hiddifypanel 7.1.9__py3-none-any.whl → 8.0.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 (40) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/base.py +18 -15
  4. hiddifypanel/cache.py +11 -0
  5. hiddifypanel/drivers/abstract_driver.py +5 -0
  6. hiddifypanel/drivers/singbox_api.py +52 -0
  7. hiddifypanel/drivers/ssh_liberty_bridge_api.py +53 -0
  8. hiddifypanel/drivers/user_driver.py +30 -0
  9. hiddifypanel/drivers/xray_api.py +113 -0
  10. hiddifypanel/models/config.py +3 -1
  11. hiddifypanel/models/config_enum.py +7 -1
  12. hiddifypanel/models/proxy.py +3 -0
  13. hiddifypanel/models/user.py +3 -0
  14. hiddifypanel/panel/admin/UserAdmin.py +6 -6
  15. hiddifypanel/panel/commercial/restapi/resources.py +2 -2
  16. hiddifypanel/panel/custom_widgets.py +10 -10
  17. hiddifypanel/panel/hiddify.py +23 -1
  18. hiddifypanel/panel/init_db.py +27 -1
  19. hiddifypanel/panel/usage.py +6 -17
  20. hiddifypanel/panel/user/link_maker.py +1 -1
  21. hiddifypanel/panel/user/templates/home/all-configs.html +104 -91
  22. hiddifypanel/panel/user/templates/singbox_config.json +110 -0
  23. hiddifypanel/panel/user/user.py +32 -26
  24. hiddifypanel/templates/fake.html +4 -0
  25. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  26. hiddifypanel/translations/en/LC_MESSAGES/messages.po +72 -18
  27. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  28. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +62 -18
  29. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  30. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +62 -18
  31. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  32. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +62 -18
  33. {hiddifypanel-7.1.9.dist-info → hiddifypanel-8.0.0.dev0.dist-info}/METADATA +3 -1
  34. {hiddifypanel-7.1.9.dist-info → hiddifypanel-8.0.0.dev0.dist-info}/RECORD +38 -33
  35. hiddifypanel/singbox_api.py +0 -55
  36. hiddifypanel/xray_api.py +0 -115
  37. {hiddifypanel-7.1.9.dist-info → hiddifypanel-8.0.0.dev0.dist-info}/LICENSE.md +0 -0
  38. {hiddifypanel-7.1.9.dist-info → hiddifypanel-8.0.0.dev0.dist-info}/WHEEL +0 -0
  39. {hiddifypanel-7.1.9.dist-info → hiddifypanel-8.0.0.dev0.dist-info}/entry_points.txt +0 -0
  40. {hiddifypanel-7.1.9.dist-info → hiddifypanel-8.0.0.dev0.dist-info}/top_level.txt +0 -0
@@ -409,7 +409,7 @@ def to_clash(proxy, meta_or_normal):
409
409
  "public-key": proxy['reality_pbk'],
410
410
  "short-id": proxy['reality_short_id'],
411
411
  }
412
- if proxy['proto'] != 'grpc':
412
+ if proxy["transport"] != 'grpc':
413
413
  base["network"] = 'tcp'
414
414
 
415
415
  return base
@@ -1,97 +1,110 @@
1
1
  {{_("user.home.tool.all-configs")}}
2
2
 
3
3
  <div class="col">
4
- <table id="all-links" class="table table-bordered table-striped dt-responsive nowrap" style="width:100%">
5
- <thead>
6
- <tr>
7
- <th>{{_('user.home.allconfig.name')}}</th>
8
- <th>{{_('user.home.allconfig.type')}}</th>
9
- <th>{{_('Domain')}}</th>
10
- <th>{{_('user.home.allconfig.protocol')}}</th>
11
- <th>{{_('user.home.allconfig.transport')}}</th>
12
- <th>{{_('user.home.allconfig.security')}}</th>
4
+ <table id="all-links" class="table table-bordered table-striped dt-responsive nowrap" style="width:100%">
5
+ <thead>
6
+ <tr>
7
+ <th>{{_('user.home.allconfig.name')}}</th>
8
+ <th>{{_('user.home.allconfig.type')}}</th>
9
+ <th>{{_('Domain')}}</th>
10
+ <th>{{_('user.home.allconfig.protocol')}}</th>
11
+ <th>{{_('user.home.allconfig.transport')}}</th>
12
+ <th>{{_('user.home.allconfig.security')}}</th>
13
13
 
