summaryrefslogtreecommitdiff
path: root/activitypub.c
diff options
context:
space:
mode:
Diffstat (limited to 'activitypub.c')
-rw-r--r--activitypub.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/activitypub.c b/activitypub.c
index 4f109cc..55a245e 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -1470,9 +1470,11 @@ int update_question(snac *user, const char *id)
int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
/* processes an ActivityPub message from the input queue */
+/* return values: -1, fatal error; 0, transient error, retry;
+ 1, processed and done; 2, propagate to users (only when no user is set) */
{
- char *actor = xs_dict_get(msg, "actor");
- char *type = xs_dict_get(msg, "type");
+ char *actor = xs_dict_get(msg, "actor");
+ char *type = xs_dict_get(msg, "type");
xs *actor_o = NULL;
int a_status;
int do_notify = 0;
@@ -1500,13 +1502,21 @@ int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
else
utype = "(null)";
+ /* special case for Delete messages */
+ if (strcmp(type, "Delete") == 0) {
+ /* if the actor is not here, do not even try */
+ if (!object_here(actor)) {
+ srv_debug(0, xs_fmt("dropped 'Delete' message from unknown actor '%s'", actor));
+ return -1;
+ }
+ }
+
/* bring the actor */
a_status = actor_request(actor, &actor_o);
/* do not retry permanent failures */
if (a_status == 404 || a_status == 410 || a_status < 0) {
srv_debug(1, xs_fmt("dropping message due to actor error %s %d", actor, a_status));
-
return -1;
}
@@ -1519,7 +1529,6 @@ int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
/* other actor download errors may need a retry */
srv_debug(1, xs_fmt("error requesting actor %s %d -- retry later", actor, a_status));
-
return 0;
}
@@ -1530,13 +1539,12 @@ int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
srv_log(xs_fmt("bad signature %s (%s)", actor, sig_err));
srv_archive_error("check_signature", sig_err, req, msg);
-
return -1;
}
- /* if no user is set, no further checks can be done */
+ /* if no user is set, no further checks can be done; propagate */
if (snac == NULL)
- return 1;
+ return 2;
/* reject messages that are not for this user */
if (!is_msg_for_me(snac, msg)) {