hiddifypanel 10.60.0.dev0__py3-none-any.whl → 10.70.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 (36) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/hutils/flask.py +5 -5
  4. hiddifypanel/hutils/github_issue.py +9 -7
  5. hiddifypanel/hutils/proxy/clash.py +54 -28
  6. hiddifypanel/hutils/proxy/shared.py +10 -2
  7. hiddifypanel/hutils/proxy/singbox.py +9 -1
  8. hiddifypanel/hutils/proxy/xray.py +5 -5
  9. hiddifypanel/hutils/proxy/xrayjson.py +16 -12
  10. hiddifypanel/models/config_enum.py +1 -1
  11. hiddifypanel/panel/admin/SettingAdmin.py +4 -4
  12. hiddifypanel/panel/commercial/restapi/v2/user/configs_api.py +2 -2
  13. hiddifypanel/panel/common.py +2 -0
  14. hiddifypanel/panel/init_db.py +13 -3
  15. hiddifypanel/panel/user/user.py +1 -0
  16. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  17. hiddifypanel/translations/en/LC_MESSAGES/messages.po +4 -4
  18. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  19. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +4 -4
  20. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  21. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +4 -4
  22. hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
  23. hiddifypanel/translations/ru/LC_MESSAGES/messages.po +4 -4
  24. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  25. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +4 -4
  26. hiddifypanel/translations.i18n/en.json +4 -4
  27. hiddifypanel/translations.i18n/fa.json +4 -4
  28. hiddifypanel/translations.i18n/pt.json +4 -4
  29. hiddifypanel/translations.i18n/ru.json +4 -4
  30. hiddifypanel/translations.i18n/zh.json +4 -4
  31. {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/METADATA +1 -1
  32. {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/RECORD +36 -36
  33. {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/WHEEL +1 -1
  34. {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/LICENSE.md +0 -0
  35. {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/entry_points.txt +0 -0
  36. {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/top_level.txt +0 -0
hiddifypanel/VERSION CHANGED
@@ -1 +1 @@
1
- 10.60.0.dev0
1
+ 10.70.0
hiddifypanel/VERSION.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__='10.60.0.dev0'
1
+ __version__='10.70.0'
2
2
  from datetime import datetime
3
- __release_date__= datetime.strptime('2024-07-25','%Y-%m-%d')
3
+ __release_date__= datetime.strptime('2024-07-29','%Y-%m-%d')
@@ -51,7 +51,7 @@ def hurl_for(endpoint, **values):
51
51
  def get_user_agent() -> dict:
52
52
  ua = __parse_user_agent(request.user_agent.string)
53
53
 
54
- if ua.get('v', 1) < 6:
54
+ if ua.get('v', 1) < 7:
55
55
  __parse_user_agent.invalidate_all() # type:ignore
56
56
  ua = __parse_user_agent(request.user_agent.string)
57
57
  return ua
@@ -66,12 +66,12 @@ def __parse_user_agent(ua: str) -> dict:
66
66
  # Example: SFA/1.7.0 (239; sing-box 1.7.0)
67
67
  # Example: HiddifyNext/0.13.6 (android) like ClashMeta v2ray sing-box
68
68
 
69
- uaa = user_agents.parse(request.user_agent.string)
69
+ uaa = user_agents.parse(ua)
70
70
 
71
- match = re.search(ua_version_pattern, request.user_agent.string)
71
+ match = re.search(ua_version_pattern, ua)
72
72
  generic_version = list(map(int, match.group(1).split('.'))) if match else [0, 0, 0]
73
73
  res = {}
74
- res['v'] = 6
74
+ res['v'] = 7
75
75
  res["is_bot"] = uaa.is_bot
76
76
  res["is_browser"] = re.match('^Mozilla', ua, re.IGNORECASE) and True
77
77
  res['os'] = uaa.os.family
@@ -89,7 +89,7 @@ def __parse_user_agent(ua: str) -> dict:
89
89
  if res['is_singbox']:
90
90
  res['singbox_version'] = generic_version
91
91
 
92
- if ['is_hiddify']:
92
+ if res['is_hiddify']:
93
93
  res['hiddify_version'] = generic_version
94
94
  if generic_version[0] == 0 and generic_version[1] <= 14:
95
95
  res['singbox_version'] = [1, 7, 0]
@@ -137,12 +137,13 @@ def __github_issue_details() -> dict:
137
137
  def __remove_sensetive_data_from_github_issue_link(issue_link: str):
138
138
  from hiddifypanel.auth import current_account
139
139
  if current_account.uuid:
140
- issue_link.replace(f'{current_account.uuid}', '*******************')
140
+ issue_link = issue_link.replace(f'{current_account.uuid}', '*******************')
141
141
 
142
- issue_link.replace(request.host, '**********')
143
- issue_link.replace(hconfig(ConfigEnum.proxy_path), '**********')
144
- issue_link.replace(hconfig(ConfigEnum.proxy_path_admin), '**********')
145
- issue_link.replace(hconfig(ConfigEnum.proxy_path_client), '**********')
142
+ issue_link = issue_link.replace(request.host, '**********')
143
+ issue_link = issue_link.replace(hconfig(ConfigEnum.proxy_path), '**********')
144
+ issue_link = issue_link.replace(hconfig(ConfigEnum.proxy_path_admin), '**********')
145
+ issue_link = issue_link.replace(hconfig(ConfigEnum.proxy_path_client), '**********')
146
+ return issue_link
146
147
 
147
148
 
148
149
  def __remove_unrelated_traceback_details(stacktrace: str) -> str:
@@ -181,10 +182,11 @@ def generate_github_issue_link_for_500_error(error, traceback: str, remove_sense
181
182
  issue_body = render_template('github_issue_body.j2', issue_details=issue_details, error=error, traceback=traceback)
182
183
 
183
184
  # Create github issue link
184
- issue_link = __generate_github_issue_link(f"Internal server error: {error.name if hasattr(error,'name') and error.name != None and error.name else 'Unknown'}", issue_body)
185
+ issue_link = __generate_github_issue_link(
186
+ f"Internal server error: {error.name if hasattr(error,'name') and error.name != None and error.name else 'Unknown'}", issue_body)
185
187
 
186
188
  if remove_sensetive_data:
187
- __remove_sensetive_data_from_github_issue_link(issue_link)
189
+ issue_link = __remove_sensetive_data_from_github_issue_link(issue_link)
188
190
 
189
191
  return issue_link
190
192
 
@@ -29,17 +29,22 @@ def get_all_clash_configs(meta_or_normal, domains: list[Domain]):
29
29
  def to_clash(proxy, meta_or_normal):
30
30
 
31
31
  name = proxy['name']
32
- if proxy['l3'] == "kcp":
33
- return {'name': name, 'msg': "clash does not support kcp", 'type': 'debug'}
34
- if proxy['proto'] == "ssh":
35
- return {'name': name, 'msg': "clash does not support ssh", 'type': 'debug'}
32
+
33
+ if proxy['l3'] in ["kcp", ProxyL3.h3_quic]:
34
+ return {'name': name, 'msg': f"clash does not support {proxy['l3']}", 'type': 'debug'}
35
+ if proxy['transport'] in [ProxyTransport.splithttp, ProxyTransport.httpupgrade]:
36
+ return {'name': name, 'msg': f"clash does not support {proxy['transport']}", 'type': 'debug'}
37
+ # if proxy['proto'] in [Proxy.shado]:
38
+
36
39
  if meta_or_normal == "normal":
37
- if proxy['proto'] in ["vless", 'tuic', 'hysteria2']:
38
- return {'name': name, 'msg': f"{proxy['proto']} not supported in clash", 'type': 'debug'}
39
40
  if proxy.get('flow'):
40
41
  return {'name': name, 'msg': "xtls not supported in clash", 'type': 'debug'}
41
- if proxy['transport'] == "shadowtls":
42
- return {'name': name, 'msg': "shadowtls not supported in clash", 'type': 'debug'}
42
+ if proxy['proto'] in [ProxyProto.ssh, ProxyProto.wireguard, ProxyProto.tuic, ProxyProto.hysteria2]:
43
+ return {'name': name, 'msg': f"clash does not support {proxy['proto']}", 'type': 'debug'}
44
+ if proxy['proto'] in ["vless", 'tuic', 'hysteria2']:
45
+ return {'name': name, 'msg': f"{proxy['proto']} not supported in clash", 'type': 'debug'}
46
+ if proxy['transport'] in ["shadowtls", "splithttp"]:
47
+ return {'name': name, 'msg': f"{proxy['transport']} not supported in clash", 'type': 'debug'}
43
48
  if proxy['l3'] == ProxyL3.tls_h2 and proxy['proto'] in [ProxyProto.vmess, ProxyProto.vless] and proxy['dbe'].cdn == ProxyCDN.direct:
44
49
  return {'name': name, 'msg': "bug tls_h2 vmess and vless in clash meta", 'type': 'warning'}
45
50
  base = {}
@@ -48,7 +53,31 @@ def to_clash(proxy, meta_or_normal):
48
53
  base["type"] = str(proxy["proto"])
49
54
  base["server"] = proxy["server"]
50
55
  base["port"] = proxy["port"]
51
- base['alpn'] = proxy['alpn'].split(',')
56
+ if proxy["proto"] == "ssh":
57
+ base["username"] = proxy["uuid"]
58
+ base["private-key"] = proxy['private_key']
59
+ base["host-key"] = proxy.get('host_key', [])
60
+ return base
61
+ base["udp"] = True
62
+ if proxy["proto"] == ProxyProto.wireguard:
63
+ base["private-key"] = proxy["wg_pk"]
64
+ base["ip"] = f'{proxy["wg_ipv4"]}/32'
65
+ # base["ipv6"]
66
+ base["public-key"] = proxy["wg_server_pub"]
67
+ base["pre-shared-key"] = proxy["wg_psk"]
68
+ # base["allowed-ips"]
69
+ return base
70
+ if proxy["proto"] == ProxyProto.tuic:
71
+ # base['congestion_control'] = "cubic"
72
+ base['udp-relay-mode'] = 'native'
73
+ base['reduce-rtt'] = True
74
+ base["skip-cert-verify"] = proxy['allow_insecure']
75
+ base['sni'] = proxy['sni']
76
+ # base['heartbeat'] = "10s"
77
+ base['password'] = proxy['uuid']
78
+ base['uuid'] = proxy['uuid']
79
+ return base
80
+
52
81
  if proxy["proto"] == "ssr":
53
82
  base["cipher"] = proxy["cipher"]
54
83
  base["password"] = proxy["uuid"]
@@ -57,16 +86,6 @@ def to_clash(proxy, meta_or_normal):
57
86
  base["protocol"] = proxy["ssr-protocol"]
58
87
  base["obfs-param"] = proxy["fakedomain"]
59
88
  return base
60
- elif proxy["proto"] == "tuic":
61
- base["uuid"] = proxy["uuid"]
62
- base["password"] = proxy["uuid"]
63
- base["disable-sni"] = proxy['allow_insecure']
64
- base["reduce-rtt"] = True
65
- base["request-timeout"] = 8000
66
- base["udp-relay-mode"] = 'native'
67
- base["congestion-controller"] = 'cubic'
68
- base['sni'] = proxy['sni']
69
- return base
70
89
  elif proxy["proto"] in ["ss", "v2ray"]:
71
90
  base["cipher"] = proxy["cipher"]
72
91
  base["password"] = proxy["password"]
@@ -81,7 +100,7 @@ def to_clash(proxy, meta_or_normal):
81
100
  base["plugin"] = "shadow-tls"
82
101
  base["plugin-opts"] = {
83
102
  "host": proxy["fakedomain"],
84
- "password": proxy["proxy_path"],
103
+ "password": proxy["shared_secret"],
85
104
  "version": 3 # support 1/2/3
86
105
 
87
106
  }
@@ -97,16 +116,26 @@ def to_clash(proxy, meta_or_normal):
97
116
  "path": proxy["path"]
98
117
  }
99
118
  return base
100
- elif proxy["proto"] == "trojan":
119
+ base['alpn'] = proxy['alpn'].split(',')
120
+ base["skip-cert-verify"] = proxy["mode"] == "Fake"
121
+ if meta_or_normal == "meta" and proxy.get('fingerprint'):
122
+ base['client-fingerprint'] = proxy['fingerprint']
123
+
124
+ if proxy["proto"] == "trojan":
101
125
  base["password"] = proxy["uuid"]
102
126
  base["sni"] = proxy["sni"]
103
-
127
+ elif proxy["proto"] == "hysteria2":
128
+ base["password"] = proxy["uuid"]
129
+ base["obfs"] = "salamander"
130
+ base["obfs-password"] = proxy.get('hysteria_obfs_password')
131
+ return base
104
132
  else:
105
133
  base["uuid"] = proxy["uuid"]
106
134
  base["servername"] = proxy["sni"]
107
135
  base["tls"] = "tls" in proxy["l3"] or "reality" in proxy["l3"]
108
- if meta_or_normal == "meta":
109
- base['client-fingerprint'] = proxy['fingerprint']
136
+ if proxy["proto"] in ["vless", "vmess"]:
137
+ base["packet-encoding"] = "xudp"
138
+
110
139
  if proxy.get('flow'):
111
140
  base["flow"] = proxy['flow']
112
141
  # base["flow-show"] = True
@@ -114,11 +143,8 @@ def to_clash(proxy, meta_or_normal):
114
143
  if proxy["proto"] == "vmess":
115
144
  base["alterId"] = 0
116
145
  base["cipher"] = proxy["cipher"]
117
- base["udp"] = True
118
-
119
- base["skip-cert-verify"] = proxy["mode"] == "Fake"
120
146
 
121
- base["network"] = proxy["transport"]
147
+ base["network"] = str(proxy["transport"])
122
148
 
123
149
  if base["network"] == "ws":
124
150
  base["ws-opts"] = {
@@ -102,7 +102,8 @@ def get_port(proxy: Proxy, hconfigs: dict, domain_db: Domain, ptls: int, phttp:
102
102
 
103
103
 
104
104
  def is_tls(l3) -> bool:
105
- return 'tls' in l3 or "reality" in l3
105
+
106
+ return 'tls' in l3 or "reality" in l3 or l3 in [ProxyL3.h3_quic]
106
107
 
107
108
 
108
109
  @cache.cache(ttl=300)
@@ -254,6 +255,9 @@ def make_proxy(hconfigs: dict, proxy: Proxy, domain_db: Domain, phttp=80, ptls=4
254
255
  alpn = "h2" if proxy.transport in ['h2', "grpc"] else 'http/1.1'
255
256
  else:
256
257
  alpn = "h2" if proxy.l3 in ['tls_h2'] or proxy.transport in ["grpc", 'h2'] else 'h2,http/1.1' if proxy.l3 == 'tls_h2_h1' else "http/1.1"
258
+ if proxy.l3 in [ProxyL3.h3_quic]:
259
+ alpn = "h3"
260
+
257
261
  cdn_forced_host = domain_db.cdn_ip or (domain_db.domain if domain_db.mode != DomainType.reality else hutils.network.get_direct_host_or_ip(4))
258
262
  is_cdn = ProxyCDN.CDN == proxy.cdn or ProxyCDN.Fake == proxy.cdn
259
263
  base = {
@@ -381,7 +385,7 @@ def make_proxy(hconfigs: dict, proxy: Proxy, domain_db: Domain, phttp=80, ptls=4
381
385
  base['mux_brutal_down_mbps'] = hconfigs.get(ConfigEnum.mux_brutal_down_mbps, 10)
382
386
 
383
387
  if is_cdn and proxy.proto in {'vless', 'trojan', "vmess"}:
384
- if hconfigs[ConfigEnum.tls_fragment_enable]:
388
+ if hconfigs[ConfigEnum.tls_fragment_enable] and "tls" in base["l3"]:
385
389
  base["tls_fragment_enable"] = True
386
390
  base["tls_fragment_size"] = hconfigs[ConfigEnum.tls_fragment_size]
387
391
  base["tls_fragment_sleep"] = hconfigs[ConfigEnum.tls_fragment_sleep]
@@ -416,6 +420,10 @@ def make_proxy(hconfigs: dict, proxy: Proxy, domain_db: Domain, phttp=80, ptls=4
416
420
  if proxy.transport in [ProxyTransport.splithttp]:
417
421
  base['transport'] = 'splithttp'
418
422
  base['path'] = f'/{path[base["proto"]]}{hconfigs[ConfigEnum.path_splithttp]}'
423
+ # if 0 and 'h2' in base['alpn'] or 'h3' in base['alpn']:
424
+ # base['path'] += "2"
425
+ # else:
426
+ # base['path'] += "1"
419
427
  base["host"] = domain
420
428
  return base
421
429
 
@@ -64,7 +64,15 @@ def to_singbox(proxy: dict) -> list[dict] | dict:
64
64
  if is_xray_proxy(proxy):
65
65
  if hutils.flask.is_client_version(hutils.flask.ClientVersion.hiddify_next, 1, 9, 0):
66
66
  base['type'] = "xray"
67
- base['xray_outbound_raw'] = to_xray(proxy)
67
+ xp = to_xray(proxy)
68
+ xp['streamSettings']['sockopt'] = {}
69
+ base['xray_outbound_raw'] = xp
70
+ if proxy.get('tls_fragment_enable'):
71
+ base['xray_fragment'] = {
72
+ 'packets': "tlshello",
73
+ 'length': proxy["tls_fragment_size"],
74
+ 'interval': proxy["tls_fragment_sleep"]
75
+ }
68
76
  return all_base
69
77
  return {'name': name, 'msg': "xray proxy does not support in this client version", 'type': 'debug'}
70
78
  base["type"] = str(proxy["proto"])
@@ -143,7 +143,7 @@ def to_link(proxy: dict) -> str | dict:
143
143
 
144
144
  if 'reality' in proxy["l3"]:
145
145
  return f"{baseurl}&security=reality&pbk={proxy['reality_pbk']}&sid={proxy['reality_short_id']}{infos}"
146
- if 'tls' in proxy['l3']:
146
+ if 'tls' in proxy['l3'] or "quic" in proxy['l3']:
147
147
  return f'{baseurl}&security=tls{infos}'
148
148
  if proxy['l3'] == 'http':
149
149
  return f'{baseurl}&security=none{infos}'
@@ -199,10 +199,10 @@ def make_v2ray_configs(domains: list[Domain], user: User, expire_days: int, ip_d
199
199
 
200
200
  def add_tls_tricks_to_dict(d: dict, proxy: dict):
201
201
  if proxy.get('tls_fragment_enable'):
202
- if g.user_agent.get('is_shadowrocket'):
203
- d['fragment'] = f'1,{proxy["tls_fragment_size"]},{proxy["tls_fragment_sleep"]}'
204
- else:
205
- d['fragment'] = f'{proxy["tls_fragment_size"]},{proxy["tls_fragment_sleep"]},tlshello'
202
+ # if g.user_agent.get('is_shadowrocket'):
203
+ # d['fragment'] = f'1,{proxy["tls_fragment_size"]},{proxy["tls_fragment_sleep"]}'
204
+ # else:
205
+ d['fragment'] = f'tlshello,{proxy["tls_fragment_size"]},{proxy["tls_fragment_sleep"]}'
206
206
 
207
207
  if proxy.get("tls_mixed_case"):
208
208
  d['mc'] = 1
@@ -94,10 +94,10 @@ def to_xray(proxy: dict) -> dict:
94
94
  'protocol': str(proxy['proto']),
95
95
  'settings': {},
96
96
  'streamSettings': {},
97
- 'mux': { # default value
98
- 'enabled': False,
99
- 'concurrency': -1
100
- }
97
+ # 'mux': { # default value
98
+ # # 'enabled': False,
99
+ # # 'concurrency': -1
100
+ # }
101
101
  }
102
102
  outbound['protocol'] = 'shadowsocks' if outbound['protocol'] == 'ss' else outbound['protocol']
103
103
  # add multiplex to outbound
@@ -216,7 +216,7 @@ def add_stream_settings(base: dict, proxy: dict):
216
216
  # security
217
217
  if proxy['l3'] == ProxyL3.reality:
218
218
  ss['security'] = 'reality'
219
- elif proxy['l3'] in [ProxyL3.tls, ProxyL3.tls_h2, ProxyL3.tls_h2_h1]:
219
+ elif proxy['l3'] in [ProxyL3.tls, ProxyL3.tls_h2, ProxyL3.tls_h2_h1, ProxyL3.h3_quic]:
220
220
  ss['security'] = 'tls'
221
221
 
222
222
  # network and transport settings
@@ -226,7 +226,8 @@ def add_stream_settings(base: dict, proxy: dict):
226
226
  if ss['security'] == 'reality':
227
227
  ss['network'] = proxy['transport']
228
228
  add_reality_stream(ss, proxy)
229
- elif ss['security'] == 'tls' or 'xtls' and proxy['proto'] != ProxyProto.ss:
229
+ elif ss['security'] in ['tls', "xtls"] and proxy['proto'] != ProxyProto.ss:
230
+
230
231
  ss['tlsSettings'] = {
231
232
  'serverName': proxy['sni'],
232
233
  'allowInsecure': proxy['allow_insecure'],
@@ -341,7 +342,9 @@ def add_splithttp_stream(ss: dict, proxy: dict):
341
342
  ss['splithttpSettings'] = {
342
343
  'path': proxy['path'],
343
344
  'host': proxy['host'],
344
- # 'acceptProxyProtocol': '', for inbounds only
345
+ "headers": {
346
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
347
+ }
345
348
  }
346
349
 
347
350
 
@@ -366,8 +369,8 @@ def add_kcp_stream(ss: dict, proxy: dict):
366
369
 
367
370
  def add_quic_stream(ss: dict, proxy: dict):
368
371
  # TODO: fix server side configs first
369
- ss['quicSettings'] = {}
370
372
  return
373
+
371
374
  ss['quicSettings'] = {
372
375
  'security': 'chacha20-poly1305',
373
376
  'key': proxy['path'],
@@ -411,10 +414,11 @@ def add_multiplex(base: dict, proxy: dict):
411
414
 
412
415
  concurrency = proxy['mux_max_connections']
413
416
  if concurrency and concurrency > 0:
414
- base['mux']['enabled'] = True
415
- base['mux']['concurrency'] = concurrency
416
- base['mux']['xudpConcurrency'] = concurrency
417
- base['mux']['xudpProxyUDP443'] = 'reject'
417
+ base['mux'] = {'enabled': True,
418
+ 'concurrency': concurrency,
419
+ 'xudpConcurrency': concurrency,
420
+ 'xudpProxyUDP443': 'reject',
421
+ }
418
422
 
419
423
 
420
424
  def null_config(tag: str) -> dict:
@@ -245,7 +245,7 @@ class ConfigEnum(metaclass=FastEnum):
245
245
  trojan_enable = _BoolConfigDscr(ConfigCategory.proxies, ApplyMode.apply_config)
246
246
  reality_enable = _BoolConfigDscr(ConfigCategory.proxies, ApplyMode.apply_config)
247
247
  tcp_enable = _BoolConfigDscr(ConfigCategory.proxies, ApplyMode.apply_config)
248
- quic_enable = _BoolConfigDscr(ConfigCategory.hidden, ApplyMode.apply_config)
248
+ quic_enable = _BoolConfigDscr(ConfigCategory.proxies, ApplyMode.apply_config)
249
249
  xtls_enable = _BoolConfigDscr(ConfigCategory.hidden, ApplyMode.apply_config)
250
250
  h2_enable = _BoolConfigDscr(ConfigCategory.proxies, ApplyMode.apply_config)
251
251
 
@@ -16,7 +16,8 @@ from flask_bootstrap import SwitchField
16
16
  # from gettext import gettext as _
17
17
  from flask_classful import FlaskView
18
18
  from flask_wtf import FlaskForm
19
- from bleach import clean as bleach_clean
19
+ from bleach import clean as bleach_clean, ALLOWED_TAGS as BLEACH_ALLOWED_TAGS
20
+ ALLOWED_TAGS = set([*BLEACH_ALLOWED_TAGS, "h1", "h2", "h3", "h4", "p"])
20
21
 
21
22
 
22
23
  from hiddifypanel.models import BoolConfig, StrConfig, ConfigEnum, hconfig, ConfigCategory
@@ -94,9 +95,8 @@ class SettingAdmin(FlaskView):
94
95
 
95
96
  for k, v in changed_configs.items():
96
97
  # html inputs santitizing
97
- san_items = {ConfigEnum.branding_title, ConfigEnum.branding_site, ConfigEnum.branding_freetext}
98
- if k in san_items:
99
- v = bleach_clean(v)
98
+ if k in {ConfigEnum.branding_title, ConfigEnum.branding_site, ConfigEnum.branding_freetext}:
99
+ v = bleach_clean(v, tags=ALLOWED_TAGS)
100
100
  set_hconfig(k, v, commit=False)
101
101
 
102
102
  db.session.commit()
@@ -94,7 +94,7 @@ class AllConfigsAPI(MethodView):
94
94
  create_item(
95
95
  "Clash Meta", "ALL", "", "", "", "",
96
96
  # f"clashmeta://install-config?url={base_url}clash/meta/all.yml&name=mnormal_{c['db_domain'].alias or c['db_domain'].domain}-{c['asn']}-{c['mode']}&asn={c['asn']}&mode={c['mode']}"
97
- f"clash://install-config?url={base_url}clashmeta/?asn={c['asn']}#{config_name}"
97
+ f"{base_url}clashmeta/?asn={c['asn']}#{config_name}"
98
98
  )
99
99
  )
100
100
 
@@ -104,7 +104,7 @@ class AllConfigsAPI(MethodView):
104
104
  create_item(
105
105
  "Clash", "ALL", "Except VLess", "", "", "",
106
106
  # f"clash://install-config?url={base_url}clash/all.yml&name=new_normal_{c['db_domain'].alias or c['db_domain'].domain}-{c['asn']}-{c['mode']}&asn={c['asn']}&mode={c['mode']}"
107
- f"clash://install-config?url={base_url}clash/?asn={c['asn']}#{config_name}"
107
+ f"{base_url}clash/?asn={c['asn']}#{config_name}"
108
108
  )
109
109
  )
110
110
 
@@ -148,6 +148,8 @@ def init_app(app: APIFlask):
148
148
 
149
149
  @app.before_request
150
150
  def base_middleware():
151
+ if "generate_204" in request.path:
152
+ return "", 204
151
153
  if request.endpoint == 'static' or request.endpoint == "videos":
152
154
  return
153
155
 
@@ -17,7 +17,16 @@ from loguru import logger
17
17
  MAX_DB_VERSION = 100
18
18
 
19
19
 
20
- def _v91(child_id):
20
+ def _v94(child_id):
21
+ set_hconfig(ConfigEnum.wireguard_noise_trick, "0-0")
22
+
23
+
24
+ def _v93(child_id):
25
+ set_hconfig(ConfigEnum.quic_enable, True)
26
+ set_hconfig(ConfigEnum.splithttp_enable, True)
27
+
28
+
29
+ def _v92(child_id):
21
30
  db.session.bulk_save_objects(get_proxy_rows_v1())
22
31
 
23
32
 
@@ -171,7 +180,6 @@ def _v69():
171
180
  wg_pk, wg_pub, _ = hutils.crypto.get_wg_private_public_psk_pair()
172
181
  add_config_if_not_exist(ConfigEnum.wireguard_private_key, wg_pk)
173
182
  add_config_if_not_exist(ConfigEnum.wireguard_public_key, wg_pub)
174
- add_config_if_not_exist(ConfigEnum.wireguard_noise_trick, "5-10")
175
183
  for u in User.query.all():
176
184
  u.wg_pk, u.wg_pub, u.wg_psk = hutils.crypto.get_wg_private_public_psk_pair()
177
185
 
@@ -591,9 +599,11 @@ def get_proxy_rows_v1():
591
599
 
592
600
  def make_proxy_rows(cfgs):
593
601
  # "h3_quic",
594
- for l3 in ["tls_h2", "tls", "http", "reality"]:
602
+ for l3 in [ProxyL3.h3_quic, "tls_h2", "tls", "http", "reality"]:
595
603
  for c in cfgs:
596
604
  transport, cdn, proto = c.split(" ")
605
+ if transport != ProxyTransport.splithttp and l3 == ProxyL3.h3_quic:
606
+ continue
597
607
  if l3 in ["kcp", 'reality'] and cdn != "direct":
598
608
  continue
599
609
  if l3 == "reality" and ((transport not in ['tcp', 'grpc', 'XTLS']) or proto != 'vless'):
@@ -425,6 +425,7 @@ def add_headers(res, c, mimetype="text/plain"):
425
425
  resp.mimetype = mimetype
426
426
  resp.headers['Subscription-Userinfo'] = f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
427
427
  resp.headers['profile-web-page-url'] = request.base_url.rsplit('/', 1)[0].replace("http://", "https://") + "/"
428
+ resp.headers['test-url'] = f"https://{request.host}/{hconfig(ConfigEnum.proxy_path_client)}/generate_204"
428
429
 
429
430
  if hconfig(ConfigEnum.branding_site):
430
431
  resp.headers['support-url'] = hconfig(ConfigEnum.branding_site)
@@ -1646,10 +1646,10 @@ msgid "config.path_httpupgrade.label"
1646
1646
  msgstr "ℹ️ HTTP Upgrade Path"
1647
1647
 
1648
1648
  msgid "config.path_splithttp.description"
1649
- msgstr "config.path_splithttp.description"
1649
+ msgstr "This option defines the Path for Split HTTP"
1650
1650
 
1651
1651
  msgid "config.path_splithttp.label"
1652
- msgstr "config.path_splithttp.label"
1652
+ msgstr "Path for Split HTTP"
1653
1653
 
1654
1654
  msgid "config.path_ss.description"
1655
1655
  msgstr "Shadowsocks Path in the Links"
@@ -1872,10 +1872,10 @@ msgid "config.speed_test.label"
1872
1872
  msgstr "🚀 Speed Test"
1873
1873
 
1874
1874
  msgid "config.splithttp_enable.description"
1875
- msgstr "config.splithttp_enable.description"
1875
+ msgstr "This Protocol send and receive information in individual channels "
1876
1876
 
1877
1877
  msgid "config.splithttp_enable.label"
1878
- msgstr "config.splithttp_enable.label"
1878
+ msgstr "Split HTTP"
1879
1879
 
1880
1880
  msgid "config.ssfaketls.description"
1881
1881
  msgstr ""
@@ -1641,10 +1641,10 @@ msgid "config.path_httpupgrade.label"
1641
1641
  msgstr "ℹ️ مسیر ارتقاء HTTP"
1642
1642
 
1643
1643
  msgid "config.path_splithttp.description"
1644
- msgstr ""
1644
+ msgstr "این گزینه مسیر را برای Split HTTP تعریف می کند"
1645
1645
 
1646
1646
  msgid "config.path_splithttp.label"
1647
- msgstr ""
1647
+ msgstr "مسیر برای Split HTTP"
1648
1648
 
1649
1649
  msgid "config.path_ss.description"
1650
1650
  msgstr "مسیر شدوساکس در لینکها"
@@ -1871,10 +1871,10 @@ msgid "config.speed_test.label"
1871
1871
  msgstr "🚀 تست سرعت"
1872
1872
 
1873
1873
  msgid "config.splithttp_enable.description"
1874
- msgstr ""
1874
+ msgstr "این پروتکل اطلاعات را در کانال های جداگانه ارسال و دریافت می کند "
1875
1875
 
1876
1876
  msgid "config.splithttp_enable.label"
1877
- msgstr ""
1877
+ msgstr "Split HTTP"
1878
1878
 
1879
1879
  msgid "config.ssfaketls.description"
1880
1880
  msgstr ""
@@ -1574,10 +1574,10 @@ msgid "config.path_httpupgrade.label"
1574
1574
  msgstr ""
1575
1575
 
1576
1576
  msgid "config.path_splithttp.description"
1577
- msgstr ""
1577
+ msgstr "Esta opção define o caminho para Split HTTP"
1578
1578
 
1579
1579
  msgid "config.path_splithttp.label"
1580
- msgstr ""
1580
+ msgstr "Caminho para Split HTTP"
1581
1581
 
1582
1582
  msgid "config.path_ss.description"
1583
1583
  msgstr "Caminho Shadowsocks nos Links"
@@ -1797,10 +1797,10 @@ msgid "config.speed_test.label"
1797
1797
  msgstr "🚀 Teste de velocidade"
1798
1798
 
1799
1799
  msgid "config.splithttp_enable.description"
1800
- msgstr ""
1800
+ msgstr "Este protocolo envia e recebe informações em canais individuais "
1801
1801
 
1802
1802
  msgid "config.splithttp_enable.label"
1803
- msgstr ""
1803
+ msgstr "Split HTTP"
1804
1804
 
1805
1805
  msgid "config.ssfaketls.description"
1806
1806
  msgstr ""
@@ -1656,10 +1656,10 @@ msgid "config.path_httpupgrade.label"
1656
1656
  msgstr ""
1657
1657
 
1658
1658
  msgid "config.path_splithttp.description"
1659
- msgstr ""
1659
+ msgstr "Эта опция определяет путь для Split HTTP."
1660
1660
 
1661
1661
  msgid "config.path_splithttp.label"
1662
- msgstr ""
1662
+ msgstr "Путь для Split HTTP"
1663
1663
 
1664
1664
  msgid "config.path_ss.description"
1665
1665
  msgstr "Путь Shadowsocks в ссылках"
@@ -1883,10 +1883,10 @@ msgid "config.speed_test.label"
1883
1883
  msgstr "🚀 Тест скорости"
1884
1884
 
1885
1885
  msgid "config.splithttp_enable.description"
1886
- msgstr ""
1886
+ msgstr "Этот протокол отправляет и получает информацию по отдельным каналам. "
1887
1887
 
1888
1888
  msgid "config.splithttp_enable.label"
1889
- msgstr ""
1889
+ msgstr "Split HTTP"
1890
1890
 
1891
1891
  msgid "config.ssfaketls.description"
1892
1892
  msgstr ""
@@ -1560,10 +1560,10 @@ msgid "config.path_httpupgrade.label"
1560
1560
  msgstr ""
1561
1561
 
1562
1562
  msgid "config.path_splithttp.description"
1563
- msgstr ""
1563
+ msgstr "此选项定义 Split HTTP 的路径"
1564
1564
 
1565
1565
  msgid "config.path_splithttp.label"
1566
- msgstr ""
1566
+ msgstr "Split HTTP 的路径"
1567
1567
 
1568
1568
  msgid "config.path_ss.description"
1569
1569
  msgstr "链接中的 Shadowsocks 路径"
@@ -1767,10 +1767,10 @@ msgid "config.speed_test.label"
1767
1767
  msgstr "🚀 速度测试"
1768
1768
 
1769
1769
  msgid "config.splithttp_enable.description"
1770
- msgstr ""
1770
+ msgstr "该协议通过单独的渠道发送和接收信息 "
1771
1771
 
1772
1772
  msgid "config.splithttp_enable.label"
1773
- msgstr ""
1773
+ msgstr "HTTP"
1774
1774
 
1775
1775
  msgid "config.ssfaketls.description"
1776
1776
  msgstr "Shadowsocks FakeTLS 是一个简单的混淆工具,将日期封装在 tls 数据包中"
@@ -641,8 +641,8 @@
641
641
  "label": "ℹ️ HTTP Upgrade Path"
642
642
  },
643
643
  "path_splithttp": {
644
- "description": "config.path_splithttp.description",
645
- "label": "config.path_splithttp.label"
644
+ "description": "This option defines the Path for Split HTTP",
645
+ "label": "Path for Split HTTP"
646
646
  },
647
647
  "path_ss": {
648
648
  "description": "Shadowsocks Path in the Links",
@@ -777,8 +777,8 @@
777
777
  "label": "🚀 Speed Test"
778
778
  },
779
779
  "splithttp_enable": {
780
- "description": "config.splithttp_enable.description",
781
- "label": "config.splithttp_enable.label"
780
+ "description": "This Protocol send and receive information in individual channels ",
781
+ "label": "Split HTTP"
782
782
  },
783
783
  "ssfaketls": {
784
784
  "description": "Shadowsocks FakeTLS is a simple obfusacting tool that encapsulate the date In tls packet",
@@ -641,8 +641,8 @@
641
641
  "label": "ℹ️ مسیر ارتقاء HTTP"
642
642
  },
643
643
  "path_splithttp": {
644
- "description": "",
645
- "label": ""
644
+ "description": "این گزینه مسیر را برای Split HTTP تعریف می کند",
645
+ "label": "مسیر برای Split HTTP"
646
646
  },
647
647
  "path_ss": {
648
648
  "description": "مسیر شدوساکس در لینکها",
@@ -777,8 +777,8 @@
777
777
  "label": "🚀 تست سرعت"
778
778
  },
779
779
  "splithttp_enable": {
780
- "description": "",
781
- "label": ""
780
+ "description": "این پروتکل اطلاعات را در کانال های جداگانه ارسال و دریافت می کند ",
781
+ "label": "Split HTTP"
782
782
  },
783
783
  "ssfaketls": {
784
784
  "description": "شادوساکس FakeTLS یک روش مبهم سازی ساده هست که دیتا را در بسته TLS کپسوله میکند تا فیلترچی فریب بخورد.",
@@ -641,8 +641,8 @@
641
641
  "label": ""
642
642
  },
643
643
  "path_splithttp": {
644
- "description": "",
645
- "label": ""
644
+ "description": "Esta opção define o caminho para Split HTTP",
645
+ "label": "Caminho para Split HTTP"
646
646
  },
647
647
  "path_ss": {
648
648
  "description": "Caminho Shadowsocks nos Links",
@@ -777,8 +777,8 @@
777
777
  "label": "🚀 Teste de velocidade"
778
778
  },
779
779
  "splithttp_enable": {
780
- "description": "",
781
- "label": ""
780
+ "description": "Este protocolo envia e recebe informações em canais individuais ",
781
+ "label": "Split HTTP"
782
782
  },
783
783
  "ssfaketls": {
784
784
  "description": "Shadowsocks FakeTLS é uma ferramenta de ofuscação simples que encapsula a data In tls package",
@@ -641,8 +641,8 @@
641
641
  "label": ""
642
642
  },
643
643
  "path_splithttp": {
644
- "description": "",
645
- "label": ""
644
+ "description": "Эта опция определяет путь для Split HTTP.",
645
+ "label": "Путь для Split HTTP"
646
646
  },
647
647
  "path_ss": {
648
648
  "description": "Путь Shadowsocks в ссылках",
@@ -777,8 +777,8 @@
777
777
  "label": "🚀 Тест скорости"
778
778
  },
779
779
  "splithttp_enable": {
780
- "description": "",
781
- "label": ""
780
+ "description": "Этот протокол отправляет и получает информацию по отдельным каналам. ",
781
+ "label": "Split HTTP"
782
782
  },
783
783
  "ssfaketls": {
784
784
  "description": "Shadowsocks FakeTLS — это простой инструмент для запутывания, который инкапсулирует данные в пакете tls.",
@@ -641,8 +641,8 @@
641
641
  "label": ""
642
642
  },
643
643
  "path_splithttp": {
644
- "description": "",
645
- "label": ""
644
+ "description": "此选项定义 Split HTTP 的路径",
645
+ "label": "Split HTTP 的路径"
646
646
  },
647
647
  "path_ss": {
648
648
  "description": "链接中的 Shadowsocks 路径",
@@ -777,8 +777,8 @@
777
777
  "label": "🚀 速度测试"
778
778
  },
779
779
  "splithttp_enable": {
780
- "description": "",
781
- "label": ""
780
+ "description": "该协议通过单独的渠道发送和接收信息 ",
781
+ "label": "HTTP"
782
782
  },
783
783
  "ssfaketls": {
784
784
  "description": "Shadowsocks FakeTLS 是一个简单的混淆工具,将日期封装在 tls 数据包中",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hiddifypanel
3
- Version: 10.60.0.dev0
3
+ Version: 10.70.0
4
4
  Summary: hiddifypanel multi proxy panel
5
5
  Home-page: https://github.com/hiddify/hiddify-manager/
6
6
  Author: hiddify
@@ -1,6 +1,6 @@
1
1
  hiddifypanel/Events.py,sha256=AlnRdjVul0jP-NCT4-zoaQgowoOo-JhdQB4ytetAFKA,723
2
- hiddifypanel/VERSION,sha256=VCrHC0wil_AmxhacgnHPQ-opC9U_UgW1gYef9nhSbSU,13
3
- hiddifypanel/VERSION.py,sha256=XFis0VtVAPuxkI3PFLDQCgCU5qtjcMsUiv5X-ytKXRM,118
2
+ hiddifypanel/VERSION,sha256=NmJf4WHEmoEED16bKdpGhln9J6RVnMPyu5L2vyBXI7E,8
3
+ hiddifypanel/VERSION.py,sha256=48oDBStZF4HIHJWkVbl_2hS11cZ5AE4KF0YqmrZu7MM,113
4
4
  hiddifypanel/__init__.py,sha256=aLukp3ORszdcH4G9J-MlxhjHN6yFlOuOE6mm-L3aG_g,266
5
5
  hiddifypanel/__main__.py,sha256=IVchnXpK6bm8T3N--mN17HBQNLMeLAjyP7iwzULexB4,218
6
6
  hiddifypanel/auth.py,sha256=Xq0UwiFTRFmQpxnOehQGwPDlJqoelwGhPQbYZ0Xn5c0,7850
@@ -18,8 +18,8 @@ hiddifypanel/hutils/auth.py,sha256=Ci3_lBfLXx1yi2M6HvYX3ceHYtOf-cfX092evcs8528,3
18
18
  hiddifypanel/hutils/convert.py,sha256=mPEDzR64hKeQ4B_tZRk2Ci8-Ybod0bjX0BbxLHOmLZA,2075
19
19
  hiddifypanel/hutils/crypto.py,sha256=2MDnzjM_ZJdY1zJ3eCoa2v24FYzzdKKO4viOFnvmBlI,1858
20
20
  hiddifypanel/hutils/encode.py,sha256=XUq7NSrV11WeVIZFyfik8sqI82R0lKRm5mqKrxNoLrQ,834
21
- hiddifypanel/hutils/flask.py,sha256=Q3EeIhk5cePNF2rFPNoz8aL5BC7hjhkqwhKaqJuQSKo,11732
22
- hiddifypanel/hutils/github_issue.py,sha256=oDJU-8BgefDdls9sUzhVpohH9utrD4WZLWrb3oUwV4c,6500
21
+ hiddifypanel/hutils/flask.py,sha256=uMbSKTs_S5_fNcGyLLr7XFJkNNpApDMwSK9DxRiC7KE,11689
22
+ hiddifypanel/hutils/github_issue.py,sha256=LSJCDVC_UEFDIXG4JdQReLDUnF_WmfhH7eFB-iZKwdg,6609
23
23
  hiddifypanel/hutils/model.py,sha256=ajlJ-Tx0Mq68S9y5qEj0lwlDbF2xj0niZBQyw7UU670,1320
24
24
  hiddifypanel/hutils/random.py,sha256=KrsarmRNL05PYzwMxDaDyv-_QcKS0YsZR2z7BnllAqI,1789
25
25
  hiddifypanel/hutils/system.py,sha256=nX7ZvmXKfHu6_cFVOGZRG-7ch2glqgzQL2iWraQc4S0,4350
@@ -36,17 +36,17 @@ hiddifypanel/hutils/node/child.py,sha256=oAyKlEHHn9FHcpZ9jBi3nYH-GHs8H7Gi2hzkmtO
36
36
  hiddifypanel/hutils/node/parent.py,sha256=UbyfvfP4fTSn6HN9oZDjYsKYIejiqW6eApKIfP0Mz5U,3749
37
37
  hiddifypanel/hutils/node/shared.py,sha256=FDSj3e-i3pb3mEv5vcUeX0Km1nxYg1CeAruIq7RwFmU,2540
38
38
  hiddifypanel/hutils/proxy/__init__.py,sha256=xXBa83kjYT_b-BNseEykfQYyJBQHTq1ZosfR8ZrQHkI,106
39
- hiddifypanel/hutils/proxy/clash.py,sha256=t57ywMo2TPpnAIuOn9v5gMD2os7zqS9b4NQtFX-Do5s,5813
40
- hiddifypanel/hutils/proxy/shared.py,sha256=cQ49Vi23MKtvY9hpjb_1HTo2zc0C-TlSabY6uMfFPtc,22175
41
- hiddifypanel/hutils/proxy/singbox.py,sha256=vBVSJ0r4TRri1ErtVo7qm-yS3xXTSYoTdUGF2rczkm8,11314
42
- hiddifypanel/hutils/proxy/xray.py,sha256=sw_g1xhIBAyCQ4cymorrHJSw2u4LOAJ41slmvxwsz5c,10788
43
- hiddifypanel/hutils/proxy/xrayjson.py,sha256=TsnOHM5IUAn5AVEsboVVTLzDLS93EU67SqasHm1y6BA,14796
39
+ hiddifypanel/hutils/proxy/clash.py,sha256=2KJnSXZqU08V1ou8qGRhTc7BF_GWTO2CskWXpPwy8oE,7039
40
+ hiddifypanel/hutils/proxy/shared.py,sha256=luAr06u3lse22MCcKtsyppB1SRgd6Sn4RhstHlzfbHs,22443
41
+ hiddifypanel/hutils/proxy/singbox.py,sha256=DDkRA5psV0eDZ_8U-Yv9GEWAkf3fNR9MDGkFdGCzaO4,11653
42
+ hiddifypanel/hutils/proxy/xray.py,sha256=Yg0ynPT2u1rBPeFHp34QbUNE-Im7-QS-JSFt19mHdWc,10815
43
+ hiddifypanel/hutils/proxy/xrayjson.py,sha256=TSD05g8dwwL2pLj8by_jSy4eIP0fDDxy1l4fI-2M1Zw,14948
44
44
  hiddifypanel/models/__init__.py,sha256=PngFjQL9WvQP4EioNHRz1tTeyIgLoNvZ7WpmAhwKHnU,677
45
45
  hiddifypanel/models/admin.py,sha256=qZ-BRJ_Gn6hJNWz35SQQSds1CoeDslU9B0MDBRhjPSM,7596
46
46
  hiddifypanel/models/base_account.py,sha256=TUGDGHt3q3GWqWBdWwqaZl75KXTt7bw6pxnzOWAbkjI,3454
47
47
  hiddifypanel/models/child.py,sha256=ZFJaH-GWTKAGD0BGMH0iKEMipi37_cAk59OeJKt2IKA,3039
48
48
  hiddifypanel/models/config.py,sha256=-KKYqMkSEn2DabRxqBogSyA6xOU4ons6sa5CxxHAlAk,6373
49
- hiddifypanel/models/config_enum.py,sha256=_lVn3Gv5JiZsguwcCU07dlngs5C5ADhKCV6gaXFEOz0,16185
49
+ hiddifypanel/models/config_enum.py,sha256=ouGCvSDvVy9qSJvm1-VjEpe4l5rgN9NSJD2IBruDhvI,16186
50
50
  hiddifypanel/models/domain.py,sha256=0tAPHR6XukN35CoyOxR3zXDNjXR-w_Ezd89jxk2H-xc,8308
51
51
  hiddifypanel/models/parent_domain.py,sha256=bs5F1neOAQu9XHEk3QQTBM4p2iuebM4cnAQqwfNjCtg,2291
52
52
  hiddifypanel/models/proxy.py,sha256=czKeDz_MVUSHuX2Lf9H2Ys_kgkggtzEiUx3HZPjJCXQ,3327
@@ -60,10 +60,10 @@ hiddifypanel/panel/asset.py,sha256=sp3NJVsTYycVgM2NbXX_KnOENGDmRB72CRKZwhd7f-4,5
60
60
  hiddifypanel/panel/auth_back.py,sha256=ft2YlK1Ke87fvKTpGLIHnLVpnBRn1Stlc_-6aEzudvk,3964
61
61
  hiddifypanel/panel/auth_back2.py,sha256=8-MkPi4WAxO7gAeChQ7ceCx0QhuEQlrYazZ9qDnm_Mc,8983
62
62
  hiddifypanel/panel/cli.py,sha256=GNK-lqoedepG6hfpLHTPLxBaMsdjbQHZAw-qKjdRxnQ,8595
63
- hiddifypanel/panel/common.py,sha256=pYI_z8dfeeaeSZWN2hUOnj10LtgvGRQBzhPaoGdYR0M,7654
63
+ hiddifypanel/panel/common.py,sha256=ia_l9ShvK9SZAuiIGmKQLjHg0bZf-m_LkQoAIp7WNqE,7724
64
64
  hiddifypanel/panel/custom_widgets.py,sha256=_zA0WZRZOCyh6Z1gW62aRQLMAOM_m85B2oZoIOU59Ys,2637
65
65
  hiddifypanel/panel/hiddify.py,sha256=-GBmkEXnGsIhZtjRomYJsqmnEToZwSXzd8ltS6Slgrc,15615
66
- hiddifypanel/panel/init_db.py,sha256=yBuro9Zg6_0cNCcwIMCXnAeHj8qy55FdC5pwFF1kX-c,35028
66
+ hiddifypanel/panel/init_db.py,sha256=JZmkNTet7kOY-DnJGzptJq4gG7uh1U_6b-m6t2Vkplc,35278
67
67
  hiddifypanel/panel/run_commander.py,sha256=D9y-My0xSe2adHWXKV5UPYGl-9WwKURzniq55MRu6tE,3259
68
68
  hiddifypanel/panel/usage.py,sha256=sG4qhH8p7PS04W7CjbfbNS4GE88IPtRAeOdqQiHPntw,6860
69
69
  hiddifypanel/panel/admin/Actions.py,sha256=o_ENbphriVrbRJkx9nvrkpaliuMIfp34sscMkZJ3P5s,8578
@@ -75,7 +75,7 @@ hiddifypanel/panel/admin/DomainAdmin.py,sha256=0g9AEk_YVCEZZMscgVDLsqQAAk0QBMW1h
75
75
  hiddifypanel/panel/admin/NodeAdmin.py,sha256=QAHQjF7e7F4KqsWNWpMt7SoLANlFEborVtWQV9OXJ2E,3102
76
76
  hiddifypanel/panel/admin/ProxyAdmin.py,sha256=6t6QDJpdRJJ-TNQbK90pf5TI6y9fSlZQEDuPzaOFjrc,5250
77
77
  hiddifypanel/panel/admin/QuickSetup.py,sha256=EDa_ombxF3vWDsj7JEmDnw8Kf0bKwdXU-IdISDi2hj0,11448
78
- hiddifypanel/panel/admin/SettingAdmin.py,sha256=0lzKol5pwuM1axYFyANNPJiIWme2xjZ64QX3PlTv16U,19574
78
+ hiddifypanel/panel/admin/SettingAdmin.py,sha256=fpl4zeKAhqll5JDJ7wzA2E2MBGzYac83RXHHLtnWYec,19664
79
79
  hiddifypanel/panel/admin/Terminal.py,sha256=rzZWRjMhjVnAvC65rfE3HJT3boUDznI6fl-htzKp7sI,1712
80
80
  hiddifypanel/panel/admin/UserAdmin.py,sha256=UPPg92NGxclBKE-inYas58Lz2bc06oFibSMdygQaC2M,18020
81
81
  hiddifypanel/panel/admin/__init__.py,sha256=hb0A2HuK_nBZRCNPumwahXX-25FMxODKYlNbk2ItF08,3015
@@ -163,7 +163,7 @@ hiddifypanel/panel/commercial/restapi/v2/parent/sync_api.py,sha256=K0uekG7KA6Qmn
163
163
  hiddifypanel/panel/commercial/restapi/v2/parent/usage_api.py,sha256=FOvb6nFuWcucTEtZPwhINpbZQDdprgk4orpwwi02jK4,2373
164
164
  hiddifypanel/panel/commercial/restapi/v2/user/__init__.py,sha256=sIV_lVcH0ImNyvhU-4vFyQavh-Pt5MJnZVK22JUd-lo,1233
165
165
  hiddifypanel/panel/commercial/restapi/v2/user/apps_api.py,sha256=WVq8Ufjr_HpkdHG3juTD6Tfg12kE-00VRV8PrbSiqY8,20833
166
- hiddifypanel/panel/commercial/restapi/v2/user/configs_api.py,sha256=lwcC_iPcmH1Z8eR6_xVTTvVO9xmG1Rl3S6qIJbMyRqY,5758
166
+ hiddifypanel/panel/commercial/restapi/v2/user/configs_api.py,sha256=-2zZSDHt5rRVT7rMBgpRRZafxTUKAV9wzkt-VAlFsK8,5704
167
167
  hiddifypanel/panel/commercial/restapi/v2/user/info_api.py,sha256=Ou-3TjwLqYYECIttjSU9rpjmfjDFbgHj2_gGnwmHj5E,3918
168
168
  hiddifypanel/panel/commercial/restapi/v2/user/mtproxies.py,sha256=wK6zMOw2OTVxeMkzZGVah34GYDMJa8Keq5z7jGKfFys,1676
169
169
  hiddifypanel/panel/commercial/restapi/v2/user/short_api.py,sha256=rhsmDJSCiZOhX9jpJGcRS_zBVRqvjpjH3CaNaJ9gMiI,1137
@@ -179,7 +179,7 @@ hiddifypanel/panel/common_bp/login.py,sha256=nBiPswFiKVk6HcHL8pB1rMjx_XLLbahWtuy
179
179
  hiddifypanel/panel/common_bp/templates/login.html,sha256=jDl9-Nh2qMuCsLQmXm7e5jvSaRAlBxReVVCbNSTTHJw,1312
180
180
  hiddifypanel/panel/user/__init__.py,sha256=E9RxA2YGc0eXLGjfJbyryeLG3bXEWJ3DoVOyIpVaDIo,1859
181
181
  hiddifypanel/panel/user/link_maker.html,sha256=g420NAm_fUI8asYjyfCiXyUOIwEQfDPonZA9xh3p0-8,177
182
- hiddifypanel/panel/user/user.py,sha256=rxjqaBiy_I0slxzf87mQ1hO7sCcRtdzVYnVc2A1JCKQ,16407
182
+ hiddifypanel/panel/user/user.py,sha256=s4eu7i_PSu63jxORSFpQk_MU1BrCkA4H98z_kLFRQOQ,16517
183
183
  hiddifypanel/panel/user/templates/all_configs copy.txt,sha256=u5jhAgjhH07_0csdIisuXy2HNCC9SWlP0whBAGFXA78,564
184
184
  hiddifypanel/panel/user/templates/all_configs.txt,sha256=i8I6g9ujOr3RIuRoGRqY2Q75I89mbHko_JVPvQt4E_g,1260
185
185
  hiddifypanel/panel/user/templates/base_singbox_config.json.j2,sha256=xhvQpm0fp2w3VA8N7zXbYs8RWlRgdyApiedFH_sRTfM,7107
@@ -822,24 +822,24 @@ hiddifypanel/templates/redirect.html,sha256=K9x_O4P96vEkqBhOXIhoGrWw1KIqd2bL0BjI
822
822
  hiddifypanel/templates/static.html,sha256=jp6q4wtx-k2A_cjqJoNiMS7Ee30arE45qI3ev4d5ky4,165
823
823
  hiddifypanel/templates/hiddify-flask-admin/actions.html,sha256=2NeITe2e-lPKCk_o511tCIqVtrPu8LYHE1wTCtrFUrI,1331
824
824
  hiddifypanel/templates/hiddify-flask-admin/list.html,sha256=MBGrTqZpzNLe4sZy0RozvXNr8seFUQc2C6v88BJtNWc,11095
825
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo,sha256=jN9uYK-lVyJbrf6jROTVsSNOf-hpEbPC-9FRZyuXVQ0,76130
826
- hiddifypanel/translations/en/LC_MESSAGES/messages.po,sha256=Y8Y9o8Zn_GvhCt9Zdzb2blxmAQ-Y9h_y5uQsJipHWJc,79318
827
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo,sha256=HHOUGfvLrMD0T2Eg_dJbEkne9Ti695umdItH8f6PHxg,96032
828
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po,sha256=Y96y6EONrEJ_BoBuItNlfZzQeF2i8klKGpqTmYIPM5k,101692
829
- hiddifypanel/translations/pt/LC_MESSAGES/messages.mo,sha256=vLDlPZEYaTR0sFZUnrIl6OBOsVQ1oJYPuHmoBtuXmY0,58587
830
- hiddifypanel/translations/pt/LC_MESSAGES/messages.po,sha256=00MqGOmJzYUArU68jKqQWwkxdR0-jno43nJw141tXyM,69622
831
- hiddifypanel/translations/ru/LC_MESSAGES/messages.mo,sha256=nXXdXsX_jTHtECFeebkyvcKIziPMjrkLXnHYt0OcK7k,97554
832
- hiddifypanel/translations/ru/LC_MESSAGES/messages.po,sha256=M7sHePHrlQQb7UHEomO0qk4c_XLL_X0Fn9ikUQRW3PQ,104841
833
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo,sha256=6IK55CKd8uPTti6wc1h7-CtsDWzHW89cwMbhdmCIj6w,58920
834
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po,sha256=8J-vgc8C1ORaL2kyHPPynEZHpHy2cFAcYyiGAL2ZIcU,68866
835
- hiddifypanel/translations.i18n/en.json,sha256=dozE6mTry3rC-Byvp4dH85lctEB_Yjz2WBZSDzfgIf8,68885
836
- hiddifypanel/translations.i18n/fa.json,sha256=TD8Tsyq6ieJv4RGw6jWtRHstQHGNB-zJfTfug-9i_KA,91256
837
- hiddifypanel/translations.i18n/pt.json,sha256=UiG2f9A8q320T7Ku_3HlASOVVk9pCaUZlgYwUDlFKXA,59558
838
- hiddifypanel/translations.i18n/ru.json,sha256=QRoRoF_RiIvpMD31T14Y9QgFtNuFqj_Hl5-hjOBQIpI,94378
839
- hiddifypanel/translations.i18n/zh.json,sha256=q2kenW7YBiqaZLFb5o_23yrAhbAMSSpgqfDuV8qwUCA,59042
840
- hiddifypanel-10.60.0.dev0.dist-info/LICENSE.md,sha256=oDrt-cUsyiDGnRPjEJh-3dH2ddAuK_bIVBD8ntkOtZw,19807
841
- hiddifypanel-10.60.0.dev0.dist-info/METADATA,sha256=WOx1hSl6xojX8Q3X1LKEVCP1rWNpEVbbt6mE8zGsDPM,4044
842
- hiddifypanel-10.60.0.dev0.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
843
- hiddifypanel-10.60.0.dev0.dist-info/entry_points.txt,sha256=Xzpqlh3nwBtZhoV9AANJykano056VJvYzaujxPztJaM,60
844
- hiddifypanel-10.60.0.dev0.dist-info/top_level.txt,sha256=rv-b3qFWUZQTBy0kyBfsr7L6tPpeO7AaQlLHXn-HI5M,13
845
- hiddifypanel-10.60.0.dev0.dist-info/RECORD,,
825
+ hiddifypanel/translations/en/LC_MESSAGES/messages.mo,sha256=44VKgLTHfnlmEszNXqy22lqxoFma1hpUeT092Z3DGs0,76144
826
+ hiddifypanel/translations/en/LC_MESSAGES/messages.po,sha256=zMVicwQ7Q6MBIqgHuPch0VukS1XSa8zZ-6_BRnligC0,79332
827
+ hiddifypanel/translations/fa/LC_MESSAGES/messages.mo,sha256=E8iBPHB_mMcv4bOikrONw6PDU1PQmX-nG92E8in2qRo,96457
828
+ hiddifypanel/translations/fa/LC_MESSAGES/messages.po,sha256=WTWuDrY-l1HvpU1oECZ-w1I57IipNLTu50dQo3subPs,101921
829
+ hiddifypanel/translations/pt/LC_MESSAGES/messages.mo,sha256=mXYqxv0sSvJnz7Zel45KztRdumenyj8hRWr6dMHyJQY,58927
830
+ hiddifypanel/translations/pt/LC_MESSAGES/messages.po,sha256=CjBrdw_493ryJdB78a-hFC4n6bF2Z6ePxGnTQqphjig,69766
831
+ hiddifypanel/translations/ru/LC_MESSAGES/messages.mo,sha256=6Ia3uCxZJol4AmrgCLQGE-qJcsSdSAoMigSJDSh2DS0,97980
832
+ hiddifypanel/translations/ru/LC_MESSAGES/messages.po,sha256=e1TkuVY3FXWrz1HIpIfW2XueKdq2WCPRvtZYeXPqhtE,105071
833
+ hiddifypanel/translations/zh/LC_MESSAGES/messages.mo,sha256=55iqkuXTWAzE5v9DU6DnAqSFMtcFEKQtHYzkojog7V8,59228
834
+ hiddifypanel/translations/zh/LC_MESSAGES/messages.po,sha256=8Er7H0ltiIqj7E6xoMVp0rd-_V2U8Hu9CRfZoxVKLYc,68978
835
+ hiddifypanel/translations.i18n/en.json,sha256=ZbBwlCq6T6ksLWWnowMON7u-CB_Vtly7KY8z0vad9TY,68899
836
+ hiddifypanel/translations.i18n/fa.json,sha256=qvTSrBdaIEFe71Q-82RvxAsHg2wUibU0k53sqoqW-PE,91485
837
+ hiddifypanel/translations.i18n/pt.json,sha256=ABrAeZpkgmntC1hkAr0wlG8og44BZbYzR6iBU-p7NJw,59702
838
+ hiddifypanel/translations.i18n/ru.json,sha256=7FWH-wqcu0WqYML-P0i53GA-4b2VWuokyHdZR-EnWnQ,94608
839
+ hiddifypanel/translations.i18n/zh.json,sha256=Jq8E5wV5wQ0QKvZG6egPRKtl8jsoBCMnmFW9lc5vaAI,59154
840
+ hiddifypanel-10.70.0.dist-info/LICENSE.md,sha256=oDrt-cUsyiDGnRPjEJh-3dH2ddAuK_bIVBD8ntkOtZw,19807
841
+ hiddifypanel-10.70.0.dist-info/METADATA,sha256=og4OP_bu4NAk1LSVxwlRXhs1b1P0nbdnJdOadNbAeDU,4039
842
+ hiddifypanel-10.70.0.dist-info/WHEEL,sha256=Rp8gFpivVLXx-k3U95ozHnQw8yDcPxmhOpn_Gx8d5nc,91
843
+ hiddifypanel-10.70.0.dist-info/entry_points.txt,sha256=Xzpqlh3nwBtZhoV9AANJykano056VJvYzaujxPztJaM,60
844
+ hiddifypanel-10.70.0.dist-info/top_level.txt,sha256=rv-b3qFWUZQTBy0kyBfsr7L6tPpeO7AaQlLHXn-HI5M,13
845
+ hiddifypanel-10.70.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5