feat: make display name banned keywords configurable

This commit is contained in:
Egor
2025-10-10 00:42:17 +03:00
parent 07c4ab264c
commit 45d2ca6e25
3 changed files with 72 additions and 33 deletions

View File

@@ -12,6 +12,38 @@ from pydantic import field_validator, Field
from pathlib import Path
DEFAULT_DISPLAY_NAME_BANNED_KEYWORDS = [
"telegram",
"teleqram",
"teiegram",
"teieqram",
"telegrarn",
"service",
"notification",
"system",
"security",
"safety",
"support",
"moderation",
"review",
"compliance",
"abuse",
"spam",
"report",
"телеграм",
"служебн",
"уведомлен",
"поддержк",
"безопасн",
"модерац",
"жалоб",
"абуз",
"служб",
"повiдом",
"пiдтрим",
]
class Settings(BaseSettings):
BOT_TOKEN: str
@@ -198,6 +230,10 @@ class Settings(BaseSettings):
MULENPAY_DESCRIPTION: str = "Пополнение баланса"
MULENPAY_LANGUAGE: str = "ru"
MULENPAY_VAT_CODE: int = 0
DISPLAY_NAME_BANNED_KEYWORDS: str = "\n".join(
DEFAULT_DISPLAY_NAME_BANNED_KEYWORDS
)
MULENPAY_PAYMENT_SUBJECT: int = 4
MULENPAY_PAYMENT_MODE: int = 4
MULENPAY_MIN_AMOUNT_KOPEKS: int = 10000
@@ -455,6 +491,29 @@ class Settings(BaseSettings):
description = re.sub(r'\s+', ' ', description).strip()
return description
def get_display_name_banned_keywords(self) -> List[str]:
raw_value = self.DISPLAY_NAME_BANNED_KEYWORDS
if raw_value is None:
return []
if isinstance(raw_value, str):
candidates = re.split(r"[\n,]+", raw_value)
else:
candidates = list(raw_value)
unique: List[str] = []
seen: set[str] = set()
for candidate in candidates:
normalized = str(candidate).strip().lower()
if not normalized:
continue
if normalized in seen:
continue
seen.add(normalized)
unique.append(normalized)
return unique
def get_autopay_warning_days(self) -> List[int]:
try:

View File

@@ -62,38 +62,6 @@ CHAR_TRANSLATION = str.maketrans({
COLLAPSE_PATTERN = re.compile(r"[\s\._\-/\\|,:;•·﹒․⋅··`~'\"!?()\[\]{}<>+=]+")
SUSPICIOUS_KEYWORDS = [
"telegram",
"teleqram",
"teiegram",
"teieqram",
"telegrarn",
"service",
"notification",
"system",
"security",
"safety",
"support",
"moderation",
"review",
"compliance",
"abuse",
"spam",
"report",
"телеграм",
"служебн",
"уведомлен",
"поддержк",
"безопасн",
"модерац",
"жалоб",
"абуз",
"служб",
"повiдом",
"пiдтрим",
]
class DisplayNameRestrictionMiddleware(BaseMiddleware):
"""Blocks users whose display name imitates links or official accounts."""
@@ -178,9 +146,11 @@ class DisplayNameRestrictionMiddleware(BaseMiddleware):
if "tme" in collapsed:
return True
banned_keywords = settings.get_display_name_banned_keywords()
return any(
keyword in normalized or keyword in collapsed
for keyword in SUSPICIOUS_KEYWORDS
for keyword in banned_keywords
)
@staticmethod

View File

@@ -112,6 +112,7 @@ class BotConfigurationService:
"WEBHOOK": "🌐 Webhook",
"LOG": "📝 Логирование",
"DEBUG": "🧪 Режим разработки",
"MODERATION": "🛡️ Модерация и фильтры",
}
CATEGORY_DESCRIPTIONS: Dict[str, str] = {
@@ -160,6 +161,7 @@ class BotConfigurationService:
"WEBHOOK": "Пути и секреты вебхуков.",
"LOG": "Уровни логирования и ротация.",
"DEBUG": "Отладочные функции и безопасный режим.",
"MODERATION": "Настройки фильтров отображаемых имен и защиты от фишинга.",
}
CATEGORY_KEY_OVERRIDES: Dict[str, str] = {
@@ -280,6 +282,7 @@ class BotConfigurationService:
"LOG_": "LOG",
"WEB_API_": "WEB_API",
"DEBUG": "DEBUG",
"DISPLAY_NAME_": "MODERATION",
}
CHOICES: Dict[str, List[ChoiceOption]] = {
@@ -398,6 +401,13 @@ class BotConfigurationService:
"warning": "Не забудьте отключить после завершения работ, иначе бот останется недоступен.",
"dependencies": "MAINTENANCE_MESSAGE, MAINTENANCE_CHECK_INTERVAL",
},
"DISPLAY_NAME_BANNED_KEYWORDS": {
"description": "Список слов и фрагментов, при наличии которых в отображаемом имени пользователь будет заблокирован.",
"format": "Перечислите ключевые слова через запятую или с новой строки.",
"example": "support, security, служебн",
"warning": "Слишком агрессивные фильтры могут блокировать добросовестных пользователей.",
"dependencies": "Фильтр отображаемых имен",
},
"REMNAWAVE_API_URL": {
"description": "Базовый адрес панели RemnaWave, с которой синхронизируется бот.",
"format": "Полный URL вида https://panel.example.com.",