hiddifypanel 9.0.0.dev90__py3-none-any.whl → 10.5.0.dev0__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 (152) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/auth.py +30 -9
  4. hiddifypanel/base.py +60 -52
  5. hiddifypanel/cache.py +43 -25
  6. hiddifypanel/database.py +9 -0
  7. hiddifypanel/drivers/abstract_driver.py +2 -0
  8. hiddifypanel/drivers/singbox_api.py +17 -15
  9. hiddifypanel/drivers/ssh_liberty_bridge_api.py +3 -1
  10. hiddifypanel/drivers/user_driver.py +12 -6
  11. hiddifypanel/drivers/wireguard_api.py +7 -2
  12. hiddifypanel/drivers/xray_api.py +14 -9
  13. hiddifypanel/hutils/__init__.py +4 -0
  14. hiddifypanel/hutils/convert.py +13 -2
  15. hiddifypanel/hutils/crypto.py +48 -0
  16. hiddifypanel/hutils/encode.py +4 -1
  17. hiddifypanel/hutils/flask.py +38 -5
  18. hiddifypanel/hutils/github_issue.py +1 -1
  19. hiddifypanel/hutils/importer/xui.py +5 -2
  20. hiddifypanel/{models/utils.py → hutils/model.py} +14 -4
  21. hiddifypanel/hutils/network/auto_ip_selector.py +2 -0
  22. hiddifypanel/hutils/network/net.py +46 -2
  23. hiddifypanel/hutils/node/__init__.py +3 -0
  24. hiddifypanel/hutils/node/api_client.py +76 -0
  25. hiddifypanel/hutils/node/child.py +147 -0
  26. hiddifypanel/hutils/node/parent.py +100 -0
  27. hiddifypanel/hutils/node/shared.py +65 -0
  28. hiddifypanel/hutils/proxy/__init__.py +5 -0
  29. hiddifypanel/hutils/proxy/clash.py +161 -0
  30. hiddifypanel/hutils/proxy/shared.py +434 -0
  31. hiddifypanel/hutils/proxy/singbox.py +339 -0
  32. hiddifypanel/hutils/proxy/xray.py +235 -0
  33. hiddifypanel/hutils/proxy/xrayjson.py +391 -0
  34. hiddifypanel/hutils/random.py +4 -0
  35. hiddifypanel/hutils/utils.py +4 -1
  36. hiddifypanel/models/__init__.py +2 -2
  37. hiddifypanel/models/admin.py +31 -17
  38. hiddifypanel/models/base_account.py +7 -7
  39. hiddifypanel/models/child.py +30 -16
  40. hiddifypanel/models/config.py +45 -16
  41. hiddifypanel/models/config_enum.py +68 -17
  42. hiddifypanel/models/domain.py +28 -20
  43. hiddifypanel/models/parent_domain.py +2 -2
  44. hiddifypanel/models/proxy.py +29 -20
  45. hiddifypanel/models/report.py +2 -3
  46. hiddifypanel/models/usage.py +2 -2
  47. hiddifypanel/models/user.py +33 -22
  48. hiddifypanel/panel/admin/Actions.py +13 -19
  49. hiddifypanel/panel/admin/AdminstratorAdmin.py +14 -3
  50. hiddifypanel/panel/admin/Dashboard.py +5 -10
  51. hiddifypanel/panel/admin/DomainAdmin.py +35 -48
  52. hiddifypanel/panel/admin/NodeAdmin.py +6 -2
  53. hiddifypanel/panel/admin/ProxyAdmin.py +6 -5
  54. hiddifypanel/panel/admin/QuickSetup.py +21 -20
  55. hiddifypanel/panel/admin/SettingAdmin.py +107 -62
  56. hiddifypanel/panel/admin/UserAdmin.py +22 -21
  57. hiddifypanel/panel/admin/templates/index.html +1 -1
  58. hiddifypanel/panel/admin/templates/model/user_list.html +44 -20
  59. hiddifypanel/panel/admin/templates/parent_dash.html +2 -4
  60. hiddifypanel/panel/admin/templates/result.html +2 -3
  61. hiddifypanel/panel/cf_api.py +1 -2
  62. hiddifypanel/panel/cli.py +16 -16
  63. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +16 -12
  64. hiddifypanel/panel/commercial/__init__.py +7 -5
  65. hiddifypanel/panel/commercial/restapi/v1/__init__.py +1 -1
  66. hiddifypanel/panel/commercial/restapi/v1/tgbot.py +1 -1
  67. hiddifypanel/panel/commercial/restapi/v1/tgmsg.py +14 -10
  68. hiddifypanel/panel/commercial/restapi/v2/admin/__init__.py +0 -5
  69. hiddifypanel/panel/commercial/restapi/v2/admin/admin_info_api.py +2 -2
  70. hiddifypanel/panel/commercial/restapi/v2/admin/admin_log_api.py +4 -5
  71. hiddifypanel/panel/commercial/restapi/v2/admin/admin_user_api.py +8 -25
  72. hiddifypanel/panel/commercial/restapi/v2/admin/admin_users_api.py +4 -4
  73. hiddifypanel/panel/commercial/restapi/v2/admin/schema.py +157 -0
  74. hiddifypanel/panel/commercial/restapi/v2/admin/server_status_api.py +3 -3
  75. hiddifypanel/panel/commercial/restapi/v2/admin/user_api.py +9 -66
  76. hiddifypanel/panel/commercial/restapi/v2/admin/users_api.py +1 -1
  77. hiddifypanel/panel/commercial/restapi/v2/child/__init__.py +18 -0
  78. hiddifypanel/panel/commercial/restapi/v2/child/actions.py +63 -0
  79. hiddifypanel/panel/commercial/restapi/v2/child/register_parent_api.py +34 -0
  80. hiddifypanel/panel/commercial/restapi/v2/child/schema.py +7 -0
  81. hiddifypanel/panel/commercial/restapi/v2/child/sync_parent_api.py +21 -0
  82. hiddifypanel/panel/commercial/restapi/v2/panel/__init__.py +13 -0
  83. hiddifypanel/panel/commercial/restapi/v2/panel/info.py +18 -0
  84. hiddifypanel/panel/commercial/restapi/v2/panel/ping_pong.py +23 -0
  85. hiddifypanel/panel/commercial/restapi/v2/panel/schema.py +7 -0
  86. hiddifypanel/panel/commercial/restapi/v2/parent/__init__.py +16 -0
  87. hiddifypanel/panel/commercial/restapi/v2/parent/register_api.py +65 -0
  88. hiddifypanel/panel/commercial/restapi/v2/parent/schema.py +115 -0
  89. hiddifypanel/panel/commercial/restapi/v2/parent/status_api.py +26 -0
  90. hiddifypanel/panel/commercial/restapi/v2/parent/sync_api.py +53 -0
  91. hiddifypanel/panel/commercial/restapi/v2/parent/usage_api.py +57 -0
  92. hiddifypanel/panel/commercial/restapi/v2/user/apps_api.py +17 -23
  93. hiddifypanel/panel/commercial/restapi/v2/user/configs_api.py +23 -26
  94. hiddifypanel/panel/commercial/telegrambot/admin.py +1 -2
  95. hiddifypanel/panel/common.py +25 -8
  96. hiddifypanel/panel/common_bp/login.py +2 -2
  97. hiddifypanel/panel/hiddify.py +22 -185
  98. hiddifypanel/panel/init_db.py +102 -55
  99. hiddifypanel/panel/usage.py +33 -18
  100. hiddifypanel/panel/user/__init__.py +0 -1
  101. hiddifypanel/panel/user/templates/all_configs copy.txt +2 -2
  102. hiddifypanel/panel/user/templates/all_configs.txt +2 -2
  103. hiddifypanel/panel/user/templates/base_singbox_config.json.j2 +2 -1
  104. hiddifypanel/panel/user/templates/base_xray_config.json.j2 +125 -0
  105. hiddifypanel/panel/user/templates/clash_config copy.yml +1 -1
  106. hiddifypanel/panel/user/templates/clash_config.yml +4 -4
  107. hiddifypanel/panel/user/templates/clash_proxies.yml +1 -1
  108. hiddifypanel/panel/user/templates/home/all-configs.html +2 -2
  109. hiddifypanel/panel/user/templates/home/all-configs_old.html +1 -1
  110. hiddifypanel/panel/user/templates/home/ios copy.html +2 -2
  111. hiddifypanel/panel/user/templates/home/usage.html +1 -1
  112. hiddifypanel/panel/user/templates/new.html +2 -2
  113. hiddifypanel/panel/user/user.py +56 -50
  114. hiddifypanel/static/css/custom.css +31 -0
  115. hiddifypanel/static/images/favicon.ico +0 -0
  116. hiddifypanel/static/images/hiddify-old.png +0 -0
  117. hiddifypanel/static/images/hiddify.png +0 -0
  118. hiddifypanel/static/images/hiddify2.png +0 -0
  119. hiddifypanel/static/new/assets/{index-1b891a7c.js → index-ccb9873c.js} +56 -56
  120. hiddifypanel/static/new/assets/index-fa00de9a.css +1 -0
  121. hiddifypanel/static/new/i18n/en.json +6 -6
  122. hiddifypanel/static/new/i18n/fa.json +2 -2
  123. hiddifypanel/templates/admin-layout.html +30 -43
  124. hiddifypanel/templates/fake.html +0 -4
  125. hiddifypanel/templates/flaskadmin-layout.html +7 -3
  126. hiddifypanel/templates/master.html +11 -6
  127. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  128. hiddifypanel/translations/en/LC_MESSAGES/messages.po +2082 -1977
  129. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  130. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +2035 -1924
  131. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  132. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +1911 -1840
  133. hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
  134. hiddifypanel/translations/ru/LC_MESSAGES/messages.po +2036 -1881
  135. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  136. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +1857 -1720
  137. hiddifypanel/translations.i18n/en.json +992 -933
  138. hiddifypanel/translations.i18n/fa.json +994 -935
  139. hiddifypanel/translations.i18n/pt.json +994 -935
  140. hiddifypanel/translations.i18n/ru.json +994 -935
  141. hiddifypanel/translations.i18n/zh.json +971 -912
  142. {hiddifypanel-9.0.0.dev90.dist-info → hiddifypanel-10.5.0.dev0.dist-info}/METADATA +47 -47
  143. {hiddifypanel-9.0.0.dev90.dist-info → hiddifypanel-10.5.0.dev0.dist-info}/RECORD +147 -120
  144. {hiddifypanel-9.0.0.dev90.dist-info → hiddifypanel-10.5.0.dev0.dist-info}/WHEEL +1 -1
  145. hiddifypanel/panel/commercial/restapi/v2/DTO.py +0 -9
  146. hiddifypanel/panel/commercial/restapi/v2/hello/__init__.py +0 -16
  147. hiddifypanel/panel/commercial/restapi/v2/hello/hello.py +0 -32
  148. hiddifypanel/panel/user/link_maker.py +0 -1083
  149. hiddifypanel/static/new/assets/index-669b32c8.css +0 -1
  150. {hiddifypanel-9.0.0.dev90.dist-info → hiddifypanel-10.5.0.dev0.dist-info}/LICENSE.md +0 -0
  151. {hiddifypanel-9.0.0.dev90.dist-info → hiddifypanel-10.5.0.dev0.dist-info}/entry_points.txt +0 -0
  152. {hiddifypanel-9.0.0.dev90.dist-info → hiddifypanel-10.5.0.dev0.dist-info}/top_level.txt +0 -0