14
- </tr>
15
- </thead>
16
- <tbody>
17
- <tr>
18
- <td>
19
- <div class="btn-group">
20
- <a href="clashmeta://install-config?url=https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/clash/meta/all.yml&name=mnormal_{{db_domain.alias or db_domain.domain}}-{{asn}}-{{mode}}&asn={{asn}}&mode={{mode}}"
21
- class="btn btn-light orig-link"> {{_('user.home.allconfig.hiddify-configs')}}</a>
22
- </div>
23
- </td>
24
- <td><span class="badge badge-danger">{{_('all')}}</span></td>
25
- <td><span class="badge ">{{_('all')}}</span></td>
26
- <td><span class="badge badge-info">{{_('all')}}</span></td>
27
- <td><span class="badge badge-warning">{{_('all')}}</span></td>
28
- <td><span class="badge badge-success">{{_('all')}}</span></td>
29
- </tr>
30
- <tr>
31
- <td>
32
- <div class="btn-group">
33
- <a href="clash://install-config?url=https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/clash/all.yml&name=new_normal_{{db_domain.alias or db_domain.domain}}-{{asn}}-{{mode}}&asn={{asn}}&mode={{mode}}"
34
- class="btn btn-light orig-link"> {{_('user.home.allconfig.clash-configs')}}</a>
35
- </div>
36
- </td>
37
- <td><span class="badge badge-danger">{{_('all')}}</span></td>
38
- <td><span class="badge ">{{_('all')}}</span></td>
39
- <td><span class="badge badge-info">{{_('user.home.allconfigs.expect_vless')}}</span></td>
40
- <td><span class="badge badge-warning">{{_('all')}}</span></td>
41
- <td><span class="badge badge-success">{{_('all')}}</span></td>
42
- </tr>
43
- <tr>
44
- <td>
45
- <div class="btn-group">
46
- <a href="https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/all.txt?name={{db_domain.alias or db_domain.domain}}-{{asn}}&asn={{asn}}&mode={{mode}}"
47
- class="btn btn-light orig-link"> {{_('user.home.allconfig.link-configs')}}</a>
48
- </div>
49
- </td>
50
- <td><span class="badge badge-danger">{{_('all')}}</span></td>
51
- <td><span class="badge ">{{_('all')}}</span></td>
52
- <td><span class="badge badge-info">{{_('all')}}</span></td>
53
- <td><span class="badge badge-warning">{{_('all')}}</span></td>
54
- <td><span class="badge badge-success">{{_('all')}}</span></td>
55
- </tr>
56
- <tr>
57
- <td>
58
- <div class="btn-group">
59
- <a href="https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/all.txt?name=new_link_{{db_domain.alias or db_domain.domain}}-{{asn}}-{{mode}}&asn={{asn}}&mode={{mode}}&base64=True"
60
- class="btn btn-light orig-link"> {{_('user.home.allconfig.link-configs')}} b64</a>
61
- </div>
62
- </td>
63
- <td><span class="badge badge-danger">{{_('all')}}</span></td>
64
- <td><span class="badge ">{{_('all')}}</span></td>
65
- <td><span class="badge badge-info">{{_('all')}}</span></td>
66
- <td><span class="badge badge-warning">{{_('all')}}</span></td>
67
- <td><span class="badge badge-success">{{_('all')}}</span></td>
68
- </tr>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr>
18
+ <td>
19
+ <div class="btn-group">
20
+ <a href="clashmeta://install-config?url=https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/clash/meta/all.yml&name=mnormal_{{db_domain.alias or db_domain.domain}}-{{asn}}-{{mode}}&asn={{asn}}&mode={{mode}}"
21
+ class="btn btn-light orig-link"> {{_('user.home.allconfig.hiddify-configs')}}</a>
22
+ </div>
23
+ </td>
24
+ <td><span class="badge badge-danger">{{_('all')}}</span></td>
25
+ <td><span class="badge ">{{_('all')}}</span></td>
26
+ <td><span class="badge badge-info">{{_('all')}}</span></td>
27
+ <td><span class="badge badge-warning">{{_('all')}}</span></td>
28
+ <td><span class="badge badge-success">{{_('all')}}</span></td>
29
+ </tr>
30
+ <tr>
31
+ <td>
32
+ <div class="btn-group">
33
+ <a href="clash://install-config?url=https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/clash/all.yml&name=new_normal_{{db_domain.alias or db_domain.domain}}-{{asn}}-{{mode}}&asn={{asn}}&mode={{mode}}"
34
+ class="btn btn-light orig-link"> {{_('user.home.allconfig.clash-configs')}}</a>
35
+ </div>
36
+ </td>
37
+ <td><span class="badge badge-danger">{{_('all')}}</span></td>
38
+ <td><span class="badge ">{{_('all')}}</span></td>
39
+ <td><span class="badge badge-info">{{_('user.home.allconfigs.expect_vless')}}</span></td>
40
+ <td><span class="badge badge-warning">{{_('all')}}</span></td>
41
+ <td><span class="badge badge-success">{{_('all')}}</span></td>
42
+ </tr>
43
+ <tr>
44
+ <td>
45
+ <div class="btn-group">
46
+ <a href="https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/all.txt?name={{db_domain.alias or db_domain.domain}}-{{asn}}&asn={{asn}}&mode={{mode}}"
47
+ class="btn btn-light orig-link"> {{_('user.home.allconfig.link-configs')}}</a>
48
+ </div>
49
+ </td>
50
+ <td><span class="badge badge-danger">{{_('all')}}</span></td>
51
+ <td><span class="badge ">{{_('all')}}</span></td>
52
+ <td><span class="badge badge-info">{{_('all')}}</span></td>
53
+ <td><span class="badge badge-warning">{{_('all')}}</span></td>
54
+ <td><span class="badge badge-success">{{_('all')}}</span></td>
55
+ </tr>
69
56
 
