mirror of
https://github.com/alexbers/mtprotoproxy.git
synced 2026-03-14 07:13:09 +00:00
Compare commits
5 Commits
34f743858c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0614c35020 | ||
|
|
368669a546 | ||
|
|
949ee12ed2 | ||
|
|
1f7ce9e977 | ||
|
|
8920faf650 |
@@ -139,10 +139,10 @@ def init_config():
|
||||
# use middle proxy, necessary to show ad
|
||||
conf_dict.setdefault("USE_MIDDLE_PROXY", len(conf_dict["AD_TAG"]) == 16)
|
||||
|
||||
# if IPv6 avaliable, use it by default
|
||||
conf_dict.setdefault("PREFER_IPV6", socket.has_ipv6)
|
||||
# if IPv6 available, use it by default, IPv6 with middle proxies is unstable now
|
||||
conf_dict.setdefault("PREFER_IPV6", socket.has_ipv6 and not conf_dict["USE_MIDDLE_PROXY"])
|
||||
|
||||
# disables tg->client trafic reencryption, faster but less secure
|
||||
# disables tg->client traffic reencryption, faster but less secure
|
||||
conf_dict.setdefault("FAST_MODE", True)
|
||||
|
||||
# enables some working modes
|
||||
@@ -264,6 +264,9 @@ def init_config():
|
||||
# telegram servers connect timeout in seconds
|
||||
conf_dict.setdefault("TG_CONNECT_TIMEOUT", 10)
|
||||
|
||||
# drop connection if no data from telegram server for this many seconds
|
||||
conf_dict.setdefault("TG_READ_TIMEOUT", 60)
|
||||
|
||||
# listen address for IPv4
|
||||
conf_dict.setdefault("LISTEN_ADDR_IPV4", "0.0.0.0")
|
||||
|
||||
@@ -483,7 +486,7 @@ myrandom = MyRandom()
|
||||
|
||||
|
||||
class TgConnectionPool:
|
||||
MAX_CONNS_IN_POOL = 64
|
||||
MAX_CONNS_IN_POOL = 16
|
||||
|
||||
def __init__(self):
|
||||
self.pools = {}
|
||||
@@ -500,6 +503,16 @@ class TgConnectionPool:
|
||||
timeout=config.TG_CONNECT_TIMEOUT)
|
||||
return reader_tgt, writer_tgt
|
||||
|
||||
def is_conn_dead(self, reader, writer):
|
||||
if writer.transport.is_closing():
|
||||
return True
|
||||
raw_reader = reader
|
||||
while hasattr(raw_reader, 'upstream'):
|
||||
raw_reader = raw_reader.upstream
|
||||
if raw_reader.at_eof():
|
||||
return True
|
||||
return False
|
||||
|
||||
def register_host_port(self, host, port, init_func):
|
||||
if (host, port, init_func) not in self.pools:
|
||||
self.pools[(host, port, init_func)] = []
|
||||
@@ -512,15 +525,16 @@ class TgConnectionPool:
|
||||
self.register_host_port(host, port, init_func)
|
||||
|
||||
ret = None
|
||||
for task in self.pools[(host, port, init_func)][::]:
|
||||
for task in self.pools[(host, port, init_func)][:]:
|
||||
if task.done():
|
||||
if task.exception():
|
||||
self.pools[(host, port, init_func)].remove(task)
|
||||
continue
|
||||
|
||||
reader, writer, *other = task.result()
|
||||
if writer.transport.is_closing():
|
||||
if self.is_conn_dead(reader, writer):
|
||||
self.pools[(host, port, init_func)].remove(task)
|
||||
writer.transport.abort()
|
||||
continue
|
||||
|
||||
if not ret:
|
||||
@@ -778,7 +792,7 @@ class MTProtoCompactFrameStreamWriter(LayeredStreamWriterBase):
|
||||
|
||||
def write(self, data, extra={}):
|
||||
SMALL_PKT_BORDER = 0x7f
|
||||
LARGE_PKT_BORGER = 256 ** 3
|
||||
LARGE_PKT_BORDER = 256 ** 3
|
||||
|
||||
if len(data) % 4 != 0:
|
||||
print_err("BUG: MTProtoFrameStreamWriter attempted to send msg with len", len(data))
|
||||
@@ -791,7 +805,7 @@ class MTProtoCompactFrameStreamWriter(LayeredStreamWriterBase):
|
||||
|
||||
if len_div_four < SMALL_PKT_BORDER:
|
||||
return self.upstream.write(bytes([len_div_four]) + data)
|
||||
elif len_div_four < LARGE_PKT_BORGER:
|
||||
elif len_div_four < LARGE_PKT_BORDER:
|
||||
return self.upstream.write(b'\x7f' + int.to_bytes(len_div_four, 3, 'little') + data)
|
||||
else:
|
||||
print_err("Attempted to send too large pkt len =", len(data))
|
||||
@@ -1573,7 +1587,11 @@ async def do_middleproxy_handshake(proto_tag, dc_idx, cl_ip, cl_port):
|
||||
async def tg_connect_reader_to_writer(rd, wr, user, rd_buf_size, is_upstream):
|
||||
try:
|
||||
while True:
|
||||
data = await rd.read(rd_buf_size)
|
||||
if not is_upstream:
|
||||
data = await asyncio.wait_for(rd.read(rd_buf_size),
|
||||
timeout=config.TG_READ_TIMEOUT)
|
||||
else:
|
||||
data = await rd.read(rd_buf_size)
|
||||
if isinstance(data, tuple):
|
||||
data, extra = data
|
||||
else:
|
||||
@@ -1594,7 +1612,7 @@ async def tg_connect_reader_to_writer(rd, wr, user, rd_buf_size, is_upstream):
|
||||
|
||||
wr.write(data, extra)
|
||||
await wr.drain()
|
||||
except (OSError, asyncio.IncompleteReadError) as e:
|
||||
except (OSError, asyncio.IncompleteReadError, asyncio.TimeoutError) as e:
|
||||
# print_err(e)
|
||||
pass
|
||||
|
||||
@@ -2000,7 +2018,8 @@ async def get_srv_time():
|
||||
continue
|
||||
line = line[len("Date: "):].decode()
|
||||
srv_time = datetime.datetime.strptime(line, "%a, %d %b %Y %H:%M:%S %Z")
|
||||
now_time = datetime.datetime.utcnow()
|
||||
srv_time = srv_time.replace(tzinfo=datetime.timezone.utc)
|
||||
now_time = datetime.datetime.now(datetime.timezone.utc)
|
||||
is_time_skewed = (now_time-srv_time).total_seconds() > MAX_TIME_SKEW
|
||||
if is_time_skewed and config.USE_MIDDLE_PROXY and not disable_middle_proxy:
|
||||
print_err("Time skew detected, please set the clock")
|
||||
@@ -2146,15 +2165,15 @@ def print_tg_info():
|
||||
for ip in ip_addrs:
|
||||
if config.MODES["classic"]:
|
||||
params = {"server": ip, "port": config.PORT, "secret": secret}
|
||||
params_encodeded = urllib.parse.urlencode(params, safe=':')
|
||||
classic_link = "tg://proxy?{}".format(params_encodeded)
|
||||
params_encoded = urllib.parse.urlencode(params, safe=':')
|
||||
classic_link = "tg://proxy?{}".format(params_encoded)
|
||||
proxy_links.append({"user": user, "link": classic_link})
|
||||
print("{}: {}".format(user, classic_link), flush=True)
|
||||
|
||||
if config.MODES["secure"]:
|
||||
params = {"server": ip, "port": config.PORT, "secret": "dd" + secret}
|
||||
params_encodeded = urllib.parse.urlencode(params, safe=':')
|
||||
dd_link = "tg://proxy?{}".format(params_encodeded)
|
||||
params_encoded = urllib.parse.urlencode(params, safe=':')
|
||||
dd_link = "tg://proxy?{}".format(params_encoded)
|
||||
proxy_links.append({"user": user, "link": dd_link})
|
||||
print("{}: {}".format(user, dd_link), flush=True)
|
||||
|
||||
@@ -2164,8 +2183,8 @@ def print_tg_info():
|
||||
# tls_secret = bytes.fromhex("ee" + secret) + config.TLS_DOMAIN.encode()
|
||||
# tls_secret_base64 = base64.urlsafe_b64encode(tls_secret)
|
||||
params = {"server": ip, "port": config.PORT, "secret": tls_secret}
|
||||
params_encodeded = urllib.parse.urlencode(params, safe=':')
|
||||
tls_link = "tg://proxy?{}".format(params_encodeded)
|
||||
params_encoded = urllib.parse.urlencode(params, safe=':')
|
||||
tls_link = "tg://proxy?{}".format(params_encoded)
|
||||
proxy_links.append({"user": user, "link": tls_link})
|
||||
print("{}: {}".format(user, tls_link), flush=True)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user