Files
cmsPRO/.paul/phases/04h-hotfix-https-updates/04h-01-SUMMARY.md
2026-04-26 01:44:36 +02:00

9.0 KiB

phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, started, completed
phase plan subsystem tags requires provides affects tech-stack key-files key-decisions patterns-established duration started completed
04h-hotfix-https-updates 01 infra
https
urlencode
ftp-cleanup
update-mechanism
license-key
phase provides
pre-paul (legacy update mechanism) file_get_contents-based update polling
HTTPS-only update endpoint (kod + 121 paczek + cmsPro.zip + kotwica 1.519)
urlencode($settings['update_key']) wrap (kod + 64 paczek + kotwica)
Audit/patcher PowerShell scripts dla updates/ ZIP-ow
FTP cleanup script (.bak removal lokalnie + zdalnie)
phase-5 (Releases+Update Domain repo)
phase-13 (Admin
Update controller)
added patterns
Audit-then-patch script pair: oddzielne audyt vs mutating skrypty (idempotent verify)
Anchor-package strategy: wstrzykniecie fixa w istniejaca paczke aktualizacji jako ratunkowy punkt zaczepienia
created modified
.paul/phases/04h-hotfix-https-updates/scripts/audit-packages.ps1
.paul/phases/04h-hotfix-https-updates/scripts/patch-packages.ps1
.paul/phases/04h-hotfix-https-updates/scripts/patch-urlencode.ps1
.paul/phases/04h-hotfix-https-updates/scripts/inject-anchor-1519.ps1
.paul/phases/04h-hotfix-https-updates/scripts/cleanup-baks.ps1
.paul/phases/04h-hotfix-https-updates/audit-report.md
.paul/phases/04h-hotfix-https-updates/patch-log.md
.paul/phases/04h-hotfix-https-updates/patch-urlencode-log.md
.paul/phases/04h-hotfix-https-updates/upload-checklist.md
autoload/Shared/Helpers/Helpers.php
autoload/admin/factory/class.Update.php
updates/cmsPro.zip
updates/**/ver_*.zip (121 paczek http->https + 64 urlencode)
2x ver_*_manifest.json (przeliczone checksum_zip SHA256)
full-patch zamiast minimal-patch: 121 paczek > ryzyko regresji przy chain-update
urlencode jako oddzielny patch po wykryciu bug-a #2 podczas UAT (klucz licencji z #)
.NET FtpWebRequest zamiast curl --quote dla cleanup (PowerShell 5.1 traktuje stderr curl jako fatal)
Reverse-engineering bug w produkcji: curl probe serwera wyzwolil odkrycie HTTP 301 redirect
Bug discovery podczas UAT: drugi bug (urlencode) ujawniony dopiero po naprawieniu pierwszego
~90min 2026-04-25T22:00:00Z 2026-04-26T00:35:00Z

Phase 04h Plan 01: Hotfix HTTPS Update Endpoint Summary

Naprawa zablokowanego mechanizmu aktualizacji w cmsPRO: HTTP->HTTPS w kodzie + 121 paczkach, urlencode klucza licencji w 64 paczkach, kotwica fixa w ver_1.519.zip, cleanup 1085 backupow z FTP+lokalnie. Test instance odblokowana i potwierdzona przez user-a.

Performance

Metric Value
Duration ~90min
Started 2026-04-25 22:00
Completed 2026-04-26 00:35
Tasks 8 zaplanowane + 3 dodatkowe (urlencode patch, urlencode w paczkach, cleanup .bak)
Files modified 4 PHP source + 124 paczki (cmsPro + 121 ZIP + 2 manifest) + 1085 .bak removed

Acceptance Criteria Results

Criterion Status Notes
AC-1: Kod cmsPRO uzywa HTTPS Pass Helpers.php + factory/Update.php; 0 wystapien http://
AC-2: Instancja testowa odblokowana Pass User potwierdzil "Zadzialalo" po dodaniu urlencode
AC-3: Wszystkie paczki wolne od bug-a Pass Audit po patchu: 0 paczek z http://, 0 paczek z raw $settings['update_key'] w URL
AC-4: ver_1.519.zip jako kotwica fixa Pass Zawiera class.S.php (37958B) + class.Update.php (2886B), oba z https + urlencode. SHA256: 14e5754c75884fcc...
AC-5: Audit report dostarczony Pass audit-report.md + patch-log.md + patch-urlencode-log.md