70
- %for d in domains
71
- %for t in (['http','tls'] if hconfig(ConfigEnum.http_proxy_enable,d.child_id) else ['tls'])
72
- %for port in hconfig(ConfigEnum.http_ports if t=='http' else ConfigEnum.tls_ports,d.child_id).split(',')
73
- %set phttp=port if t=='http' else None
74
- %set ptls=port if t=='tls' else None
75
- % for type in link_maker.all_proxies(d.child_id)
76
- % set pinfo=link_maker.make_proxy(type,d,phttp=phttp,ptls=ptls)
77
- % if 'msg' not in pinfo
78
- <tr>
79
- <td>
80
- <div class="btn-group"><a href='{{link_maker.to_link(pinfo)}}'
81
- class="btn btn-light orig-link">{{pinfo["name"].replace("_", " ")}}</a></div>
82
- </td>
83
- <td><span class="badge badge-danger"> {% if d.has_auto_ip %}Auto {%endif%}{{pinfo["mode"]}}</span></td>
84
- <td><span class="badge ltr">{{d.domain}}</span></td>
85
- <td><span class="badge badge-info">{{pinfo["proto"]}}</span></td>
86
- <td><span class="badge badge-warning">{{pinfo['transport']}}</span></td>
87
- <td><span class="badge badge-success">{{pinfo['l3']}}</span></td>
88
- </tr>
89
-
90
- %endif
91
- % endfor
92
- % endfor
93
- % endfor
94
- % endfor
95
- </tbody>
96
- </table>
57
+ <tr>
58
+ <td>
59
+ <div class="btn-group">
60
+ <a href="https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/singbox.json?name={{db_domain.alias or db_domain.domain}}-{{asn}}&asn={{asn}}&mode={{mode}}"
61
+ class="btn btn-light orig-link"> {{_('singbox: ssh')}}</a>
62
+ </div>
63
+ </td>
64
+ <td><span class="badge badge-danger">{{_('ssh')}}</span></td>
65
+ <td><span class="badge ">{{_('ssh')}}</span></td>
66
+ <td><span class="badge badge-info">{{_('ssh')}}</span></td>
67
+ <td><span class="badge badge-warning">{{_('ssh')}}</span></td>
68
+ <td><span class="badge badge-success">{{_('ssh')}}</span></td>
69
+ </tr>
70
+ <tr>
71
+ <td>
72
+ <div class="btn-group">
73
+ <a href="https://{{domain}}/{{hconfigs[ConfigEnum.proxy_path]}}/{{user.uuid}}/all.txt?name=new_link_{{db_domain.alias or db_domain.domain}}-{{asn}}-{{mode}}&asn={{asn}}&mode={{mode}}&base64=True"
74
+ class="btn btn-light orig-link"> {{_('user.home.allconfig.link-configs')}} b64</a>
75
+ </div>
76
+ </td>
77
+ <td><span class="badge badge-danger">{{_('all')}}</span></td>
78
+ <td><span class="badge ">{{_('all')}}</span></td>
79
+ <td><span class="badge badge-info">{{_('all')}}</span></td>
80
+ <td><span class="badge badge-warning">{{_('all')}}</span></td>
81
+ <td><span class="badge badge-success">{{_('all')}}</span></td>
82
+ </tr>
83
+
84
+ %for d in domains
85
+ %for t in (['http','tls'] if hconfig(ConfigEnum.http_proxy_enable,d.child_id) else ['tls'])
86
+ %for port in hconfig(ConfigEnum.http_ports if t=='http' else ConfigEnum.tls_ports,d.child_id).split(',')
87
+ %set phttp=port if t=='http' else None
88
+ %set ptls=port if t=='tls' else None
89
+ % for type in link_maker.all_proxies(d.child_id)
90
+ % set pinfo=link_maker.make_proxy(type,d,phttp=phttp,ptls=ptls)
91
+ % if 'msg' not in pinfo
92
+ <tr>
93
+ <td>
94
+ <div class="btn-group"><a href='{{link_maker.to_link(pinfo)}}' class="btn btn-light orig-link">{{pinfo["name"].replace("_", " ")}}</a></div>
95
+ </td>
96
+ <td><span class="badge badge-danger"> {% if d.has_auto_ip %}Auto {%endif%}{{pinfo["mode"]}}</span></td>
97
+ <td><span class="badge ltr">{{d.domain}}</span></td>
98
+ <td><span class="badge badge-info">{{pinfo["proto"]}}</span></td>
99
+ <td><span class="badge badge-warning">{{pinfo['transport']}}</span></td>
100
+ <td><span class="badge badge-success">{{pinfo['l3']}}</span></td>
101
+ </tr>
102
+
103
+ %endif
104
+ % endfor
105
+ % endfor
106
+ % endfor
107
+ % endfor
108
+ </tbody>
109
+ </table>
97
110
  </div>
