fix(sub): serve a copy-only page when a subscription URL is opened in a browser (#6183)

* fix(sub): show copy-only page for browser subscription visits

Browser navigation to /sub previously rendered the normal subscription page, which exposed subscription material in page data or raw base64 depending on request headers. Keep VPN clients on the raw subscription body, but classify browser document requests and return a neutral static copy-only HTML page with no embedded share links or page data.

This preserves the C1 LimitIP parser fix in the same master candidate while avoiding a DE rollback of the browser subscription UX.

* fix(sub): keep the themed page for an explicit html request

Only implicit browser navigation is downgraded to the copy-only page. An
operator who appends html=1 or view=html already holds the URL, so the
themed subscription page keeps rendering for them and serveSubPage stays
in use.

* fix(sub): keep browser pages copy-only
This commit is contained in:
n0ctal
2026-08-15 21:18:03 +05:00
committed by GitHub
parent dafd3c0e64
commit 43bc915397
16 changed files with 312 additions and 96 deletions
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "فشل",
"statusDown": "غير متصل",
"statusUp": "متصل"
}
},
"subCopyPageTitle": "رابط الاشتراك",
"subCopyPageHeading": "هذا رابط اشتراك",
"subCopyPageInstructions": "لا حاجة لفتحه في المتصفح. انسخ عنوان هذه الصفحة والصقه في التطبيق."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "FAILED",
"statusDown": "DOWN",
"statusUp": "UP"
}
},
"subCopyPageTitle": "Subscription link",
"subCopyPageHeading": "This is a subscription link",
"subCopyPageInstructions": "You do not need to open it in a browser. Copy this page address and paste it into the app."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "FALLIDO",
"statusDown": "CAÍDO",
"statusUp": "ACTIVO"
}
},
"subCopyPageTitle": "Enlace de suscripción",
"subCopyPageHeading": "Este es un enlace de suscripción",
"subCopyPageInstructions": "No necesita abrirlo en el navegador. Copie la dirección de esta página y péguela en la aplicación."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "ناموفق",
"statusDown": "قطع",
"statusUp": "وصل"
}
},
"subCopyPageTitle": "پیوند اشتراک",
"subCopyPageHeading": "این یک پیوند اشتراک است",
"subCopyPageInstructions": "نیازی نیست آن را در مرورگر باز کنید. نشانی این صفحه را کپی و در برنامه جای‌گذاری کنید."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "GAGAL",
"statusDown": "MATI",
"statusUp": "AKTIF"
}
},
"subCopyPageTitle": "Tautan langganan",
"subCopyPageHeading": "Ini adalah tautan langganan",
"subCopyPageInstructions": "Anda tidak perlu membukanya di browser. Salin alamat halaman ini dan tempelkan ke aplikasi."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "失敗",
"statusDown": "ダウン",
"statusUp": "アップ"
}
},
"subCopyPageTitle": "サブスクリプションリンク",
"subCopyPageHeading": "これはサブスクリプションリンクです",
"subCopyPageInstructions": "ブラウザーで開く必要はありません。このページのアドレスをコピーしてアプリに貼り付けてください。"
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "FALHOU",
"statusDown": "INATIVO",
"statusUp": "ATIVO"
}
},
"subCopyPageTitle": "Link de assinatura",
"subCopyPageHeading": "Este é um link de assinatura",
"subCopyPageInstructions": "Não é necessário abri-lo no navegador. Copie o endereço desta página e cole-o no aplicativo."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "НЕУДАЧНО",
"statusDown": "НЕДОСТУПЕН",
"statusUp": "РАБОТАЕТ"
}
},
"subCopyPageTitle": "Ссылка подписки",
"subCopyPageHeading": "Это ссылка подписки",
"subCopyPageInstructions": "Открывать её в браузере не нужно. Скопируйте адрес этой страницы и вставьте его в приложение."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "BAŞARISIZ",
"statusDown": "ÇEVRİMDIŞI",
"statusUp": "ÇEVRİMİÇİ"
}
},
"subCopyPageTitle": "Abonelik bağlantısı",
"subCopyPageHeading": "Bu bir abonelik bağlantısıdır",
"subCopyPageInstructions": "Tarayıcıda açmanız gerekmez. Bu sayfanın adresini kopyalayıp uygulamaya yapıştırın."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "НЕВДАЛО",
"statusDown": "НЕДОСТУПНО",
"statusUp": "ДОСТУПНО"
}
},
"subCopyPageTitle": "Посилання підписки",
"subCopyPageHeading": "Це посилання підписки",
"subCopyPageInstructions": "Відкривати його в браузері не потрібно. Скопіюйте адресу цієї сторінки та вставте її в застосунок."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "THẤT BẠI",
"statusDown": "NGỪNG HOẠT ĐỘNG",
"statusUp": "HOẠT ĐỘNG"
}
},
"subCopyPageTitle": "Liên kết đăng ký",
"subCopyPageHeading": "Đây là liên kết đăng ký",
"subCopyPageInstructions": "Bạn không cần mở liên kết trong trình duyệt. Hãy sao chép địa chỉ trang này và dán vào ứng dụng."
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "失败",
"statusDown": "断开",
"statusUp": "恢复"
}
},
"subCopyPageTitle": "订阅链接",
"subCopyPageHeading": "这是一个订阅链接",
"subCopyPageInstructions": "无需在浏览器中打开。请复制此页面地址并粘贴到应用中。"
}
+4 -1
View File
@@ -2075,5 +2075,8 @@
"statusFailed": "失敗",
"statusDown": "中斷",
"statusUp": "恢復"
}
},
"subCopyPageTitle": "訂閱連結",
"subCopyPageHeading": "這是訂閱連結",
"subCopyPageInstructions": "無需在瀏覽器中開啟。請複製此頁面位址並貼到應用程式中。"
}