11const WIREGUARD_PROTOCOL = 'wireguard://'
2- const TEXT_FILE_MIME_TYPE = 'text/plain;charset=utf-8 '
2+ const TEXT_FILE_MIME_TYPE = 'application/octet-stream '
33
44const safeDecodeURIComponent = ( value : string ) => {
55 try {
@@ -16,6 +16,20 @@ const formatCommaSeparatedValue = (value: string) =>
1616 . filter ( Boolean )
1717 . join ( ', ' )
1818
19+ const getSearchParam = ( params : URLSearchParams , name : string ) => {
20+ const directValue = params . get ( name )
21+ if ( directValue !== null ) return directValue
22+
23+ const normalizedName = name . toLowerCase ( )
24+ for ( const [ key , value ] of params . entries ( ) ) {
25+ if ( key . toLowerCase ( ) === normalizedName ) {
26+ return value
27+ }
28+ }
29+
30+ return ''
31+ }
32+
1933const sanitizeFileNameSegment = ( value : string | null | undefined ) => {
2034 if ( ! value ) return ''
2135
@@ -38,6 +52,7 @@ const getWireGuardEndpointHost = (hostname: string) => {
3852type ParsedWireGuardUri = {
3953 address : string
4054 allowedIps : string
55+ dns : string
4156 endpoint : string
4257 mtu : string
4358 port : string
@@ -63,18 +78,19 @@ const parseWireGuardUri = (value: string): ParsedWireGuardUri | null => {
6378 const endpointHost = getWireGuardEndpointHost ( hostname )
6479
6580 return {
66- address : parsed . searchParams . get ( 'address' ) || '' ,
67- allowedIps : parsed . searchParams . get ( 'allowedips' ) || '' ,
81+ address : getSearchParam ( parsed . searchParams , 'address' ) ,
82+ allowedIps : getSearchParam ( parsed . searchParams , 'allowedips' ) ,
83+ dns : getSearchParam ( parsed . searchParams , 'dns' ) ,
6884 endpoint : port ? `${ endpointHost } :${ port } ` : endpointHost ,
69- mtu : parsed . searchParams . get ( 'mtu' ) || '' ,
85+ mtu : getSearchParam ( parsed . searchParams , 'mtu' ) ,
7086 port,
71- preSharedKey : parsed . searchParams . get ( 'presharedkey' ) || '' ,
87+ preSharedKey : getSearchParam ( parsed . searchParams , 'presharedkey' ) ,
7288 privateKey : safeDecodeURIComponent ( parsed . username ) ,
73- publicKey : parsed . searchParams . get ( 'publickey' ) || '' ,
89+ publicKey : getSearchParam ( parsed . searchParams , 'publickey' ) ,
7490 remark : safeDecodeURIComponent ( parsed . hash . replace ( / ^ # / , '' ) ) ,
75- reserved : parsed . searchParams . get ( 'reserved' ) || '' ,
91+ reserved : getSearchParam ( parsed . searchParams , 'reserved' ) ,
7692 source,
77- keepalive : parsed . searchParams . get ( 'keepalive' ) || '' ,
93+ keepalive : getSearchParam ( parsed . searchParams , 'keepalive' ) ,
7894 }
7995 } catch {
8096 return null
@@ -100,6 +116,10 @@ export const convertWireGuardUrlToConfig = (value: string) => {
100116 lines . push ( `PrivateKey = ${ parsed . privateKey } ` )
101117 lines . push ( `Address = ${ formatCommaSeparatedValue ( parsed . address ) } ` )
102118
119+ if ( parsed . dns ) {
120+ lines . push ( `DNS = ${ formatCommaSeparatedValue ( parsed . dns ) } ` )
121+ }
122+
103123 if ( parsed . mtu ) {
104124 lines . push ( `MTU = ${ parsed . mtu } ` )
105125 }
0 commit comments