package web // Corrections and undo on the mail page (novox/hq ADR 0459 §8, §13; issue 1523): each POST is called only // once RequireFormToken (issue 1284, csrf.go) has already let it through — a POST with no token, or // another session's, is answered 403 before mail-reading.correct or .undo is ever asked (1523/AC1). Both // show the page again once done, exactly as sendHandler (write.go) does for a send. import ( "context" "net/http" "strconv" "time" ) // mailCorrectHandler is POST /mail-correct (1523/AC1): the mail's id, and whatever of mark or group the // form carried (both optional; neither given asks mail-reading.correct to refuse, exactly as it already // does for nothing to change). A correction that mail-reading itself refuses is not surfaced as an error // here — the page is shown again regardless, and simply does not reflect a change that did not happen. func (b *Bundle) mailCorrectHandler(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { http.Error(w, "bad request", http.StatusBadRequest) return } id, err := strconv.Atoi(r.PostFormValue("id")) if err != nil { http.Error(w, "bad request", http.StatusBadRequest) return } args := map[string]any{"id": float64(id)} if mark := r.PostFormValue("mark"); mark != "" { args["mark"] = mark } if group := r.PostFormValue("group"); group != "" { args["group"] = group } ctx, cancel := context.WithTimeout(r.Context(), 20*time.Second) defer cancel() _, _ = b.mailCorrectAsk(ctx, args) b.accountsPage(w, r) } // mailUndoHandler is POST /mail-undo (1523/AC2): the reading lesson's id. func (b *Bundle) mailUndoHandler(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { http.Error(w, "bad request", http.StatusBadRequest) return } id, err := strconv.Atoi(r.PostFormValue("id")) if err != nil { http.Error(w, "bad request", http.StatusBadRequest) return } ctx, cancel := context.WithTimeout(r.Context(), 20*time.Second) defer cancel() _, _ = b.mailUndoAsk(ctx, map[string]any{"id": float64(id)}) b.accountsPage(w, r) }