Ver Fonte

XDNS finalmask: Support resolvers (client) and domains (server)

Treat the xdns mask type as a multi-value setting and update forms accordingly. Inbound/outbound UdpMask models now return arrays for xdns (inbound: settings.domains, outbound: settings.resolvers) using Array.isArray checks. UI templates were split so 'header-dns' still uses a single domain string, while 'xdns' renders a tags-style <a-select> for multiple entries (domains/resolvers). Conditionals were made explicit (mask.type === ...) instead of using includes(). Changed files: web/assets/js/model/inbound.js, web/assets/js/model/outbound.js, web/html/form/outbound.html, web/html/form/stream/stream_finalmask.html.
MHSanaei há 5 dias atrás
pai
commit
88dafa6cdf

+ 2 - 1
web/assets/js/model/inbound.js

@@ -1073,8 +1073,9 @@ class UdpMask extends XrayCommonClass {
             case 'mkcp-aes128gcm':
                 return { password: settings.password || '' };
             case 'header-dns':
-            case 'xdns':
                 return { domain: settings.domain || '' };
+            case 'xdns':
+                return { domains: Array.isArray(settings.domains) ? settings.domains : [] };
             case 'xicmp':
                 return { ip: settings.ip || '', id: settings.id ?? 0 };
             case 'mkcp-original':

+ 2 - 1
web/assets/js/model/outbound.js

@@ -573,8 +573,9 @@ class UdpMask extends CommonClass {
             case 'mkcp-aes128gcm':
                 return { password: settings.password || '' };
             case 'header-dns':
-            case 'xdns':
                 return { domain: settings.domain || '' };
+            case 'xdns':
+                return { resolvers: Array.isArray(settings.resolvers) ? settings.resolvers : [] };
             case 'xicmp':
                 return { ip: settings.ip || '', id: settings.id ?? 0 };
             case 'mkcp-original':

+ 12 - 4
web/html/form/outbound.html

@@ -886,15 +886,23 @@
                 placeholder="Obfuscation password"
               ></a-input>
             </a-form-item>
-            <a-form-item
-              label="Domain"
-              v-if="['header-dns', 'xdns'].includes(mask.type)"
-            >
+            <a-form-item label="Domain" v-if="mask.type === 'header-dns'">
               <a-input
                 v-model.trim="mask.settings.domain"
                 placeholder="e.g., www.example.com"
               ></a-input>
             </a-form-item>
+            <template v-if="mask.type === 'xdns'">
+              <a-form-item label="Resolvers">
+                <a-select
+                  mode="tags"
+                  v-model="mask.settings.resolvers"
+                  :style="{ width: '100%' }"
+                  :token-separators="[',']"
+                  placeholder="e.g., xxx+udp://8.8.8.8:53"
+                ></a-select>
+              </a-form-item>
+            </template>
             <template v-if="mask.type === 'header-custom'">
               <a-form-item label="Client">
                 <a-icon

+ 12 - 4
web/html/form/stream/stream_finalmask.html

@@ -81,15 +81,23 @@
           placeholder="Obfuscation password"
         ></a-input>
       </a-form-item>
-      <a-form-item
-        label="Domain"
-        v-if="['header-dns', 'xdns'].includes(mask.type)"
-      >
+      <a-form-item label="Domain" v-if="mask.type === 'header-dns'">
         <a-input
           v-model.trim="mask.settings.domain"
           placeholder="e.g., www.example.com"
         ></a-input>
       </a-form-item>
+      <template v-if="mask.type === 'xdns'">
+        <a-form-item label="Domains">
+          <a-select
+            mode="tags"
+            v-model="mask.settings.domains"
+            :style="{ width: '100%' }"
+            :token-separators="[',']"
+            placeholder="e.g., www.example.com"
+          ></a-select>
+        </a-form-item>
+      </template>
       <template v-if="mask.type === 'header-custom'">
         <a-form-item label="Client">
           <a-icon