feat(sub): add Happ client integration, routing presets, and app management (#6434)

* feat(sub): add Happ client integration, routing presets, and app management

Implement comprehensive Happ proxy client integration according to official developer specifications.

- Fix header emission on disabled routing and hidden settings to send explicit '0' headers rather than omitting, allowing Happ clients to reset cached settings.
- Add support for 'happ://routing/off' deeplink in routing validation.
- Preserve '?serverDescription=' query parameters in link fragments without escaping to support Happ server subtitles across VMess, VLESS, Trojan and SS.
- Add Happ application management headers: ProviderID, New-Url, Fallback-Url, Sub-Info banners, Sub-Expire notifications, No-Limit mode, hardware ID enforcement, TUN modes/types, route exclusions, APNS exclusions, and per-app proxy settings.
- Add curated routing presets (Iran Bypass, China Direct, AdBlock, Global) and interactive visual rule generator in frontend settings.
- Synchronize all 13 translation locales with native Persian, Russian, and Chinese translations.

* fix(sub): keep Happ header overrides behind the auto-detect opt-in

The Routing-Enable/Hide-Settings off values were emitted on the
User-Agent alone, so every panel that upgraded would push
"Routing-Enable: 0" — documented by happ.su as disabling routing
globally — to every Happ client without the operator enabling anything.
They now ride subHappAutoDetect like every other Happ header.

Two further mismatches against the vendor spec:

- serverDescription was written as a key of the VMess base64 JSON
  object. happ.su documents it as a "#Title?serverDescription=<base64>"
  link parameter or a JSON "meta" entry, so the caption never reached
  Happ while every other VMess consumer received an unknown key.
  Dropped rather than moved: emitting the documented form is unsafe
  here because our own parser base64-decodes the whole VMess body
  (internal/util/link/outbound.go).

- The TUN Mode dropdown stored the literal "default", forwarded as
  "Tun-Mode: default", where happ.su documents system|gvisor only. It
  now stores the unset value so no header is sent. TUN Type "default"
  is a documented value and is unchanged.

Each fix carries a test that fails without it.
This commit is contained in:
Pejman Yousefi
2026-09-10 17:16:12 +03:30
committed by GitHub
parent d5ab84e8d5
commit 1456658028
35 changed files with 3460 additions and 51 deletions
+93 -1
View File
@@ -1466,7 +1466,99 @@
"subExpiredTemplate": "قالب پیام انقضا",
"subExpiredTemplateDesc": "قالب کانفیگ نمایشی زمانی که اشتراک کاربر منقضی شده است.",
"subTrafficDepletedTemplate": "قالب پیام اتمام حجم",
"subTrafficDepletedTemplateDesc": "قالب کانفیگ نمایشی زمانی که حجم اشتراک کاربر به پایان رسیده است."
"subTrafficDepletedTemplateDesc": "قالب کانفیگ نمایشی زمانی که حجم اشتراک کاربر به پایان رسیده است.",
"subHappAutoDetect": "تشخیص خودکار کلاینت Happ",
"subHappAutoDetectDesc": "تزریق خودکار هدرها و روتینگ Happ هنگامی که User-Agent کلاینت مربوط به برنامه Happ باشد.",
"subHappProviderId": "شناسه ارائه‌دهنده (Provider ID)",
"subHappProviderIdDesc": "شناسه یکتا جهت مدیریت کلاینت Happ، اتصال به کانفیگ ریموت و مهاجرت کاربران.",
"subHappNewUrl": "لینک اشتراک جدید (مهاجرت)",
"subHappNewUrlDesc": "آدرس اشتراک جدید جهت انتقال خودکار؛ برنامه Happ پس از دریافت، آدرس اشتراک را به این لینک تغییر می‌دهد.",
"subHappFallbackUrl": "لینک اشتراک پشتیبان (Fallback)",
"subHappFallbackUrlDesc": "آدرس اشتراک جایگزین در صورت در دسترس نبودن سرور اصلی اشتراک.",
"subHappSubInfoText": "متن بنر اعلانات",
"subHappSubInfoTextDesc": "پیام اعلان سفارشی در بالای صفحه برنامه Happ (حداکثر ۲۰۰ نویسه).",
"subHappSubInfoColor": "رنگ بنر اعلانات",
"subHappSubInfoColorDesc": "تم رنگی بنر اعلان (پیش‌فرض، اطلاع‌رسانی، موفقیت، هشدار یا اخطار).",
"subHappSubInfoButtonText": "متن دکمه بنر",
"subHappSubInfoButtonTextDesc": "عنوان دکمه اقدام در بنر اعلان (حداکثر ۲۵ نویسه).",
"subHappSubInfoButtonLink": "لینک دکمه بنر",
"subHappSubInfoButtonLinkDesc": "آدرسی که با کلیک روی دکمه بنر باز می‌شود.",
"subHappSubExpire": "بنر اشتراک منقضی‌شده",
"subHappSubExpireDesc": "نمایش بنر تمدید در برنامه Happ در صورت اتمام ترافیک یا زمان اشتراک کاربر.",
"subHappSubExpireButtonLink": "لینک تمدید اشتراک",
"subHappSubExpireButtonLinkDesc": "آدرس صفحه خرید یا تمدید اشتراک منقضی‌شده.",
"subHappNotificationExpire": "اعلان انقضای اشتراک",
"subHappNotificationExpireDesc": "نمایش هشدار انقضای اشتراک به کاربر پیش از پایان اعتبار در برنامه Happ.",
"subHappNoLimit": "حذف محدودیت تعداد قوانین",
"subHappNoLimitDesc": "اجازه اعمال تعداد نامحدود قوانین روتینگ بدون برش خوردن روی سیستم‌های تلفن همراه.",
"subHappAlwaysHwid": "الزام شناسه سخت‌افزاری (HWID)",
"subHappAlwaysHwidDesc": "قفل کردن درخواست‌های اشتراک به شناسه سخت‌افزاری دستگاه جهت جلوگیری از اشتراک‌گذاری اکانت.",
"subHappTunMode": "حالت تونل (TUN Mode)",
"subHappTunModeDesc": "حالت رابط شبکه مجازی TUN در برنامه Happ (پیش‌فرض، سیستمی یا سخت‌گیرانه).",
"subHappTunType": "موتور شبکه TUN",
"subHappTunTypeDesc": "پشته شبکه مورد استفاده برای TUN (سیستمی، gVisor یا ترکیبی).",
"subHappExcludeRoutes": "مستثنی کردن مسیرهای CIDR",
"subHappExcludeRoutesDesc": "رنج‌های IP جدا شده با کاما جهت دور زدن تونل VPN (مانند 192.168.0.0/16, 10.0.0.0/8).",
"subHappExcludeApns": "مستثنی کردن سرویس‌های اعلان اپل (APNs)",
"subHappExcludeApnsDesc": "دور زدن سرویس‌های اعلان اپل برای اطمینان از دریافت پایدار ناتیفیکیشن‌ها در iOS.",
"subHappColorProfile": "پروفایل رنگ و پوسته",
"subHappColorProfileDesc": "پوسته ظاهری برنامه Happ (بنفش، فیروزه‌ای، سایبرپانک یا JSON سفارشی).",
"subHappPingType": "روش تست پینگ",
"subHappPingTypeDesc": "پروتکل اندازه‌گیری تأخیر گره‌ها در برنامه Happ (icmp، tcp یا http).",
"subHappAutoConnect": "اتصال خودکار هنگام اجرا",
"subHappAutoConnectDesc": "اتصال خودکار به وی‌پی‌ان با باز شدن برنامه Happ.",
"subHappAutoConnectType": "راهبرد اتصال خودکار",
"subHappAutoConnectTypeDesc": "هدف اتصال خودکار: سریع‌ترین سرور یا آخرین سرور استفاده‌شده.",
"subHappPerAppMode": "پراکسی انتخابی برنامه‌ها در اندروید",
"subHappPerAppModeDesc": "مدیریت عبور ترافیک برنامه‌های اندروید: خاموش، عبور فقط برنامه‌های منتخب یا مستثنی کردن آن‌ها.",
"subHappPerAppList": "نام بسته‌های برنامه‌های اندروید",
"subHappPerAppListDesc": "نام بسته‌های اپلیکیشن‌های اندروید جدا شده با کاما (مانند com.telegram.messenger).",
"subHappPresetIran": "دور زدن سایت‌های ایران (Iran Bypass)",
"subHappPresetChina": "دور زدن چین (China Direct)",
"subHappPresetAdblock": "مسدودسازی تبلیغات (AdBlock)",
"subHappPresetGlobal": "پراکسی کل ترافیک (Global)",
"subHappPresetOff": "غیرفعال‌سازی روتینگ (happ://routing/off)",
"subHappColorBlue": "آبی (استاندارد / پیش‌فرض)",
"subHappColorGreen": "سبز (موفقیت)",
"subHappColorRed": "قرمز (هشدار / خطر)",
"subHappTunModeDefault": "پیش‌فرض",
"subHappTunModeSystem": "سیستم (استک استاندارد سیستم‌عامل)",
"subHappTunModeGvisor": "gVisor (استک فضای کاربری)",
"subHappTunTypeSingbox": "sing-box",
"subHappTunTypeTun2proxy": "tun2proxy",
"subHappTunTypeDefault": "پیش‌فرض (Happ TUN)",
"subHappTunTypeXray": "Xray TUN",
"subHappPingProxy": "از طریق پروکسی (تأخیر GET)",
"subHappPingProxyHead": "از طریق پروکسی (تأخیر HEAD)",
"subHappPingTcp": "پینگ دست‌دادن TCP",
"subHappPingIcmp": "پینگ ICMP",
"subHappAutoConnectLowestDelay": "کمترین تأخیر (سریع‌ترین نود)",
"subHappAutoConnectLastUsed": "آخرین نود استفاده‌شده",
"subHappAutoConnectRandom": "نود تصادفی",
"subHappPerAppOff": "خاموش",
"subHappPerAppOn": "روشن (فقط برنامه‌های فهرست‌شده)",
"subHappPerAppBypass": "بای‌پس (مستثنی‌کردن برنامه‌های فهرست‌شده)",
"subHappPresetApplied": "الگوی روتینگ Happ اعمال شد",
"subHappPresets": "الگوهای آماده روتینگ",
"subHappPresetsDesc": "الگوهای آماده و بهینه‌سازی‌شده برای روتینگ در برنامه Happ.",
"subHappVisualBuilder": "سازنده بصری قوانین",
"subHappVisualBuilderDesc": "ایجاد آسان دیپ‌لینک روتینگ سفارشی بر اساس دامنه‌ها و آی‌پی‌ها.",
"subHappBuildDeeplink": "تولید دیپ‌لینک",
"subHappModalTitle": "سازنده بصری قوانین روتینگ Happ",
"subHappDirectDomains": "دامنه‌های مستقیم (Direct)",
"subHappProxyDomains": "دامنه‌های پراکسی (Proxy)",
"subHappBlockDomains": "دامنه‌های مسدود (Block)",
"subHappDirectIPs": "آی‌پی‌های مستقیم (Direct CIDRs)",
"subHappProxyIPs": "آی‌پی‌های پراکسی (Proxy CIDRs)",
"subHappBlockIPs": "آی‌پی‌های مسدود (Block CIDRs)",
"subHappDeeplinkGenerated": "دیپ‌لینک تولید و در قوانین روتینگ اعمال شد",
"subHappGroupRouting": "قوانین و روتینگ",
"subHappGroupBanners": "اعلانات و بنرهای هوشمند",
"subHappGroupNetwork": "تنظیمات شبکه و TUN",
"subHappGroupThemes": "ظاهر و پوسته برنامه",
"subHappGroupFailover": "مهاجرت و مدیریت کلاینت",
"subHappGroupAndroid": "پراکسی برنامه‌های اندروید"
},
"xray": {
"save": "ذخیره",