@@ -0,0 +1,110 @@
1
+ {
2
+ "log": {
3
+ "disabled": false,
4
+ "level": "warn",
5
+ "timestamp": false
6
+ },
7
+ "dns": {
8
+ "servers": [
9
+ {
10
+ "tag": "global",
11
+ "address": "8.8.8.8",
12
+ "strategy": "prefer_ipv4",
13
+ "detour": "ssh-out"
14
+ },
15
+ {
16
+ "tag": "global",
17
+ "address": "https://1.1.1.1/dns-query",
18
+ "address_resolver": "local",
19
+ "strategy": "prefer_ipv4",
20
+ "detour": "ssh-out"
21
+ },
22
+ {
23
+ "tag": "local",
24
+ "address": "8.8.8.8",
25
+ "strategy": "prefer_ipv4",
26
+ "detour": "direct-out"
27
+ },
28
+ {
29
+ "tag": "block",
30
+ "address": "rcode://success"
31
+ }
32
+ ],
33
+ "rules": [
34
+ {
35
+ "domain_suffix": [
36
+ ".ir",
37
+ ".edu",
38
+ ".cn",
39
+ "microsoft.com",
40
+ "bale.ai",
41
+ "eitaa.com",
42
+ "google.com"
43
+ ],
44
+ "server": "local"
45
+ }
46
+ ],
47
+ "final": "global"
48
+ },
49
+ "inbounds": [
50
+ {
51
+ "type": "tun",
52
+ "tag": "tun-in",
53
+ "inet4_address": "172.43.0.1/30",
54
+ "inet6_address": "fdfe:dcba:9876::1/126",
55
+ "mtu": 9000,
56
+ "endpoint_independent_nat": true,
57
+ "auto_route": true,
58
+ "strict_route": true,
59
+ "stack": "system",
60
+ "sniff": true,
61
+ "domain_strategy": "prefer_ipv6",
62
+ "sniff_override_destination": true
63
+ }
64
+ ],
65
+ "outbounds": [
66
+ {
67
+ "type": "ssh",
68
+ "tag": "ssh-out",
69
+ "server": "$server_addr",
70
+ "server_port": {{hconfigs[ConfigEnum.ssh_server_port]}},
71
+ "user": "{{user.uuid}}",
72
+ "private_key": "{{user.ed25519_private_key}}",
73
+ "host_key": {{host_keys}},
74
+ "client_version": "{{ssh_client_version}}"
75
+ },
76
+ {
77
+ "type": "direct",
78
+ "tag": "direct-out"
79
+ },
80
+ {
81
+ "type": "dns",
82
+ "tag": "dns-out"
83
+ }
84
+ ],
85
+ "route": {
86
+ "rules": [
87
+ {
88
+ "domain_suffix": [
89
+ ".ir",
90
+ ".edu",
91
+ ".cn",
92
+ "microsoft.com",
93
+ "bale.ai",
94
+ "eitaa.com",
95
+ "google.com"
96
+ ],
97
+ "outbound": "direct-out"
98
+ },
99
+ {
100
+ "protocol": "dns",
101
+ "outbound": "dns-out"
102
+ },
103
+ {
104
+ "inbound": ["tun-in"],
105
+ "outbound": "ssh-out"
106
+ }
107
+ ],
108
+ "auto_detect_interface": true
109
+ }
110
+ }
@@ -71,18 +71,19 @@ class UserView(FlaskView):
71
71
  resp = Response("")
72
72
  else:
73
73
  resp = Response(render_template('clash_config.yml', typ=typ, meta_or_normal=meta_or_normal, **c, hash=hash_rnd))
74
- resp.mimetype = "text/plain"
75
- resp.headers['Subscription-Userinfo'] = f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
76
- resp.headers['profile-web-page-url'] = request.base_url.split("clash")[0].replace("http://", "https://")
77
- if hconfig(ConfigEnum.branding_site):
78
- resp.headers['support-url'] = hconfig(ConfigEnum.branding_site)
79
- resp.headers['profile-update-interval'] = 1
80
-
81
- profile_title = f'{c["db_domain"].alias or c["db_domain"].domain} {c["user"].name}'
82
- if c['has_auto_cdn']:
83
- profile_title += f" {c['asn']}"
84
- resp.headers['profile-title'] = 'base64:'+do_base_64(profile_title)
85
- return resp
74
+
75
+ return add_headers(resp, c)
76
+
77
+ @route('/singbox.json', methods=["GET", "HEAD"])
78
+ def singbox(self):
79
+ mode = "new" # request.args.get("mode")
80
+ c = get_common_data(g.user_uuid, mode)
81
+ # response.content_type = 'text/plain';
82
+ if request.method == 'HEAD':
83
+ resp = ""
84
+ else:
85
+ resp = render_template('singbox_config.json', **c, host_keys=hiddify.get_hostkeys(True), ssh_client_version=hiddify.get_ssh_client_version(user), base64=False)
86
+ return add_headers(resp, c)
86
87
 
87
88
  @route('/all.txt', methods=["GET", "HEAD"])
88
89
  def all_configs(self):
@@ -102,20 +103,7 @@ class UserView(FlaskView):
102
103
  res += line+"\n"
103
104
  if base64:
104
105
  res = do_base_64(res)
