summaryrefslogtreecommitdiff
path: root/activitypub.c
diff options
context:
space:
mode:
authordefault <nobody@localhost>2023-03-06 14:28:53 +0100
committerdefault <nobody@localhost>2023-03-06 14:28:53 +0100
commite3e45b7c98ecae9b5e0b1d417b29fda073505134 (patch)
treed070cc62b7a6f524980e80afc7c04fce38cd5031 /activitypub.c
parent1152450d1c1f742a20d6db2d3fce3169ff80a8a1 (diff)
New function is_msg_for_me().
Diffstat (limited to 'activitypub.c')
-rw-r--r--activitypub.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/activitypub.c b/activitypub.c
index e5713fa..ee790c7 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -289,6 +289,34 @@ int is_msg_public(snac *snac, xs_dict *msg)
}
+int is_msg_for_me(snac *snac, xs_dict *msg)
+/* checks if this message is for me */
+{
+ int ret = 1;
+ char *type = xs_dict_get(msg, "type");
+
+ if (!xs_is_null(type) && strcmp(type, "Note") == 0) {
+ xs *rcpts = recipient_list(snac, msg, 0);
+ xs_list *p = rcpts;
+ xs_str *v;
+
+ while(xs_list_iter(&p, &v)) {
+ /* explicitly for me? we're done */
+ if (strcmp(v, snac->actor) == 0)
+ goto done;
+ }
+
+ /* if we're not following this fellow, then the answer is NO */
+ char *atto = xs_dict_get(msg, "attributedTo");
+ if (xs_is_null(atto) || !following_check(snac, atto))
+ ret = 0;
+ }
+
+done:
+ return ret;
+}
+
+
void process_tags(snac *snac, const char *content, d_char **n_content, d_char **tag)
/* parses mentions and tags from content */
{
@@ -874,7 +902,7 @@ void notify(snac *snac, xs_str *type, xs_str *utype, xs_str *actor, xs_dict *msg
/** queues **/
-int process_input_message(snac *snac, char *msg, char *req)
+int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
/* processes an ActivityPub message from the input queue */
{
/* actor and type exist, were checked previously */
@@ -892,6 +920,11 @@ int process_input_message(snac *snac, char *msg, char *req)
else
utype = "(null)";
+ /* reject messages that are not for this user */
+ if (!is_msg_for_me(snac, msg)) {
+ snac_debug(snac, 0, xs_fmt("message from %s not for us", actor));
+ }
+
/* bring the actor */
a_status = actor_request(snac, actor, &actor_o);