@@ -13,8 +13,8 @@
13
13
  <link rel="manifest" href="{{ url_for('common_bp.LoginView:create_pwa_manifest',secret_uuid=g.account.uuid or '')}}">
14
14
 
15
15
  <title>Hiddify | Panel</title>
16
- <script type="module" crossorigin src="../static/new/assets/index-1b891a7c.js"></script>
17
- <link rel="stylesheet" href="../static/new/assets/index-669b32c8.css">
16
+ <script type="module" crossorigin src="../static/new/assets/index-ccb9873c.js"></script>
17
+ <link rel="stylesheet" href="../static/new/assets/index-fa00de9a.css">
18
18
  </head>
19
19
  <body>
20
20
  <div id="root"></div>
@@ -5,7 +5,6 @@ import re
5
5
 
6
6
  from flask import render_template, request, Response, g
7
7
  from apiflask import abort
8
- from . import link_maker
9
8
  from flask_classful import FlaskView, route
10
9
  from urllib.parse import urlparse
11
10
  from flask_babel import gettext as _
@@ -16,7 +15,6 @@ from hiddifypanel.database import db
16
15
  from hiddifypanel.panel import hiddify
17
16
  from hiddifypanel.models import *
18
17
  from hiddifypanel import hutils
19
- from hiddifypanel import cache
20
18
 
