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