105
- resp = Response(res)
106
- resp.mimetype = "text/plain"
107
- resp.headers['Subscription-Userinfo'] = f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
108
- resp.headers['profile-web-page-url'] = request.base_url.split("all.txt")[0].replace("http://", "https://")
109
- if hconfig(ConfigEnum.branding_site):
110
- resp.headers['support-url'] = hconfig(ConfigEnum.branding_site)
111
- resp.headers['profile-update-interval'] = 1
112
- # resp.headers['content-disposition']=f'attachment; filename="{c["db_domain"].alias or c["db_domain"].domain} {c["user"].name}"'
113
- profile_title = f'{c["db_domain"].alias or c["db_domain"].domain} {c["user"].name}'
114
- if c['has_auto_cdn']:
115
- profile_title += f" {c['asn']}"
116
- resp.headers['profile-title'] = 'base64:'+do_base_64(profile_title)
117
-
118
- return resp
106
+ return add_headers(res, c)
119
107
 
120
108
  @route('/manifest.webmanifest')
121
109
  def create_pwa_manifest(self):
@@ -259,3 +247,21 @@ def get_common_data(user_uuid, mode, no_domain=False, filter_domain=None):
259
247
  "country": clean_ip.get_country(user_ip),
260
248
  'has_auto_cdn': has_auto_cdn
261
249
  }
