commit d75a22a
default
·
2023-03-01 07:25:36 +0000 UTC
parent 105683d
New function srv_archive_error().
4 files changed,
+45,
-33
+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