Skip to content

Чинит загрузку данных админ-панели: origin воркера в CSP (#174)#175

Merged
xlabtg merged 3 commits into
mainfrom
issue-174-13bb3a9dd007
May 27, 2026
Merged

Чинит загрузку данных админ-панели: origin воркера в CSP (#174)#175
xlabtg merged 3 commits into
mainfrom
issue-174-13bb3a9dd007

Conversation

@konard
Copy link
Copy Markdown
Collaborator

@konard konard commented May 27, 2026

Проблема (issue #174)

После исправлений #172/#173 и деплоя через установщик админ-панель по-прежнему не показывала никаких данных — «всё осталось как до решения issue».

Корневая причина

Админ-панель загружает все наборы данных из кросс-доменного Cloudflare Worker (/admin/api/*, см. assets/js/admin.jsworker/src/adminPanel.js). Но origin воркера отсутствовал в директиве connect-src CSP админ-страницы:

connect-src 'self' https://api.telegram.org https://tganalytics.xyz https://mc.yandex.ru

Браузер блокировал все запросы к воркеру (stats, fraud-flags, top-users, users, audit-log) ещё до отправки. Поэтому панель показывала баннер Failed to load data… и пустые метрики . Логика загрузки из #172 была корректной, но её эффект был не виден — запросы не доходили до сети.

Остальные страницы, работающие с воркером (redeem, intro, otc, referral), уже перечисляют его origin в connect-src — админ-страница была единственным исключением.

Воспроизведение

experiments/admin-csp-repro.mjs поднимает статический сайт (origin A) и mock-воркер (origin B), как при реальном деплое. В консоли браузера:

Refused to connect to 'http://localhost:8090/admin/api/stats' because it violates
the document's Content Security Policy. @ admin.js:113

Исправление

  • src/_includes/admin-page.njk и собранный admin/index.html: в connect-src добавлен https://ton-bridge-worker.tonbankcard.workers.dev. Установщик переписывает этот литерал на реальный URL воркера (tonbridge_installer_static_replacements) — ровно так же, как для redeem-страницы.
  • assets/js/admin.js: DEFAULT_API_BASE выровнен с auth.js (https://ton-bridge-worker.tonbankcard.workers.dev). Раньше там был нерабочий плейсхолдер ...YOUR_ACCOUNT..., которого нет в списке замен установщика.

Тесты (регрессионная защита)

Существующие tests/admin.spec.js патчат window.fetch до запуска скриптов и намеренно обходят CSP, поэтому этот баг поймать не могли. Добавлены проверки на уровне статического контента:

  • tests/deployment-assets.test.php — собранный admin/index.html несёт origin воркера в connect-src.
  • tests/installer.test.php — установщик переписывает origin воркера в админ-CSP.
  • tests/csp-sri.spec.js (e2e) — connect-src админ-страницы в dist/ содержит origin воркера.

Все проверки проходят локально: npm run test:installer, npm run test:admin-panel, npm run check:i18n, e2e csp-sri + admin (88 passed).

Скриншоты

До (CSP блокирует запросы — баннер ошибки, метрики ):

До

После (origin воркера разрешён — данные загружаются):

После

Closes #174

Adding .gitkeep for PR creation (default mode).
This file will be removed when the task is complete.

Issue: #174
@konard konard self-assigned this May 27, 2026
)

Админ-панель загружает все данные из кросс-доменного Cloudflare Worker
(/admin/api/*), но его origin отсутствовал в директиве connect-src CSP
админ-страницы. Браузер блокировал все запросы к воркеру, поэтому панель
показывала баннер ошибки и пустые метрики — эффект исправления #172/#173
был не виден после деплоя через установщик.

- admin-page.njk и собранный admin/index.html: добавлен
  https://ton-bridge-worker.tonbankcard.workers.dev в connect-src
  (установщик переписывает его на реальный URL воркера, как для redeem).
- admin.js: DEFAULT_API_BASE выровнен с auth.js и списком замен
  установщика (был нерабочий плейсхолдер ...YOUR_ACCOUNT...).
- Регрессионные проверки: deployment-assets.test.php и installer.test.php
  (PHP) + csp-sri.spec.js (e2e) проверяют наличие origin воркера в
  connect-src админ-страницы и его переписывание установщиком.

Существующие admin.spec.js патчат window.fetch до запуска скриптов и
намеренно обходят CSP, поэтому не могли поймать этот баг.
@konard konard changed the title [WIP] The admin panel has not been updated Чинит загрузку данных админ-панели: origin воркера в CSP (#174) May 27, 2026
@konard konard marked this pull request as ready for review May 27, 2026 14:19
@konard
Copy link
Copy Markdown
Collaborator Author

konard commented May 27, 2026

Working session summary

Готово. Issue #174 решена, PR #175 обновлён и готов к ревью.

Что было не так

Админ-панель тянет все данные из кросс-доменного Cloudflare Worker (/admin/api/*). Но origin воркера отсутствовал в директиве connect-src CSP админ-страницы:

connect-src 'self' https://api.telegram.org https://tganalytics.xyz https://mc.yandex.ru

Браузер блокировал все запросы к воркеру ещё до отправки → баннер Failed to load data… и пустые метрики . Логика загрузки из #172/#173 была корректной, но её эффект был не виден после деплоя через установщик. Остальные страницы с воркером (redeem, intro, otc, referral) уже имели его origin в connect-src — админ-страница была единственным исключением.

Подтверждено эмпирически в браузере (Playwright): ошибка Refused to connect … violates the document's Content Security Policy. @ admin.js:113 для всех 5 эндпоинтов. После фикса все данные загружаются (см. скриншоты before/after в PR).

Исправление

  • src/_includes/admin-page.njk + собранный admin/index.html: в connect-src добавлен https://ton-bridge-worker.tonbankcard.workers.dev (установщик переписывает литерал на реальный URL воркера — как для redeem).
  • assets/js/admin.js: DEFAULT_API_BASE выровнен с auth.js (был нерабочий плейсхолдер ...YOUR_ACCOUNT..., отсутствующий в заменах установщика).

Регрессионная защита

Существующие admin.spec.js патчат window.fetch до запуска скриптов и намеренно обходят CSP — поэтому баг и проскочил. Добавлены проверки на уровне статического контента:

  • tests/deployment-assets.test.php — собранный admin/index.html несёт origin воркера.
  • tests/installer.test.php — установщик переписывает origin в админ-CSP.
  • tests/csp-sri.spec.js (e2e) — connect-src в dist/ содержит origin воркера.

Статус

  • Локально и в CI всё зелёное: 14 джобов success (Deploy пропущен — только для main), Playwright 88 passed.
  • Рабочее дерево чистое, ветка issue-174-13bb3a9dd007 запушена.
  • PR снят с черновика, скриншоты доступны (HTTP 200).

PR: #175


This summary was automatically extracted from the AI working session output.

@konard
Copy link
Copy Markdown
Collaborator Author

konard commented May 27, 2026

🤖 Solution Draft Log

This log file contains the complete execution trace of the AI solution draft process.

💰 Cost: $8.098061

📊 Context and tokens usage:

Claude Opus 4.7: (2 sub-sessions)

  1. 116.3K / 1M (12%) input tokens, 38.9K / 128K (30%) output tokens
  2. 107.6K / 1M (11%) input tokens, 31.5K / 128K (25%) output tokens

Total: (14.1K new + 293.4K cache writes + 8.5M cache reads) input tokens, 77.2K output tokens, $8.098061 cost

🤖 Models used:

  • Tool: Anthropic Claude Code
  • Requested: opus
  • Model: Claude Opus 4.7 (claude-opus-4-7)

📎 Log file uploaded as Gist (3935KB)


Now working session is ended, feel free to review and add any feedback on the solution draft.

@konard
Copy link
Copy Markdown
Collaborator Author

konard commented May 27, 2026

✅ Ready to merge

This pull request is now ready to be merged:

  • All CI checks have passed
  • No merge conflicts
  • No pending changes

Monitored by hive-mind with --auto-restart-until-mergeable flag

@xlabtg xlabtg merged commit d5d9aa8 into main May 27, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The admin panel has not been updated

2 participants