250
+
251
+
252
+ def add_headers(res, c):
253
+ resp = Response(res)
254
+ resp.mimetype = "text/plain"
255
+ resp.headers['Subscription-Userinfo'] = f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
256
+ resp.headers['profile-web-page-url'] = request.base_url.rsplit('/', 1)[0].replace("http://", "https://")+"/"
257
+
258
+ if hconfig(ConfigEnum.branding_site):
259
+ resp.headers['support-url'] = hconfig(ConfigEnum.branding_site)
260
+ resp.headers['profile-update-interval'] = 1
261
+ # resp.headers['content-disposition']=f'attachment; filename="{c["db_domain"].alias or c["db_domain"].domain} {c["user"].name}"'
262
+ profile_title = f'{c["db_domain"].alias or c["db_domain"].domain} {c["user"].name}'
263
+ if c['has_auto_cdn']:
264
+ profile_title += f" {c['asn']}"
265
+ resp.headers['profile-title'] = 'base64:'+do_base_64(profile_title)
266
+
267
+ return resp
@@ -0,0 +1,4 @@
1
+ {{_("config.first_setup.label")}}{{_("config.first_setup.description")}}{{_("config.core_type.label")}}{{_("config.core_type.description")}}{{_("config.warp_enable.label")}}{{_("config.warp_enable.description")}}{{_("config.warp_mode.label")}}{{_("config.warp_mode.description")}}{{_("config.warp_plus_code.label")}}{{_("config.warp_plus_code.description")}}{{_("config.dns_server.label")}}{{_("config.dns_server.description")}}{{_("config.reality_fallback_domain.label")}}{{_("config.reality_fallback_domain.description")}}{{_("config.reality_server_names.label")}}{{_("config.reality_server_names.description")}}{{_("config.reality_short_ids.label")}}{{_("config.reality_short_ids.description")}}{{_("config.reality_private_key.label")}}{{_("config.reality_private_key.description")}}{{_("config.reality_public_key.label")}}{{_("config.reality_public_key.description")}}{{_("config.restls1_2_domain.label")}}{{_("config.restls1_2_domain.description")}}{{_("config.restls1_3_domain.label")}}{{_("config.restls1_3_domain.description")}}{{_("config.show_usage_in_sublink.label")}}{{_("config.show_usage_in_sublink.description")}}{{_("config.cloudflare.label")}}{{_("config.cloudflare.description")}}{{_("config.license.label")}}{{_("config.license.description")}}{{_("config.country.label")}}{{_("config.country.description")}}{{_("config.package_mode.label")}}{{_("config.package_mode.description")}}{{_("config.utls.label")}}{{_("config.utls.description")}}{{_("config.telegram_bot_token.label")}}{{_("config.telegram_bot_token.description")}}{{_("config.is_parent.label")}}{{_("config.is_parent.description")}}{{_("config.parent_panel.label")}}{{_("config.parent_panel.description")}}{{_("config.unique_id.label")}}{{_("config.unique_id.description")}}{{_("config.last_hash.label")}}{{_("config.last_hash.description")}}{{_("config.cdn_forced_host.label")}}{{_("config.cdn_forced_host.description")}}{{_("config.lang.label")}}{{_("config.lang.description")}}{{_("config.admin_lang.label")}}{{_("config.admin_lang.description")}}{{_("config.admin_secret.label")}}{{_("config.admin_secret.description")}}{{_("config.tls_ports.label")}}{{_("config.tls_ports.description")}}{{_("config.http_ports.label")}}{{_("config.http_ports.description")}}{{_("config.kcp_ports.label")}}{{_("config.kcp_ports.description")}}{{_("config.kcp_enable.label")}}{{_("config.kcp_enable.description")}}{{_("config.decoy_domain.label")}}{{_("config.decoy_domain.description")}}{{_("config.proxy_path.label")}}{{_("config.proxy_path.description")}}{{_("config.firewall.label")}}{{_("config.firewall.description")}}{{_("config.netdata.label")}}{{_("config.netdata.description")}}{{_("config.http_proxy_enable.label")}}{{_("config.http_proxy_enable.description")}}{{_("config.block_iran_sites.label")}}{{_("config.block_iran_sites.description")}}{{_("config.allow_invalid_sni.label")}}{{_("config.allow_invalid_sni.description")}}{{_("config.auto_update.label")}}{{_("config.auto_update.description")}}{{_("config.speed_test.label")}}{{_("config.speed_test.description")}}{{_("config.only_ipv4.label")}}{{_("config.only_ipv4.description")}}{{_("config.shared_secret.label")}}{{_("config.shared_secret.description")}}{{_("config.telegram_enable.label")}}{{_("config.telegram_enable.description")}}{{_("config.telegram_adtag.label")}}{{_("config.telegram_adtag.description")}}{{_("config.telegram_lib.label")}}{{_("config.telegram_lib.description")}}{{_("config.telegram_fakedomain.label")}}{{_("config.telegram_fakedomain.description")}}{{_("config.v2ray_enable.label")}}{{_("config.v2ray_enable.description")}}{{_("config.torrent_block.label")}}{{_("config.torrent_block.description")}}{{_("config.ssfaketls_enable.label")}}{{_("config.ssfaketls_enable.description")}}{{_("config.ssfaketls_fakedomain.label")}}{{_("config.ssfaketls_fakedomain.description")}}{{_("config.shadowtls_enable.label")}}{{_("config.shadowtls_enable.description")}}{{_("config.shadowtls_fakedomain.label")}}{{_("config.shadowtls_fakedomain.description")}}{{_("config.tuic_enable.label")}}{{_("config.tuic_enable.description")}}{{_("config.tuic_port.label")}}{{_("config.tuic_port.description")}}{{_("config.ssr_enable.label")}}{{_("config.ssr_enable.description")}}{{_("config.ssr_fakedomain.label")}}{{_("config.ssr_fakedomain.description")}}{{_("config.vmess_enable.label")}}{{_("config.vmess_enable.description")}}{{_("config.domain_fronting_domain.label")}}{{_("config.domain_fronting_domain.description")}}{{_("config.domain_fronting_http_enable.label")}}{{_("config.domain_fronting_http_enable.description")}}{{_("config.domain_fronting_tls_enable.label")}}{{_("config.domain_fronting_tls_enable.description")}}{{_("config.db_version.label")}}{{_("config.db_version.description")}}{{_("config.branding_title.label")}}{{_("config.branding_title.description")}}{{_("config.branding_site.label")}}{{_("config.branding_site.description")}}{{_("config.branding_freetext.label")}}{{_("config.branding_freetext.description")}}{{_("config.not_found.label")}}{{_("config.not_found.description")}}{{_("config.path_vmess.label")}}{{_("config.path_vmess.description")}}{{_("config.path_vless.label")}}{{_("config.path_vless.description")}}{{_("config.path_trojan.label")}}{{_("config.path_trojan.description")}}{{_("config.path_v2ray.label")}}{{_("config.path_v2ray.description")}}{{_("config.path_ss.label")}}{{_("config.path_ss.description")}}{{_("config.path_ws.label")}}{{_("config.path_ws.description")}}{{_("config.path_tcp.label")}}{{_("config.path_tcp.description")}}{{_("config.path_grpc.label")}}{{_("config.path_grpc.description")}}
2
+ {{_("config.admin.label")}}{{_("config.admin.description")}}{{_("config.branding.label")}}{{_("config.branding.description")}}{{_("config.general.label")}}{{_("config.general.description")}}{{_("config.proxies.label")}}{{_("config.proxies.description")}}{{_("config.domain_fronting.label")}}{{_("config.domain_fronting.description")}}{{_("config.telegram.label")}}{{_("config.telegram.description")}}{{_("config.http.label")}}{{_("config.http.description")}}{{_("config.tls.label")}}{{_("config.tls.description")}}{{_("config.ssfaketls.label")}}{{_("config.ssfaketls.description")}}{{_("config.shadowtls.label")}}{{_("config.shadowtls.description")}}{{_("config.restls.label")}}{{_("config.restls.description")}}{{_("config.tuic.label")}}{{_("config.tuic.description")}}{{_("config.ssr.label")}}{{_("config.ssr.description")}}{{_("config.kcp.label")}}{{_("config.kcp.description")}}{{_("config.hidden.label")}}{{_("config.hidden.description")}}{{_("config.advanced.label")}}{{_("config.advanced.description")}}{{_("config.too_advanced.label")}}{{_("config.too_advanced.description")}}{{_("config.warp.label")}}{{_("config.warp.description")}}{{_("config.reality.label")}}{{_("config.reality.description")}}
3
+ {{_("direct")}}{{_("sub_link_only")}}{{_("cdn")}}{{_("auto_cdn_ip")}}{{_("relay")}}{{_("reality")}}{{_("old_xtls_direct")}}{{_("worker")}}{{_("fake")}}
4
+ {{_("no_reset")}}{{_("monthly")}}{{_("weekly")}}{{_("daily")}}
@@ -3,8 +3,8 @@ msgid ""
3
3
  msgstr ""