21
19
 
22
20
  class UserView(FlaskView):
@@ -56,6 +54,14 @@ class UserView(FlaskView):
56
54
  def sub64(self):
57
55
  return self.all_configs(base64=True)
58
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
+
59
65
  @route("/singbox/")
60
66
  @route("/singbox")
61
67
  @login_required(roles={Role.user})
@@ -127,43 +133,43 @@ class UserView(FlaskView):
127
133
 
128
134
  return resp
129
135
 
130
- @ route('/report', methods=["POST"])
131
- @login_required(roles={Role.user})
132
- def report(self):
133
-
134
- # THE REPORT MODEL IS NOT COMPLETED YET.
135
-
136
- data = request.get_json()
137
- user_ip = hutils.network.auto_ip_selector.get_real_user_ip()
138
- report = Report()
139
- report.asn_id = hutils.network.auto_ip_selector.get_asn_id(user_ip)
140
- report.country = hutils.network.auto_ip_selector.get_country(user_ip)
141
-
142
- city_info = hutils.network.auto_ip_selector.get_city(user_ip)
143
- report.city = city_info['name']
144
- report.latitude = city_info['latitude']
145
- report.longitude = city_info['longitude']
146
- report.accuracy_radius = city_info['accuracy_radius']
147
-
148
- report.date = datetime.datetime.now()
149
- sub_update_time = data['sub_update_time']
150
- sub_url = data['sub_url']
151
-
152
- db.session.add(report)
153
- db.session.commit()
154
- proxy_map = {p.name: p.id for p in Proxy.query.all()}
155
-
156
- for name, ping in data['pings']:
157
- detail = ReportDetail()
158
- detail.report_id = report.id
159
- detail.proxy_id = proxy_map.get(name, -1)
160
- del proxy_map[name]
161
- if detail.proxy_id < 0:
162
- print("Error. Proxy not found!")
163
- continue
164
- detail.ping = ping
165
- db.session.add(detail)
166
- db.session.commit()
136
+ # @ route('/report', methods=["POST"])
137
+ # @login_required(roles={Role.user})
138
+ # def report(self):
139
+
140
+ # # THE REPORT MODEL IS NOT COMPLETED YET.
141
+
142
+ # data = request.get_json()
143
+ # user_ip = hutils.network.auto_ip_selector.get_real_user_ip()
144
+ # report = Report()
145
+ # report.asn_id = hutils.network.auto_ip_selector.get_asn_id(user_ip)
146
+ # report.country = hutils.network.auto_ip_selector.get_country(user_ip)
147
+
148
+ # city_info = hutils.network.auto_ip_selector.get_city(user_ip)
149
+ # report.city = city_info['name']
150
+ # report.latitude = city_info['latitude']
151
+ # report.longitude = city_info['longitude']
152
+ # report.accuracy_radius = city_info['accuracy_radius']
153
+
154
+ # report.date = datetime.datetime.now()
155
+ # sub_update_time = data['sub_update_time']
156
+ # sub_url = data['sub_url']
157
+
158
+ # db.session.add(report)
159
+ # db.session.commit()
160
+ # proxy_map = {p.name: p.id for p in Proxy.query.all()}
161
+
162
+ # for name, ping in data['pings']:
163
+ # detail = ReportDetail()
164
+ # detail.report_id = report.id
165
+ # detail.proxy_id = proxy_map.get(name, -1)
166
+ # del proxy_map[name]
167
+ # if detail.proxy_id < 0:
168
+ # print("Error. Proxy not found!")
169
+ # continue
170
+ # detail.ping = ping
171
+ # db.session.add(detail)
172
+ # db.session.commit()
167
173
 
