1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
diff --git a/main.go b/main.go
index 8b22f43e0407c32e4b9fc2f0e2eceec185f748f2..98fa14b4f3f18e8bac1f88d7be582f24a861941a 100644
--- a/main.go
+++ b/main.go
@@ -9,6 +9,7 @@ "encoding/pem"
"errors"
"flag"
"fmt"
+ "io"
"log/slog"
"net/http"
"os"
@@ -32,7 +33,7 @@ logLevel slog.Level
logJSON bool
}
-const magicKey = "woodpcecker-ci-extensions"
+const magicKey = "woodpecker-ci-extensions"
func maine() error {
var args args
@@ -71,6 +72,14 @@ ff.WithEnvVarPrefix("JSONNETPECKER"),
); err != nil {
return err
}
+ logOpts := &slog.HandlerOptions{Level: args.logLevel}
+ var logger slog.Handler
+ if args.logJSON {
+ logger = slog.NewJSONHandler(os.Stderr, logOpts)
+ } else {
+ logger = slog.NewTextHandler(os.Stderr, logOpts)
+ }
+ slog.SetDefault(slog.New(logger))
if args.pubKeyFile != "" {
data, err := os.ReadFile(args.pubKeyFile)
@@ -100,8 +109,15 @@ mux.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`send me some jsonnet`))
})
mux.With(verifyMiddleware(pubKey)).Post("/", func(w http.ResponseWriter, r *http.Request) {
+ body, err := io.ReadAll(r.Body)
+ if err != nil {
+ json.NewEncoder(w).Encode(map[string]string{"error": "could not read body"})
+ w.WriteHeader(http.StatusBadRequest)
+ return
+ }
+ slog.Debug("incoming request", slog.String("body", string(body)))
var req Request
- if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
+ if err := json.Unmarshal(body, &req); err != nil {
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode(map[string]string{"error": "could not decode JSON"})
return
@@ -109,6 +125,7 @@ }
configs := make([]Config, 0, len(req.Configs))
for _, cfg := range req.Configs {
+ slog.Debug("incoming config", slog.String("name", cfg.Name), slog.String("data", cfg.Data))
if strings.HasSuffix(cfg.Name, "jsonnet") {
vm := jsonnet.MakeVM()
jsonData, err := vm.EvaluateAnonymousSnippet(cfg.Name, cfg.Data)
@@ -130,7 +147,8 @@ cfg.Data = string(yamlData)
}
configs = append(configs, cfg)
}
- json.NewEncoder(w).Encode(Request{Configs: configs})
+ slog.Debug("YAML response", slog.Any("configs", configs))
+ json.NewEncoder(w).Encode(Response{Configs: configs})
})
return mux
@@ -173,6 +191,7 @@ func verifyMiddleware(pubKey ed25519.PublicKey) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if err := verify(pubKey, r); err != nil {
+ slog.Error("verify failed", slog.Any("err", err), slog.String("signature", r.Header.Get("Signature")), slog.String("signature-input", r.Header.Get("Signature-Input")), slog.String("content-digest", r.Header.Get("Content-Digest")))
w.WriteHeader(http.StatusUnauthorized)
json.NewEncoder(w).Encode(map[string]string{"error": "Failed to verify request"})
return
@@ -183,6 +202,10 @@ }
}
type Request struct {
+ Configs []Config `json:"configuration"`
+}
+
+type Response struct {
Configs []Config `json:"configs"`
}
|