From 1a42fdc8bd4d5dc045a87108e73dcda4f633266b Mon Sep 17 00:00:00 2001 From: grunfink Date: Fri, 24 Oct 2025 05:02:28 +0200 Subject: Keep track of deleted users and return 410 Gone for them. --- activitypub.c | 10 ++++++---- data.c | 29 +++++++++++++++++++++++++++++ html.c | 5 +++-- httpd.c | 3 +++ snac.h | 2 ++ utils.c | 2 ++ 6 files changed, 45 insertions(+), 6 deletions(-) diff --git a/activitypub.c b/activitypub.c index 2d53cbe..0368ac8 100644 --- a/activitypub.c +++ b/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 diff --git a/data.c b/data.c index 36f5101..d291ba7 100644 --- a/data.c +++ b/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) diff --git a/html.c b/html.c index 584059b..2146c93 100644 --- a/html.c +++ b/html.c @@ -3830,8 +3830,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() */ diff --git a/httpd.c b/httpd.c index 254d0e5..a8cd849 100644 --- a/httpd.c +++ b/httpd.c @@ -598,6 +598,9 @@ void httpd_connection(FILE *f) if (status == HTTP_STATUS_NOT_FOUND) body = xs_str_new("

404 Not Found (" USER_AGENT ")

"); + if (status == HTTP_STATUS_GONE) + body = xs_str_new("

410 Gone (" USER_AGENT ")

"); + if (status == HTTP_STATUS_BAD_REQUEST && body != NULL) body = xs_str_new("

400 Bad Request (" USER_AGENT ")

"); diff --git a/snac.h b/snac.h index 038aa40..a160abf 100644 --- a/snac.h +++ b/snac.h @@ -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, diff --git a/utils.c b/utils.c index de6db79..b76c0f8 100644 --- a/utils.c +++ b/utils.c @@ -454,6 +454,8 @@ int deluser(snac *user) } } + grave(user->uid, 1); + rm_rf(user->basedir); return ret; -- cgit v1.2.3 From ef4af726d73f09db8688034edd63f4ba1348485a Mon Sep 17 00:00:00 2001 From: grunfink Date: Fri, 24 Oct 2025 05:12:44 +0200 Subject: Added cast to curl_read_callback functions to mute warnings. --- xs_curl.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xs_curl.h b/xs_curl.h index 2301661..16b022a 100644 --- a/xs_curl.h +++ b/xs_curl.h @@ -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); -- cgit v1.2.3 From f52306f4dba129ab9797fc8596e4b336b2142315 Mon Sep 17 00:00:00 2001 From: grunfink Date: Fri, 24 Oct 2025 05:18:49 +0200 Subject: More fixes to libcurl warnings. --- xs_curl.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/xs_curl.h b/xs_curl.h index 16b022a..feb23e0 100644 --- a/xs_curl.h +++ b/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); -- cgit v1.2.3 From a7d103a4144edb97bef0a2eb4fdcf672174c656f Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 27 Oct 2025 09:40:35 +0100 Subject: Updated RELEASE_NOTES. --- RELEASE_NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index d89bee6..7dfb332 100644 --- a/RELEASE_NOTES.md +++ b/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). -- cgit v1.2.3 From 2a617bc34cdaf66431a1de46565436c62f44fc54 Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 27 Oct 2025 09:41:19 +0100 Subject: Version 2.84 RELEASED. --- snac.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snac.h b/snac.h index a160abf..4c3100a 100644 --- a/snac.h +++ b/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 -- cgit v1.2.3 From bf79252e905f0768e68af9cb87dfe1ed40cb9024 Mon Sep 17 00:00:00 2001 From: zen Date: Tue, 28 Oct 2025 21:28:45 +0100 Subject: po/de_DE.po aktualisiert de_DE update --- po/de_DE.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/po/de_DE.po b/po/de_DE.po index 147f7ac..bb6876c 100644 --- a/po/de_DE.po +++ b/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" -- cgit v1.2.3