censoring domains

This commit is contained in:
Flowseal
2026-09-05 16:23:24 +03:00
parent 5f55245184
commit c02398fbc0
3 changed files with 33 additions and 0 deletions
+2
View File
@@ -731,6 +731,7 @@ def main():
console = logging.StreamHandler() console = logging.StreamHandler()
console.setFormatter(log_fmt) console.setFormatter(log_fmt)
console.addFilter(DomainCensorFilter())
root.addHandler(console) root.addHandler(console)
if args.log_file: if args.log_file:
@@ -741,6 +742,7 @@ def main():
backups=args.log_backups, backups=args.log_backups,
) )
fh.setFormatter(log_fmt) fh.setFormatter(log_fmt)
fh.addFilter(DomainCensorFilter())
root.addHandler(fh) root.addHandler(fh)
logging.getLogger('asyncio').setLevel(logging.WARNING) logging.getLogger('asyncio').setLevel(logging.WARNING)
+28
View File
@@ -2,6 +2,8 @@ import socket as _socket
import urllib.request import urllib.request
import http.client import http.client
import ssl import ssl
import logging
import re
import certifi import certifi
@@ -85,6 +87,32 @@ def get_link_host(host: str) -> Optional[str]:
return host return host
class DomainCensorFilter(logging.Filter):
domain_pattern = re.compile(
r'(?<![\w-])(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+'
r'[a-zA-Z]{2,}(?![\w-])'
)
def _censor_match(self, match):
domain = match.group()
normalized = domain.casefold().rstrip('.')
if normalized == 'telegram.org' or normalized.endswith('.telegram.org') or normalized.endswith('.log'):
return domain
parts = domain.split('.')
if len(parts) < 2:
return domain
return '.'.join(
part if i == len(parts) - 1 else
part[:len(part) // 2] + '*' * (len(part) - len(part) // 2)
for i, part in enumerate(parts)
)
def filter(self, record):
record.msg = self.domain_pattern.sub(self._censor_match, record.getMessage())
record.args = ()
return True
class _PinnedHTTPSHandler(urllib.request.HTTPSHandler): class _PinnedHTTPSHandler(urllib.request.HTTPSHandler):
def https_open(self, req: Request): def https_open(self, req: Request):
host = req.host.split(":")[0] host = req.host.split(":")[0]
+3
View File
@@ -15,6 +15,7 @@ from typing import Any, Callable, Dict, Optional, Tuple
import psutil import psutil
from proxy import __version__, get_link_host, parse_dc_ip_list, proxy_config, coerce_domain_list from proxy import __version__, get_link_host, parse_dc_ip_list, proxy_config, coerce_domain_list
from proxy.utils import DomainCensorFilter
from proxy.tg_ws_proxy import _run from proxy.tg_ws_proxy import _run
from utils.default_config import default_tray_config from utils.default_config import default_tray_config
from utils.diagnostics import diagnose_listen_error from utils.diagnostics import diagnose_listen_error
@@ -237,12 +238,14 @@ def setup_logging(verbose: bool = False, log_max_mb: float = 5) -> None:
fh = build_log_handler(str(LOG_FILE), log_max_mb=log_max_mb, backups=1) fh = build_log_handler(str(LOG_FILE), log_max_mb=log_max_mb, backups=1)
fh.setLevel(logging.DEBUG) fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(_LOG_FMT_FILE, datefmt="%Y-%m-%d %H:%M:%S")) fh.setFormatter(logging.Formatter(_LOG_FMT_FILE, datefmt="%Y-%m-%d %H:%M:%S"))
fh.addFilter(DomainCensorFilter())
root.addHandler(fh) root.addHandler(fh)
if not IS_FROZEN: if not IS_FROZEN:
ch = logging.StreamHandler(sys.stdout) ch = logging.StreamHandler(sys.stdout)
ch.setLevel(level) ch.setLevel(level)
ch.setFormatter(logging.Formatter(_LOG_FMT_CONSOLE, datefmt="%H:%M:%S")) ch.setFormatter(logging.Formatter(_LOG_FMT_CONSOLE, datefmt="%H:%M:%S"))
ch.addFilter(DomainCensorFilter())
root.addHandler(ch) root.addHandler(ch)