Commit 7fe30e4

Eric Bower  ·  2026-01-22 18:12:11 -0500 EST
parent 78dfe01
feat(auth): `/pubkeys/{user}` public endpoint
1 files changed,  +45, -6
+45, -6
......@@ -69,7 +69,7 @@ func wellKnownHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
6969 w.WriteHeader(http.StatusOK)
7070 err := json.NewEncoder(w).Encode(p)
7171 if err != nil {
72- apiConfig.Cfg.Logger.Error(err.Error())
72+ apiConfig.Cfg.Logger.Error("cannot json encode", "err", err.Error())
7373 http.Error(w, err.Error(), http.StatusInternalServerError)
7474 }
7575 }
......@@ -108,7 +108,7 @@ func introspectHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
108108 w.WriteHeader(http.StatusOK)
109109 err = json.NewEncoder(w).Encode(p)
110110 if err != nil {
111- apiConfig.Cfg.Logger.Error(err.Error())
111+ apiConfig.Cfg.Logger.Error("cannot json encode", "err", err.Error())
112112 http.Error(w, err.Error(), http.StatusInternalServerError)
113113 }
114114 }
......@@ -151,7 +151,7 @@ func authorizeHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
151151 })
152152
153153 if err != nil {
154- apiConfig.Cfg.Logger.Error(err.Error())
154+ apiConfig.Cfg.Logger.Error("cannot execture template", "err", err.Error())
155155 http.Error(w, err.Error(), http.StatusUnauthorized)
156156 return
157157 }
......@@ -221,7 +221,7 @@ func tokenHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
221221 w.WriteHeader(http.StatusOK)
222222 err = json.NewEncoder(w).Encode(p)
223223 if err != nil {
224- apiConfig.Cfg.Logger.Error(err.Error())
224+ apiConfig.Cfg.Logger.Error("cannot json encode", "err", err.Error())
225225 http.Error(w, err.Error(), http.StatusInternalServerError)
226226 }
227227 }
......@@ -348,7 +348,7 @@ func userHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
348348 w.WriteHeader(http.StatusOK)
349349 err = json.NewEncoder(w).Encode(keys)
350350 if err != nil {
351- apiConfig.Cfg.Logger.Error(err.Error())
351+ apiConfig.Cfg.Logger.Error("cannot json encode", "err", err.Error())
352352 http.Error(w, err.Error(), http.StatusInternalServerError)
353353 }
354354 }
......@@ -382,7 +382,45 @@ func rssHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
382382 w.Header().Add("Content-Type", "application/atom+xml")
383383 _, err = w.Write([]byte(rss))
384384 if err != nil {
385- apiConfig.Cfg.Logger.Error(err.Error())
385+ apiConfig.Cfg.Logger.Error("cannot write to http handler", "err", err.Error())
386+ }
387+ }
388+}
389+
390+func pubkeysHandler(apiConfig *shared.ApiConfig) http.HandlerFunc {
391+ return func(w http.ResponseWriter, r *http.Request) {
392+ userName := r.PathValue("user")
393+ user, err := apiConfig.Dbpool.FindUserByName(userName)
394+ if err != nil {
395+ apiConfig.Cfg.Logger.Error(
396+ "could not find user by name",
397+ "err", err.Error(),
398+ "user", userName,
399+ )
400+ http.Error(w, "user not found", http.StatusNotFound)
401+ return
402+ }
403+
404+ pubkeys, err := apiConfig.Dbpool.FindKeysByUser(user)
405+ if err != nil {
406+ apiConfig.Cfg.Logger.Error(
407+ "could not find pubkeys for user",
408+ "err", err.Error(),
409+ "user", userName,
410+ )
411+ http.Error(w, "user pubkeys not found", http.StatusNotFound)
412+ return
413+ }
414+
415+ keys := []string{}
416+ for _, pubkeys := range pubkeys {
417+ keys = append(keys, pubkeys.Key)
418+ }
419+
420+ w.Header().Add("Content-Type", "text/plain")
421+ _, err = w.Write([]byte(strings.Join(keys, "\n")))
422+ if err != nil {
423+ apiConfig.Cfg.Logger.Error("cannot write to http handler", "err", err.Error())
386424 }
387425 }
388426 }
......@@ -815,6 +853,7 @@ func authMux(apiConfig *shared.ApiConfig) *http.ServeMux {
815853 mux.Handle("POST /key", keyHandler(apiConfig))
816854 mux.Handle("POST /user", userHandler(apiConfig))
817855 mux.Handle("GET /rss/{token}", rssHandler(apiConfig))
856+ mux.Handle("GET /pubkeys/{user}", pubkeysHandler(apiConfig))
818857 mux.Handle("POST /redirect", redirectHandler(apiConfig))
819858 mux.Handle("POST /webhook", paymentWebhookHandler(apiConfig))
820859 mux.HandleFunc("GET /main.css", fileServer.ServeHTTP)