commit be894b3

grunfink  ·  2026-06-24 06:45:27 +0000 UTC
parent a0fada7
Added an new keyId check.
3 files changed,  +14, -3
M http.c
M snac.h
+9, -1
 1@@ -2686,14 +2686,22 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
 2 
 3     /* check the signature */
 4     xs *sig_err = NULL;
 5+    xs *key_id = NULL;
 6 
 7-    if (!check_signature(req, &sig_err)) {
 8+    if (!check_signature(req, &sig_err, &key_id)) {
 9         srv_log(xs_fmt("bad signature %s (%s)", actor, sig_err));
10 
11         srv_archive_error("check_signature", sig_err, req, msg);
12         return -1;
13     }
14 
15+    if (strcmp(actor, key_id) != 0) {
16+        srv_log(xs_fmt("mismatched actor '%s' and key '%s'", actor, key_id));
17+
18+        srv_archive_error("mismatched_actor_and_key", "bad keyId", req, msg);
19+        return -1;
20+    }
21+
22     /* if no user is set, no further checks can be done; propagate */
23     if (snac == NULL)
24         return 2;
M http.c
+4, -1
 1@@ -123,7 +123,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url,
 2 }
 3 
 4 
 5-int check_signature(const xs_dict *req, xs_str **err)
 6+int check_signature(const xs_dict *req, xs_str **err, xs_str **key_id)
 7 /* check the signature */
 8 {
 9     const char *sig_hdr = xs_dict_get(req, "signature");
10@@ -182,6 +182,9 @@ int check_signature(const xs_dict *req, xs_str **err)
11     if ((p = strchr(keyId, '#')) != NULL)
12         *p = '\0';
13 
14+    /* copy the keyId */
15+    *key_id = xs_dup(keyId);
16+
17     xs *actor = NULL;
18     int status;
19 
M snac.h
+1, -1
1@@ -348,7 +348,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url,
2                             const char *body, int b_size,
3                             int *status, xs_str **payload, int *p_size,
4                             int timeout);
5-int check_signature(const xs_dict *req, xs_str **err);
6+int check_signature(const xs_dict *req, xs_str **err, xs_str **key_id);
7 
8 srv_state *srv_state_op(xs_str **fname, int op);
9 void httpd(void);