168
174
  @ route('/clash/<typ>.yml', methods=["GET", "HEAD"])
169
175
  @ route('/clash/<meta_or_normal>/<typ>.yml', methods=["GET", "HEAD"])
@@ -191,7 +197,7 @@ class UserView(FlaskView):
191
197
  if request.method == 'HEAD':
192
198
  resp = ""
193
199
  else:
194
- resp = link_maker.make_full_singbox_config(**c)
200
+ resp = hutils.proxy.singbox.configs_as_json(**c)
195
201
 
196
202
  return add_headers(resp, c, 'application/json')
197
203
 
@@ -206,7 +212,7 @@ class UserView(FlaskView):
206
212
  if request.method == 'HEAD':
207
213
  resp = ""
208
214
  else:
209
- resp = render_template('singbox_config.json', **c, host_keys=hiddify.get_hostkeys(True),
215
+ resp = render_template('singbox_config.json', **c, host_keys=hutils.proxy.get_ssh_hostkeys(True),
210
216
  ssh_client_version=hiddify.get_ssh_client_version(user), ssh_ip=hutils.network.get_direct_host_or_ip(4), base64=False)
211
217
 
212
218
  return add_headers(resp, c)
@@ -222,7 +228,7 @@ class UserView(FlaskView):
222
228
  resp = ""
223
229
  else:
224
230
  # render_template('all_configs.txt', **c, base64=hutils.encode.do_base_64)
225
- resp = link_maker.make_v2ray_configs(**c)
231
+ resp = hutils.proxy.xray.make_v2ray_configs(**c)
226
232
 
227
233
  if base64:
228
234
  resp = hutils.encode.do_base_64(resp)
@@ -249,7 +255,7 @@ class UserView(FlaskView):
249
255
  # @cache.cache(ttl=300)
250
256
  def get_domain_information(no_domain=False, filter_domain=None, alternative=None):
251
257
  domains = []
252
- default_asn = request.args.get("asn")
258
+ default_asn = request.args.get("asn", '')
253
259
  if filter_domain:
254
260
  domain = filter_domain
255
261
  db_domain = Domain.query.filter(Domain.domain == domain).first() or Domain(
@@ -260,7 +266,7 @@ def get_domain_information(no_domain=False, filter_domain=None, alternative=None
260
266
  db_domain = Domain.query.filter(Domain.domain == domain).first()
261
267
 
262
268
  if not db_domain:
263
- parts = domain.split('.')
269
+ parts = domain.split('.') # TODO fix bug domain maybe null
264
270
  parts[0] = "*"
265
271
  domain_new = ".".join(parts)
266
272
  db_domain = Domain.query.filter(Domain.domain == domain_new).first()
@@ -284,19 +290,19 @@ def get_domain_information(no_domain=False, filter_domain=None, alternative=None
284
290
  # print("autocdn ip mode ", d.cdn_ip)
285
291
  if "*" in d.domain:
286
292
  d.domain = d.domain.replace("*", hutils.random.get_random_string(5, 15))
293
+
287
294
  if len(domains) == 0:
288
295
  domains = [Domain(id=0, domain=alternative, mode=DomainType.direct, cdn_ip='', show_domains=[], child_id=0)]
289
296
  domains[0].has_auto_ip = True
290
297
 
291
- return domains, has_auto_cdn
298
+ return domains, db_domain, has_auto_cdn
292
299
 
293
300
 
294
301
  def get_common_data(user_uuid, mode, no_domain=False, filter_domain=None):
295
302
  '''Usable for user account'''
296
303
  # uuid_secret=str(uuid.UUID(user_secret))
297
- domains, has_auto_cdn = get_domain_information(no_domain, filter_domain, urlparse(request.base_url).hostname)
298
- domains_valid = [d for d in domains if d.mode != DomainType.fake and d.mode != DomainType.reality]
299
- db_domain = domains_valid[0]
304
+ domains, db_domain, has_auto_cdn = get_domain_information(no_domain, filter_domain, request.host)
305
+
300
306
  domain = db_domain.domain
301
307
  user: User = g.account if g.account.uuid == user_uuid else User.by_uuid(f'{user_uuid}')
302
308
  if user is None:
@@ -340,11 +346,11 @@ def get_common_data(user_uuid, mode, no_domain=False, filter_domain=None):
340
346
  'hconfigs': get_hconfigs(),
341
347
  'hdomains': get_hdomains(),
342
348
  'ConfigEnum': ConfigEnum,
343
- 'link_maker': link_maker,
349
+ 'link_maker': hutils.proxy,
344
350
  'domains': domains,
345
351
  "bot": g.get('bot', None),
346
352
  "db_domain": db_domain,
347
- "telegram_enable": hiddify.is_telegram_proxy_enable(),
353
+ "telegram_enable": hiddify.is_telegram_proxy_enable(domains),
348
354
  "ip": user_ip,
349
355
  "ip_debug": hutils.network.auto_ip_selector.get_real_user_ip_debug(user_ip),
350
356
  "asn": asn,
@@ -537,4 +537,35 @@ div#qrcode img {
537
537
 
538
538
  .global-form .custom-switch {
539
539
  width: 100%;
540
+ }
541
+
542
+ td.col-is_active {
543
+ text-align: center !important;
544
+ padding: 0px;
545
+ }
546
+
547
+ td.col-uuid a {
548
+
549
+ text-overflow: ellipsis;
550
+ white-space: nowrap;
551
+ width: 80px;
552
+ overflow: hidden;
553
+ display: inline-block;
554
+ }
555
+
556
+ .select2-container {
557
+ display: none;
558
+ }
559
+
560
+
561
+ #main-sidebar .nav-sidebar>.nav-item>.nav-link {
562
+ color: white;
563
+ }
564
+
565
+ #main-sidebar .nav-sidebar>.nav-item>.nav-link:hover {
566
+ background: #007bff;
567
+ }
568
+
569
+ .dark-mode #main-sidebar .nav-sidebar>.nav-item>.nav-link:hover {
570
+ background: #3f6791;
540
571
  }
Binary file
Binary file
Binary file