4
4
  "Project-Id-Version: HiddifyPanel\n"
5
5
  "Report-Msgid-Bugs-To: \n"
6
- "POT-Creation-Date: 2023-07-30 16:43+0200\n"
7
- "PO-Revision-Date: 2023-07-30 09:30-0500\n"
6
+ "POT-Creation-Date: 2023-08-03 10:13+0200\n"
7
+ "PO-Revision-Date: 2023-07-30 09:43-0500\n"
8
8
  "Last-Translator: hidden u\n"
9
9
  "Language-Team: English (USA)\n"
10
10
  "Language: en_US\n"
@@ -15,7 +15,7 @@ msgstr ""
15
15
  "Generated-By: Babel 2.12.1\n"
16
16
 
17
17
  # | msgid "This Domain does not exist in the Panel !"
18
- #: hiddifypanel/models/domain.py:134 hiddifypanel/panel/user/user.py:177
18
+ #: hiddifypanel/models/domain.py:134 hiddifypanel/panel/user/user.py:165
19
19
  msgid "This domain does not exist in the panel!"
20
20
  msgstr "This Domain does not exist in the Panel !"
21
21
 
@@ -24,27 +24,27 @@ msgstr "This Domain does not exist in the Panel !"
24
24
  msgid "Error! auto cdn ip can not be find, please contact admin."
25
25
  msgstr "Error In Auto CDN IP! It Can Not Be Find, Please Contact Admin"
26
26
 
27
- #: hiddifypanel/panel/hiddify.py:76
27
+ #: hiddifypanel/panel/hiddify.py:78
28
28
  #, fuzzy
29
29
  msgid "Access Denied"
30
30
  msgstr "Access Denied"
31
31
 
32
32
  # | msgid "Apply Configs"
33
- #: hiddifypanel/panel/hiddify.py:221
33
+ #: hiddifypanel/panel/hiddify.py:223
34
34
  msgid "admin.config.apply_configs"
35
35
  msgstr "Apply Configs"
36
36
 
37
37
  # | msgid ""
38
38
  # | "Configs have been changed successfully. Click %(link)s to apply the "
39
39
  # | "configs. It may take 2 minutes to apply"
40
- #: hiddifypanel/panel/hiddify.py:222
40
+ #: hiddifypanel/panel/hiddify.py:224
41
41
  msgid "config.validation-success"
42
42
  msgstr ""
43
43
  "Configs have been changed successfully. Click %(link)s to apply the configs."
44
44
  " It may take 2 minutes to apply"
45
45
 
46
46
  # | msgid " ✅ Configs have been changed successfully"
47
- #: hiddifypanel/panel/hiddify.py:224
47
+ #: hiddifypanel/panel/hiddify.py:226
48
48
  msgid "config.validation-success-no-reset"
49
49
  msgstr " ✅ Configs have been changed successfully"
50
50
 
@@ -57,14 +57,14 @@ msgstr " ✅ Configs have been changed successfully"
57
57
  #: hiddifypanel/panel/admin/DomainAdmin.py:179
58
58
  #: hiddifypanel/panel/admin/QuickSetup.py:126
59
59
  #: hiddifypanel/panel/commercial/ParentDomainAdmin.py:107
60
- #: hiddifypanel/panel/hiddify.py:343
60
+ #: hiddifypanel/panel/hiddify.py:345
61
61
  msgid "Domain can not be resolved! there is a problem in your domain"
62
62
  msgstr ""
63
63
  "Domain can not be resolved! There is a problem in your domain. Please check "
64
64
  "your Domain configurations."
65
65
 
66
66
  # | msgid "Last Day"
67
- #: hiddifypanel/panel/hiddify.py:371
67
+ #: hiddifypanel/panel/hiddify.py:373
68
68
  msgid "0 - Last day"
69
69
  msgstr "Last Day"
70
70
 
@@ -72,7 +72,7 @@ msgstr "Last Day"
72
72
  # | "Selected Domain for REALITY is not in the same ASN. To better use of the
73
73
  # "
74
74
  # | "Protocol, it is better to find a Domain in the same ASN"
75
- #: hiddifypanel/panel/hiddify.py:652
75
+ #: hiddifypanel/panel/hiddify.py:654
76
76
  msgid ""
77
77
  "selected domain for REALITY is not in the same ASN. To better use of the "
78
78
  "protocol, it is better to find a domain in the same ASN."
@@ -81,12 +81,12 @@ msgstr ""
81
81
  "Protocol, it is better to find a Domain in the same ASN"
82
82
 
83
83
  # | msgid "User Activated"
84
- #: hiddifypanel/panel/usage.py:113
84
+ #: hiddifypanel/panel/usage.py:102
85
85
  msgid "User activated!"
86
86
  msgstr "User Activated"
87
87
 
88
88
  # | msgid "Package Ended"
89
- #: hiddifypanel/panel/usage.py:113
89
+ #: hiddifypanel/panel/usage.py:102
90
90
  msgid "Package ended!"
