package main import ( "context" "net/http" "slices" "strings" "src.opensuse.org/autogits/common" ) func ConfigMiddleWare(cfg *Config) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), configKey, cfg) next.ServeHTTP(w, r.WithContext(ctx)) }) } } func ProxyAuthMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { header := r.Header.Get("Authorization") if header == "" { http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } token_arr := strings.Split(header, " ") if len(token_arr) != 2 { http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } if !strings.EqualFold(token_arr[0], "Bearer") { http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } token := token_arr[1] config, ok := r.Context().Value(configKey).(*Config) if !ok { common.LogError("Config missing from context") http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } if !slices.Contains(config.Keys, token) { http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } next.ServeHTTP(w, r) }) }