From 9bf65054498df1216b0e1db42b154ac282470026 Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 16 Apr 2026 10:40:52 +0200 Subject: Mark actor and instance as OK in successful actor refreshing. --- activitypub.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 2f6da8b..9e49d0d 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3421,6 +3421,10 @@ void process_user_queue_item(snac *user, xs_dict *q_item) actor_o = actor_get_collections(user, actor_o, 1); actor_add(actor, actor_o); + + /* mark actor and instance as working */ + actor_failure(actor, 2); + instance_failure(actor, 2); } else { if (status == HTTP_STATUS_GONE || status == HTTP_STATUS_NOT_FOUND) { -- cgit From 4f1687ad0bf86d764077e0266f067ca086580540 Mon Sep 17 00:00:00 2001 From: grunfink Date: Fri, 22 May 2026 17:00:51 +0200 Subject: Ensure the request path have enough parts. --- activitypub.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 9e49d0d..aeb0967 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3884,6 +3884,10 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path, return 0; xs *l = xs_split_n(q_path, "/", 2); + + if (xs_list_len(l) <= 1) + return HTTP_STATUS_BAD_REQUEST; + const char *uid; const char *p_path; @@ -4071,6 +4075,9 @@ int activitypub_post_handler(const xs_dict *req, const char *q_path, /* get the user and path */ xs *l = xs_split_n(q_path, "/", 2); + if (xs_list_len(l) <= 1) + return HTTP_STATUS_BAD_REQUEST; + if (xs_list_len(l) == 2 && strcmp(xs_list_get(l, 1), "shared-inbox") == 0) { enqueue_shared_input(msg, req, 0); return HTTP_STATUS_ACCEPTED; -- cgit From fbbc4e808631b81f0baf43ffc6ea12be603e4d79 Mon Sep 17 00:00:00 2001 From: grunfink Date: Fri, 22 May 2026 17:05:52 +0200 Subject: Added more logging. --- activitypub.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index aeb0967..49e81f4 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3885,8 +3885,10 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path, xs *l = xs_split_n(q_path, "/", 2); - if (xs_list_len(l) <= 1) + if (xs_list_len(l) <= 1) { + srv_debug(1, xs_fmt("activitypub_get_handler bad path %s", q_path)); return HTTP_STATUS_BAD_REQUEST; + } const char *uid; const char *p_path; @@ -4075,8 +4077,10 @@ int activitypub_post_handler(const xs_dict *req, const char *q_path, /* get the user and path */ xs *l = xs_split_n(q_path, "/", 2); - if (xs_list_len(l) <= 1) + if (xs_list_len(l) <= 1) { + srv_debug(1, xs_fmt("activitypub_post_handler bad path %s", q_path)); return HTTP_STATUS_BAD_REQUEST; + } if (xs_list_len(l) == 2 && strcmp(xs_list_get(l, 1), "shared-inbox") == 0) { enqueue_shared_input(msg, req, 0); -- cgit From be54d22340814efa47439de5e784856010c44af6 Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 1 Jun 2026 08:21:13 +0200 Subject: Ensure publicKeyPem never contain trailing text after the end marker. --- activitypub.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 49e81f4..29a4b66 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1829,7 +1829,18 @@ xs_dict *msg_actor(snac *snac) keys = xs_dict_append(keys, "id", kid); keys = xs_dict_append(keys, "owner", snac->actor); - keys = xs_dict_append(keys, "publicKeyPem", xs_dict_get(snac->key, "public")); + + xs *public_key_pem = xs_dup(xs_dict_get(snac->key, "public")); + + if (xs_is_string(public_key_pem)) { + /* crop any garbage after the PEM */ + const char *pem_trailer = "END PUBLIC KEY-----\n"; + int i = xs_str_in(public_key_pem, pem_trailer); + if (i > 0) + public_key_pem[i + strlen(pem_trailer)] = '\0'; + } + + keys = xs_dict_append(keys, "publicKeyPem", public_key_pem); msg = xs_dict_set(msg, "publicKey", keys); /* if the "bot" config field is set to true, change type to "Service" */ -- cgit From 87e87c199bfd4bfeb5e3371e047a96bec8bcb20b Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 1 Jun 2026 08:31:48 +0200 Subject: Use the full end PEM trailer. --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 29a4b66..1357b6e 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1834,7 +1834,7 @@ xs_dict *msg_actor(snac *snac) if (xs_is_string(public_key_pem)) { /* crop any garbage after the PEM */ - const char *pem_trailer = "END PUBLIC KEY-----\n"; + const char *pem_trailer = "\n-----END PUBLIC KEY-----\n"; int i = xs_str_in(public_key_pem, pem_trailer); if (i > 0) public_key_pem[i + strlen(pem_trailer)] = '\0'; -- cgit From be894b379e72126a28c1aeaa79d4c5eab787638a Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 08:45:27 +0200 Subject: Added an new keyId check. --- activitypub.c | 10 +++++++++- http.c | 5 ++++- snac.h | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 1357b6e..845d92f 100644 --- a/activitypub.c +++ b/activitypub.c @@ -2686,14 +2686,22 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) /* check the signature */ xs *sig_err = NULL; + xs *key_id = NULL; - if (!check_signature(req, &sig_err)) { + if (!check_signature(req, &sig_err, &key_id)) { srv_log(xs_fmt("bad signature %s (%s)", actor, sig_err)); srv_archive_error("check_signature", sig_err, req, msg); return -1; } + if (strcmp(actor, key_id) != 0) { + srv_log(xs_fmt("mismatched actor '%s' and key '%s'", actor, key_id)); + + srv_archive_error("mismatched_actor_and_key", "bad keyId", req, msg); + return -1; + } + /* if no user is set, no further checks can be done; propagate */ if (snac == NULL) return 2; diff --git a/http.c b/http.c index 125d346..95cc489 100644 --- a/http.c +++ b/http.c @@ -123,7 +123,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url, } -int check_signature(const xs_dict *req, xs_str **err) +int check_signature(const xs_dict *req, xs_str **err, xs_str **key_id) /* check the signature */ { const char *sig_hdr = xs_dict_get(req, "signature"); @@ -182,6 +182,9 @@ int check_signature(const xs_dict *req, xs_str **err) if ((p = strchr(keyId, '#')) != NULL) *p = '\0'; + /* copy the keyId */ + *key_id = xs_dup(keyId); + xs *actor = NULL; int status; diff --git a/snac.h b/snac.h index f1fadad..b61cc6c 100644 --- a/snac.h +++ b/snac.h @@ -348,7 +348,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url, const char *body, int b_size, int *status, xs_str **payload, int *p_size, int timeout); -int check_signature(const xs_dict *req, xs_str **err); +int check_signature(const xs_dict *req, xs_str **err, xs_str **key_id); srv_state *srv_state_op(xs_str **fname, int op); void httpd(void); -- cgit From fe83b48f5b1bb5f30c65e1ba3fc10d0f1cfb1841 Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 10:46:44 +0200 Subject: Reverted previous patch. This check needs more granularity; Mastodon sends Create + Note posts not from the actor, relays sends announces, etc. --- activitypub.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 845d92f..cfa97a0 100644 --- a/activitypub.c +++ b/activitypub.c @@ -2695,13 +2695,6 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) return -1; } - if (strcmp(actor, key_id) != 0) { - srv_log(xs_fmt("mismatched actor '%s' and key '%s'", actor, key_id)); - - srv_archive_error("mismatched_actor_and_key", "bad keyId", req, msg); - return -1; - } - /* if no user is set, no further checks can be done; propagate */ if (snac == NULL) return 2; -- cgit From 2135bdfd3aa62cb319fb73f87c071b36a160ef73 Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 10:58:59 +0200 Subject: Added an additional check for updated actor objects. --- activitypub.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index cfa97a0..7d9eb7b 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3067,10 +3067,16 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else if (strcmp(type, "Update") == 0) { /** **/ if (xs_match(utype, "Person|Service|Application")) { /** **/ - actor_add(actor, xs_dict_get(msg, "object")); - timeline_touch(snac); + if (strcmp(actor, key_id) == 0) { + actor_add(actor, xs_dict_get(msg, "object")); + timeline_touch(snac); - snac_log(snac, xs_fmt("updated actor %s", actor)); + snac_log(snac, xs_fmt("updated actor %s", actor)); + } + else { + srv_log(xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id)); + srv_archive_error("update_actor_key_mismatch", "bad keyId", actor, key_id); + } } else if (xs_match(utype, "Note|Page|Article|Video|Audio|Event")) { /** **/ -- cgit From fbc30d15524a84467570308a6eac2fcebf548659 Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 11:22:11 +0200 Subject: Added more checks for 'Delete' and 'Update'. --- activitypub.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 7d9eb7b..0d2a54b 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3086,6 +3086,16 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("malformed message: no 'id' field")); else if (object_here(id)) { + const char *atto = get_atto(object); + + if (atto == NULL) + snac_log(snac, xs_fmt("ignored post 'Update' with no attributedTo %s", id)); + else + if (strcmp(atto, key_id) != 0) { + snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id)); + srv_archive_error("update_post_key_mismatch", "bad keyId", atto, key_id); + } + else if (xs_startswith(id, srv_baseurl) && !xs_startswith(id, actor)) snac_log(snac, xs_fmt("ignored incorrect 'Update' %s %s", actor, id)); else { @@ -3126,10 +3136,22 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) if (xs_type(object) == XSTYPE_DICT) object = xs_dict_get(object, "id"); + xs *obj_data = NULL; + if (xs_is_null(object)) snac_log(snac, xs_fmt("malformed message: no 'id' field")); else - if (object_here(object)) { + if (valid_status(object_get(object, &obj_data))) { + const char *atto = get_atto(obj_data); + + if (atto == NULL) + snac_log(snac, xs_fmt("ignored 'Delete' for object with attributedTo %s", object)); + else + if (strcmp(atto, key_id) != 0) { + snac_log(snac, xs_fmt("Delete: mismatched attributedTo '%s' and key '%s'", atto, key_id)); + srv_archive_error("delete_post_key_mismatch", "bad keyId", atto, key_id); + } + else if (xs_startswith(object, srv_baseurl) && !is_msg_mine(snac, object)) snac_log(snac, xs_fmt("ignored incorrect 'Delete' %s %s", actor, object)); else { -- cgit From 84084ee0246e3a7f64eca977a77f2b4ae32bb6d3 Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 11:33:11 +0200 Subject: Added and additional keyId check in 'Move'. --- activitypub.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 0d2a54b..7a18af4 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3145,7 +3145,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) const char *atto = get_atto(obj_data); if (atto == NULL) - snac_log(snac, xs_fmt("ignored 'Delete' for object with attributedTo %s", object)); + snac_log(snac, xs_fmt("ignored 'Delete' for object without attributedTo %s", object)); else if (strcmp(atto, key_id) != 0) { snac_log(snac, xs_fmt("Delete: mismatched attributedTo '%s' and key '%s'", atto, key_id)); @@ -3195,7 +3195,12 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) const char *old_account = xs_dict_get(msg, "object"); const char *new_account = xs_dict_get(msg, "target"); - if (!xs_is_null(old_account) && !xs_is_null(new_account)) { + if (xs_is_string(old_account) && xs_is_string(new_account)) { + if (strcmp(old_account, key_id) != 0) { + snac_log(snac, xs_fmt("'Move': mismatched old_account %s and key %s", old_account, key_id)); + srv_archive_error("move_old_account_key_mismatch", "bad keyId", old_account, msg); + } + else if (following_check(snac, old_account)) { xs *n_actor = NULL; -- cgit From 192056299c0b2aa707e643ba17f53f703f7fac8c Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 12:49:05 +0200 Subject: Fixed incorrect calls to srv_archive_error(). --- activitypub.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 7a18af4..0dfcf84 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3075,7 +3075,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) } else { srv_log(xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id)); - srv_archive_error("update_actor_key_mismatch", "bad keyId", actor, key_id); + srv_archive_error("update_actor_key_mismatch", "bad keyId", req, msg); } } else @@ -3093,7 +3093,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else if (strcmp(atto, key_id) != 0) { snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id)); - srv_archive_error("update_post_key_mismatch", "bad keyId", atto, key_id); + srv_archive_error("update_post_key_mismatch", "bad keyId", req, msg); } else if (xs_startswith(id, srv_baseurl) && !xs_startswith(id, actor)) @@ -3149,7 +3149,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else if (strcmp(atto, key_id) != 0) { snac_log(snac, xs_fmt("Delete: mismatched attributedTo '%s' and key '%s'", atto, key_id)); - srv_archive_error("delete_post_key_mismatch", "bad keyId", atto, key_id); + srv_archive_error("delete_post_key_mismatch", "bad keyId", req, msg); } else if (xs_startswith(object, srv_baseurl) && !is_msg_mine(snac, object)) @@ -3198,7 +3198,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) if (xs_is_string(old_account) && xs_is_string(new_account)) { if (strcmp(old_account, key_id) != 0) { snac_log(snac, xs_fmt("'Move': mismatched old_account %s and key %s", old_account, key_id)); - srv_archive_error("move_old_account_key_mismatch", "bad keyId", old_account, msg); + srv_archive_error("move_old_account_key_mismatch", "bad keyId", req, msg); } else if (following_check(snac, old_account)) { -- cgit From a55a54d73ddbc461a8f55b0f12342c277ae2b18f Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 13:08:20 +0200 Subject: Improved error archiving. --- activitypub.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 0dfcf84..9e554ce 100644 --- a/activitypub.c +++ b/activitypub.c @@ -2977,8 +2977,9 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_debug(snac, 1, xs_dup("ignored 'Accept' + 'Create'")); } else { - srv_archive_error("accept", "ignored Accept", req, msg); - snac_debug(snac, 1, xs_fmt("ignored 'Accept' for object type '%s'", utype)); + xs_str *e = xs_fmt("ignored 'Accept' for object type '%s'", utype); + srv_archive_error("accept", e, req, msg); + snac_debug(snac, 1, e); } } else @@ -3074,8 +3075,9 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("updated actor %s", actor)); } else { - srv_log(xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id)); - srv_archive_error("update_actor_key_mismatch", "bad keyId", req, msg); + xs_str *e = xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id); + srv_archive_error("update_actor_key_mismatch", e, req, msg); + snac_log(snac, e); } } else @@ -3092,8 +3094,9 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("ignored post 'Update' with no attributedTo %s", id)); else if (strcmp(atto, key_id) != 0) { - snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id)); - srv_archive_error("update_post_key_mismatch", "bad keyId", req, msg); + xs_str *e = xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id); + srv_archive_error("update_post_key_mismatch", e, req, msg); + snac_log(snac, e); } else if (xs_startswith(id, srv_baseurl) && !xs_startswith(id, actor)) @@ -3148,8 +3151,8 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("ignored 'Delete' for object without attributedTo %s", object)); else if (strcmp(atto, key_id) != 0) { + /* don't call srv_archive_error() on this, because it can be a delete from a relay */ snac_log(snac, xs_fmt("Delete: mismatched attributedTo '%s' and key '%s'", atto, key_id)); - srv_archive_error("delete_post_key_mismatch", "bad keyId", req, msg); } else if (xs_startswith(object, srv_baseurl) && !is_msg_mine(snac, object)) @@ -3197,8 +3200,9 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) if (xs_is_string(old_account) && xs_is_string(new_account)) { if (strcmp(old_account, key_id) != 0) { - snac_log(snac, xs_fmt("'Move': mismatched old_account %s and key %s", old_account, key_id)); - srv_archive_error("move_old_account_key_mismatch", "bad keyId", req, msg); + xs_str *e = xs_fmt("'Move': mismatched old_account %s and key %s", old_account, key_id); + srv_archive_error("move_old_account_key_mismatch", e, req, msg); + snac_log(snac, e); } else if (following_check(snac, old_account)) { -- cgit From f54956128afe4c0fae57375e1a6a42ecdcd10d55 Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 14:04:25 +0200 Subject: Minor logging tweak. --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 9e554ce..c3fd7fd 100644 --- a/activitypub.c +++ b/activitypub.c @@ -2979,7 +2979,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else { xs_str *e = xs_fmt("ignored 'Accept' for object type '%s'", utype); srv_archive_error("accept", e, req, msg); - snac_debug(snac, 1, e); + snac_log(snac, e); } } else -- cgit From 778046fa7ab73e64b6a30021f1c81fc72c58bea7 Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 14:46:28 +0200 Subject: On mismatched 'Update' messages, request the objects instead of just failing. --- activitypub.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index c3fd7fd..e9be2de 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3075,9 +3075,11 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("updated actor %s", actor)); } else { - xs_str *e = xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id); - srv_archive_error("update_actor_key_mismatch", e, req, msg); - snac_log(snac, e); + /* actor / key mismatch: don't accept blindly, but request an actor update + from the original source, as the Update may come from a relay and be legit */ + enqueue_actor_refresh(snac, actor, 0); + + snac_log(snac, xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id)); } } else @@ -3094,9 +3096,10 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("ignored post 'Update' with no attributedTo %s", id)); else if (strcmp(atto, key_id) != 0) { - xs_str *e = xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id); - srv_archive_error("update_post_key_mismatch", e, req, msg); - snac_log(snac, e); + /* actor / key mismatch: request the object from the original source */ + enqueue_object_request(snac, id, 0); + + snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id)); } else if (xs_startswith(id, srv_baseurl) && !xs_startswith(id, actor)) -- cgit From ef7b66697f5b3261a451917d2996563a141df68a Mon Sep 17 00:00:00 2001 From: grunfink Date: Wed, 24 Jun 2026 14:54:45 +0200 Subject: Implemented semi-random forward_secs in enqueue_object_request() or enqueue_actor_refresh(). If forward_secs is a negative value in these functions, it's used as the modulo of a hash of the user id. This way, a refresh storm of the same object by all users is somewhat distributed in time. --- activitypub.c | 4 ++-- data.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index e9be2de..514e764 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3077,7 +3077,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else { /* actor / key mismatch: don't accept blindly, but request an actor update from the original source, as the Update may come from a relay and be legit */ - enqueue_actor_refresh(snac, actor, 0); + enqueue_actor_refresh(snac, actor, -10); snac_log(snac, xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id)); } @@ -3097,7 +3097,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else if (strcmp(atto, key_id) != 0) { /* actor / key mismatch: request the object from the original source */ - enqueue_object_request(snac, id, 0); + enqueue_object_request(snac, id, -10); snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id)); } diff --git a/data.c b/data.c index 3f7ba29..9500474 100644 --- a/data.c +++ b/data.c @@ -3858,6 +3858,11 @@ void enqueue_close_question(snac *user, const char *id, int end_secs) void enqueue_object_request(snac *user, const char *id, int forward_secs) /* enqueues the request of an object in the future */ { + if (forward_secs < 0) { + /* set it to a somewhat random delay */ + forward_secs = xs_hash_func(user->uid, strlen(user->uid)) % -forward_secs; + } + xs *qmsg = _new_qmsg("object_request", id, 0); xs *ntid = tid(forward_secs); xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); @@ -3886,6 +3891,11 @@ void enqueue_verify_links(snac *user) void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs) /* enqueues an actor refresh */ { + if (forward_secs < 0) { + /* set it to a somewhat random delay */ + forward_secs = xs_hash_func(user->uid, strlen(user->uid)) % -forward_secs; + } + xs *qmsg = _new_qmsg("actor_refresh", "", 0); xs *ntid = tid(forward_secs); xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); -- cgit