commit 8ed4d5b

byte  ·  2025-10-31 23:48:33 +0000 UTC
parents a4a1990, 074072b
Merge remote-tracking branch 'orig/master' into feature/lesser-visibility
9 files changed,  +61, -22
M data.c
M html.c
M snac.h
+1, -1
1@@ -1,6 +1,6 @@
2 # Release Notes
3 
4-## UNRELEASED
5+## 2.84
6 
7 Implemented more scopes to match other ActivityPub implementations (public, unlisted, followers-only and direct message) (contributed by byte).
8 
+6, -4
 1@@ -3660,8 +3660,9 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path,
 2     uid = xs_list_get(l, 1);
 3     if (!user_open(&snac, uid)) {
 4         /* invalid user */
 5-        srv_debug(1, xs_fmt("activitypub_get_handler bad user %s", uid));
 6-        return HTTP_STATUS_NOT_FOUND;
 7+        status = grave(uid, 0) ? HTTP_STATUS_GONE : HTTP_STATUS_NOT_FOUND;
 8+        srv_debug(1, xs_fmt("activitypub_get_handler bad user %s %d", uid, status));
 9+        return status;
10     }
11 
12     p_path = xs_list_get(l, 2);
13@@ -3854,8 +3855,9 @@ int activitypub_post_handler(const xs_dict *req, const char *q_path,
14     const char *uid = xs_list_get(l, 1);
15     if (!user_open(&snac, uid)) {
16         /* invalid user */
17-        srv_debug(1, xs_fmt("activitypub_post_handler bad user %s", uid));
18-        return HTTP_STATUS_NOT_FOUND;
19+        status = grave(uid, 0) ? HTTP_STATUS_GONE : HTTP_STATUS_NOT_FOUND;
20+        srv_debug(1, xs_fmt("activitypub_post_handler bad user %s %d", uid, status));
21+        return status;
22     }
23 
24     /* if it has a digest, check it now, because
M data.c
+29, -0
 1@@ -3137,6 +3137,35 @@ int instance_failure(const char *url, int op)
 2 }
 3 
 4 
 5+int grave(const char *objid, int op)
 6+/* the graveyeard of deleted objects */
 7+{
 8+    int ret = 0;
 9+    xs *dir = xs_fmt("%s/grave", srv_basedir);
10+    xs *md5 = xs_md5_hex(objid, strlen(objid));
11+    xs *fn  = xs_fmt("%s/%s", dir, md5);
12+    FILE *f;
13+
14+    switch (op) {
15+    case 0: /** check **/
16+        ret = mtime(fn) > 0.0 ? 1 : 0;
17+        break;
18+
19+    case 1: /** add **/
20+        mkdirx(dir);
21+
22+        if ((f = fopen(fn, "w")) != NULL) {
23+            fprintf(f, "%s\n", objid);
24+            fclose(f);
25+        }
26+
27+        break;
28+    }
29+
30+    return ret;
31+}
32+
33+
34 /** notifications **/
35 
36 xs_str *notify_check_time(snac *snac, int reset)
M html.c
+3, -2
 1@@ -3822,8 +3822,9 @@ int html_get_handler(const xs_dict *req, const char *q_path,
 2 
 3     if (!uid || !user_open(&snac, uid)) {
 4         /* invalid user */
 5-        srv_debug(1, xs_fmt("html_get_handler bad user %s", uid));
 6-        return HTTP_STATUS_NOT_FOUND;
 7+        status = grave(uid, 0) ? HTTP_STATUS_GONE : HTTP_STATUS_NOT_FOUND;
 8+        srv_debug(1, xs_fmt("html_get_handler bad user %s %d", uid, status));
 9+        return status;
10     }
11 
12     user = &snac; /* for L() */
+3, -0
 1@@ -598,6 +598,9 @@ void httpd_connection(FILE *f)
 2     if (status == HTTP_STATUS_NOT_FOUND)
 3         body = xs_str_new("<h1>404 Not Found (" USER_AGENT ")</h1>");
 4 
 5+    if (status == HTTP_STATUS_GONE)
 6+        body = xs_str_new("<h1>410 Gone (" USER_AGENT ")</h1>");
 7+
 8     if (status == HTTP_STATUS_BAD_REQUEST && body != NULL)
 9         body = xs_str_new("<h1>400 Bad Request (" USER_AGENT ")</h1>");
10 
+5, -5
 1@@ -782,20 +782,20 @@ msgstr "en fr es de_DE"
 2 
 3 #: html.c:460
 4 msgid "Visibility: "
 5-msgstr ""
 6+msgstr "Sichtbarkeit"
 7 
 8 #: html.c:468
 9 msgid "Public"
10-msgstr ""
11+msgstr "Öffentlich"
12 
13 #: html.c:477
14 msgid "Unlisted"
15-msgstr ""
16+msgstr "Ungelistete"
17 
18 #: html.c:486
19 msgid "Followers-only"
20-msgstr ""
21+msgstr "Nur Follower"
22 
23 #: html.c:495
24 msgid "Direct Message"
25-msgstr ""
26+msgstr "Direktnachricht"
M snac.h
+3, -1
 1@@ -1,7 +1,7 @@
 2 /* snac - A simple, minimalistic ActivityPub instance */
 3 /* copyright (c) 2022 - 2025 grunfink et al. / MIT license */
 4 
 5-#define VERSION "2.84-dev"
 6+#define VERSION "2.84"
 7 
 8 #define USER_AGENT "snac/" VERSION
 9 
10@@ -288,6 +288,8 @@ xs_list *content_search(snac *user, const char *regex,
11 int actor_failure(const char *actor, int op);
12 int instance_failure(const char *url, int op);
13 
14+int grave(const char *objid, int op);
15+
16 void enqueue_input(snac *snac, const xs_dict *msg, const xs_dict *req, int retries);
17 void enqueue_shared_input(const xs_dict *msg, const xs_dict *req, int retries);
18 void enqueue_output_raw(const char *keyid, const char *seckey,
+2, -0
1@@ -454,6 +454,8 @@ int deluser(snac *user)
2         }
3     }
4 
5+    grave(user->uid, 1);
6+
7     rm_rf(user->basedir);
8 
9     return ret;
+9, -9
 1@@ -54,10 +54,10 @@ struct _payload_data {
 2     int offset;
 3 };
 4 
 5-static int _data_callback(void *buffer, size_t size,
 6+static size_t _data_callback(void *buffer, size_t size,
 7                           size_t nitems, struct _payload_data *pd)
 8 {
 9-    int sz = size * nitems;
10+    size_t sz = size * nitems;
11 
12     /* open space */
13     pd->size += sz;
14@@ -71,14 +71,14 @@ static int _data_callback(void *buffer, size_t size,
15 }
16 
17 
18-static int _post_callback(char *buffer, size_t size,
19+static size_t _post_callback(char *buffer, size_t size,
20                           size_t nitems, struct _payload_data *pd)
21 {
22     /* size of data left */
23-    int sz = pd->size - pd->offset;
24+    size_t sz = pd->size - pd->offset;
25 
26     /* if it's still bigger than the provided space, trim */
27-    if (sz > (int) (size * nitems))
28+    if (sz > (size_t) (size * nitems))
29         sz = size * nitems;
30 
31     memcpy(buffer, pd->data + pd->offset, sz);
32@@ -125,11 +125,11 @@ xs_dict *xs_http_request(const char *method, const char *url,
33 
34     /* store response headers here */
35     curl_easy_setopt(curl, CURLOPT_HEADERDATA,     &response);
36-    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, _header_callback);
37+    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, (curl_read_callback) _header_callback);
38 
39     struct _payload_data ipd = { NULL, 0, 0 };
40     curl_easy_setopt(curl, CURLOPT_WRITEDATA,      &ipd);
41-    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,  _data_callback);
42+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (curl_read_callback) _data_callback);
43 
44     if (strcmp(method, "POST") == 0 || strcmp(method, "PUT") == 0) {
45         CURLoption curl_method = method[1] == 'O' ? CURLOPT_POST : CURLOPT_UPLOAD;
46@@ -147,7 +147,7 @@ xs_dict *xs_http_request(const char *method, const char *url,
47             pd.offset = 0;
48 
49             curl_easy_setopt(curl, CURLOPT_READDATA,     &pd);
50-            curl_easy_setopt(curl, CURLOPT_READFUNCTION, _post_callback);
51+            curl_easy_setopt(curl, CURLOPT_READFUNCTION, (curl_read_callback) _post_callback);
52         }
53     }
54 
55@@ -232,7 +232,7 @@ int xs_smtp_request(const char *url, const char *user, const char *pass,
56     curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt);
57 
58     curl_easy_setopt(curl, CURLOPT_READDATA, &pd);
59-    curl_easy_setopt(curl, CURLOPT_READFUNCTION, _post_callback);
60+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, (curl_read_callback) _post_callback);
61     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
62 
63     res = curl_easy_perform(curl);