Просмотр исходного кода

Merge remote-tracking branch 'orig/master' into feature/lesser-visibility

byte 9 месяцев назад
Родитель
Сommit
8ed4d5bdcb
9 измененных файлов с 61 добавлено и 22 удалено
  1. 1 1
      RELEASE_NOTES.md
  2. 6 4
      activitypub.c
  3. 29 0
      data.c
  4. 3 2
      html.c
  5. 3 0
      httpd.c
  6. 5 5
      po/de_DE.po
  7. 3 1
      snac.h
  8. 2 0
      utils.c
  9. 9 9
      xs_curl.h

+ 1 - 1
RELEASE_NOTES.md

@@ -1,6 +1,6 @@
 # Release Notes
 
-## UNRELEASED
+## 2.84
 
 Implemented more scopes to match other ActivityPub implementations (public, unlisted, followers-only and direct message) (contributed by byte).
 

+ 6 - 4
activitypub.c

@@ -3660,8 +3660,9 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path,
     uid = xs_list_get(l, 1);
     if (!user_open(&snac, uid)) {
         /* invalid user */
-        srv_debug(1, xs_fmt("activitypub_get_handler bad user %s", uid));
-        return HTTP_STATUS_NOT_FOUND;
+        status = grave(uid, 0) ? HTTP_STATUS_GONE : HTTP_STATUS_NOT_FOUND;
+        srv_debug(1, xs_fmt("activitypub_get_handler bad user %s %d", uid, status));
+        return status;
     }
 
     p_path = xs_list_get(l, 2);
