package handlers import ( "html/template" "net/http" "strings" "gitea.leeworks.dev/0xwheatyz/gitea-mobile/internal/auth" "gitea.leeworks.dev/0xwheatyz/gitea-mobile/internal/middleware" ) var settingsTemplate = template.Must(template.New("settings").Parse(` Settings — Gitea Mobile

Settings

{{if .Message}}
{{.Message}}
{{end}} {{if .HasToken}}

Status: Connected

A Gitea API token is configured.

{{end}}

Generate a token at your Gitea instance under Settings → Applications.

{{if .HasToken}}

Back to Dashboard

{{end}} `)) // SettingsHandler handles GET and POST requests for the settings page. type SettingsHandler struct { SessionSecret string SecureCookies bool } type settingsData struct { HasToken bool Message string MessageType string // "success", "error", "info" } // ServeHTTP handles the settings page. func (h *SettingsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: h.handleGet(w, r) case http.MethodPost: h.handlePost(w, r) default: http.Error(w, "method not allowed", http.StatusMethodNotAllowed) } } func (h *SettingsHandler) handleGet(w http.ResponseWriter, r *http.Request) { hasToken := false if token := middleware.TokenFromContext(r.Context()); token != "" { hasToken = true } else if _, err := auth.GetToken(r, h.SessionSecret); err == nil { hasToken = true } data := settingsData{HasToken: hasToken} w.Header().Set("Content-Type", "text/html; charset=utf-8") settingsTemplate.Execute(w, data) } func (h *SettingsHandler) handlePost(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { h.renderWithMessage(w, r, "Failed to parse form.", "error") return } action := r.FormValue("action") switch action { case "logout": auth.ClearTokenCookie(w, h.SecureCookies) h.renderWithMessage(w, r, "Token removed successfully.", "success") return case "save": token := strings.TrimSpace(r.FormValue("token")) if token == "" { h.renderWithMessage(w, r, "Token cannot be empty.", "error") return } auth.SetTokenCookie(w, token, h.SessionSecret, h.SecureCookies) // After saving, redirect to dashboard. http.Redirect(w, r, "/", http.StatusSeeOther) return default: h.renderWithMessage(w, r, "Unknown action.", "error") } } func (h *SettingsHandler) renderWithMessage(w http.ResponseWriter, r *http.Request, msg, msgType string) { hasToken := false if _, err := auth.GetToken(r, h.SessionSecret); err == nil { hasToken = true } data := settingsData{ HasToken: hasToken, Message: msg, MessageType: msgType, } w.Header().Set("Content-Type", "text/html; charset=utf-8") settingsTemplate.Execute(w, data) }