GNServer 0.0.0.0.58__tar.gz → 0.0.0.0.60__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.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/__init__.py +17 -1
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_app.py +5 -3
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_client.py +11 -19
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/models.py +8 -7
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer.egg-info/PKG-INFO +1 -1
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/PKG-INFO +1 -1
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/setup.py +1 -1
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_cors_resolver.py +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_crt.py +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_func_params_validation.py +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_routes.py +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer/_template_resolver.py +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer.egg-info/SOURCES.txt +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer.egg-info/dependency_links.txt +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer.egg-info/requires.txt +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/GNServer.egg-info/top_level.txt +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/LICENSE +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/GNServer/mmbConfig.json +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/LICENSE +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/MANIFEST.in +0 -0
- {gnserver-0.0.0.0.58 → gnserver-0.0.0.0.60}/setup.cfg +0 -0
@@ -33,10 +33,26 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
33
33
|
DEALINGS IN THE SOFTWARE.
|
34
34
|
"""
|
35
35
|
|
36
|
+
__all__ = [
|
37
|
+
'App',
|
38
|
+
'Url',
|
39
|
+
'GNRequest',
|
40
|
+
'GNResponse',
|
41
|
+
'CommandObject',
|
42
|
+
'CORSObject',
|
43
|
+
'FileObject',
|
44
|
+
'TemplateObject',
|
45
|
+
'GNTransportProtocol',
|
46
|
+
'AsyncClient',
|
47
|
+
'response'
|
48
|
+
]
|
49
|
+
|
50
|
+
|
36
51
|
from ._app import App
|
37
52
|
|
38
53
|
from gnobjects.net.objects import Url, GNRequest, GNResponse, CommandObject, CORSObject, FileObject, TemplateObject, GNTransportProtocol
|
39
|
-
from gnobjects.net.objects import AllGNFastCommands as
|
54
|
+
from gnobjects.net.objects import AllGNFastCommands as response
|
40
55
|
|
56
|
+
responses = response
|
41
57
|
|
42
58
|
from ._client import AsyncClient
|
@@ -249,6 +249,8 @@ class App:
|
|
249
249
|
return r.handler(**kw)
|
250
250
|
|
251
251
|
result = await r.handler(**kw)
|
252
|
+
if result is None:
|
253
|
+
result = AllGNFastCommands.ok()
|
252
254
|
if isinstance(result, GNResponse):
|
253
255
|
if r.cors is None:
|
254
256
|
if result._cors is None:
|
@@ -359,7 +361,7 @@ class App:
|
|
359
361
|
raise Exception('Не удалось расшифровать от KDC')
|
360
362
|
|
361
363
|
request.stream_id = stream_id # type: ignore
|
362
|
-
logger.debug(f'Request: {request.method} {request.url}')
|
364
|
+
logger.debug(f'[<] Request: {request.method} {request.url}')
|
363
365
|
asyncio.create_task(self._handle_request(request, mode))
|
364
366
|
|
365
367
|
self._buffer.pop(event.stream_id, None)
|
@@ -457,7 +459,7 @@ class App:
|
|
457
459
|
await response.assembly()
|
458
460
|
|
459
461
|
|
460
|
-
logger.debug(f'Response: {request.method} {request.url} -> {response.command} {response.payload if len(str(response.payload)) < 256 else ''}')
|
462
|
+
logger.debug(f'[>] Response: {request.method} {request.url} -> {response.command} {response.payload if len(str(response.payload)) < 256 else ''}')
|
461
463
|
|
462
464
|
blob = response.serialize(mode)
|
463
465
|
|
@@ -542,4 +544,4 @@ class App:
|
|
542
544
|
cert_path=cert_path,
|
543
545
|
key_path=key_path,
|
544
546
|
host=host
|
545
|
-
)
|
547
|
+
)
|
@@ -92,7 +92,7 @@ from .models import KDCObject
|
|
92
92
|
|
93
93
|
import logging
|
94
94
|
|
95
|
-
logger = logging.getLogger("
|
95
|
+
logger = logging.getLogger("GNClient")
|
96
96
|
logger.setLevel(logging.DEBUG)
|
97
97
|
|
98
98
|
console = logging.StreamHandler(sys.stdout)
|
@@ -138,7 +138,7 @@ def devLog(request: GNRequest, point: str, level: int, log: str):
|
|
138
138
|
|
139
139
|
|
140
140
|
|
141
|
-
|
141
|
+
_sys_s_mode = 2
|
142
142
|
|
143
143
|
async def chain_async(first_item, rest: AsyncIterable) -> AsyncGenerator:
|
144
144
|
yield first_item
|
@@ -189,15 +189,11 @@ class AsyncClient:
|
|
189
189
|
|
190
190
|
async def connect(self, request: GNRequest, restart_connection: bool = False, reconnect_wait: float = 10, keep_alive: bool = True) -> 'QuicClient':
|
191
191
|
domain = request.url.hostname
|
192
|
-
devLog(request, '1.2.1', 10, f'Connect to {domain}: restart_connection={restart_connection}, reconnect_wait={reconnect_wait}, keep_alive={keep_alive}')
|
193
192
|
if not restart_connection and domain in self._active_connections:
|
194
193
|
c = self._active_connections[domain]
|
195
|
-
devLog(request, '1.2.2', 10, f'Connection to {domain} found: status={c.status}')
|
196
194
|
if c.status == 'connecting':
|
197
|
-
devLog(request, '1.2.3', 10, f'Waiting for connection to {domain}...')
|
198
195
|
try:
|
199
196
|
await asyncio.wait_for(c.connect_future, reconnect_wait)
|
200
|
-
devLog(request, '1.2.4', 10, f'Connected to {domain}: status={c.status}')
|
201
197
|
if c.status == 'active':
|
202
198
|
return c
|
203
199
|
elif c.status == 'connecting': # если очень долго подключаемся, то кидаем ошибку
|
@@ -206,7 +202,6 @@ class AsyncClient:
|
|
206
202
|
elif c.status == 'disconnect':
|
207
203
|
raise GNExceptions.ConnectionError.client.connection
|
208
204
|
except:
|
209
|
-
devLog(request, '1.2.5', 10, f'Connection to {domain} failed or timed out.')
|
210
205
|
await self.disconnect(domain)
|
211
206
|
|
212
207
|
else:
|
@@ -216,9 +211,7 @@ class AsyncClient:
|
|
216
211
|
c.status = 'connecting'
|
217
212
|
self._active_connections[domain] = c
|
218
213
|
|
219
|
-
devLog(request, '1.2.6', 10, f'Connecting to {domain}...')
|
220
214
|
data = await self.getDNS(domain, raise_errors=True)
|
221
|
-
devLog(request, '1.2.7', 10, f'Got DNS for {domain}: {data}')
|
222
215
|
|
223
216
|
data = data.split(':')
|
224
217
|
|
@@ -229,7 +222,6 @@ class AsyncClient:
|
|
229
222
|
|
230
223
|
c._disconnect_signal = f # type: ignore
|
231
224
|
c._domain = domain # type: ignore
|
232
|
-
devLog(request, '1.2.8', 10, f'Creating QuicClient for {domain}...')
|
233
225
|
await c.connect(data[0], int(data[1]), keep_alive=keep_alive)
|
234
226
|
await c.connect_future
|
235
227
|
|
@@ -533,7 +525,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
533
525
|
del buf[:lenght]
|
534
526
|
|
535
527
|
|
536
|
-
r = GNResponse.deserialize(data,
|
528
|
+
r = GNResponse.deserialize(data, _sys_s_mode)
|
537
529
|
handler.put_nowait(r)
|
538
530
|
if event.end_stream:
|
539
531
|
handler.put_nowait(None)
|
@@ -606,7 +598,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
606
598
|
await self.ensure_sys_stream()
|
607
599
|
if response:
|
608
600
|
msg_id = next(self._sys_id_gen)
|
609
|
-
blob = request.serialize(
|
601
|
+
blob = request.serialize(_sys_s_mode)
|
610
602
|
payload = (
|
611
603
|
msg_id.to_bytes(8, "little") + len(blob).to_bytes(4, "little") + blob
|
612
604
|
)
|
@@ -622,7 +614,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
622
614
|
|
623
615
|
async def request(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]]):
|
624
616
|
if isinstance(request, GNRequest):
|
625
|
-
blob = request.serialize(
|
617
|
+
blob = request.serialize(_sys_s_mode)
|
626
618
|
|
627
619
|
if self.quicClient._client._kdc is not None:
|
628
620
|
blob = self.quicClient._client._kdc.encode(request.url.hostname, blob)
|
@@ -640,7 +632,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
640
632
|
data, domain = self.quicClient._client._kdc.decode(data)
|
641
633
|
|
642
634
|
if data is not None:
|
643
|
-
r = GNResponse.deserialize(data,
|
635
|
+
r = GNResponse.deserialize(data, _sys_s_mode)
|
644
636
|
return r
|
645
637
|
else:
|
646
638
|
return GNResponse('gn:client:0')
|
@@ -653,7 +645,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
653
645
|
_last = None
|
654
646
|
async for req in request:
|
655
647
|
_last = req
|
656
|
-
blob = req.serialize(
|
648
|
+
blob = req.serialize(_sys_s_mode)
|
657
649
|
self._enqueue(sid, blob, False, False)
|
658
650
|
|
659
651
|
|
@@ -664,7 +656,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
664
656
|
|
665
657
|
_last.setPayload(None)
|
666
658
|
_last.setMethod('gn:end-stream')
|
667
|
-
blob = _last.serialize(
|
659
|
+
blob = _last.serialize(_sys_s_mode)
|
668
660
|
self._enqueue(sid, blob, True, False)
|
669
661
|
self._schedule_flush()
|
670
662
|
|
@@ -677,7 +669,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
677
669
|
|
678
670
|
async def requestStream(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]]) -> asyncio.Queue[GNResponse]:
|
679
671
|
if isinstance(request, GNRequest):
|
680
|
-
blob = request.serialize(
|
672
|
+
blob = request.serialize(_sys_s_mode)
|
681
673
|
sid = self._quic.get_next_available_stream_id()
|
682
674
|
self._enqueue(sid, blob, False, False)
|
683
675
|
self._schedule_flush()
|
@@ -694,7 +686,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
694
686
|
_last = None
|
695
687
|
async for req in request:
|
696
688
|
_last = req
|
697
|
-
blob = req.serialize(
|
689
|
+
blob = req.serialize(_sys_s_mode)
|
698
690
|
self._enqueue(sid, blob, False, False)
|
699
691
|
|
700
692
|
|
@@ -705,7 +697,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
705
697
|
|
706
698
|
_last.setPayload(None)
|
707
699
|
_last.setMethod('gn:end-stream')
|
708
|
-
blob = _last.serialize(
|
700
|
+
blob = _last.serialize(_sys_s_mode)
|
709
701
|
self._enqueue(sid, blob, True, False)
|
710
702
|
self._schedule_flush()
|
711
703
|
|
@@ -28,11 +28,11 @@ class KDCObject:
|
|
28
28
|
|
29
29
|
async def init(self, servers_keys: Optional[Dict[str, bytes]] = None): # type: ignore
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
if self._kdc_domain not in self._servers_keys:
|
32
|
+
self._servers_keys[self._kdc_domain] = self._kdc_key
|
33
|
+
h = hash3(self._kdc_domain.encode())
|
34
|
+
self._servers_keys_hash_domain[h] = self._kdc_domain
|
35
|
+
self._servers_keys_domain_hash[self._kdc_domain] = h
|
36
36
|
|
37
37
|
|
38
38
|
if servers_keys is not None:
|
@@ -76,14 +76,15 @@ class KDCObject:
|
|
76
76
|
return request[:8] + sig + self._domain_hash + data
|
77
77
|
|
78
78
|
def decode(self, response: bytes):
|
79
|
+
r = response
|
79
80
|
if len(response) < 8+164+64:
|
80
|
-
return
|
81
|
+
return r, None
|
81
82
|
h = response[:8]
|
82
83
|
response = response[8:]
|
83
84
|
sig, domain_h, data = response[:164], response[164:164+64], response[164+64:]
|
84
85
|
if domain_h not in self._servers_keys_hash_domain:
|
85
86
|
print(domain_h, 'not in', self._servers_keys_hash_domain)
|
86
|
-
return
|
87
|
+
return r, None
|
87
88
|
d = self._servers_keys_hash_domain[domain_h]
|
88
89
|
key = self._servers_keys[d]
|
89
90
|
if not s2.verify(key, sig):
|
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
|