diff --git a/core/scripts/normalsub/normalsub.py b/core/scripts/normalsub/normalsub.py index fdfcebb..fb407f5 100644 --- a/core/scripts/normalsub/normalsub.py +++ b/core/scripts/normalsub/normalsub.py @@ -124,6 +124,7 @@ class TemplateContext: expiration_date: str sublink_qrcode: str sub_link: str + blocked: bool = False local_uris: List[NodeURI] = field(default_factory=list) node_uris: List[NodeURI] = field(default_factory=list) @@ -558,7 +559,7 @@ class HysteriaServer: return web.Response(status=404, text=f"User '{username}' details not found.") if user_info.blocked: - return await self._handle_blocked_user(request) + return await self._handle_blocked_user(request, user_info) user_agent = request.headers.get('User-Agent', '').lower() if any(browser in user_agent for browser in ['chrome', 'firefox', 'safari', 'edge', 'opera']): @@ -573,12 +574,12 @@ class HysteriaServer: print(f"Internal Server Error: {e}") return web.Response(status=500, text="Error: Internal server error") - async def _handle_blocked_user(self, request: web.Request) -> web.Response: + async def _handle_blocked_user(self, request: web.Request, user_info: UserInfo) -> web.Response: fake_uri = "hysteria2://x@end.com:443?sni=support.me#⛔Account-Expired⚠️" user_agent = request.headers.get('User-Agent', '').lower() if any(browser in user_agent for browser in ['chrome', 'firefox', 'safari', 'edge', 'opera']): - context = self._get_blocked_template_context(fake_uri) + context = self._get_blocked_template_context(fake_uri, user_info) return web.Response(text=self.template_renderer.render(context), content_type='text/html') fragment = request.query.get('fragment', '') @@ -588,19 +589,20 @@ class HysteriaServer: return web.Response(text=fake_uri, content_type='text/plain') - def _get_blocked_template_context(self, fake_uri: str) -> TemplateContext: + def _get_blocked_template_context(self, fake_uri: str, user_info: UserInfo) -> TemplateContext: return TemplateContext( - username="blocked", - usage="N/A", + username=user_info.username, + usage=user_info.usage_human_readable, usage_raw="This account has been suspended.", - expiration_date="N/A", - sublink_qrcode=Utils.generate_qrcode_base64("blocked"), + expiration_date=user_info.expiration_date, + sublink_qrcode="", sub_link="#blocked", + blocked=True, local_uris=[ NodeURI( label="Blocked", uri=fake_uri, - qrcode=Utils.generate_qrcode_base64(fake_uri) + qrcode=None ) ], node_uris=[] @@ -656,6 +658,7 @@ class HysteriaServer: expiration_date=user_info.expiration_date, sublink_qrcode=sublink_qrcode, sub_link=sub_link, + blocked=user_info.blocked, local_uris=local_uris, node_uris=node_uris ) diff --git a/core/scripts/normalsub/template.html b/core/scripts/normalsub/template.html index 59922a7..0912c67 100644 --- a/core/scripts/normalsub/template.html +++ b/core/scripts/normalsub/template.html @@ -11,6 +11,7 @@ :root { --primary-gradient: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%); --secondary-gradient: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); + --danger-color: #ef4444; --card-bg-light: #ffffff; --card-bg-dark: #1f2937; --text-light: #1f2937; @@ -187,6 +188,10 @@ align-items: center; gap: 0.75rem; } + + .qr-header.blocked { + background: var(--danger-color); + } .qr-content { padding: 2rem; @@ -213,9 +218,17 @@ margin-bottom: 1rem; } + .qr-title.blocked { + color: var(--danger-color); + } + .dark-mode .qr-title { color: #818cf8; } + + .dark-mode .qr-title.blocked { + color: #f87171; + } .qrcode { max-width: 200px; @@ -361,12 +374,18 @@
-
+
Subscription Link
+ {% if blocked %} +
+

Account Suspended

+

Your subscription link is disabled. Please contact support.

+
+ {% else %}

Universal Subscription Link

Subscription QR Code @@ -376,37 +395,51 @@
+ {% endif %}
-
+
- Local Server Connections + {% if blocked %} + Connection Status + {% else %} + Local Server Connections + {% endif %}
- {% for item in local_uris %} -
-

{{ item.label }} URI

- {% if item.qrcode %} - {{ item.label }} QR Code -
- + {% if blocked %} + {% for item in local_uris %} +
+

{{ item.label }}

+

{{ usage_raw }}

- {% else %} -

{{ item.label }} URI not available

- {% endif %} -
- {% endfor %} + {% endfor %} + {% else %} + {% for item in local_uris %} +
+

{{ item.label }} URI

+ {% if item.qrcode %} + {{ item.label }} QR Code +
+ +
+ {% else %} +

{{ item.label }} URI not available

+ {% endif %} +
+ {% endfor %} + {% endif %}
- {% if node_uris %} + {% if node_uris and not blocked %}