Symptom
Post-deploy Smoke-Test nach PR #82 + #83 zeigt: Template-Detail-Page rendert src=\"#ZgotmplZ\" statt src=\"data:image/png;base64,...\" für die Preview-Bild-img-tag.
Root Cause
Go html/template escaped data:image/png;base64,... URLs in src=-Attributen automatisch zu #ZgotmplZ als Security-Feature gegen data:text/html,<script> XSS-Vektoren. Das PreviewURI-Feld in TemplateDetailData ist als string typisiert (frontend/internal/handlers/template.go).
Fix
Type der PreviewURI von string auf template.URL ändern. Das markiert den String als trusted-URL, sodass html/template ihn unescaped lässt.
import "html/template"
type TemplateDetailData struct {
TemplateData
Template *api.TemplateRead
PreviewURI template.URL // war: string
YAMLSource string
}
Wieso CI das nicht gefangen hat
template_test.go prüft nur HTTP 200 + Container-Div-Existenz, nicht den src-Attribut-Inhalt. Regression-Test sollte ergänzt werden:
if !strings.Contains(body, \"data:image/png;base64\") {
t.Errorf(\"preview src must be a data URL, got: %s\", body)
}
Backend-Endpoint funktioniert
POST /api/render/preview?template=grocy-12mm antwortet HTTP 200 + image/png direkt (710 Bytes für Sample-Template). Nur Frontend-Template-Rendering ist das Problem.
Detected
Production-Smoke nach Phase 7b/UI-Fix-Deploy auf hhdocker02 am 2026-05-17 ~23:30 UTC. Issue #22 enthält den vollständigen Smoke-Report.
Vorgeschlagene Lösung
Schneller Fix-PR (~3 Zeilen Go + 1 Test). Conventional Commit: fix(ui): preview-PNG data-URL must use template.URL type.
Refs #22
Symptom
Post-deploy Smoke-Test nach PR #82 + #83 zeigt: Template-Detail-Page rendert
src=\"#ZgotmplZ\"stattsrc=\"data:image/png;base64,...\"für die Preview-Bild-img-tag.Root Cause
Go
html/templateescapeddata:image/png;base64,...URLs insrc=-Attributen automatisch zu#ZgotmplZals Security-Feature gegendata:text/html,<script>XSS-Vektoren. DasPreviewURI-Feld inTemplateDetailDataist alsstringtypisiert (frontend/internal/handlers/template.go).Fix
Type der
PreviewURIvonstringauftemplate.URLändern. Das markiert den String als trusted-URL, sodass html/template ihn unescaped lässt.Wieso CI das nicht gefangen hat
template_test.goprüft nur HTTP 200 + Container-Div-Existenz, nicht densrc-Attribut-Inhalt. Regression-Test sollte ergänzt werden:Backend-Endpoint funktioniert
POST /api/render/preview?template=grocy-12mmantwortet HTTP 200 + image/png direkt (710 Bytes für Sample-Template). Nur Frontend-Template-Rendering ist das Problem.Detected
Production-Smoke nach Phase 7b/UI-Fix-Deploy auf hhdocker02 am 2026-05-17 ~23:30 UTC. Issue #22 enthält den vollständigen Smoke-Report.
Vorgeschlagene Lösung
Schneller Fix-PR (~3 Zeilen Go + 1 Test). Conventional Commit:
fix(ui): preview-PNG data-URL must use template.URL type.Refs #22