package web import ( "context" "net/http" "github.com/arnef/ebooks/internal/users" ) type contextKey int const sessionKey contextKey = iota // sessionFrom retrieves the session stored in request context. func sessionFrom(r *http.Request) *users.Session { s, _ := r.Context().Value(sessionKey).(*users.Session) return s } // requireAuth is middleware that redirects unauthenticated requests to /login. func (h *Handler) requireAuth(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { sess, err := h.sessionFromRequest(r) if err != nil || sess == nil { http.Redirect(w, r, "/login", http.StatusSeeOther) return } ctx := context.WithValue(r.Context(), sessionKey, sess) next(w, r.WithContext(ctx)) } } // requireUpload is middleware that returns 403 if the user lacks upload permission. func (h *Handler) requireUpload(next http.HandlerFunc) http.HandlerFunc { return h.requireAuth(func(w http.ResponseWriter, r *http.Request) { sess := sessionFrom(r) if !sess.CanUpload { http.Error(w, "Keine Berechtigung", http.StatusForbidden) return } next(w, r) }) } func (h *Handler) sessionFromRequest(r *http.Request) (*users.Session, error) { cookie, err := r.Cookie("session") if err != nil { return nil, nil } return h.store.LookupSession(cookie.Value) }