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.
Files changed (48) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/auth.py +15 -5
  4. hiddifypanel/hutils/encode.py +0 -1
  5. hiddifypanel/hutils/proxy/__init__.py +1 -0
  6. hiddifypanel/hutils/proxy/shared.py +20 -10
  7. hiddifypanel/hutils/proxy/singbox.py +47 -46
  8. hiddifypanel/hutils/proxy/xray.py +39 -23
  9. hiddifypanel/hutils/proxy/xrayjson.py +391 -0
  10. hiddifypanel/hutils/random.py +4 -0
  11. hiddifypanel/models/config.py +7 -2
  12. hiddifypanel/models/config_enum.py +9 -5
  13. hiddifypanel/panel/admin/DomainAdmin.py +3 -2
  14. hiddifypanel/panel/admin/SettingAdmin.py +22 -11
  15. hiddifypanel/panel/admin/templates/model/user_list.html +44 -20
  16. hiddifypanel/panel/commercial/restapi/v1/tgmsg.py +14 -10
  17. hiddifypanel/panel/commercial/restapi/v2/user/apps_api.py +17 -23
  18. hiddifypanel/panel/common_bp/login.py +2 -2
  19. hiddifypanel/panel/init_db.py +1 -1
  20. hiddifypanel/panel/user/templates/base_xray_config.json.j2 +125 -0
  21. hiddifypanel/panel/user/user.py +9 -1
  22. hiddifypanel/static/images/hiddify.png +0 -0
  23. hiddifypanel/static/images/hiddify1.png +0 -0
  24. hiddifypanel/static/new/assets/hiddify-logo-7617d937.png +0 -0
  25. hiddifypanel/static/new/assets/hiddify-logo-7617d937_old.png +0 -0
  26. hiddifypanel/templates/admin-layout.html +22 -11
  27. hiddifypanel/templates/master.html +48 -25
  28. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  29. hiddifypanel/translations/en/LC_MESSAGES/messages.po +28 -22
  30. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  31. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +15 -11
  32. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  33. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +8 -8
  34. hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
  35. hiddifypanel/translations/ru/LC_MESSAGES/messages.po +111 -53
  36. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  37. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +108 -58
  38. hiddifypanel/translations.i18n/en.json +18 -17
  39. hiddifypanel/translations.i18n/fa.json +7 -6
  40. hiddifypanel/translations.i18n/pt.json +3 -2
  41. hiddifypanel/translations.i18n/ru.json +53 -52
  42. hiddifypanel/translations.i18n/zh.json +58 -57
  43. {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/METADATA +1 -1
  44. {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/RECORD +48 -44
  45. {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/LICENSE.md +0 -0
  46. {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/WHEEL +0 -0
  47. {hiddifypanel-10.11.0.dist-info → hiddifypanel-10.12.0.dist-info}/entry_points.txt +0 -0
  48. {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
- if hutils.convert.is_int(identifier):
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
- elif identifier == 'all':
57
+ if identifier == 'all':
53
58
  return query.all()
54
- elif identifier == 'expired':
59
+ if identifier == 'expired':
55
60
  return [u for u in query.all() if not u.is_active]
56
- elif identifier == 'active':
61
+ if identifier == 'active':
57
62
  return [u for u in query.all() if u.is_active]
58
- elif identifier == 'offline 1h':
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
- elif identifier == 'offline 1d':
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
- elif identifier == 'offline 1w':
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
- else:
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
- if isinstance(platform, list):
351
- for p in platform:
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}x64.dmg'
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/hiddify-android-universal.apk'
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/hiddify-windows-x64-setup.zip'
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/hiddify-windows-x64-portable.zip'
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/hiddify-linux-x64.zip'
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/hiddify-macos-universal.zip'
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
- return redirect(hurl_for('client.UserView:index'))
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()
@@ -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, "python")
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
+ }
@@ -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.make_full_singbox_config(**c)
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
@@ -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 else "bg-white navbar-light" }} border-bottom">
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 class="brand-text font-weight-light">{{_("master.page-title")}}
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" src="https://img.shields.io/github/stars/hiddify/hiddify-manager?style=social&logo=star&label=%E2%AD%90">
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" href="{{hurl_for('admin.Actions:apply_configs')}}">
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="" style="text-align: center; color: white;display: block;">
62
- <img src="{{static_url_for(filename='images/WhiteLogo.png')}}" class=" " style="width: 50%;opacity: .8;margin: auto;display:block" />
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" class="nav-link">{{icon('solid','gear','nav-icon')+_('admin.menu.config')}}</a>
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" class="nav-link">{{icon('solid','suitcase','nav-icon')+_('admin.actions.title')}} <i class="right fas fa-angle-left"></i></a>
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" class=" nav-link">{{icon('solid','circle-question','nav-icon')+_('admin.menu.support')}}</a>
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" class="nav-link">{{icon('brands','telegram','nav-icon')+_('admin.menu.telegram')}}</a>
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
- {{ render_nav_item(proxy_stats_url()+"#/proxies", icon('solid','feed','nav-icon')+_('admin.menu.proxy_stats'),_use_li=True) }}
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')}}" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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')}}" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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')}}" media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
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')}}" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
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')}}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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')}}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
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')}}" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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')}}" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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')}}" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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')}}" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
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" href="https://cdn.datatables.net/responsive/2.4.0/css/responsive.bootstrap4.min.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
- <img src="{{static_url_for( filename='images/hiddify.png')}}" />
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 ""}} <span class="badge">{{version}}</span>
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 class="fa-brands fa-github"></i></a></li>
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
  &nbsp; <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
  &nbsp; <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">&nbsp; <i class="fa-brands fa-telegram fa-margin"></i> </a></li>
168
+ <li class="ms-3"><a class="text-primary" href="https://t.me/hiddify">&nbsp; <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 style='max-height: 100%; max-width: 100%;width: auto; height: auto;'>
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> {{_("copy")}} </a>
180
- <a id="share-link-redirect" class="btn btn-success copy-link" href=""><i class="fa-solid fa-share-from-square"></i> {{_('clickable copy')}}</a>
181
- <a target="_blank" id="share-link-open" class="btn btn-secondary" href=""><i class="fa-solid fa-arrow-up-right-from-square"></i> {{_('open')}}</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
- }, '{{g.is_admin}}' == 'True' || document.URL.indexOf("pwa") > 0 ? 0 : 1000);
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 src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js' ) }}"></script>
233
- <script src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/responsive.bootstrap4.min.js' ) }}"></script>
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>