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
+33 -5
View File
@@ -591,7 +591,6 @@
"pinnedPeerCertSha256": "SHA-256 لشهادة النظير المثبَّتة",
"pinnedPeerCertSha256Tip": "تجزئات SHA-256 لشهادة النظير كسلسلة سداسية عشرية (مثل e8e2d3…)، مفصولة بفواصل. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.",
"pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) سداسية عشرية، مفصولة بفواصل",
"generateRandomPin": "إنشاء تجزئة عشوائية",
"getNewEchCert": "احصل على شهادة ECH جديدة",
"show": "عرض",
"xver": "Xver",
@@ -620,7 +619,28 @@
"node": "عنوان العقدة",
"listen": "عنوان استماع الوارد",
"custom": "مخصص"
}
},
"echSockopt": "ECH Sockopt",
"echSockoptTip": "خيارات السوكيت للاتصال اللي Xray بتستخدمه عشان تجيب قائمة إعدادات ECH (مثلاً توجيه الاستعلام عبر صادر dialerProxy). سيبه متعطّل عشان تستخدم الإعدادات الافتراضية.",
"curvePreferences": "تفضيلات المنحنى",
"curvePreferencesTip": "بتقصر منحنيات تبادل مفاتيح TLS اللي السيرفر بيعرضها، بترتيب الأفضلية (مثلاً X25519MLKEM768, X25519). سيبه فاضي عشان تستخدم الإعدادات الافتراضية لـ Xray-core.",
"masterKeyLog": "سجل المفتاح الرئيسي",
"masterKeyLogTip": "المسار اللي هتتكتب فيه مفاتيح TLS الرئيسية (بصيغة SSLKEYLOGFILE) عشان التصحيح باستخدام Wireshark. سيبه فاضي في الإنتاج — لإنه بيخلي أي حد عنده الملف يقدر يفك تشفير المرور.",
"verifyPeerCertByName": "التحقق من شهادة النظير بالاسم",
"verifyPeerCertByNameTip": "بيقول للعملاء يتحققوا من شهادة السيرفر مقابل الاسم ده بدل الـ SNI. الأسماء بتتفصل بفاصلة. للوحة بس — بيتضاف في روابط المشاركة (vcn). ده البديل الحديث لـ allowInsecure اللي شالته Xray بعد 2026-06-01.",
"pinFromCert": "املأ من شهادة الوارد ده",
"pinFromRemote": "اجلب الهاش عبر ping على الـ SNI (xray tls ping)",
"pinFromRemoteNoSni": "حدّد الـ SNI (serverName) الأول عشان تعمل ping للشهادة البعيدة.",
"pinFromRemoteFailed": "تعذّر جلب هاش الشهادة البعيدة.",
"limitFallback": "تحديد الـ Fallback",
"limitFallbackUpload": "تحديد رفع الـ Fallback",
"limitFallbackDownload": "تحديد تنزيل الـ Fallback",
"afterBytes": "بعد البايتات",
"afterBytesTip": "خلي الـ fallback يشتغل بالسرعة الكاملة لعدد البايتات ده، وبعدين يبدأ التحجيم. 0 = حجّم من أول بايت.",
"bytesPerSec": "بايت في الثانية",
"bytesPerSecTip": "حد السرعة (بايت/ثانية) المطبّق على مرور الـ fallback بعد العتبة، عشان الفحوصات ماتقدرش تستخدم سيرفرك كنطاق ترددي مجاني للهدف. 0 = بلا حد (بيعطّل الاتجاه ده).",
"burstBytesPerSec": "بايت في الثانية للدفقة",
"burstBytesPerSecTip": "السماح بدفقات قصيرة فوق المعدل الثابت (حجم token-bucket). لو أقل من بايت في الثانية بيترفع ليطابقه."
},
"info": {
"mode": "الوضع",
@@ -1340,6 +1360,14 @@
"Outbounds": "الصادرات",
"OutboundSubscriptions": "اشتراكات الصادرات",
"OutboundSubscriptionsDesc": "استورد الصادرات من روابط اشتراك بعيدة (vmess/vless/trojan/ss/...). الوسوم بتفضل ثابتة عشان تستخدمها في موازنات التحميل وقواعد التوجيه. التحديثات بتتم تلقائياً.",
"importRules": "استيراد القواعد",
"exportRules": "تصدير القواعد",
"importOutbounds": "استيراد الصادرات",
"exportOutbounds": "تصدير الصادرات",
"importInvalidJson": "JSON غير صالح — المتوقع مصفوفة أو كائن بمفتاح مطابق.",
"metricsListen": "نقطة نهاية المقاييس",
"metricsListenDesc": "بتعرض مقاييس Xray بنمط Prometheus على العنوان:المنفذ ده (مثلاً 127.0.0.1:11111). سيبه فاضي عشان تعطّله. اربطه بـ localhost وحطّ قدامه reverse-proxy — لإنه من غير مصادقة.",
"metricsTag": "وسم المقاييس",
"Balancers": "موازنات التحميل",
"balancerTagRequired": "الوسم مطلوب",
"balancerSelectorRequired": "اختر صادراً واحداً على الأقل",
@@ -1729,7 +1757,6 @@
"alpn": "ALPN",
"fingerprint": "بصمة",
"pins": "SHA-256 للشهادة المثبّتة",
"verifyPeerCertByName": "التحقق من شهادة النظير بالاسم",
"allowInsecure": "السماح بغير الآمن",
"echConfigList": "قائمة إعدادات ECH",
"muxParams": "Mux",
@@ -1741,7 +1768,8 @@
"shuffleHost": "خلط المضيف",
"tags": "وسوم",
"nodeGuids": "النودز",
"excludeFromSubTypes": "استبعاد من الصيغ"
"excludeFromSubTypes": "استبعاد من الصيغ",
"verifyPeerCertByName": "التحقق من شهادة النظير بالاسم"
},
"hints": {
"address": "اتركه فارغاً ليرث عنوان الوارد نفسه.",
@@ -2015,4 +2043,4 @@
"statusDown": "غير متصل",
"statusUp": "متصل"
}
}
}