Zdalny changelog z shoppro.project-dc.pl/updates/changelog.php zwracal niezbalansowany HTML (niezamkniety <script>/<style>/<textarea>/<!--), ktory "polykal" reszte dokumentu - inline-script z handlerami #confirm/#confirmUpdateAll i footer-script z main-layout.php (#clear-cache-btn) nigdy nie parsowaly sie jako JS. Klienci nie mogli aktualizowac shopPRO. Fix w admin/templates/update/main-view.php: 1. Blok <script> z handlerami przeniesiony PRZED sekcje Changelog - handlery podpinaja sie niezaleznie od zdalnego HTML. 2. Sanityzacja zdalnego changeloga: preg_replace usuwa komentarze HTML, strip_tags z whitelista (<p><br><b><strong><i><em><u><ul><ol><li> <h1>-<h6><span><div><a><pre><code><hr>) wycina tagi strukturalne i wykonywalne (<script>, <style>, <iframe>, <textarea>). Skutek uboczny: footer-script z main-layout.php (Wyczysc cache + globalne wyszukiwanie + sprawdzanie aktualizacji) dziala teraz na podstronie update. Po wgraniu na instancje: hard-reload (Ctrl+F5) + restart PHP-FPM / wyczyszczenie OPcache. Suita PHPUnit: 846 testow / 2348 assertions OK. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
125 lines
5.4 KiB
Markdown
125 lines
5.4 KiB
Markdown
---
|
|
phase: 21-admin-update-view-js-fix
|
|
plan: 01
|
|
subsystem: admin
|
|
tags: [template, js, htmlsanitize, update, admin-panel]
|
|
|
|
requires:
|
|
- phase: none
|
|
provides: none
|
|
provides:
|
|
- Działające przyciski aktualizacji systemu (`#confirm`, `#confirmUpdateAll`) na /admin/update/main_view/
|
|
- Działający globalny przycisk "Wyczyść cache" (`#clear-cache-btn`) na tej podstronie
|
|
- Sanityzacja zdalnego changeloga (whitelist tagów formatujących + usunięcie komentarzy HTML)
|
|
affects: [admin update workflow, future remote-content includes]
|
|
|
|
tech-stack:
|
|
added: []
|
|
patterns:
|
|
- "Zdalne file_get_contents w szablonie sanityzować przez strip_tags z whitelistą + usunięcie komentarzy HTML; krytyczne <script> renderować PRZED takim includem"
|
|
|
|
key-files:
|
|
created: []
|
|
modified:
|
|
- admin/templates/update/main-view.php
|
|
|
|
key-decisions:
|
|
- "Reorder: blok <script> z handlerami PRZED sekcję Changelog (nie po) — odporność na uszkodzony zdalny HTML"
|
|
- "Whitelist strip_tags ogranicza zdalny changelog do tagów formatujących; <script>/<style>/<textarea>/<iframe> wykluczone"
|
|
|
|
patterns-established:
|
|
- "Sanityzacja zdalnego HTML w szablonach admina: preg_replace('/<!--.*?-->/s', '', $html) + strip_tags(whitelist)"
|
|
|
|
duration: ~15min
|
|
started: 2026-05-13T00:00:00Z
|
|
completed: 2026-05-13T00:00:00Z
|
|
---
|
|
|
|
# Phase 21 Plan 01: Admin update view JS fix — Summary
|
|
|
|
**Naprawiono niedziałające przyciski aktualizacji systemu i globalny "Wyczyść cache" na `/admin/update/main_view/` przez reorder bloku `<script>` przed sekcję Changelog + sanityzację zdalnego changeloga w `admin/templates/update/main-view.php`.**
|
|
|
|
## Performance
|
|
|
|
| Metric | Value |
|
|
|--------|-------|
|
|
| Duration | ~15min |
|
|
| Tasks | 1 auto + 1 checkpoint:human-verify |
|
|
| Files modified | 1 |
|
|
| Tests | 846 / 2348 asercji — OK |
|
|
|
|
## Acceptance Criteria Results
|
|
|
|
| Criterion | Status | Notes |
|
|
|-----------|--------|-------|
|
|
| AC-1: Handlery JS działają niezależnie od treści zdalnego changeloga | Pass | Blok `<script>` w linii 55, przed sekcją Changelog w linii 135 — handlery `#confirm`/`#confirmUpdateAll` podpinają się przed parsowaniem zdalnego HTML |
|
|
| AC-2: Globalny "Wyczyść cache" działa na podstronie update | Pass | Footer-script z `main-layout.php` (#clear-cache-btn) nie jest już „połykany" przez niezbalansowany tag changeloga — potwierdzone human-verify |
|
|
| AC-3: Zdalny changelog renderuje się sanityzowany | Pass | `preg_replace('/<!--.*?-->/s', '', ...)` usuwa komentarze HTML, `strip_tags` z whitelistą `<p><br><b><strong><i><em><u><ul><ol><li><h1>-<h6><span><div><a><pre><code><hr>` wycina niedozwolone tagi strukturalne i wykonywalne |
|
|
|
|
## Accomplishments
|
|
|
|
- Klient może aktualizować shopPRO na instancjach — root cause (niezbalansowany zdalny HTML „połykający" inline-script handlerów i footer-script `main-layout.php`) wyeliminowany przez reorder + sanityzację.
|
|
- Globalny "Wyczyść cache" w headerze admina działa nie tylko na podstronie update, ale i pośrednio wszędzie indziej (footer-script się teraz parsuje).
|
|
- Dodatkowy zysk bezpieczeństwa: zdalny `shoppro.project-dc.pl/updates/changelog.php` nie może już wstrzyknąć `<script>`/`<style>`/`<iframe>` w panel admina.
|
|
|
|
## Files Created/Modified
|
|
|
|
| File | Change | Purpose |
|
|
|------|--------|---------|
|
|
| `admin/templates/update/main-view.php` | Modified | Reorder bloku `<script>` przed sekcję Changelog + sanityzacja zdalnego changeloga (strip_tags whitelist + usunięcie komentarzy HTML) |
|
|
|
|
## Decisions Made
|
|
|
|
| Decision | Rationale | Impact |
|
|
|----------|-----------|--------|
|
|
| Reorder zamiast np. wyłączenia zdalnego changeloga | Zachowuje istniejącą funkcjonalność (admin widzi nowości), eliminuje root cause | Minimalna zmiana, ten sam UX |
|
|
| `strip_tags` z białą listą zamiast np. iframe sandbox | Najprostszy, zerowy narzut, działa na PHP 7.4, brak dodatkowych zależności | Zdalny content może być tylko tekstem z formatowaniem — wystarczy do changeloga |
|
|
| Whitelist obejmuje tagi formatujące + `<div>`/`<span>`/`<a>` | Zachowuje typową strukturę changeloga | Zdalny serwer nie może już strukturalnie popsuć strony |
|
|
|
|
## Deviations from Plan
|
|
|
|
### Summary
|
|
|
|
| Type | Count | Impact |
|
|
|------|-------|--------|
|
|
| Auto-fixed | 0 | — |
|
|
| Scope additions | 0 | — |
|
|
| Deferred | 0 | — |
|
|
|
|
**Total impact:** Plan wykonany dokładnie według change.md, bez odstępstw.
|
|
|
|
### Deferred Items
|
|
|
|
None.
|
|
|
|
## Issues Encountered
|
|
|
|
| Issue | Resolution |
|
|
|-------|------------|
|
|
| `./test.ps1` z CLAUDE.md nie istnieje w repo (zmiana w lokalnej konfiguracji) | Uruchomiono `php phpunit.phar` bezpośrednio — 846 testów zielonych |
|
|
|
|
## Skill Audit (Phase 21)
|
|
|
|
| Expected | Invoked | Notes |
|
|
|----------|---------|-------|
|
|
| /feature-dev | ○ | Hotfix template-only z konkretną instrukcją w change.md — override per pattern poprzednich faz |
|
|
| /koniec-pracy | ○ | Pending — uruchomić przy release update package |
|
|
|
|
Skill audit: not blocking (warning only).
|
|
|
|
## Next Phase Readiness
|
|
|
|
**Ready:**
|
|
- Repo gotowe do `/koniec-pracy` (release update package z nową wersją zawierającą fix `admin/templates/update/main-view.php`)
|
|
- Brak regresji testowej — 846 testów zielonych
|
|
|
|
**Concerns:**
|
|
- Po wgraniu update package na instancje klientów konieczny: hard-reload (Ctrl+F5) + restart PHP-FPM / wyczyszczenie OPcache (zgodnie z change.md sekcja "Po wgraniu")
|
|
|
|
**Blockers:**
|
|
- None
|
|
|
|
---
|
|
*Phase: 21-admin-update-view-js-fix, Plan: 01*
|
|
*Completed: 2026-05-13*
|