this repo has no description
1package knotserver
2
3import (
4 "context"
5 "log/slog"
6 "net/http"
7
8 "github.com/go-chi/chi/v5"
9 "github.com/go-chi/chi/v5/middleware"
10 "tangled.sh/tangled.sh/core/knotserver/config"
11 "tangled.sh/tangled.sh/core/knotserver/db"
12 "tangled.sh/tangled.sh/core/rbac"
13)
14
15type InternalHandle struct {
16 db *db.DB
17 c *config.Config
18 e *rbac.Enforcer
19 l *slog.Logger
20}
21
22func (h *InternalHandle) PushAllowed(w http.ResponseWriter, r *http.Request) {
23 user := r.URL.Query().Get("user")
24 repo := r.URL.Query().Get("repo")
25
26 if user == "" || repo == "" {
27 w.WriteHeader(http.StatusBadRequest)
28 return
29 }
30
31 ok, err := h.e.IsPushAllowed(user, ThisServer, repo)
32 if err != nil || !ok {
33 w.WriteHeader(http.StatusForbidden)
34 return
35 }
36
37 w.WriteHeader(http.StatusNoContent)
38 return
39}
40
41func (h *InternalHandle) InternalKeys(w http.ResponseWriter, r *http.Request) {
42 keys, err := h.db.GetAllPublicKeys()
43 if err != nil {
44 writeError(w, err.Error(), http.StatusInternalServerError)
45 return
46 }
47
48 data := make([]map[string]interface{}, 0)
49 for _, key := range keys {
50 j := key.JSON()
51 data = append(data, j)
52 }
53 writeJSON(w, data)
54 return
55}
56
57func Internal(ctx context.Context, c *config.Config, db *db.DB, e *rbac.Enforcer, l *slog.Logger) http.Handler {
58 r := chi.NewRouter()
59
60 h := InternalHandle{
61 db,
62 c,
63 e,
64 l,
65 }
66
67 r.Get("/push-allowed", h.PushAllowed)
68 r.Get("/keys", h.InternalKeys)
69 r.Mount("/debug", middleware.Profiler())
70
71 return r
72}