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