91
91
  msgstr "Package Ended"
92
92
 
@@ -2738,11 +2738,11 @@ msgstr "Hiddify Configs"
2738
2738
  #: hiddifypanel/panel/user/templates/home/all-configs.html:52
2739
2739
  #: hiddifypanel/panel/user/templates/home/all-configs.html:53
2740
2740
  #: hiddifypanel/panel/user/templates/home/all-configs.html:54
2741
- #: hiddifypanel/panel/user/templates/home/all-configs.html:63
2742
- #: hiddifypanel/panel/user/templates/home/all-configs.html:64
2743
- #: hiddifypanel/panel/user/templates/home/all-configs.html:65
2744
- #: hiddifypanel/panel/user/templates/home/all-configs.html:66
2745
- #: hiddifypanel/panel/user/templates/home/all-configs.html:67
2741
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:77
2742
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:78
2743
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:79
2744
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:80
2745
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:81
2746
2746
  #: hiddifypanel/panel/user/templates/home/all-configs_old.html:22
2747
2747
  #: hiddifypanel/panel/user/templates/home/all-configs_old.html:23
2748
2748
  #: hiddifypanel/panel/user/templates/home/all-configs_old.html:24
@@ -2771,13 +2771,27 @@ msgstr "Except VLess"
2771
2771
 
2772
2772
  # | msgid "Subscription Link"
2773
2773
  #: hiddifypanel/panel/user/templates/home/all-configs.html:47
2774
- #: hiddifypanel/panel/user/templates/home/all-configs.html:60
2774
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:74
2775
2775
  #: hiddifypanel/panel/user/templates/home/all-configs_old.html:43
2776
2776
  #: hiddifypanel/panel/user/templates/home/android.html:43
2777
2777
  #: hiddifypanel/panel/user/templates/home/ios.html:29
2778
2778
  msgid "user.home.allconfig.link-configs"
2779
2779
  msgstr "Subscription Link"
2780
2780
 
2781
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:61
2782
+ #, fuzzy
2783
+ msgid "singbox: ssh"
2784
+ msgstr "singbox: ssh"
2785
+
2786
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:64
2787
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:65
2788
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:66
2789
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:67
2790
+ #: hiddifypanel/panel/user/templates/home/all-configs.html:68
2791
+ #, fuzzy
2792
+ msgid "ssh"
2793
+ msgstr "ssh"
2794
+
2781
2795
  # | msgid ""
2782
2796
  # | "📍 Please select one of the following applications:\n"
2783
2797
  # | "<br />\n"
@@ -3786,6 +3800,36 @@ msgstr ""
3786
3800
  "\n"
3787
3801
  "Please contact us at <a href=\"mailto:info@hiddify.com\">info@hiddify.com</a> if you can help us."
3788
3802
 
3803
+ #: hiddifypanel/templates/fake.html:1
3804
+ #, fuzzy
3805
+ msgid "config.ssh_server_redis_url.label"
3806
+ msgstr "config.ssh_server_redis_url.label"
3807
+
3808
+ #: hiddifypanel/templates/fake.html:1
3809
+ #, fuzzy
3810
+ msgid "config.ssh_server_redis_url.description"
3811
+ msgstr "config.ssh_server_redis_url.description"
3812
+
3813
+ #: hiddifypanel/templates/fake.html:1
3814
+ #, fuzzy
3815
+ msgid "config.ssh_server_ports.label"
3816
+ msgstr "config.ssh_server_ports.label"
3817
+
3818
+ #: hiddifypanel/templates/fake.html:1
3819
+ #, fuzzy
3820
+ msgid "config.ssh_server_ports.description"
3821
+ msgstr "config.ssh_server_ports.description"
3822
+
3823
+ #: hiddifypanel/templates/fake.html:1
3824
+ #, fuzzy
3825
+ msgid "config.ssh_server_enable.label"
3826
+ msgstr "config.ssh_server_enable.label"
3827
+
3828
+ #: hiddifypanel/templates/fake.html:1
3829
+ #, fuzzy
3830
+ msgid "config.ssh_server_enable.description"
3831
+ msgstr "config.ssh_server_enable.description"
3832
+
3789
3833
  # | msgid "🎛️ Core"
3790
3834
  #: hiddifypanel/templates/fake.html:1
3791
3835
  msgid "config.core_type.label"
@@ -3818,6 +3862,16 @@ msgstr ""
3818
3862
  "🚧 Block Malware 1.1.1.2 <br>\n"
3819
3863
  "🔞 Block Porn 1.1.1.3\n"
3820
3864
 
3865
+ #: hiddifypanel/templates/fake.html:2
3866
+ #, fuzzy
3867
+ msgid "config.ssh.label"
3868
+ msgstr "config.ssh.label"
3869
+
3870
+ #: hiddifypanel/templates/fake.html:2
3871
+ #, fuzzy
3872
+ msgid "config.ssh.description"
3873
+ msgstr "config.ssh.description"
3874
+
3821
3875
  #: hiddifypanel/templates/fake.html:2
3822
3876
  #, fuzzy
3823
3877
  msgid "config.hidden.label"