hiddifypanel 10.11.0__py3-none-any.whl → 10.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +2 -2
- hiddifypanel/auth.py +15 -5
- hiddifypanel/hutils/encode.py +0 -1
- hiddifypanel/hutils/proxy/__init__.py +1 -0
- hiddifypanel/hutils/proxy/shared.py +20 -10
- hiddifypanel/hutils/proxy/singbox.py +47 -46
- hiddifypanel/hutils/proxy/xray.py +39 -23
- hiddifypanel/hutils/proxy/xrayjson.py +391 -0
- hiddifypanel/hutils/random.py +4 -0
- hiddifypanel/models/config.py +7 -2
- hiddifypanel/models/config_enum.py +9 -5
- hiddifypanel/panel/admin/DomainAdmin.py +3 -2
- hiddifypanel/panel/admin/SettingAdmin.py +22 -11
- hiddifypanel/panel/admin/templates/model/user_list.html +44 -20
- hiddifypanel/panel/commercial/restapi/v1/tgmsg.py +14 -10
- hiddifypanel/panel/commercial/restapi/v2/user/apps_api.py +17 -23
- hiddifypanel/panel/common_bp/login.py +2 -2
- hiddifypanel/panel/init_db.py +1 -1
- hiddifypanel/panel/user/templates/base_xray_config.json.j2 +125 -0
- hiddifypanel/panel/user/user.py +9 -1
- hiddifypanel/static/images/hiddify.png +0 -0
- hiddifypanel/static/images/hiddify1.png +0 -0
- hiddifypanel/static/new/assets/hiddify-logo-7617d937.png +0 -0
- hiddifypanel/static/new/assets/hiddify-logo-7617d937_old.png +0 -0
- hiddifypanel/templates/admin-layout.html +22 -11
- hiddifypanel/templates/master.html +48 -25
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +28 -22
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +15 -11
- hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/pt/LC_MESSAGES/messages.po +8 -8
- hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/ru/LC_MESSAGES/messages.po +111 -53
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +108 -58
- hiddifypanel/translations.i18n/en.json +18 -17
- hiddifypanel/translations.i18n/fa.json +7 -6
- hiddifypanel/translations.i18n/pt.json +3 -2
- hiddifypanel/translations.i18n/ru.json +53 -52
- hiddifypanel/translations.i18n/zh.json +58 -57
- {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/METADATA +1 -1
- {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/RECORD +48 -44
- {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/LICENSE.md +0 -0
- {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/WHEEL +0 -0
- {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/entry_points.txt +0 -0
- {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/top_level.txt +0 -0
@@ -39,30 +39,34 @@ class SendMsgResource(Resource):
|
|
39
39
|
else:
|
40
40
|
return {'msg': 'error', 'res': res}
|
41
41
|
|
42
|
-
def get_users_by_identifier(self, identifier: str) -> List[User]:
|
42
|
+
def get_users_by_identifier(self, identifier: str | list) -> List[User]:
|
43
43
|
'''Returns all users that match the identifier for sending a message to them'''
|
44
44
|
# when we are here we must have g.account but ...
|
45
45
|
if not hasattr(g, 'account'):
|
46
46
|
return []
|
47
|
+
|
47
48
|
query = User.query.filter(User.added_by.in_(g.account.recursive_sub_admins_ids()))
|
48
49
|
query = query.filter(User.telegram_id is not None, User.telegram_id != 0)
|
49
50
|
|
50
|
-
|
51
|
+
# user selected many ids as users identifier
|
52
|
+
if isinstance(identifier, list):
|
53
|
+
return query.filter(User.id.in_(identifier)).all()
|
54
|
+
|
55
|
+
if hutils.convert.is_int(identifier): # type: ignore
|
51
56
|
return [query.filter(User.id == int(identifier)).first() or abort(404, 'The user not found')] # type: ignore
|
52
|
-
|
57
|
+
if identifier == 'all':
|
53
58
|
return query.all()
|
54
|
-
|
59
|
+
if identifier == 'expired':
|
55
60
|
return [u for u in query.all() if not u.is_active]
|
56
|
-
|
61
|
+
if identifier == 'active':
|
57
62
|
return [u for u in query.all() if u.is_active]
|
58
|
-
|
63
|
+
if identifier == 'offline 1h':
|
59
64
|
h1 = datetime.datetime.now() - datetime.timedelta(hours=1)
|
60
65
|
return [u for u in query.all() if u.is_active and u.last_online < h1]
|
61
|
-
|
66
|
+
if identifier == 'offline 1d':
|
62
67
|
d1 = datetime.datetime.now() - datetime.timedelta(hours=24)
|
63
68
|
return [u for u in query.all() if u.is_active and u.last_online < d1]
|
64
|
-
|
69
|
+
if identifier == 'offline 1w':
|
65
70
|
d7 = datetime.datetime.now() - datetime.timedelta(days=7)
|
66
71
|
return [u for u in query.all() if u.is_active and u.last_online < d7]
|
67
|
-
|
68
|
-
return []
|
72
|
+
return []
|
@@ -346,31 +346,25 @@ class AppAPI(MethodView):
|
|
346
346
|
|
347
347
|
if self.platform == Platform.all:
|
348
348
|
platform = [Platform.windows, Platform.linux, Platform.mac]
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
match p:
|
353
|
-
case Platform.windows:
|
354
|
-
ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}_x64_en-US.msi'
|
355
|
-
dto.install.append(self.__get_app_install_dto(AppInstallType.setup, ins_url))
|
356
|
-
case Platform.linux:
|
357
|
-
ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/hiddify-clash-desktop_{version}_amd64.AppImage'
|
358
|
-
dto.install.append(self.__get_app_install_dto(AppInstallType.appimage, ins_url))
|
359
|
-
case Platform.mac:
|
360
|
-
ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}_x64.dmg'
|
361
|
-
dto.install.append(self.__get_app_install_dto(AppInstallType.dmg, ins_url))
|
362
|
-
else:
|
363
|
-
match platform:
|
349
|
+
|
350
|
+
def get_link(p):
|
351
|
+
match p:
|
364
352
|
case Platform.windows:
|
365
|
-
ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}_x64_en-US.msi'
|
353
|
+
ins_url = latest_url.split('releases/')[0] + f'releases/download/v{version}/HiddifyClashDesktop_{version}_x64_en-US.msi'
|
366
354
|
dto.install.append(self.__get_app_install_dto(AppInstallType.setup, ins_url))
|
367
355
|
case Platform.linux:
|
368
|
-
ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/hiddify-clash-desktop_{version}_amd64.AppImage'
|
356
|
+
ins_url = latest_url.split('releases/')[0] + f'releases/download/v{version}/hiddify-clash-desktop_{version}_amd64.AppImage'
|
369
357
|
dto.install.append(self.__get_app_install_dto(AppInstallType.appimage, ins_url))
|
370
358
|
case Platform.mac:
|
371
|
-
ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}
|
359
|
+
ins_url = latest_url.split('releases/')[0] + f'releases/download/v{version}/HiddifyClashDesktop_{version}_x64.dmg'
|
372
360
|
dto.install.append(self.__get_app_install_dto(AppInstallType.dmg, ins_url))
|
373
361
|
|
362
|
+
if isinstance(platform, list):
|
363
|
+
for p in platform:
|
364
|
+
get_link(p)
|
365
|
+
else:
|
366
|
+
get_link(platform)
|
367
|
+
|
374
368
|
return dto
|
375
369
|
|
376
370
|
def __get_hiddify_next_app_dto(self):
|
@@ -402,17 +396,17 @@ class AppAPI(MethodView):
|
|
402
396
|
ins_url = ''
|
403
397
|
match install_type:
|
404
398
|
case AppInstallType.apk:
|
405
|
-
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/
|
399
|
+
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk'
|
406
400
|
case AppInstallType.google_play:
|
407
401
|
ins_url = 'https://play.google.com/store/apps/details?id=app.hiddify.com'
|
408
402
|
case AppInstallType.setup:
|
409
|
-
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/
|
403
|
+
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe'
|
410
404
|
case AppInstallType.portable:
|
411
|
-
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/
|
405
|
+
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip'
|
412
406
|
case AppInstallType.appimage:
|
413
|
-
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/
|
407
|
+
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage'
|
414
408
|
case AppInstallType.dmg:
|
415
|
-
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/
|
409
|
+
ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg'
|
416
410
|
|
417
411
|
install_dto = self.__get_app_install_dto(install_type, ins_url)
|
418
412
|
install_dtos.append(install_dto)
|
@@ -42,8 +42,8 @@ class LoginView(FlaskView):
|
|
42
42
|
return redirect(redirect_arg)
|
43
43
|
if hutils.flask.is_admin_proxy_path() and g.account.role in {Role.super_admin, Role.admin, Role.agent}:
|
44
44
|
return redirect(hurl_for('admin.Dashboard:index'))
|
45
|
-
if g.user_agent['is_browser'] and hutils.flask.is_client_proxy_path():
|
46
|
-
|
45
|
+
# if g.user_agent['is_browser'] and hutils.flask.is_client_proxy_path():
|
46
|
+
# return redirect(hurl_for('client.UserView:index'))
|
47
47
|
|
48
48
|
from hiddifypanel.panel.user import UserView
|
49
49
|
return UserView().auto_sub()
|
hiddifypanel/panel/init_db.py
CHANGED
@@ -371,7 +371,7 @@ def _v7():
|
|
371
371
|
Proxy.query.filter(Proxy.name == 'tls XTLSVision direct trojan').delete()
|
372
372
|
except BaseException:
|
373
373
|
pass
|
374
|
-
add_config_if_not_exist(ConfigEnum.telegram_lib, "
|
374
|
+
add_config_if_not_exist(ConfigEnum.telegram_lib, "erlang")
|
375
375
|
add_config_if_not_exist(ConfigEnum.admin_lang, hconfig(ConfigEnum.lang))
|
376
376
|
add_config_if_not_exist(ConfigEnum.branding_title, "")
|
377
377
|
add_config_if_not_exist(ConfigEnum.branding_site, "")
|
@@ -0,0 +1,125 @@
|
|
1
|
+
{
|
2
|
+
"remarks": "{{remarks}}",
|
3
|
+
"log": {
|
4
|
+
"access": "",
|
5
|
+
"error": "",
|
6
|
+
"loglevel": "warning"
|
7
|
+
},
|
8
|
+
"inbounds": [
|
9
|
+
{
|
10
|
+
"tag": "socks",
|
11
|
+
"port": 10808,
|
12
|
+
"listen": "127.0.0.1",
|
13
|
+
"protocol": "socks",
|
14
|
+
"sniffing": {
|
15
|
+
"enabled": true,
|
16
|
+
"destOverride": [
|
17
|
+
"http",
|
18
|
+
"tls"
|
19
|
+
],
|
20
|
+
"routeOnly": false
|
21
|
+
},
|
22
|
+
"settings": {
|
23
|
+
"auth": "noauth",
|
24
|
+
"udp": true,
|
25
|
+
"allowTransparent": false
|
26
|
+
}
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"tag": "http",
|
30
|
+
"port": 10809,
|
31
|
+
"listen": "127.0.0.1",
|
32
|
+
"protocol": "http",
|
33
|
+
"sniffing": {
|
34
|
+
"enabled": true,
|
35
|
+
"destOverride": [
|
36
|
+
"http",
|
37
|
+
"tls"
|
38
|
+
],
|
39
|
+
"routeOnly": false
|
40
|
+
},
|
41
|
+
"settings": {
|
42
|
+
"auth": "noauth",
|
43
|
+
"udp": true,
|
44
|
+
"allowTransparent": false
|
45
|
+
}
|
46
|
+
}
|
47
|
+
],
|
48
|
+
"outbounds": [
|
49
|
+
{
|
50
|
+
"tag": "fragment",
|
51
|
+
"protocol": "freedom",
|
52
|
+
"settings": {
|
53
|
+
"domainStrategy": "AsIs"
|
54
|
+
{% if hconfig(ConfigEnum.tls_fragment_enable) %}
|
55
|
+
,"fragment": {
|
56
|
+
"packets": "tlshello",
|
57
|
+
"length": "{{ hconfig(ConfigEnum.tls_fragment_size) }}",
|
58
|
+
"interval": "{{ hconfig(ConfigEnum.tls_fragment_sleep) }}"
|
59
|
+
}
|
60
|
+
{% endif %}
|
61
|
+
},
|
62
|
+
"streamSettings": {
|
63
|
+
"sockopt": {
|
64
|
+
"tcpNoDelay": true,
|
65
|
+
"tcpKeepAliveIdle": 100
|
66
|
+
}
|
67
|
+
}
|
68
|
+
},
|
69
|
+
{
|
70
|
+
"tag": "direct",
|
71
|
+
"protocol": "freedom",
|
72
|
+
"settings": {}
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"tag": "block",
|
76
|
+
"protocol": "blackhole",
|
77
|
+
"settings": {
|
78
|
+
"response": {
|
79
|
+
"type": "http"
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
],
|
84
|
+
"routing": {
|
85
|
+
"domainStrategy": "AsIs",
|
86
|
+
"rules": [
|
87
|
+
{
|
88
|
+
"type": "field",
|
89
|
+
"inboundTag": [
|
90
|
+
"api"
|
91
|
+
],
|
92
|
+
"outboundTag": "api",
|
93
|
+
"enabled": true
|
94
|
+
},
|
95
|
+
{
|
96
|
+
"id": "5465425548310166497",
|
97
|
+
"type": "field",
|
98
|
+
"outboundTag": "direct",
|
99
|
+
"domain": [
|
100
|
+
"domain:ir",
|
101
|
+
"geosite:cn"
|
102
|
+
],
|
103
|
+
"enabled": true
|
104
|
+
},
|
105
|
+
{
|
106
|
+
"id": "5425034033205580637",
|
107
|
+
"type": "field",
|
108
|
+
"outboundTag": "direct",
|
109
|
+
"ip": [
|
110
|
+
"geoip:private",
|
111
|
+
"geoip:cn",
|
112
|
+
"geoip:ir"
|
113
|
+
],
|
114
|
+
"enabled": true
|
115
|
+
},
|
116
|
+
{
|
117
|
+
"id": "5627785659655799759",
|
118
|
+
"type": "field",
|
119
|
+
"port": "0-65535",
|
120
|
+
"outboundTag": "proxy",
|
121
|
+
"enabled": true
|
122
|
+
}
|
123
|
+
]
|
124
|
+
}
|
125
|
+
}
|
hiddifypanel/panel/user/user.py
CHANGED
@@ -54,6 +54,14 @@ class UserView(FlaskView):
|
|
54
54
|
def sub64(self):
|
55
55
|
return self.all_configs(base64=True)
|
56
56
|
|
57
|
+
@route("/xray/")
|
58
|
+
@route("/xray")
|
59
|
+
@login_required(roles={Role.user})
|
60
|
+
def xray(self):
|
61
|
+
c = c = get_common_data(g.account.uuid, mode="new")
|
62
|
+
configs = hutils.proxy.xrayjson.configs_as_json(c['domains'], c['profile_title'])
|
63
|
+
return add_headers(configs, c, 'application/json')
|
64
|
+
|
57
65
|
@route("/singbox/")
|
58
66
|
@route("/singbox")
|
59
67
|
@login_required(roles={Role.user})
|
@@ -189,7 +197,7 @@ class UserView(FlaskView):
|
|
189
197
|
if request.method == 'HEAD':
|
190
198
|
resp = ""
|
191
199
|
else:
|
192
|
-
resp = hutils.proxy.singbox.
|
200
|
+
resp = hutils.proxy.singbox.configs_as_json(**c)
|
193
201
|
|
194
202
|
return add_headers(resp, c, 'application/json')
|
195
203
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -9,13 +9,15 @@
|
|
9
9
|
{% block nav_bar %}
|
10
10
|
{% include "donation.html" %}
|
11
11
|
<!-- Navbar -->
|
12
|
-
<nav class="main-header hold-transition sidebar-mini-md navbar navbar-expand {{" navbar-dark" if g.darkmode
|
12
|
+
<nav class="main-header hold-transition sidebar-mini-md navbar navbar-expand {{" navbar-dark" if g.darkmode
|
13
|
+
else "bg-white navbar-light" }} border-bottom">
|
13
14
|
<!-- Left navbar links -->
|
14
15
|
|
15
16
|
|
16
17
|
|
17
18
|
<div class="navbar-nav">
|
18
|
-
<a class="nav-link" data-widget="pushmenu" href="#"><i class="fa fa-bars"></i> <span
|
19
|
+
<a class="nav-link" data-widget="pushmenu" href="#"><i class="fa fa-bars"></i> <span
|
20
|
+
class="brand-text font-weight-light">{{_("master.page-title")}}
|
19
21
|
<!-- <span class="badge d-none d-sm-inline-block">{{version}}</span> -->
|
20
22
|
{% if hconfig(ConfigEnum.is_parent) %}
|
21
23
|
{{_("Parent Panel")}}
|
@@ -24,7 +26,8 @@
|
|
24
26
|
{% endif %}
|
25
27
|
</a>
|
26
28
|
<a class="nav-link" href="https://github.com/hiddify/Hiddify-Manager/" target="_blank">
|
27
|
-
<img alt="GitHub Repo stars"
|
29
|
+
<img alt="GitHub Repo stars"
|
30
|
+
src="https://img.shields.io/github/stars/hiddify/hiddify-manager?style=social&logo=star&label=%E2%AD%90">
|
28
31
|
|
29
32
|
</a>
|
30
33
|
</div>
|
@@ -41,7 +44,8 @@
|
|
41
44
|
{% if 0 and not hconfig(ConfigEnum.is_parent) %}
|
42
45
|
|
43
46
|
|
44
|
-
<a class="nav-link btn btn-outline-secondary form_post d-none d-md-flex"
|
47
|
+
<a class="nav-link btn btn-outline-secondary form_post d-none d-md-flex"
|
48
|
+
href="{{hurl_for('admin.Actions:apply_configs')}}">
|
45
49
|
{{icon('solid','bolt','nav-icon')}} {{_('admin.Actions:apply_configs')}}
|
46
50
|
</a>
|
47
51
|
|
@@ -58,8 +62,10 @@
|
|
58
62
|
<aside id="main-sidebar" class="main-sidebar {{ " sidebar-dark-primary"}} elevation-4">
|
59
63
|
<!-- Brand Logo -->
|
60
64
|
|
61
|
-
<a href="https://github.com/hiddify/hiddify-manager/wiki" class=""
|
62
|
-
|
65
|
+
<a href="https://github.com/hiddify/hiddify-manager/wiki" class=""
|
66
|
+
style="text-align: center; color: white;display: block;">
|
67
|
+
<img src="{{static_url_for(filename='images/WhiteLogo.png')}}" class=" "
|
68
|
+
style="width: 50%;opacity: .8;margin: auto;display:block" />
|
63
69
|
<div class="ltr" style="font-size: 8pt;">{{version}}</div>
|
64
70
|
{% if False and hconfig(ConfigEnum.is_parent) %}
|
65
71
|
<br>
|
@@ -107,7 +113,8 @@
|
|
107
113
|
request.endpoint or "Dashboard" in request.endpoint) else True %}
|
108
114
|
<li class="nav-item {{'menu-open' if settings_active else ''}}">
|
109
115
|
|
110
|
-
<a id=href="#" data-target="#setting-sidebar"
|
116
|
+
<a id=href="#" data-target="#setting-sidebar"
|
117
|
+
class="nav-link">{{icon('solid','gear','nav-icon')+_('admin.menu.config')}}</a>
|
111
118
|
|
112
119
|
</li>
|
113
120
|
{% endif %}
|
@@ -122,17 +129,21 @@
|
|
122
129
|
{% if g.account.mode=="super_admin" %}
|
123
130
|
<li class="nav-item {{'menu-open' if action_active else ''}}">
|
124
131
|
|
125
|
-
<a id=href="#" data-target="#action-sidebar"
|
132
|
+
<a id=href="#" data-target="#action-sidebar"
|
133
|
+
class="nav-link">{{icon('solid','suitcase','nav-icon')+_('admin.actions.title')}} <i
|
134
|
+
class="right fas fa-angle-left"></i></a>
|
126
135
|
|
127
136
|
</li>
|
128
137
|
{% endif %}
|
129
138
|
|
130
139
|
<li class="nav-item">
|
131
140
|
<a href="https://github.com/hiddify/hiddify-manager/wiki/{{'%D9%87%D9%85%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%E2%80%8C%D9%87%D8%A7-%D9%88-%D9%88%DB%8C%D8%AF%D8%A6%D9%88%D9%87%D8%A7' if get_locale()=='fa' else 'All-tutorials-and-videos'}}"
|
132
|
-
target="_blank"
|
141
|
+
target="_blank"
|
142
|
+
class=" nav-link">{{icon('solid','circle-question','nav-icon')+_('admin.menu.support')}}</a>
|
133
143
|
</li>
|
134
144
|
<li class="nav-item d-none">
|
135
|
-
<a href="https://t.me/hiddify" target="_blank"
|
145
|
+
<a href="https://t.me/hiddify" target="_blank"
|
146
|
+
class="nav-link">{{icon('brands','telegram','nav-icon')+_('admin.menu.telegram')}}</a>
|
136
147
|
</li>
|
137
148
|
<li class="nav-item">
|
138
149
|
{% set issue_link = generate_github_issue_link_for_admin_sidebar() %}
|
@@ -206,7 +217,7 @@
|
|
206
217
|
{% endif %}
|
207
218
|
|
208
219
|
{% if g.account.mode=="super_admin" %}
|
209
|
-
{{
|
220
|
+
{{render_nav_item(proxy_stats_url(),icon('solid','feed','nav-icon')+_('admin.menu.proxy_stats'),_use_li=True)}}
|
210
221
|
{% endif %}
|
211
222
|
|
212
223
|
</div>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<html>
|
6
6
|
|
7
7
|
<head>
|
8
|
-
<title>{% block title %}{% endblock %}| {{_("master.page-title")}}</title>
|
8
|
+
<title>{% block title %}{% endblock %} | {{_("master.page-title")}}</title>
|
9
9
|
{% block head_meta %}
|
10
10
|
<meta name="robots" content="noindex, nofollow">
|
11
11
|
<meta name="googlebot" content="noindex, nofollow">
|
@@ -20,25 +20,35 @@
|
|
20
20
|
{% else %}
|
21
21
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
22
22
|
{% endif %}
|
23
|
-
<link href="{{static_url_for(filename='images/splash/iphone5_splash.png')}}"
|
23
|
+
<link href="{{static_url_for(filename='images/splash/iphone5_splash.png')}}"
|
24
|
+
media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
24
25
|
rel="apple-touch-startup-image" />
|
25
|
-
<link href="{{static_url_for(filename='images/splash/iphone6_splash.png')}}"
|
26
|
+
<link href="{{static_url_for(filename='images/splash/iphone6_splash.png')}}"
|
27
|
+
media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
26
28
|
rel="apple-touch-startup-image" />
|
27
|
-
<link href="{{static_url_for(filename='images/splash/iphoneplus_splash.png')}}"
|
29
|
+
<link href="{{static_url_for(filename='images/splash/iphoneplus_splash.png')}}"
|
30
|
+
media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
|
28
31
|
rel="apple-touch-startup-image" />
|
29
|
-
<link href="{{static_url_for(filename='images/splash/iphonex_splash.png')}}"
|
32
|
+
<link href="{{static_url_for(filename='images/splash/iphonex_splash.png')}}"
|
33
|
+
media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
|
30
34
|
rel="apple-touch-startup-image" />
|
31
|
-
<link href="{{static_url_for(filename='images/splash/iphonexr_splash.png')}}"
|
35
|
+
<link href="{{static_url_for(filename='images/splash/iphonexr_splash.png')}}"
|
36
|
+
media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
32
37
|
rel="apple-touch-startup-image" />
|
33
|
-
<link href="{{static_url_for(filename='images/splash/iphonexsmax_splash.png')}}"
|
38
|
+
<link href="{{static_url_for(filename='images/splash/iphonexsmax_splash.png')}}"
|
39
|
+
media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
|
34
40
|
rel="apple-touch-startup-image" />
|
35
|
-
<link href="{{static_url_for(filename='images/splash/ipad_splash.png')}}"
|
41
|
+
<link href="{{static_url_for(filename='images/splash/ipad_splash.png')}}"
|
42
|
+
media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
36
43
|
rel="apple-touch-startup-image" />
|
37
|
-
<link href="{{static_url_for(filename='images/splash/ipadpro1_splash.png')}}"
|
44
|
+
<link href="{{static_url_for(filename='images/splash/ipadpro1_splash.png')}}"
|
45
|
+
media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
38
46
|
rel="apple-touch-startup-image" />
|
39
|
-
<link href="{{static_url_for(filename='images/splash/ipadpro3_splash.png')}}"
|
47
|
+
<link href="{{static_url_for(filename='images/splash/ipadpro3_splash.png')}}"
|
48
|
+
media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
40
49
|
rel="apple-touch-startup-image" />
|
41
|
-
<link href="{{static_url_for(filename='images/splash/ipadpro2_splash.png')}}"
|
50
|
+
<link href="{{static_url_for(filename='images/splash/ipadpro2_splash.png')}}"
|
51
|
+
media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
|
42
52
|
rel="apple-touch-startup-image" />
|
43
53
|
<link rel="icon" type="image/x-icon" href="{{ static_url_for( filename='images/favicon.ico')}}">
|
44
54
|
<link rel="manifest" href="{{ hurl_for('common_bp.LoginView:create_pwa_manifest',secret_uuid=g.account.uuid or '')}}">
|
@@ -60,7 +70,8 @@
|
|
60
70
|
<link rel="stylesheet" href="{{static_url_for(filename='plugins/datatables/extensions/Responsive/css/responsive.bootstrap4.min.css')}}"> -->
|
61
71
|
|
62
72
|
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.2/css/dataTables.bootstrap4.min.css">
|
63
|
-
<link rel="stylesheet" type="text/css"
|
73
|
+
<link rel="stylesheet" type="text/css"
|
74
|
+
href="https://cdn.datatables.net/responsive/2.4.0/css/responsive.bootstrap4.min.css">
|
64
75
|
|
65
76
|
<link rel="stylesheet" href="{{ static_url_for( filename='css/custom.css',version=5.23 ) }}">
|
66
77
|
{% if get_locale()=='fa' %}
|
@@ -79,8 +90,11 @@
|
|
79
90
|
|
80
91
|
<body class="hold-transition layout-fixed {{" dark-mode" if g.darkmode else "" }} {% block bodyclass %}sidebar-collapse{%endblock%}">
|
81
92
|
<div id="splash_screen">
|
82
|
-
<center>
|
83
|
-
|
93
|
+
<center>
|
94
|
+
|
95
|
+
<img src="{{static_url_for( filename='images/hiddify.png' )}}" />
|
96
|
+
|
97
|
+
|
84
98
|
<a href="https://github.com/hiddify/hiddify-manager/wiki">
|
85
99
|
<h1 class="title">{{_('user.home.title')}}</h1><br>Powered by hiddify.com
|
86
100
|
</a>
|
@@ -138,18 +152,21 @@
|
|
138
152
|
<footer class="main-footer d-flex flex-wrap justify-content-between align-items-center " dir="ltr">
|
139
153
|
<div class="nav col-md-8 d-flex align-items-center">
|
140
154
|
|
141
|
-
<strong><span class="mb-3 mb-md-0 text-muted">© 2023 Hiddify {{"Central" if hconfig(ConfigEnum.is_parent) else
|
155
|
+
<strong><span class="mb-3 mb-md-0 text-muted">© 2023 Hiddify {{"Central" if hconfig(ConfigEnum.is_parent) else
|
156
|
+
""}} <span class="badge">{{version}}</span>
|
142
157
|
</span>
|
143
158
|
</strong>
|
144
159
|
</div>
|
145
160
|
|
146
161
|
<ul class="nav col-md-4 justify-content-end list-unstyled d-flex">
|
147
|
-
<li class="ms-3"><a class="text-secondary" href="https://github.com/hiddify/hiddify-manager/wiki"><i
|
162
|
+
<li class="ms-3"><a class="text-secondary" href="https://github.com/hiddify/hiddify-manager/wiki"><i
|
163
|
+
class="fa-brands fa-github"></i></a></li>
|
148
164
|
<li class="ms-3"><a class="text-danger" href="https://youtube.com/@hiddify/videos">
|
149
165
|
<i class="fa-brands fa-square-youtube fa-margin"></i> </a></li>
|
150
166
|
<li class="ms-3"><a class="text-primary" href="https://twitter.com/intent/follow?screen_name=hiddify_com">
|
151
167
|
<i class="fa-brands fa-square-twitter fa-margin"></i> </a></li>
|
152
|
-
<li class="ms-3"><a class="text-primary" href="https://t.me/hiddify"> <i
|
168
|
+
<li class="ms-3"><a class="text-primary" href="https://t.me/hiddify"> <i
|
169
|
+
class="fa-brands fa-telegram fa-margin"></i> </a></li>
|
153
170
|
</ul>
|
154
171
|
|
155
172
|
</footer>
|
@@ -159,7 +176,8 @@
|
|
159
176
|
</div>
|
160
177
|
<!-- ./wrapper -->
|
161
178
|
|
162
|
-
{#modal("guide-modal","","<video id='guide-video' controls
|
179
|
+
{#modal("guide-modal","","<video id='guide-video' controls
|
180
|
+
style='max-height: 100%; max-width: 100%;width: auto; height: auto;'>
|
163
181
|
<source id='guide-video-mp4' type='video/mp4'>
|
164
182
|
</video>")#}
|
165
183
|
|
@@ -176,9 +194,12 @@
|
|
176
194
|
<div class="modal-body">
|
177
195
|
<center>
|
178
196
|
<div class="btn-group">
|
179
|
-
<a id='qrcode-link' class="btn btn-primary copy-link" href=""><i class="fa-regular fa-copy"></i>
|
180
|
-
|
181
|
-
<a
|
197
|
+
<a id='qrcode-link' class="btn btn-primary copy-link" href=""><i class="fa-regular fa-copy"></i>
|
198
|
+
{{_("copy")}} </a>
|
199
|
+
<a id="share-link-redirect" class="btn btn-success copy-link" href=""><i
|
200
|
+
class="fa-solid fa-share-from-square"></i> {{_('clickable copy')}}</a>
|
201
|
+
<a target="_blank" id="share-link-open" class="btn btn-secondary" href=""><i
|
202
|
+
class="fa-solid fa-arrow-up-right-from-square"></i> {{_('open')}}</a>
|
182
203
|
</div>
|
183
204
|
<br />
|
184
205
|
<div id="qrcode" style="margin:10px;padding:10px;"></div>
|
@@ -204,7 +225,7 @@
|
|
204
225
|
wrappers[i].style.display = 'initial';
|
205
226
|
}
|
206
227
|
|
207
|
-
},
|
228
|
+
}, document.URL.indexOf("pwa") > 0 ? 0 : 1000);
|
208
229
|
|
209
230
|
</script>
|
210
231
|
<!-- jQuery -->
|
@@ -217,7 +238,7 @@
|
|
217
238
|
|
218
239
|
<script src="{{ static_url_for( filename='js/moment.min.js' ) }}"></script>
|
219
240
|
<script src="{{ static_url_for( filename='js/bootbox.all.min.js' ) }}"></script>
|
220
|
-
<script src="{{ static_url_for( filename="plugins/select2/select2.min.js" ) }}"></script>
|
241
|
+
<script src="{{ static_url_for( filename=" plugins/select2/select2.min.js" ) }}"></script>
|
221
242
|
|
222
243
|
|
223
244
|
|
@@ -229,8 +250,10 @@
|
|
229
250
|
|
230
251
|
<script src="{{ static_url_for( filename='plugins/datatables/jquery.dataTables.min.js' ) }}"></script>
|
231
252
|
<script src="{{ static_url_for( filename='plugins/datatables/dataTables.bootstrap4.js' ) }}"></script>
|
232
|
-
<script
|
233
|
-
|
253
|
+
<script
|
254
|
+
src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js' ) }}"></script>
|
255
|
+
<script
|
256
|
+
src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/responsive.bootstrap4.min.js' ) }}"></script>
|
234
257
|
|
235
258
|
<!-- <script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.13.2/js/jquery.dataTables.min.js"></script>
|
236
259
|
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.13.2/js/dataTables.bootstrap4.min.js"></script>
|
Binary file
|