commit d75a22a

default  ·  2023-03-01 07:25:36 +0000 UTC
parent 105683d
New function srv_archive_error().
4 files changed,  +45, -33
M data.c
M http.c
M snac.h
+7, -2
 1@@ -930,8 +930,13 @@ int process_input_message(snac *snac, char *msg, char *req)
 2     }
 3 
 4     /* check the signature */
 5-    if (!check_signature(snac, req)) {
 6-        snac_log(snac, xs_fmt("bad signature %s", actor));
 7+    xs *sig_err = NULL;
 8+
 9+    if (!check_signature(snac, req, &sig_err)) {
10+        snac_log(snac, xs_fmt("bad signature %s (%s)", actor, sig_err));
11+
12+        srv_archive_error("check_signature", sig_err, req, msg);
13+
14         return 1;
15     }
16 
M data.c
+30, -0
 1@@ -1844,3 +1844,33 @@ void srv_archive(const char *direction, xs_dict *req,
 2         }
 3     }
 4 }
 5+
 6+
 7+void srv_archive_error(const char *prefix, const xs_str *err,
 8+                       const xs_dict *req, const xs_dict *data)
 9+/* archives an error */
10+{
11+    xs *ntid = tid(0);
12+    xs *fn   = xs_fmt("%s/error/%s_%s", srv_basedir, prefix, ntid);
13+    FILE *f;
14+
15+    if ((f = fopen(fn, "w")) != NULL) {
16+        fprintf(f, "Error: %s\n", err);
17+
18+        if (req) {
19+            fprintf(f, "Request headers:\n");
20+
21+            xs *j = xs_json_dumps_pp(req, 4);
22+            fwrite(j, strlen(j), 1, f);
23+        }
24+
25+        if (data) {
26+            fprintf(f, "Data:\n");
27+
28+            xs *j = xs_json_dumps_pp(data, 4);
29+            fwrite(j, strlen(j), 1, f);
30+        }
31+
32+        fclose(f);
33+    }
34+}
M http.c
+5, -30
 1@@ -119,7 +119,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url,
 2 }
 3 
 4 
 5-static int _check_signature(snac *snac, char *req, char **err)
 6+int check_signature(snac *snac, xs_dict *req, xs_str **err)
 7 /* check the signature */
 8 {
 9     char *sig_hdr = xs_dict_get(req, "signature");
10@@ -134,7 +134,8 @@ static int _check_signature(snac *snac, char *req, char **err)
11     {
12         /* extract the values */
13         xs *l = xs_split(sig_hdr, ",");
14-        char *v;
15+        xs_list *p;
16+        xs_val *v;
17 
18         p = l;
19         while (xs_list_iter(&p, &v)) {
20@@ -182,7 +183,8 @@ static int _check_signature(snac *snac, char *req, char **err)
21 
22     {
23         xs *l = xs_split(headers, " ");
24-        char *v;
25+        xs_list *p;
26+        xs_val *v;
27 
28         p = l;
29         while (xs_list_iter(&p, &v)) {
30@@ -224,30 +226,3 @@ static int _check_signature(snac *snac, char *req, char **err)
31 
32     return 1;
33 }
34-
35-
36-int check_signature(snac *snac, char *req)
37-/* checks the signature and archives the error */
38-{
39-    int ret;
40-    xs *err = NULL;
41-
42-    if ((ret = _check_signature(snac, req, &err)) == 0) {
43-        snac_debug(snac, 1, xs_fmt("check_signature %s", err));
44-
45-        xs *ntid = tid(0);
46-        xs *fn   = xs_fmt("%s/error/check_signature_%s", srv_basedir, ntid);
47-        FILE *f;
48-
49-        if ((f = fopen(fn, "w")) != NULL) {
50-            fprintf(f, "Error: %s\nRequest headers:\n", err);
51-
52-            xs *j = xs_json_dumps_pp(req, 4);
53-
54-            fwrite(j, strlen(j), 1, f);
55-            fclose(f);
56-        }
57-    }
58-
59-    return ret;
60-}
M snac.h
+3, -1
 1@@ -55,6 +55,8 @@ void srv_archive(const char *direction, xs_dict *req,
 2                  const char *payload, int p_size,
 3                  int status, xs_dict *headers,
 4                  const char *body, int b_size);
 5+void srv_archive_error(const char *prefix, const xs_str *err,
 6+                       const xs_dict *req, const xs_dict *data);
 7 
 8 double mtime_nl(const char *fn, int *n_link);
 9 #define mtime(fn) mtime_nl(fn, NULL)
10@@ -157,7 +159,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url,
11                             const char *body, int b_size,
12                             int *status, xs_str **payload, int *p_size,
13                             int timeout);
14-int check_signature(snac *snac, char *req);
15+int check_signature(snac *snac, xs_dict *req, xs_str **err);
16 
17 void httpd(void);
18