GNServer 0.0.0.0.61__tar.gz → 0.0.0.0.63__tar.gz
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.
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_app.py +35 -3
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_client.py +17 -11
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/models.py +9 -6
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer.egg-info/PKG-INFO +1 -1
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/PKG-INFO +1 -1
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/setup.py +1 -1
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/__init__.py +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_cors_resolver.py +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_crt.py +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_func_params_validation.py +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_routes.py +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer/_template_resolver.py +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer.egg-info/SOURCES.txt +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer.egg-info/dependency_links.txt +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer.egg-info/requires.txt +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/GNServer.egg-info/top_level.txt +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/LICENSE +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/GNServer/mmbConfig.json +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/LICENSE +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/MANIFEST.in +0 -0
- {gnserver-0.0.0.0.61 → gnserver-0.0.0.0.63}/setup.cfg +0 -0
@@ -18,14 +18,15 @@ from typing import Any, AsyncGenerator, Union
|
|
18
18
|
from gnobjects.net.objects import GNRequest, GNResponse, FileObject, CORSObject, TemplateObject
|
19
19
|
from gnobjects.net.fastcommands import AllGNFastCommands, GNFastCommand
|
20
20
|
|
21
|
+
from KeyisBTools.cryptography.bytes import userFriendly
|
21
22
|
|
22
23
|
from ._func_params_validation import register_schema_by_key, validate_params_by_key
|
23
24
|
from ._cors_resolver import resolve_cors
|
24
|
-
|
25
25
|
from ._routes import Route, _compile_path, _ensure_async, _convert_value
|
26
|
-
|
27
26
|
from .models import KDCObject
|
27
|
+
from ._client import AsyncClient
|
28
28
|
|
29
|
+
from pathlib import Path
|
29
30
|
|
30
31
|
try:
|
31
32
|
if not sys.platform.startswith("win"):
|
@@ -122,6 +123,8 @@ class App:
|
|
122
123
|
|
123
124
|
self._kdc: Optional[KDCObject] = None
|
124
125
|
|
126
|
+
self.client = AsyncClient()
|
127
|
+
|
125
128
|
def setKDC(self, kdc: KDCObject):
|
126
129
|
self._kdc = kdc
|
127
130
|
|
@@ -487,21 +490,50 @@ class App:
|
|
487
490
|
port: int,
|
488
491
|
cert_path: str,
|
489
492
|
key_path: str,
|
493
|
+
server_key: Optional[Union[str, Path]] = None,
|
490
494
|
*,
|
491
495
|
host: str = '0.0.0.0',
|
492
496
|
idle_timeout: float = 20.0,
|
493
497
|
wait: bool = True,
|
494
|
-
run: Optional[Callable] = None
|
498
|
+
run: Optional[Callable] = None,
|
499
|
+
kdc_passive_key_sync_domains: List[str] = [],
|
500
|
+
kdc_active_key_synchronization: bool = True
|
495
501
|
):
|
496
502
|
"""
|
497
503
|
# Запустить сервер
|
498
504
|
|
499
505
|
Запускает сервер в главном процессе asyncio.run()
|
506
|
+
|
507
|
+
server_key: `:kdc.core:<...>:<...>:`
|
500
508
|
"""
|
501
509
|
|
502
510
|
self.domain = domain
|
503
511
|
|
504
512
|
|
513
|
+
if server_key is not None:
|
514
|
+
if isinstance(server_key, Path):
|
515
|
+
server_key = server_key.read_text('utf-8')
|
516
|
+
|
517
|
+
if server_key[0] == ':' and server_key[0] == ':':
|
518
|
+
kdc_domain, dns_key, kdc_key = server_key.split(':')
|
519
|
+
|
520
|
+
dns_key = userFriendly.decode(dns_key)
|
521
|
+
kdc_key = userFriendly.decode(kdc_key)
|
522
|
+
|
523
|
+
kdc = KDCObject(self.domain, kdc_domain, kdc_key, kdc_passive_key_sync_domains, active_key_synchronization=kdc_active_key_synchronization)
|
524
|
+
self.setKDC(kdc)
|
525
|
+
|
526
|
+
if self.client._domain is None:
|
527
|
+
self.client._domain = domain
|
528
|
+
if self.client._dns_key is None:
|
529
|
+
self.client.setDNSkey(dns_key)
|
530
|
+
|
531
|
+
|
532
|
+
|
533
|
+
|
534
|
+
|
535
|
+
|
536
|
+
|
505
537
|
self._init_sys_routes()
|
506
538
|
|
507
539
|
cfg = QuicConfiguration(
|
@@ -161,20 +161,26 @@ class AsyncClient:
|
|
161
161
|
self.__dns_client: Optional[AsyncClient] = None
|
162
162
|
self._dns_cache: TTLDict = TTLDict()
|
163
163
|
|
164
|
-
self.
|
164
|
+
self._domain = domain
|
165
165
|
|
166
166
|
self._kdc: Optional[KDCObject] = None
|
167
167
|
|
168
|
+
|
168
169
|
if server_key:
|
169
|
-
|
170
|
-
|
170
|
+
self.setDNSkey(server_key)
|
171
|
+
|
172
|
+
|
173
|
+
def setDNSkey(self, key: Union[bytes, str]):
|
174
|
+
if key:
|
175
|
+
if isinstance(key, bytes):
|
176
|
+
self._dns_key = key
|
171
177
|
else:
|
172
|
-
if os.path.exists(
|
173
|
-
self.
|
178
|
+
if os.path.exists(key):
|
179
|
+
self._dns_key = open(key, 'rb').read()
|
174
180
|
else:
|
175
|
-
self.
|
181
|
+
self._dns_key = userFriendly.decode(key)
|
176
182
|
else:
|
177
|
-
self.
|
183
|
+
self._dns_key = None
|
178
184
|
|
179
185
|
def setKDC(self, kdc: KDCObject):
|
180
186
|
self._kdc = kdc
|
@@ -348,10 +354,10 @@ class AsyncClient:
|
|
348
354
|
if self.__dns_client is None:
|
349
355
|
self.__dns_client = AsyncClient()
|
350
356
|
|
351
|
-
if self.
|
352
|
-
s = s2.sign(self.
|
353
|
-
data = m1.encrypt(s, domain.encode(), serialize({'domain': domain}), hash(self.
|
354
|
-
payload = {'sign': {'alg': 'KeyisB-c-s-m1', 'data': s, 'domain': self.
|
357
|
+
if self._dns_key is not None:
|
358
|
+
s = s2.sign(self._dns_key)
|
359
|
+
data = m1.encrypt(s, domain.encode(), serialize({'domain': domain}), hash(self._dns_key))
|
360
|
+
payload = {'sign': {'alg': 'KeyisB-c-s-m1', 'data': s, 'domain': self._domain}, 'data': data}
|
355
361
|
else:
|
356
362
|
payload = None
|
357
363
|
|
@@ -6,7 +6,7 @@ from KeyisBTools.cryptography import m1
|
|
6
6
|
from ._app import GNRequest, GNResponse
|
7
7
|
from gnobjects.net.objects import Url
|
8
8
|
|
9
|
-
from KeyisBTools.cryptography.bytes import hash3
|
9
|
+
from KeyisBTools.cryptography.bytes import hash3, userFriendly
|
10
10
|
|
11
11
|
class KDCObject:
|
12
12
|
def __init__(self, domain: str, kdc_domain: str, kdc_key: bytes, requested_domains: List[str], active_key_synchronization: bool = True):
|
@@ -19,6 +19,7 @@ class KDCObject:
|
|
19
19
|
|
20
20
|
from ._client import AsyncClient
|
21
21
|
self._client = AsyncClient(domain)
|
22
|
+
self._client.setKDC(self)
|
22
23
|
|
23
24
|
self._servers_keys: Dict[str, bytes] = {}
|
24
25
|
self._servers_keys_hash_domain: Dict[bytes, str] = {}
|
@@ -36,9 +37,12 @@ class KDCObject:
|
|
36
37
|
else:
|
37
38
|
servers_keys = {}
|
38
39
|
|
40
|
+
self._servers_keys.update(servers_keys)
|
41
|
+
|
39
42
|
if len(self._requested_domains) > 0:
|
40
43
|
await self.requestKDC(self._requested_domains) # type: ignore
|
41
|
-
|
44
|
+
else:
|
45
|
+
self._update()
|
42
46
|
|
43
47
|
def _update(self):
|
44
48
|
for domain in self._servers_keys.keys():
|
@@ -70,7 +74,7 @@ class KDCObject:
|
|
70
74
|
|
71
75
|
async def encode(self, domain: str, request: bytes):
|
72
76
|
if domain not in self._servers_keys:
|
73
|
-
if not self._active_key_synchronization:
|
77
|
+
if domain is None or not self._active_key_synchronization:
|
74
78
|
return request
|
75
79
|
else:
|
76
80
|
await self.requestKDC(domain)
|
@@ -88,10 +92,9 @@ class KDCObject:
|
|
88
92
|
response = response[8:]
|
89
93
|
sig, domain_h, data = response[:164], response[164:164+64], response[164+64:]
|
90
94
|
if domain_h not in self._servers_keys_hash_domain:
|
91
|
-
if not self._active_key_synchronization:
|
92
|
-
print(domain_h, 'not in', self._servers_keys_hash_domain)
|
95
|
+
if domain_h is None or not self._active_key_synchronization:
|
93
96
|
return r, None
|
94
|
-
|
97
|
+
elif self._active_key_synchronization:
|
95
98
|
await self.requestKDC(domain_h)
|
96
99
|
|
97
100
|
d = self._servers_keys_hash_domain[domain_h]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|