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.
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +2 -2
- hiddifypanel/hutils/flask.py +5 -5
- hiddifypanel/hutils/github_issue.py +9 -7
- hiddifypanel/hutils/proxy/clash.py +54 -28
- hiddifypanel/hutils/proxy/shared.py +10 -2
- hiddifypanel/hutils/proxy/singbox.py +9 -1
- hiddifypanel/hutils/proxy/xray.py +5 -5
- hiddifypanel/hutils/proxy/xrayjson.py +16 -12
- hiddifypanel/models/config_enum.py +1 -1
- hiddifypanel/panel/admin/SettingAdmin.py +4 -4
- hiddifypanel/panel/commercial/restapi/v2/user/configs_api.py +2 -2
- hiddifypanel/panel/common.py +2 -0
- hiddifypanel/panel/init_db.py +13 -3
- hiddifypanel/panel/user/user.py +1 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +4 -4
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +4 -4
- hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/pt/LC_MESSAGES/messages.po +4 -4
- hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/ru/LC_MESSAGES/messages.po +4 -4
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +4 -4
- hiddifypanel/translations.i18n/en.json +4 -4
- hiddifypanel/translations.i18n/fa.json +4 -4
- hiddifypanel/translations.i18n/pt.json +4 -4
- hiddifypanel/translations.i18n/ru.json +4 -4
- hiddifypanel/translations.i18n/zh.json +4 -4
- {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/METADATA +1 -1
- {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/RECORD +36 -36
- {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/WHEEL +1 -1
- {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/LICENSE.md +0 -0
- {hiddifypanel-10.60.0.dev0.dist-info → hiddifypanel-10.70.0.dist-info}/entry_points.txt +0 -0
- {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.
|
1
|
+
10.70.0
|
hiddifypanel/VERSION.py
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
__version__='10.
|
1
|
+
__version__='10.70.0'
|
2
2
|
from datetime import datetime
|
3
|
-
__release_date__= datetime.strptime('2024-07-
|
3
|
+
__release_date__= datetime.strptime('2024-07-29','%Y-%m-%d')
|
hiddifypanel/hutils/flask.py
CHANGED
@@ -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) <
|
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(
|
69
|
+
uaa = user_agents.parse(ua)
|
70
70
|
|
71
|
-
match = re.search(ua_version_pattern,
|
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'] =
|
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(
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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['
|
42
|
-
return {'name': name, 'msg': "
|
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
|
-
|
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["
|
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
|
-
|
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
|
109
|
-
base[
|
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
|
-
|
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
|
-
|
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
|
-
|
204
|
-
else:
|
205
|
-
|
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
|
-
|
99
|
-
|
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']
|
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
|
-
|
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']
|
415
|
-
|
416
|
-
|
417
|
-
|
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.
|
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
|
-
|
98
|
-
|
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"
|
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"
|
107
|
+
f"{base_url}clash/?asn={c['asn']}#{config_name}"
|
108
108
|
)
|
109
109
|
)
|
110
110
|
|
hiddifypanel/panel/common.py
CHANGED
hiddifypanel/panel/init_db.py
CHANGED
@@ -17,7 +17,16 @@ from loguru import logger
|
|
17
17
|
MAX_DB_VERSION = 100
|
18
18
|
|
19
19
|
|
20
|
-
def
|
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'):
|
hiddifypanel/panel/user/user.py
CHANGED
@@ -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)
|
Binary file
|
@@ -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 "
|
1649
|
+
msgstr "This option defines the Path for Split HTTP"
|
1650
1650
|
|
1651
1651
|
msgid "config.path_splithttp.label"
|
1652
|
-
msgstr "
|
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 "
|
1875
|
+
msgstr "This Protocol send and receive information in individual channels "
|
1876
1876
|
|
1877
1877
|
msgid "config.splithttp_enable.label"
|
1878
|
-
msgstr "
|
1878
|
+
msgstr "Split HTTP"
|
1879
1879
|
|
1880
1880
|
msgid "config.ssfaketls.description"
|
1881
1881
|
msgstr ""
|
Binary file
|
@@ -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 ""
|
Binary file
|
@@ -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 ""
|
Binary file
|
@@ -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 ""
|
Binary file
|
@@ -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": "
|
645
|
-
"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": "
|
781
|
-
"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
|
hiddifypanel/Events.py,sha256=AlnRdjVul0jP-NCT4-zoaQgowoOo-JhdQB4ytetAFKA,723
|
2
|
-
hiddifypanel/VERSION,sha256=
|
3
|
-
hiddifypanel/VERSION.py,sha256=
|
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=
|
22
|
-
hiddifypanel/hutils/github_issue.py,sha256=
|
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=
|
40
|
-
hiddifypanel/hutils/proxy/shared.py,sha256=
|
41
|
-
hiddifypanel/hutils/proxy/singbox.py,sha256=
|
42
|
-
hiddifypanel/hutils/proxy/xray.py,sha256=
|
43
|
-
hiddifypanel/hutils/proxy/xrayjson.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
826
|
-
hiddifypanel/translations/en/LC_MESSAGES/messages.po,sha256=
|
827
|
-
hiddifypanel/translations/fa/LC_MESSAGES/messages.mo,sha256=
|
828
|
-
hiddifypanel/translations/fa/LC_MESSAGES/messages.po,sha256=
|
829
|
-
hiddifypanel/translations/pt/LC_MESSAGES/messages.mo,sha256=
|
830
|
-
hiddifypanel/translations/pt/LC_MESSAGES/messages.po,sha256=
|
831
|
-
hiddifypanel/translations/ru/LC_MESSAGES/messages.mo,sha256=
|
832
|
-
hiddifypanel/translations/ru/LC_MESSAGES/messages.po,sha256=
|
833
|
-
hiddifypanel/translations/zh/LC_MESSAGES/messages.mo,sha256=
|
834
|
-
hiddifypanel/translations/zh/LC_MESSAGES/messages.po,sha256=
|
835
|
-
hiddifypanel/translations.i18n/en.json,sha256=
|
836
|
-
hiddifypanel/translations.i18n/fa.json,sha256=
|
837
|
-
hiddifypanel/translations.i18n/pt.json,sha256=
|
838
|
-
hiddifypanel/translations.i18n/ru.json,sha256=
|
839
|
-
hiddifypanel/translations.i18n/zh.json,sha256=
|
840
|
-
hiddifypanel-10.
|
841
|
-
hiddifypanel-10.
|
842
|
-
hiddifypanel-10.
|
843
|
-
hiddifypanel-10.
|
844
|
-
hiddifypanel-10.
|
845
|
-
hiddifypanel-10.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|