aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefault <nobody@localhost>2024-11-24 08:17:38 +0100
committerdefault <nobody@localhost>2024-11-24 08:17:38 +0100
commit7287776fd1f659619e211ee482ba0d6d64ddbf0b (patch)
tree26d4c501947a86d294080730db38ee052ce658d3
parent35b35ec3afff47be872004448e6ba81a6a339131 (diff)
New function pending_add().
-rw-r--r--activitypub.c31
-rw-r--r--data.c22
-rw-r--r--snac.h2
3 files changed, 44 insertions, 11 deletions
diff --git a/activitypub.c b/activitypub.c
index 649b1f2..3ab093f 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -1927,22 +1927,31 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
object_add(actor, actor_obj);
}
- xs *f_msg = xs_dup(msg);
- xs *reply = msg_accept(snac, f_msg, actor);
+ if (xs_is_true(xs_dict_get(snac->config, "approve_followers"))) {
+ pending_add(snac, actor, msg);
- post_message(snac, actor, reply);
-
- if (xs_is_null(xs_dict_get(f_msg, "published"))) {
- /* add a date if it doesn't include one (Mastodon) */
- xs *date = xs_str_utctime(0, ISO_DATE_SPEC);
- f_msg = xs_dict_set(f_msg, "published", date);
+ snac_log(snac, xs_fmt("new pending follower approval %s", actor));
}
+ else {
+ /* automatic following */
+ xs *f_msg = xs_dup(msg);
+ xs *reply = msg_accept(snac, f_msg, actor);
- timeline_add(snac, id, f_msg);
+ post_message(snac, actor, reply);
+
+ if (xs_is_null(xs_dict_get(f_msg, "published"))) {
+ /* add a date if it doesn't include one (Mastodon) */
+ xs *date = xs_str_utctime(0, ISO_DATE_SPEC);
+ f_msg = xs_dict_set(f_msg, "published", date);
+ }
- follower_add(snac, actor);
+ timeline_add(snac, id, f_msg);
+
+ follower_add(snac, actor);
+
+ snac_log(snac, xs_fmt("new follower %s", actor));
+ }
- snac_log(snac, xs_fmt("new follower %s", actor));
do_notify = 1;
}
else
diff --git a/data.c b/data.c
index bbebdb8..fa631e1 100644
--- a/data.c
+++ b/data.c
@@ -1202,6 +1202,28 @@ xs_list *follower_list(snac *snac)
}
+/** pending followers **/
+
+int pending_add(snac *user, const char *actor, const xs_dict *msg)
+/* stores the follow message for later confirmation */
+{
+ xs *dir = xs_fmt("%s/pending", user->basedir);
+ xs *md5 = xs_md5_hex(actor, strlen(actor));
+ xs *fn = xs_fmt("%s/%s.json", dir, md5);
+ FILE *f;
+
+ mkdirx(dir);
+
+ if ((f = fopen(fn, "w")) == NULL)
+ return -1;
+
+ xs_json_dump(msg, 4, f);
+ fclose(f);
+
+ return 0;
+}
+
+
/** timeline **/
double timeline_mtime(snac *snac)
diff --git a/snac.h b/snac.h
index 0d62eb2..bcddab4 100644
--- a/snac.h
+++ b/snac.h
@@ -141,6 +141,8 @@ int follower_del(snac *snac, const char *actor);
int follower_check(snac *snac, const char *actor);
xs_list *follower_list(snac *snac);
+int pending_add(snac *user, const char *actor, const xs_dict *msg);
+
double timeline_mtime(snac *snac);
int timeline_touch(snac *snac);
int timeline_here(snac *snac, const char *md5);