fix: устранены все найденные аудитом баги и тихие падения

- SQL injection паттерн → параметризованные запросы во всех местах
- except: pass/continue → logger.warning() везде, ничего не тонет молча
- WAL mode + индекс domain_dedup_key в database.py
- try/finally для conn в main.py, утечка соединения устранена
- backoff 30с при 403/429 от Rusprofile/ЕГРЮЛ
- ликвидированные компании → egrul_status="liquidated"
- max_candidates в contacts_finder считает только реальных кандидатов
- DB_PATH абсолютный (Path(__file__).parent), HH_PAUSE_BETWEEN_QUERIES в config
- HH_SIGNAL_QUERIES дубль убран из launcher.py → импорт из config
- path traversal защита в egrul_enricher debug_dump_html

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Aks
2026-06-09 13:19:52 +03:00
parent f78f35fb3f
commit 98309dcc96
9 changed files with 208 additions and 186 deletions
+10
View File
@@ -8,6 +8,7 @@ Streamlit перезапускает скрипт на каждое действ
держать не имеет смысла.
"""
import json
import logging
import sqlite3
from datetime import datetime
from pathlib import Path
@@ -15,6 +16,8 @@ from typing import Any
import pandas as pd
logger = logging.getLogger(__name__)
def _conn(db_path: Path | str) -> sqlite3.Connection:
conn = sqlite3.connect(str(db_path))
@@ -311,10 +314,17 @@ def add_lead_manual(db_path, data: dict) -> int:
conn.rollback()
msg = str(e).lower()
if "inn" in msg:
logger.warning(f"[db_layer] add_lead_manual: дубль по ИНН ({data.get('inn')}): {e}")
raise ValueError(f"Компания с таким ИНН уже есть в базе ({data.get('inn')}).") from e
if "phone" in msg:
logger.warning(f"[db_layer] add_lead_manual: дубль по телефону: {e}")
raise ValueError(f"Компания с таким телефоном уже есть в базе.") from e
logger.warning(f"[db_layer] add_lead_manual: IntegrityError: {e}")
raise ValueError(f"Не удалось добавить (дубль): {e}") from e
except Exception as e:
conn.rollback()
logger.warning(f"[db_layer] add_lead_manual: неожиданная ошибка: {e}")
raise
finally:
conn.close()