48 lines
No EOL
1.2 KiB
Python
48 lines
No EOL
1.2 KiB
Python
import socket as _socket
|
|
|
|
from typing import Optional
|
|
|
|
|
|
ZERO_64 = b'\x00' * 64
|
|
HANDSHAKE_LEN = 64
|
|
SKIP_LEN = 8
|
|
PREKEY_LEN = 32
|
|
KEY_LEN = 32
|
|
IV_LEN = 16
|
|
PROTO_TAG_POS = 56
|
|
DC_IDX_POS = 60
|
|
|
|
PROTO_TAG_ABRIDGED = b'\xef\xef\xef\xef'
|
|
PROTO_TAG_INTERMEDIATE = b'\xee\xee\xee\xee'
|
|
PROTO_TAG_SECURE = b'\xdd\xdd\xdd\xdd'
|
|
|
|
PROTO_ABRIDGED_INT = 0xEFEFEFEF
|
|
PROTO_INTERMEDIATE_INT = 0xEEEEEEEE
|
|
PROTO_PADDED_INTERMEDIATE_INT = 0xDDDDDDDD
|
|
|
|
RESERVED_FIRST_BYTES = {0xEF}
|
|
RESERVED_STARTS = {b'\x48\x45\x41\x44', b'\x50\x4F\x53\x54',
|
|
b'\x47\x45\x54\x20', b'\xee\xee\xee\xee',
|
|
b'\xdd\xdd\xdd\xdd', b'\x16\x03\x01\x02'}
|
|
RESERVED_CONTINUE = b'\x00\x00\x00\x00'
|
|
|
|
|
|
def human_bytes(n: int) -> str:
|
|
for unit in ('B', 'KB', 'MB', 'GB'):
|
|
if abs(n) < 1024:
|
|
return f"{n:.1f}{unit}"
|
|
n /= 1024 # type: ignore
|
|
return f"{n:.1f}TB"
|
|
|
|
|
|
def get_link_host(host: str) -> Optional[str]:
|
|
if host == '0.0.0.0':
|
|
try:
|
|
with _socket.socket(_socket.AF_INET, _socket.SOCK_DGRAM) as _s:
|
|
_s.connect(('8.8.8.8', 80))
|
|
link_host = _s.getsockname()[0]
|
|
except OSError:
|
|
link_host = '127.0.0.1'
|
|
return link_host
|
|
else:
|
|
return host |