@@ -3854,8 +3855,9 @@ int activitypub_post_handler(const xs_dict *req, const char *q_path,
     const char *uid = xs_list_get(l, 1);
     if (!user_open(&snac, uid)) {
         /* invalid user */
-        srv_debug(1, xs_fmt("activitypub_post_handler bad user %s", uid));
-        return HTTP_STATUS_NOT_FOUND;
+        status = grave(uid, 0) ? HTTP_STATUS_GONE : HTTP_STATUS_NOT_FOUND;
+        srv_debug(1, xs_fmt("activitypub_post_handler bad user %s %d", uid, status));
+        return status;
     }
 
     /* if it has a digest, check it now, because

+ 29 - 0
data.c

@@ -3137,6 +3137,35 @@ int instance_failure(const char *url, int op)
 }
 
 
+int grave(const char *objid, int op)
+/* the graveyeard of deleted objects */
+{
+    int ret = 0;
+    xs *dir = xs_fmt("%s/grave", srv_basedir);
+    xs *md5 = xs_md5_hex(objid, strlen(objid));
+    xs *fn  = xs_fmt("%s/%s", dir, md5);
+    FILE *f;
+
+    switch (op) {
+    case 0: /** check **/
+        ret = mtime(fn) > 0.0 ? 1 : 0;
+        break;
+
+    case 1: /** add **/
+        mkdirx(dir);
+
+        if ((f = fopen(fn, "w")) != NULL) {
+            fprintf(f, "%s\n", objid);
+            fclose(f);
+        }
+
+        break;
+    }
+
+    return ret;
+}
+
+
 /** notifications **/
 
 xs_str *notify_check_time(snac *snac, int reset)

+ 3 - 2
html.c

@@ -3822,8 +3822,9 @@ int html_get_handler(const xs_dict *req, const char *q_path,
 
     if (!uid || !user_open(&snac, uid)) {
         /* invalid user */
-        srv_debug(1, xs_fmt("html_get_handler bad user %s", uid));
-        return HTTP_STATUS_NOT_FOUND;
+        status = grave(uid, 0) ? HTTP_STATUS_GONE : HTTP_STATUS_NOT_FOUND;
+        srv_debug(1, xs_fmt("html_get_handler bad user %s %d", uid, status));
+        return status;
     }
 
     user = &snac; /* for L() */

+ 3 - 0
httpd.c

@@ -598,6 +598,9 @@ void httpd_connection(FILE *f)
     if (status == HTTP_STATUS_NOT_FOUND)
         body = xs_str_new("<h1>404 Not Found (" USER_AGENT ")</h1>");
 
+    if (status == HTTP_STATUS_GONE)
+        body = xs_str_new("<h1>410 Gone (" USER_AGENT ")</h1>");
+
     if (status == HTTP_STATUS_BAD_REQUEST && body != NULL)
         body = xs_str_new("<h1>400 Bad Request (" USER_AGENT ")</h1>");
 

+ 5 - 5
po/de_DE.po

@@ -782,20 +782,20 @@ msgstr "en fr es de_DE"
 
 #: html.c:460
 msgid "Visibility: "
-msgstr ""
+msgstr "Sichtbarkeit"
 
 #: html.c:468
 msgid "Public"
-msgstr ""
+msgstr "Öffentlich"
 
 #: html.c:477
 msgid "Unlisted"
-msgstr ""
+msgstr "Ungelistete"
 
 #: html.c:486
 msgid "Followers-only"
-msgstr ""
+msgstr "Nur Follower"
 
 #: html.c:495
 msgid "Direct Message"
-msgstr ""
+msgstr "Direktnachricht"

+ 3 - 1
snac.h

@@ -1,7 +1,7 @@
 /* snac - A simple, minimalistic ActivityPub instance */
 /* copyright (c) 2022 - 2025 grunfink et al. / MIT license */
 
-#define VERSION "2.84-dev"
+#define VERSION "2.84"
 
 #define USER_AGENT "snac/" VERSION
 
@@ -288,6 +288,8 @@ xs_list *content_search(snac *user, const char *regex,
 int actor_failure(const char *actor, int op);
 int instance_failure(const char *url, int op);
 
+int grave(const char *objid, int op);
+
 void enqueue_input(snac *snac, const xs_dict *msg, const xs_dict *req, int retries);
 void enqueue_shared_input(const xs_dict *msg, const xs_dict *req, int retries);
 void enqueue_output_raw(const char *keyid, const char *seckey,

+ 2 - 0
utils.c

@@ -454,6 +454,8 @@ int deluser(snac *user)
         }
     }
 
+    grave(user->uid, 1);
+
     rm_rf(user->basedir);
 
     return ret;

+ 9 - 9
xs_curl.h

@@ -54,10 +54,10 @@ struct _payload_data {
     int offset;
 };
 
-static int _data_callback(void *buffer, size_t size,
+static size_t _data_callback(void *buffer, size_t size,
                           size_t nitems, struct _payload_data *pd)
 {
-    int sz = size * nitems;
+    size_t sz = size * nitems;
 
     /* open space */
     pd->size += sz;
@@ -71,14 +71,14 @@ static int _data_callback(void *buffer, size_t size,
 }
 
 
-static int _post_callback(char *buffer, size_t size,
+static size_t _post_callback(char *buffer, size_t size,
                           size_t nitems, struct _payload_data *pd)
 {
     /* size of data left */
-    int sz = pd->size - pd->offset;
+    size_t sz = pd->size - pd->offset;
 
     /* if it's still bigger than the provided space, trim */
-    if (sz > (int) (size * nitems))
+    if (sz > (size_t) (size * nitems))
         sz = size * nitems;
 
     memcpy(buffer, pd->data + pd->offset, sz);
@@ -125,11 +125,11 @@ xs_dict *xs_http_request(const char *method, const char *url,
 
     /* store response headers here */
     curl_easy_setopt(curl, CURLOPT_HEADERDATA,     &response);
-    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, _header_callback);
+    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, (curl_read_callback) _header_callback);
 
     struct _payload_data ipd = { NULL, 0, 0 };
     curl_easy_setopt(curl, CURLOPT_WRITEDATA,      &ipd);
-    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,  _data_callback);
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (curl_read_callback) _data_callback);
 
     if (strcmp(method, "POST") == 0 || strcmp(method, "PUT") == 0) {
         CURLoption curl_method = method[1] == 'O' ? CURLOPT_POST : CURLOPT_UPLOAD;
@@ -147,7 +147,7 @@ xs_dict *xs_http_request(const char *method, const char *url,
             pd.offset = 0;
 
             curl_easy_setopt(curl, CURLOPT_READDATA,     &pd);
-            curl_easy_setopt(curl, CURLOPT_READFUNCTION, _post_callback);
+            curl_easy_setopt(curl, CURLOPT_READFUNCTION, (curl_read_callback) _post_callback);
         }
     }
 
@@ -232,7 +232,7 @@ int xs_smtp_request(const char *url, const char *user, const char *pass,
     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt);
 
     curl_easy_setopt(curl, CURLOPT_READDATA, &pd);
-    curl_easy_setopt(curl, CURLOPT_READFUNCTION, _post_callback);
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, (curl_read_callback) _post_callback);
     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
 
     res = curl_easy_perform(curl);