Files
shopPRO/.paul/phases/21-admin-update-view-js-fix/21-01-PLAN.md
Jacek Pyziak 073069c303 fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (v0.353)
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>
2026-05-13 23:10:08 +02:00

8.1 KiB

phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
phase plan type wave depends_on files_modified autonomous delegation
21-admin-update-view-js-fix 01 execute 1
admin/templates/update/main-view.php
false off
## Goal Naprawić niedziałające przyciski na `/admin/update/main_view/`: "Aktualizuj do wyższej wersji" (`#confirm`), "Aktualizuj do najwyższej wersji" (`#confirmUpdateAll`) oraz globalny "Wyczyść cache" (`#clear-cache-btn`) z headera admina.

Purpose

Na instancjach klientów shopPRO aktualizacja wersji nie była możliwa — zdalny changelog z shoppro.project-dc.pl/updates/changelog.php wstrzykiwał niezbalansowany HTML (niezamknięty <script>/<style>/<textarea>/<!--), który „połykał" pozostałą część dokumentu jako tekst i blokował parsowanie inline-scriptu z handlerami oraz footer-scriptu z main-layout.php. Bez tej naprawy klienci nie mogą aktualizować systemu.

Output

Zmodyfikowany plik admin/templates/update/main-view.php:

  1. Blok <script> z handlerami przeniesiony PRZED sekcję Changelog.
  2. Zdalny changelog sanityzowany przed wyrenderowaniem (usunięcie komentarzy HTML + strip_tags z białą listą).
## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md

Source Files

@admin/templates/update/main-view.php @change.md

- **Scope** — Wystarczy fix zgodny z change.md (jeden plik, dwa kroki)? → Odpowiedź: brak pytań — change.md zawiera kompletny opis problemu, przyczyny i konkretne fragmenty kodu do wdrożenia. Plan = mechaniczne wdrożenie change.md.

<acceptance_criteria>

AC-1: Handlery JS działają niezależnie od treści zdalnego changeloga

Given administrator jest na /admin/update/main_view/ z wersją starszą niż najnowsza
And zdalny serwer shoppro.project-dc.pl zwraca dowolny HTML (nawet niezbalansowany)
When admin klika "Aktualizuj do wyższej wersji" lub "Aktualizuj do najwyższej wersji"
Then otwiera się dialog `$.confirm` (potwierdzenie aktualizacji)
And po potwierdzeniu uruchamia się aktualizacja (redirect /admin/update/update/ lub AJAX /admin/update/updateAll/)

AC-2: Globalny przycisk "Wyczyść cache" działa na podstronie update

Given administrator jest na /admin/update/main_view/
When klika "Wyczyść cache" w headerze admina (`#clear-cache-btn`)
Then footer-script z main-layout.php obsługuje kliknięcie (nie jest „połknięty" przez nieparzysty tag changeloga)

AC-3: Zdalny changelog nadal się wyświetla, ale nie może popsuć strony

Given zdalny changelog zawiera `<script>`, `<style>`, `<textarea>`, `<iframe>`, `<!--...-->` lub niezamknięte tagi strukturalne
When szablon main-view.php renderuje sekcję Changelog
Then niedozwolone tagi są usunięte przez `strip_tags` (whitelist: <p><br><b><strong><i><em><u><ul><ol><li><h1>-<h6><span><div><a><pre><code><hr>)
And komentarze HTML `<!--...-->` są usuwane
And treść tekstowa changeloga + dozwolone tagi formatujące są widoczne na stronie

</acceptance_criteria>

Task 1: Reorder + sanitize w main-view.php admin/templates/update/main-view.php Wdrożyć zmianę zgodnie z change.md:
1. **Przenieść blok `<script type="text/javascript">...</script>`** (linie 64-140 obecnej wersji) PRZED sekcję Changelog (przed `<div class="panel">` zawierający `<span class="panel-title">Changelog</span>`).

   Nowa kolejność w szablonie:
   - panel "Aktualizacja systemu" (wersje + przyciski)
   - panel "Log ostatniej aktualizacji" (warunkowy)
   - **`<script>` z handlerami**  ← przeniesiony tutaj
   - panel "Changelog" (zdalny `file_get_contents` + sanityzacja)

2. **Zastąpić linię z `file_get_contents`** (obecnie linia 60):
   ```php
   <?= @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver ); ?>
   ```
   na blok sanityzacji:
   ```php
   <?php
   $changelog = (string) @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver );
   $changelog = preg_replace( '/<!--.*?-->/s', '', $changelog );
   $changelog = strip_tags( $changelog, '<p><br><b><strong><i><em><u><ul><ol><li><h1><h2><h3><h4><h5><h6><span><div><a><pre><code><hr>' );
   echo $changelog;
   ?>
   ```

Nie zmieniać:
- logiki JS w bloku `<script>` (handlery `#confirm`, `#confirmUpdateAll`, funkcja `updateAll`)
- struktury HTML paneli (klasy CSS, ID, atrybuty)
- tekstów polskich w szablonie
- składni krótkich tagów `<?` (kompatybilność PHP < 8.0 — szablon używa krótkich tagów, zachować konwencję)

Plik zostaje UTF-8 bez BOM.

Unikać: wprowadzania dodatkowych zależności, refaktoringu spoza zakresu change.md, zmiany URL zdalnego changeloga.
1. `php -l admin/templates/update/main-view.php` → "No syntax errors" 2. Grep: `grep -n "strip_tags" admin/templates/update/main-view.php` → linia z whitelistą obecna 3. Grep: blok `<script type="text/javascript">` znajduje się przed `Changelog` w pliku (sprawdzić numery linii) AC-3 satisfied (sanityzacja whitelist + usunięcie komentarzy HTML); strukturalna baza dla AC-1 i AC-2 (reorder przed changelogiem) Reorder bloku `<script>` przed sekcję Changelog + sanityzacja zdalnego changeloga w `admin/templates/update/main-view.php`. 1. Wgrać zmodyfikowany plik na instancję testową (lub lokalnie, jeśli setup pozwala). 2. Hard-reload (Ctrl+F5) w przeglądarce. 3. Restart PHP-FPM / wyczyścić OPcache (jeśli aktywny). 4. Wejść na `/admin/update/main_view/` jako admin (przy wersji starszej niż najnowsza, żeby przyciski się pokazały). 5. **AC-1:** Kliknąć "Aktualizuj do wyższej wersji" → dialog `$.confirm` musi się otworzyć. To samo dla "Aktualizuj do najwyższej wersji". 6. **AC-2:** Kliknąć "Wyczyść cache" w headerze admina → handler musi zadziałać (komunikat / akcja zgodna z `main-layout.php`). 7. **AC-3:** Sekcja Changelog nadal wyświetla treść ze zdalnego serwera (tekst + formatowanie), ale bez `<script>`/`<style>`/`