From 049818a9042ce1da23e6fe3c41f776b1470e7cc4 Mon Sep 17 00:00:00 2001 From: default Date: Sat, 29 Apr 2023 07:36:18 +0200 Subject: Public posts are also added to an instance public timeline index. --- data.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index c2d29c1..db42ece 100644 --- a/data.c +++ b/data.c @@ -969,8 +969,13 @@ void timeline_update_indexes(snac *snac, const char *id) if (valid_status(object_get(id, &msg))) { /* if its ours and is public, also store in public */ - if (is_msg_public(snac, msg)) + if (is_msg_public(snac, msg)) { object_user_cache_add(snac, id, "public"); + + /* also add it to the instance public timeline */ + xs *ipt = xs_fmt("%s/public.idx", srv_basedir); + index_add(ipt, id); + } } } } -- cgit v1.2.3 From ede4d6f2dc8f862337724054dcfeb31cbaa89bcc Mon Sep 17 00:00:00 2001 From: default Date: Sun, 30 Apr 2023 06:39:55 +0200 Subject: Some instance timeline work. --- data.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index db42ece..60c4b26 100644 --- a/data.c +++ b/data.c @@ -1046,7 +1046,7 @@ xs_list *timeline_top_level(snac *snac, xs_list *list) } -d_char *timeline_simple_list(snac *snac, const char *idx_name, int skip, int show) +xs_list *timeline_simple_list(snac *snac, const char *idx_name, int skip, int show) /* returns a timeline (with all entries) */ { int c_max; @@ -1064,7 +1064,7 @@ d_char *timeline_simple_list(snac *snac, const char *idx_name, int skip, int sho } -d_char *timeline_list(snac *snac, const char *idx_name, int skip, int show) +xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show) /* returns a timeline (only top level entries) */ { xs *list = timeline_simple_list(snac, idx_name, skip, show); @@ -1073,6 +1073,15 @@ d_char *timeline_list(snac *snac, const char *idx_name, int skip, int show) } +xs_list *timeline_instance_list(int skip, int show) +/* returns the timeline for the full instance */ +{ + xs *idx = xs_fmt("%s/public.idx", srv_basedir); + + return index_list_desc(idx, skip, show); +} + + /** following **/ /* this needs special treatment and cannot use the object db as is, -- cgit v1.2.3 From e31c4810a83c42c0298d4832fb4f2291dec0e84d Mon Sep 17 00:00:00 2001 From: default Date: Sun, 30 Apr 2023 06:49:51 +0200 Subject: actor_get() returns an actor message for local users. --- data.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 60c4b26..187d9b9 100644 --- a/data.c +++ b/data.c @@ -1287,27 +1287,43 @@ int is_hidden(snac *snac, const char *id) } -int actor_add(snac *snac, const char *actor, d_char *msg) +int actor_add(snac *snac, const char *actor, xs_dict *msg) /* adds an actor */ { return object_add_ow(actor, msg); } -int actor_get(snac *snac, const char *actor, d_char **data) +int actor_get(snac *snac1, const char *actor, xs_dict **data) /* returns an already downloaded actor */ { int status = 200; - d_char *d; + xs_dict *d; - if (strcmp(actor, snac->actor) == 0) { + if (strcmp(actor, snac1->actor) == 0) { /* this actor */ if (data) - *data = msg_actor(snac); + *data = msg_actor(snac1); return status; } + if (xs_startswith(actor, srv_baseurl)) { + /* it's a (possible) local user */ + xs *l = xs_split(actor, "/"); + const char *uid = xs_list_get(l, -1); + snac user; + + if (!xs_is_null(uid) && user_open(&user, uid)) { + if (data) + *data = msg_actor(&user); + + user_free(&user); + } + else + return 404; + } + /* read the object */ if (!valid_status(status = object_get(actor, &d))) return status; -- cgit v1.2.3 From 21a2a01937211543216add23a8a4eaca20bf5f67 Mon Sep 17 00:00:00 2001 From: default Date: Sun, 30 Apr 2023 07:37:39 +0200 Subject: Return immediately from actor_get() if it's a local user. --- data.c | 1 + 1 file changed, 1 insertion(+) (limited to 'data.c') diff --git a/data.c b/data.c index 187d9b9..ee36103 100644 --- a/data.c +++ b/data.c @@ -1319,6 +1319,7 @@ int actor_get(snac *snac1, const char *actor, xs_dict **data) *data = msg_actor(&user); user_free(&user); + return 200; } else return 404; -- cgit v1.2.3 From 84902d8dcca0ff06e55698432cca69e542be685f Mon Sep 17 00:00:00 2001 From: default Date: Mon, 1 May 2023 08:32:48 +0200 Subject: Purge / gc the instance timeline index. --- data.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index ee36103..50d88eb 100644 --- a/data.c +++ b/data.c @@ -2051,7 +2051,11 @@ void purge_server(void) xs *ib_dir = xs_fmt("%s/inbox", srv_basedir); _purge_dir(ib_dir, 7); - srv_debug(1, xs_fmt("purge: global (obj: %d, idx: %d)", cnt, icnt)); + /* purge the instance timeline */ + xs *itl_fn = xs_fmt("%s/public.idx", srv_basedir); + int itl_gc = index_gc(itl_fn); + + srv_debug(1, xs_fmt("purge: global (obj: %d, idx: %d, itl: %d)", cnt, icnt, itl_gc)); } -- cgit v1.2.3 From c21bbd5f7ca814d65a3759d429c1d673bee5081b Mon Sep 17 00:00:00 2001 From: default Date: Mon, 1 May 2023 17:02:44 +0200 Subject: New functions index_del_md5(), index_del() and object_unadmire(). --- data.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 50d88eb..e038f81 100644 --- a/data.c +++ b/data.c @@ -328,6 +328,51 @@ int index_add(const char *fn, const char *id) } +int index_del_md5(const char *fn, const char *md5) +/* deletes an md5 from an index */ +{ + int status = 404; + FILE *f; + + pthread_mutex_lock(&data_mutex); + + if ((f = fopen(fn, "r+")) != NULL) { + char line[256]; + + while (fgets(line, sizeof(line), f) != NULL) { + line[32] = '\0'; + + if (strcmp(line, md5) == 0) { + /* found! just rewind, overwrite it with garbage + and an eventual call to index_gc() will clean it + [yes: this breaks index_len()] */ + fseek(f, -33, SEEK_CUR); + fwrite("-", 1, 1, f); + status = 200; + + break; + } + } + + fclose(f); + } + else + status = 500; + + pthread_mutex_unlock(&data_mutex); + + return status; +} + + +int index_del(const char *fn, const char *id) +/* deletes an id from an index */ +{ + xs *md5 = xs_md5_hex(id, strlen(id)); + return index_del_md5(fn, md5); +} + + int index_gc(const char *fn) /* garbage-collects an index, deleting objects that are not here */ { @@ -772,6 +817,23 @@ int object_admire(const char *id, const char *actor, int like) } +int object_unadmire(const char *id, const char *actor, int like) +/* actor no longer likes or announces this object */ +{ + int status; + xs *fn = _object_fn(id); + + fn = xs_replace_i(fn, ".json", like ? "_l.idx" : "_a.idx"); + + status = index_del(fn, actor); + + srv_debug(1, + xs_fmt("object_unadmire (%s) %s %s %d", like ? "Like" : "Announce", actor, fn, status)); + + return status; +} + + int _object_user_cache(snac *snac, const char *id, const char *cachedir, int del) /* adds or deletes from a user cache */ { -- cgit v1.2.3 From 4595a3685992a8f31b86cca0ecf10e286dec52eb Mon Sep 17 00:00:00 2001 From: default Date: Mon, 1 May 2023 17:20:49 +0200 Subject: Partial support for mastoapi unfavourite / unreblog. --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index e038f81..67f5751 100644 --- a/data.c +++ b/data.c @@ -827,7 +827,7 @@ int object_unadmire(const char *id, const char *actor, int like) status = index_del(fn, actor); - srv_debug(1, + srv_debug(0, xs_fmt("object_unadmire (%s) %s %s %d", like ? "Like" : "Announce", actor, fn, status)); return status; -- cgit v1.2.3 From cf2b334d86e8b4ccd0525fbb741fbbaf86a2c618 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 3 May 2023 08:15:38 +0200 Subject: Ensure no actor data is left in actor_get(). --- data.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 67f5751..edeb676 100644 --- a/data.c +++ b/data.c @@ -1360,7 +1360,7 @@ int actor_get(snac *snac1, const char *actor, xs_dict **data) /* returns an already downloaded actor */ { int status = 200; - xs_dict *d; + xs_dict *d = NULL; if (strcmp(actor, snac1->actor) == 0) { /* this actor */ @@ -1388,8 +1388,10 @@ int actor_get(snac *snac1, const char *actor, xs_dict **data) } /* read the object */ - if (!valid_status(status = object_get(actor, &d))) + if (!valid_status(status = object_get(actor, &d))) { + d = xs_free(d); return status; + } if (data) *data = d; -- cgit v1.2.3 From 511f5062b7df26c47409c88649f24d68bbd43ccb Mon Sep 17 00:00:00 2001 From: default Date: Thu, 4 May 2023 09:19:26 +0200 Subject: Deleted real unused parameters. --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index edeb676..f03fd71 100644 --- a/data.c +++ b/data.c @@ -1349,7 +1349,7 @@ int is_hidden(snac *snac, const char *id) } -int actor_add(snac *snac, const char *actor, xs_dict *msg) +int actor_add(const char *actor, xs_dict *msg) /* adds an actor */ { return object_add_ow(actor, msg); -- cgit v1.2.3 From 753eadfd1775545c5bfb4110ad2ba7cb61df9588 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 4 May 2023 09:25:09 +0200 Subject: Added some const here and there. --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index f03fd71..72b63f8 100644 --- a/data.c +++ b/data.c @@ -1814,7 +1814,7 @@ static xs_dict *_new_qmsg(const char *type, const xs_val *msg, int retries) } -void enqueue_input(snac *snac, xs_dict *msg, xs_dict *req, int retries) +void enqueue_input(snac *snac, const xs_dict *msg, const xs_dict *req, int retries) /* enqueues an input message */ { xs *qmsg = _new_qmsg("input", msg, retries); -- cgit v1.2.3