From fc9ba8f02647035e2d9ebcc29b32c586f90a10fd Mon Sep 17 00:00:00 2001 From: default Date: Tue, 19 Nov 2024 06:59:53 +0100 Subject: More usage of get_in_reply_to(). --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 1cd69a5..f2fa521 100644 --- a/data.c +++ b/data.c @@ -799,7 +799,7 @@ int _object_add(const char *id, const xs_dict *obj, int ow) fclose(f); /* does this object has a parent? */ - const char *in_reply_to = xs_dict_get(obj, "inReplyTo"); + const char *in_reply_to = get_in_reply_to(obj); if (!xs_is_null(in_reply_to) && *in_reply_to) { /* update the children index of the parent */ -- cgit v1.2.3 From 36c3030231ed806c29c182e38cb0957993c835d1 Mon Sep 17 00:00:00 2001 From: default Date: Sat, 23 Nov 2024 17:33:49 +0100 Subject: In user_persist(), only publish the actor to the world if a relevant field has changed. This way, changing user preferences does not trigger an automatic send storm. --- data.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index f2fa521..bbebdb8 100644 --- a/data.c +++ b/data.c @@ -336,6 +336,32 @@ int user_persist(snac *snac, int publish) xs *bfn = xs_fmt("%s.bak", fn); FILE *f; + if (publish) { + /* check if any of the relevant fields have really changed */ + if ((f = fopen(fn, "r")) != NULL) { + xs *old = xs_json_load(f); + fclose(f); + + if (old != NULL) { + int nw = 0; + const char *fields[] = { "header", "avatar", "name", "bio", "metadata", NULL }; + + for (int n = 0; fields[n]; n++) { + const char *of = xs_dict_get(old, fields[n]); + const char *nf = xs_dict_get(snac->config, fields[n]); + + if (xs_type(of) != XSTYPE_STRING || xs_type(nf) != XSTYPE_STRING || strcmp(of, nf)) { + nw = 1; + break; + } + } + + if (!nw) + publish = 0; + } + } + } + rename(fn, bfn); if ((f = fopen(fn, "w")) != NULL) { -- cgit v1.2.3 From 7287776fd1f659619e211ee482ba0d6d64ddbf0b Mon Sep 17 00:00:00 2001 From: default Date: Sun, 24 Nov 2024 08:17:38 +0100 Subject: New function pending_add(). --- data.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index bbebdb8..fa631e1 100644 --- a/data.c +++ b/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) -- cgit v1.2.3 From b91177cb464ffdb118d50569592be3f9789dbef6 Mon Sep 17 00:00:00 2001 From: default Date: Sun, 24 Nov 2024 08:31:01 +0100 Subject: New function pending_get() and pending_list(). --- data.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index fa631e1..79c7001 100644 --- a/data.c +++ b/data.c @@ -1224,6 +1224,44 @@ int pending_add(snac *user, const char *actor, const xs_dict *msg) } +xs_dict *pending_get(snac *user, const char *actor) +/* returns the pending follow confirmation for the actor */ +{ + xs *md5 = xs_md5_hex(actor, strlen(actor)); + xs *fn = xs_fmt("%s/pending/%s.json", user->basedir, md5); + xs_dict *msg = NULL; + FILE *f; + + if ((f = fopen(fn, "r")) != NULL) { + msg = xs_json_load(f); + fclose(f); + } + + return msg; +} + + +xs_list *pending_list(snac *user) +/* returns a list of pending follow confirmations */ +{ + xs *spec = xs_fmt("%s/pending/""*.json", user->basedir); + xs *l = xs_glob(spec, 0, 0); + xs_list *r = xs_list_new(); + const char *v; + + xs_list_foreach(l, v) { + const char *actor = xs_dict_get(v, "actor"); + + if (xs_type(actor) == XSTYPE_STRING) { + xs *md5 = xs_md5_hex(actor, strlen(actor)); + r = xs_list_append(r, md5); + } + } + + return r; +} + + /** timeline **/ double timeline_mtime(snac *snac) -- cgit v1.2.3 From 129049edf4752495f768b247253cb7ffc848b0cc Mon Sep 17 00:00:00 2001 From: default Date: Sun, 24 Nov 2024 08:37:19 +0100 Subject: New function pending_check() and pending_del(). --- data.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 79c7001..8bc35aa 100644 --- a/data.c +++ b/data.c @@ -1224,6 +1224,16 @@ int pending_add(snac *user, const char *actor, const xs_dict *msg) } +int pending_check(snac *user, const char *actor) +/* checks if there is a pending follow confirmation for the actor */ +{ + xs *md5 = xs_md5_hex(actor, strlen(actor)); + xs *fn = xs_fmt("%s/pending/%s.json", user->basedir, md5); + + return mtime(fn) != 0; +} + + xs_dict *pending_get(snac *user, const char *actor) /* returns the pending follow confirmation for the actor */ { @@ -1241,6 +1251,16 @@ xs_dict *pending_get(snac *user, const char *actor) } +void pending_del(snac *user, const char *actor) +/* deletes a pending follow confirmation for the actor */ +{ + xs *md5 = xs_md5_hex(actor, strlen(actor)); + xs *fn = xs_fmt("%s/pending/%s.json", user->basedir, md5); + + unlink(fn); +} + + xs_list *pending_list(snac *user) /* returns a list of pending follow confirmations */ { -- cgit v1.2.3 From 9fb84bcb3aa4c6a8061e4b892dc5bd1826b44715 Mon Sep 17 00:00:00 2001 From: default Date: Sun, 24 Nov 2024 08:54:43 +0100 Subject: The people page shows 'Approve' and 'Discard' buttons for pending follows. --- data.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 8bc35aa..82a1776 100644 --- a/data.c +++ b/data.c @@ -1270,12 +1270,22 @@ xs_list *pending_list(snac *user) const char *v; xs_list_foreach(l, v) { - const char *actor = xs_dict_get(v, "actor"); + FILE *f; + xs *msg = NULL; - if (xs_type(actor) == XSTYPE_STRING) { - xs *md5 = xs_md5_hex(actor, strlen(actor)); - r = xs_list_append(r, md5); - } + if ((f = fopen(v, "r")) == NULL) + continue; + + msg = xs_json_load(f); + fclose(f); + + if (msg == NULL) + continue; + + const char *actor = xs_dict_get(msg, "actor"); + + if (xs_type(actor) == XSTYPE_STRING) + r = xs_list_append(r, actor); } return r; -- cgit v1.2.3 From a2665c3cc9bb94a7969a904bfcd210e20cf038e7 Mon Sep 17 00:00:00 2001 From: default Date: Sun, 24 Nov 2024 09:37:59 +0100 Subject: Minor tweak to user_persist(). --- data.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 82a1776..4e5851a 100644 --- a/data.c +++ b/data.c @@ -350,6 +350,9 @@ int user_persist(snac *snac, int publish) const char *of = xs_dict_get(old, fields[n]); const char *nf = xs_dict_get(snac->config, fields[n]); + if (of == NULL && nf == NULL) + continue; + if (xs_type(of) != XSTYPE_STRING || xs_type(nf) != XSTYPE_STRING || strcmp(of, nf)) { nw = 1; break; -- cgit v1.2.3