HIGH: Template rendering bypass in HandleAppCreate/HandleAppUpdate can produce partial HTML #121

Open
opened 2026-02-21 09:51:51 +01:00 by clawbot · 0 comments
Collaborator

Bug

Several error paths in HandleAppCreate and HandleAppUpdate call tmpl.ExecuteTemplate(writer, ...) directly instead of using h.renderTemplate(writer, tmpl, ...). The renderTemplate method renders into a buffer first and only writes to the ResponseWriter on success, preventing partial/corrupt HTML. The direct calls bypass this safety.

Affected Code

internal/handlers/app.goHandleAppCreate:

nameErr := validateAppName(name)
if nameErr != nil {
    data["Error"] = "Invalid app name: " + nameErr.Error()
    _ = tmpl.ExecuteTemplate(writer, "app_new.html", data) // DIRECT — no buffer
    return
}

internal/handlers/app.goHandleAppUpdate:

nameErr := validateAppName(newName)
if nameErr != nil {
    // ...
    _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer
    return
}

repoURLErr := validateRepoURL(request.FormValue("repo_url"))
if repoURLErr != nil {
    // ...
    _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer
    return
}

Other error paths in the same functions correctly use h.renderTemplate.

Impact

If template execution fails partway through (e.g., missing template data), a partial HTML response is sent to the browser. This is unlikely in practice but violates the safety invariant that renderTemplate was specifically designed to enforce.

Fix

Replace all tmpl.ExecuteTemplate(writer, ...) calls with h.renderTemplate(writer, tmpl, ...).

## Bug Several error paths in `HandleAppCreate` and `HandleAppUpdate` call `tmpl.ExecuteTemplate(writer, ...)` directly instead of using `h.renderTemplate(writer, tmpl, ...)`. The `renderTemplate` method renders into a buffer first and only writes to the ResponseWriter on success, preventing partial/corrupt HTML. The direct calls bypass this safety. ## Affected Code **`internal/handlers/app.go` — `HandleAppCreate`:** ```go nameErr := validateAppName(name) if nameErr != nil { data["Error"] = "Invalid app name: " + nameErr.Error() _ = tmpl.ExecuteTemplate(writer, "app_new.html", data) // DIRECT — no buffer return } ``` **`internal/handlers/app.go` — `HandleAppUpdate`:** ```go nameErr := validateAppName(newName) if nameErr != nil { // ... _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer return } repoURLErr := validateRepoURL(request.FormValue("repo_url")) if repoURLErr != nil { // ... _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer return } ``` Other error paths in the same functions correctly use `h.renderTemplate`. ## Impact If template execution fails partway through (e.g., missing template data), a partial HTML response is sent to the browser. This is unlikely in practice but violates the safety invariant that `renderTemplate` was specifically designed to enforce. ## Fix Replace all `tmpl.ExecuteTemplate(writer, ...)` calls with `h.renderTemplate(writer, tmpl, ...)`.
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sneak/upaas#121
No description provided.