Kaynağa Gözat

New function pending_add().

default 4 ay önce
ebeveyn
işleme
7287776fd1
3 değiştirilmiş dosya ile 44 ekleme ve 11 silme
  1. 20 11
      activitypub.c
  2. 22 0
      data.c
  3. 2 0
      snac.h

+ 20 - 11
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

+ 22 - 0
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)

+ 2 - 0
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);