feat(tls,reality): port xray TLS/REALITY fields, cert-hash helpers, fallback UX

TLS: add verifyPeerCertByName (vcn) to inbound settings + emit in both share-link generators (frontend + Go sub) and outbound parser; the allowInsecure replacement xray removed after 2026-06-01. Add server-side curvePreferences, masterKeyLog, echSockopt (passthrough + form) at tlsSettings top-level so they survive the panel-only settings strip.

REALITY: add limitFallbackUpload/Download (afterBytes/bytesPerSec/burstBytesPerSec) with per-field tooltips, plus masterKeyLog. Verified field names/semantics against pinned xray v1.260327.1 (bytesPerSec=0 disables).

Hosts: fix verify_peer_cert_by_name column bool->string (xray expects comma-separated names) with an idempotent, history-gate-free migration (SQLite typeof blank; Postgres ALTER once); emit vcn for hosts/external proxies.

Server: add getCertHash (local cert DER SHA-256) and getRemoteCertHash (xray tls ping) endpoints + api-docs; wire pinned-cert field buttons. Drop the meaningless random-hash button.

Xray UI: metrics endpoint (listen/tag) config in Basics; import/export for routing rules and outbounds.

Fallbacks card: compact empty state, header-aligned actions, responsive labeled grid rows.

i18n: add all new keys to every locale; drop unused generateRandomPin.
This commit is contained in:
MHSanaei
2026-06-21 15:51:50 +02:00
parent 315ecc2588
commit 7c8889466b
48 changed files with 1316 additions and 173 deletions
+1 -1
View File
@@ -317,7 +317,7 @@ export const EXAMPLES: Record<string, unknown> = {
""
],
"updatedAt": 0,
"verifyPeerCertByName": false,
"verifyPeerCertByName": "",
"vlessRoute": ""
},
"Inbound": {
+1 -1
View File
@@ -1448,7 +1448,7 @@ export const SCHEMAS: Record<string, unknown> = {
"type": "integer"
},
"verifyPeerCertByName": {
"type": "boolean"
"type": "string"
},
"vlessRoute": {
"description": "VlessRoute is a free-form port/range routing spec (e.g. \"53,443,1000-2000\");\nstored verbatim, format-validated on the frontend.",
+1 -1
View File
@@ -324,7 +324,7 @@ export interface Host {
sortOrder: number;
tags: string[];
updatedAt: number;
verifyPeerCertByName: boolean;
verifyPeerCertByName: string;
vlessRoute: string;
}
+1 -1
View File
@@ -347,7 +347,7 @@ export const HostSchema = z.object({
sortOrder: z.number().int(),
tags: z.array(z.string()),
updatedAt: z.number().int(),
verifyPeerCertByName: z.boolean(),
verifyPeerCertByName: z.string(),
vlessRoute: z.string(),
});
export type Host = z.infer<typeof HostSchema>;