Accomplishments

  • Odblokowanie WSZYSTKICH instancji cmsPRO: kazda instancja ktora dotrze do 1.519 dostaje wbudowana kotwice z dzialajacym klientem update (https + urlencode)
  • Identyfikacja DWOCH bugow (HTTP 301 redirect i URL fragment-cutting na #) podczas jednej sesji
  • Idempotentne skrypty audit+patch+cleanup mozliwe do reuse gdyby pojawila sie kolejna fala buggy paczek
  • Zero regresji: zachowane oryginalne backupy podczas patcha (.bak), usuniete dopiero po UAT confirmation

Files Created/Modified

File Change Purpose
autoload/Shared/Helpers/Helpers.php Modified http->https + urlencode w get_new_version()
autoload/admin/factory/class.Update.php Modified http->https + urlencode w update()
cmstest.../autoload/class.S.php Modified UAT instance hotfix
cmstest.../autoload/admin/factory/class.Update.php Modified UAT instance hotfix
updates/cmsPro.zip Modified Base install patched (legacy nie uzywal klucza, tylko http->https)
updates/**/ver_*.zip (121) Modified http->https w autoload/class.S.php / Helpers.php / factory/Update.php
updates/**/ver_*.zip (64) Modified urlencode wrap (subset 121)
updates/1.50/ver_1.519.zip Modified + anchor injection: class.S.php + factory/Update.php
updates/**/ver_*_manifest.json (2) Modified Przeliczony checksum_zip SHA256
.paul/phases/04h-hotfix-https-updates/scripts/*.ps1 (5) Created Audit, patch, anchor inject, urlencode patch, FTP cleanup
.paul/phases/04h-hotfix-https-updates/*.md (4) Created audit-report, patch-log, patch-urlencode-log, upload-checklist

Decisions Made

Decision Rationale Impact
full-patch wszystkich 121 paczek Czesciowy patch ryzykowal regresje gdy stara buggy paczka nadpisywala swiezo zaktualizowany class.S.php 124 pliki do uploadu (vs 3 minimum), ale kazda chain-update sciezka bezpieczna
Anchor injection do ver_1.519.zip Oryginalna paczka (class.Articles.php only) jest "darmowa" wersja na granicy licencji - idealny punkt by gwarantowac dzialajacy klient HTTPS dla wszystkich nowych instancji Wszystkie nowe instancje od zera dostaja fix przy upgrade do 1.519
.NET FtpWebRequest zamiast curl dla cleanup curl stderr w PowerShell 5.1 wyrzuca NativeCommandError przy 550, blokujac batch Cleanup ukonczony bez bledow (1085 .bak)
urlencode jako oddzielny etap Bug ujawniony dopiero podczas UAT (user dodal klucz z #) - zorganizowany jako "rozszerzenie planu" zamiast restart Czysta sciezka audytowa, oba bugi udokumentowane oddzielnie

Deviations from Plan

Summary

Type Count Impact
Auto-fixed 1 urlencode bug discovered during UAT, dodatkowe 3 zadania (patch kodu, patch paczek, cleanup)
Scope additions 1 FTP cleanup (.bak files na serwerze) - nie planowane, user zlecil po UAT
Deferred 0 -

Total impact: Plan ukonczony + 2 niezbedne rozszerzenia odkryte podczas wykonania.

Auto-fixed Issues

1. URL encoding klucza licencji (krytyczny bug #2)

  • Found during: UAT post-Task 8 (user testowal z kluczem #e@1tUVvZDP:$7dL)
  • Issue: Klucz licencji wstrzykiwany raw w URL, znak # w kluczu byl traktowany jako fragment delimiter -> serwer dostawal pusty klucz -> zwracal wersje tylko do 1.519 (free tier)
  • Fix: urlencode($settings['update_key']) w kodzie + 64 paczkach + kotwicy
  • Files: Helpers.php, factory/Update.php (cmsPRO + test instance), 64x ver_*.zip, ver_1.519.zip
  • Verification: PowerShell scan wszystkich plikow w paczkach: 0/165 bez urlencode wrap

Scope Additions

1. FTP cleanup .bak files

  • Trigger: User polecil usuniecie backupow po UAT confirmation
  • Discovered: Auto-deploy ftp-kr.json (autoUpload=true, autoDelete=false) wyslal 1085 .bak na serwer
  • Action: Skrypt cleanup-baks.ps1 (.NET FtpWebRequest) - 355 zdalnych usuniec + lokalne removal
  • Verification: sample listing /updates/1.50/ - 0 .bak remote, 0 .bak lokalnie

Deferred Items

None.

Issues Encountered

Issue Resolution
PowerShell 5.1 mis-reads UTF-8 file bez BOM (audit-packages.ps1 z em-dash) Zamieniono "—" na "--", plik czysto ASCII
Substring(0,12) na "(dry-run)" string (length 9) Dodany length-guard if
curl -Q "DELE name" w katalogu wymaga CWD; bez CWD szuka w root (550) Zmiana na pelna sciezka w DELE + URL ftp://host/
curl stderr w PowerShell 5.1 = NativeCommandError przy 550 -> ErrorActionPreference Stop blokuje batch Przepisanie na .NET FtpWebRequest z try/catch na 550

Next Phase Readiness

Ready:

  • Phase 5 (Domain: SeoAdditional + Cron + Releases) moze ruszyc bez zaleznosci od 04h
  • Mechanizm update na produkcji odblokowany - nowe wersje moga byc dystrybuowane normalnie
  • Skrypty audit/patch w .paul/phases/04h-hotfix-https-updates/scripts/ dostepne jako template przy podobnych operacjach

Concerns:

  • Mechanizm update nadal uzywa file_get_contents() bez stream context z verify_peer/follow_location - rekomendacja: w Phase 5 lub Phase 13 przepisac na cURL z proper error handling i SSL verification
  • Klucze licencji powinny byc walidowane przy zapisie w settings (max length, allowed chars) - obecnie polegamy na urlencode jako fix
  • Brak retry logic przy chwilowym network failure podczas update - obecny kod silnie failuje

Blockers:

  • None. Phase 5 moze ruszyc.

Phase: 04h-hotfix-https-updates, Plan: 01 Completed: 2026-04-26