fix(#242): ekburg_permits SSL — verify=False для CA Минцифры РФ (clean re-roll PR #245) #249

Merged
lekss361 merged 1 commit from fix/242-ekburg-permits-ssl-clean into main 2026-05-17 06:01:23 +00:00
Owner

Summary

Чистая версия PR #245 после reviewer rejection (🟠 HIGH — содержал 2 независимых work units). Этот PR содержит только SSL fix (1 commit 4a48d49). Sub-PR feat(#126) Sub-PR A уже отдельно merged как PR #247.

Что фиксит

ekburg_permits.py падал с SSL: CERTIFICATE_VERIFY_FAILED на всех 5 годах (2022-2026) — екатеринбург.рф использует CA Минцифры РФ, которого нет в certifi bundle.

GlitchTip issues: BACKEND-Q..V (6 events). Подробности: issue #242.

Fix

backend/app/services/scrapers/ekburg_permits.pyverify=False в httpx.Client (Option C — per-scraper). Прецедент: nspd_lite.py использует ssl._create_unverified_context() для nspd.gov.ru.

Why not Dockerfile CA install (Option A)

Python certifi игнорирует системные CA по умолчанию. Option A требует SSL_CERT_FILE env + docker-compose changes (devops scope). Данные публичные open-data — verify=False acceptable риск.

Test plan

  • 25/25 unit tests passed (uv run pytest tests/services/test_ekburg_permits.py)
  • ruff lint passed
  • Pre-commit hooks passed
  • After deploy smoke:
    curl -X POST https://gendsgn.ru/api/v1/admin/scrape/ekburg-permits \
      -H "X-Admin-Token: $SCRAPE_ADMIN_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{}'
    # SELECT permit_type, source_year, count(*) FROM ekburg_construction_permits GROUP BY 1,2;
    

Replaces #245. Closes #242.

## Summary Чистая версия [PR #245](https://git.gendsgn.ru/lekss361/gendesign/pulls/245) после reviewer rejection (🟠 HIGH — содержал 2 независимых work units). Этот PR содержит **только** SSL fix (1 commit `4a48d49`). Sub-PR `feat(#126) Sub-PR A` уже отдельно merged как PR #247. ## Что фиксит `ekburg_permits.py` падал с `SSL: CERTIFICATE_VERIFY_FAILED` на всех 5 годах (2022-2026) — екатеринбург.рф использует CA Минцифры РФ, которого нет в `certifi` bundle. GlitchTip issues: BACKEND-Q..V (6 events). Подробности: issue #242. ## Fix `backend/app/services/scrapers/ekburg_permits.py` — `verify=False` в `httpx.Client` (Option C — per-scraper). Прецедент: `nspd_lite.py` использует `ssl._create_unverified_context()` для nspd.gov.ru. ## Why not Dockerfile CA install (Option A) Python `certifi` игнорирует системные CA по умолчанию. Option A требует `SSL_CERT_FILE` env + docker-compose changes (devops scope). Данные публичные open-data — verify=False acceptable риск. ## Test plan - [x] 25/25 unit tests passed (`uv run pytest tests/services/test_ekburg_permits.py`) - [x] ruff lint passed - [x] Pre-commit hooks passed - [ ] After deploy smoke: ```bash curl -X POST https://gendsgn.ru/api/v1/admin/scrape/ekburg-permits \ -H "X-Admin-Token: $SCRAPE_ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{}' # SELECT permit_type, source_year, count(*) FROM ekburg_construction_permits GROUP BY 1,2; ``` Replaces #245. Closes #242.
lekss361 added 1 commit 2026-05-17 05:58:50 +00:00
lekss361 merged commit 95e97da713 into main 2026-05-17 06:01:23 +00:00
Author
Owner

Deep Review — verdict APPROVE → merged

Scope clean: 1 commit (4a48d49), 2 файла (+23/-4), только SSL fix. PR #245 закрыт.

Verified:

  • httpx.Client(verify=False) добавлен в единственном месте — ekburg_permits.py:253 (ровно один Client в файле, grep clean).
  • Прецеденты в codebase подтверждены: nspd_bulk_client.py:145, pzz_loader.py:48 — same pattern для гос. РУ-доменов.
  • Нет monkey-patch / глобального отключения SSL — изоляция per-scraper сохранена. Другие scraper'ы (verify=True default) не затронуты.
  • Тест TestSslConfiguration.test_client_uses_verify_false — sanity check (isinstance + _transport), не assert'ит verify=False напрямую (httpx не хранит этот kwarg как attr — _transport создаётся с unverified SSL context). Acceptable: реальная verification идёт через post-deploy smoke-curl.
  • Vault entry fixes/Bug_Ekburg_Permits_SSL_Russian_CA_May17.md существует, не дубль.
  • Closes #242 корректно — issue авто-закроется после merge.

После deploy: smoke POST /api/v1/admin/scrape/ekburg-permits + SELECT permit_type, source_year, count(*) FROM ekburg_construction_permits GROUP BY 1,2.

Merged via deep-code-reviewer — verdict APPROVE.

## Deep Review — verdict APPROVE → merged **Scope clean:** 1 commit (`4a48d49`), 2 файла (+23/-4), только SSL fix. PR #245 закрыт. **Verified:** - `httpx.Client(verify=False)` добавлен в единственном месте — `ekburg_permits.py:253` (ровно один Client в файле, grep clean). - Прецеденты в codebase подтверждены: `nspd_bulk_client.py:145`, `pzz_loader.py:48` — same pattern для гос. РУ-доменов. - Нет monkey-patch / глобального отключения SSL — изоляция per-scraper сохранена. Другие scraper'ы (`verify=True` default) не затронуты. - Тест `TestSslConfiguration.test_client_uses_verify_false` — sanity check (isinstance + `_transport`), не assert'ит `verify=False` напрямую (httpx не хранит этот kwarg как attr — `_transport` создаётся с unverified SSL context). Acceptable: реальная verification идёт через post-deploy smoke-curl. - Vault entry `fixes/Bug_Ekburg_Permits_SSL_Russian_CA_May17.md` существует, не дубль. - `Closes #242` корректно — issue авто-закроется после merge. **После deploy:** smoke `POST /api/v1/admin/scrape/ekburg-permits` + `SELECT permit_type, source_year, count(*) FROM ekburg_construction_permits GROUP BY 1,2`. Merged via deep-code-reviewer — verdict APPROVE.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#249
No description provided.