package auth import ( "context" "net/http" ) const sessionCookieName = "session" type contextKey string const userContextKey contextKey = "user" func RequireAuth(store *Store) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { cookie, err := r.Cookie(sessionCookieName) if err != nil || cookie.Value == "" { http.Redirect(w, r, "/login", http.StatusFound) return } session, err := store.GetSession(cookie.Value) if err != nil { http.Redirect(w, r, "/login", http.StatusFound) return } ctx := context.WithValue(r.Context(), userContextKey, session.User) next.ServeHTTP(w, r.WithContext(ctx)) }) } } func RequireAdmin(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { user, ok := UserFromContext(r.Context()) if !ok || !user.IsAdmin { http.Error(w, "forbidden", http.StatusForbidden) return } next.ServeHTTP(w, r) }) } func UserFromContext(ctx context.Context) (*User, bool) { user, ok := ctx.Value(userContextKey).(*User) return user, ok }