From 7312f4ce51100d4ed98988cb3af0ab06e4fba53c Mon Sep 17 00:00:00 2001 From: iwojim0 Date: Sat, 9 Mar 2024 14:37:54 +0000 Subject: Ability to federate with hidden networks #93 (update for v2.49) --- data.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 4d9824a..f4cd6d6 100644 --- a/data.c +++ b/data.c @@ -67,7 +67,7 @@ int srv_open(char *basedir, int auto_upgrade) if (host == NULL || prefix == NULL) error = xs_str_new("ERROR: cannot get server data"); else { - srv_baseurl = xs_fmt("https://%s%s", host, prefix); + srv_baseurl = xs_fmt("http://%s%s", host, prefix); dbglevel = (int) xs_number_get(dbglvl); @@ -1944,7 +1944,8 @@ xs_list *inbox_list(void) xs_str *_instance_block_fn(const char *instance) { - xs *s1 = xs_replace(instance, "https:/" "/", ""); + xs *s = xs_replace(instance, "http:/" "/", ""); + xs *s1 = xs_replace(s, "https:/" "/", ""); xs *l = xs_split(s1, "/"); char *p = xs_list_get(l, 0); xs *md5 = xs_md5_hex(p, strlen(p)); -- cgit v1.2.3 From 46f2e324d8df49af914ba5781f13337dea7dd6aa Mon Sep 17 00:00:00 2001 From: default Date: Thu, 11 Apr 2024 19:29:30 +0200 Subject: Undo for Likes and Announces are no longer dropped. --- data.c | 1 + 1 file changed, 1 insertion(+) (limited to 'data.c') diff --git a/data.c b/data.c index 7dd7d19..5cf62e7 100644 --- a/data.c +++ b/data.c @@ -916,6 +916,7 @@ int object_unadmire(const char *id, const char *actor, int like) fn = xs_replace_i(fn, ".json", like ? "_l.idx" : "_a.idx"); status = index_del(fn, actor); + index_gc(fn); srv_debug(0, xs_fmt("object_unadmire (%s) %s %s %d", like ? "Like" : "Announce", actor, fn, status)); -- cgit v1.2.3 From e362dfc3563c2564b550a3274f7bf5c7ad9e92f8 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 11 Apr 2024 19:39:45 +0200 Subject: Also purge like and announce index backups. --- data.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 5cf62e7..c55f70f 100644 --- a/data.c +++ b/data.c @@ -2744,6 +2744,16 @@ void purge_server(void) } } } + + /* delete index backups */ + xs *specb = xs_fmt("%s/" "*.bak", v); + xs *bakfs = xs_glob(specb, 0, 0); + + p2 = bakfs; + while (xs_list_iter(&p2, &v2)) { + unlink(v2); + srv_debug(1, xs_fmt("purged %s", v2)); + } } } -- cgit v1.2.3 From a7bd9b63e4992018cade7c5c388bf30878389274 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 11 Apr 2024 19:55:45 +0200 Subject: In object_unadmire(), don't call index_gc() if index_del() did nothing. --- data.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index c55f70f..688813f 100644 --- a/data.c +++ b/data.c @@ -916,7 +916,9 @@ int object_unadmire(const char *id, const char *actor, int like) fn = xs_replace_i(fn, ".json", like ? "_l.idx" : "_a.idx"); status = index_del(fn, actor); - index_gc(fn); + + if (valid_status(status)) + index_gc(fn); srv_debug(0, xs_fmt("object_unadmire (%s) %s %s %d", like ? "Like" : "Announce", actor, fn, status)); -- cgit v1.2.3 From dba063066025d8feed0e18dde91037c9bb503d53 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 12 Apr 2024 05:28:34 +0200 Subject: Commented out received unboosts (see code for an explanation). --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 688813f..b6aa9cf 100644 --- a/data.c +++ b/data.c @@ -406,7 +406,7 @@ int index_del_md5(const char *fn, const char *md5) fclose(f); } else - status = 500; + status = 410; pthread_mutex_unlock(&data_mutex); -- cgit v1.2.3 From 26840e0dc0e7322b2041c21b4e44ed9a34afff4b Mon Sep 17 00:00:00 2001 From: default Date: Thu, 18 Apr 2024 17:13:31 +0200 Subject: Some tweaks to previous patch. --- data.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index d3045f4..1e46395 100644 --- a/data.c +++ b/data.c @@ -60,15 +60,17 @@ int srv_open(char *basedir, int auto_upgrade) char *host; char *prefix; char *dbglvl; + char *proto; host = xs_dict_get(srv_config, "host"); prefix = xs_dict_get(srv_config, "prefix"); dbglvl = xs_dict_get(srv_config, "dbglevel"); + proto = xs_dict_get_def(srv_config, "protocol", "https"); if (host == NULL || prefix == NULL) error = xs_str_new("ERROR: cannot get server data"); else { - srv_baseurl = xs_fmt("http://%s%s", host, prefix); + srv_baseurl = xs_fmt("%s:/" "/%s%s", proto, host, prefix); dbglevel = (int) xs_number_get(dbglvl); @@ -1990,7 +1992,7 @@ xs_list *inbox_list(void) xs_str *_instance_block_fn(const char *instance) { - xs *s = xs_replace(instance, "http:/" "/", ""); + xs *s = xs_replace(instance, "http:/" "/", ""); xs *s1 = xs_replace(s, "https:/" "/", ""); xs *l = xs_split(s1, "/"); char *p = xs_list_get(l, 0); -- cgit v1.2.3 From ebf6a4bd8e97e434d1502ddead4690aca3dd6d33 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 22 Apr 2024 05:46:56 +0200 Subject: URLs like {srv_baseurl}/{user}/admin/p/{md5} are valid. But only if {md5} is in the user's timeline. --- data.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 1e46395..2fb00eb 100644 --- a/data.c +++ b/data.c @@ -1065,14 +1065,18 @@ int timeline_touch(snac *snac) xs_str *timeline_fn_by_md5(snac *snac, const char *md5) /* get the filename of an entry by md5 from any timeline */ { - xs_str *fn = xs_fmt("%s/private/%s.json", snac->basedir, md5); + xs_str *fn = NULL; - if (mtime(fn) == 0.0) { - fn = xs_free(fn); - fn = xs_fmt("%s/public/%s.json", snac->basedir, md5); + if (xs_is_hex(md5) && strlen(md5) == 32) { + fn = xs_fmt("%s/private/%s.json", snac->basedir, md5); - if (mtime(fn) == 0.0) + if (mtime(fn) == 0.0) { fn = xs_free(fn); + fn = xs_fmt("%s/public/%s.json", snac->basedir, md5); + + if (mtime(fn) == 0.0) + fn = xs_free(fn); + } } return fn; -- cgit v1.2.3 From 8275a5f4d8764ebc9f9f82a4db377bacfa9fbc75 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 29 Apr 2024 07:43:01 +0200 Subject: Start of list support. --- data.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 2fb00eb..ab597e7 100644 --- a/data.c +++ b/data.c @@ -1729,6 +1729,68 @@ xs_list *tag_search(char *tag, int skip, int show) } +/** lists **/ + +xs_list *list_maint(snac *user, const char *list, int op) +{ + xs_list *l = NULL; + + switch (op) { + case 0: /** list of lists **/ + { + FILE *f; + xs *spec = xs_fmt("%s/list/" "*.id", user->basedir); + xs *ls = xs_glob(spec, 0, 0); + int c = 0; + char *v; + + l = xs_list_new(); + + while (xs_list_next(ls, &v, &c)) { + if ((f = fopen(v, "r")) != NULL) { + xs *title = xs_readline(f); + fclose(f); + + title = xs_strip_i(title); + xs *md5 = xs_md5_hex(title, strlen(title)); + + /* return [ list_id, list_title ] */ + l = xs_list_append(l, xs_list_append(xs_list_new(), md5, title)); + } + } + } + + break; + + case 1: /** create new list (list is the name) **/ + { + FILE *f; + xs *dir = xs_fmt("%s/list/", user->basedir); + xs *md5 = xs_md5_hex(list, strlen(list)); + + mkdirx(dir); + + xs *fn = xs_fmt("%s%s.id", dir, md5); + + if ((f = fopen(fn, "w")) != NULL) { + fprintf(f, "%s\n", list); + fclose(f); + } + } + + break; + + case 2: /** delete list (list is md5 id) **/ + break; + + case 3: /** list content (list is md5 id) **/ + break; + } + + return l; +} + + /** static data **/ static int _load_raw_file(const char *fn, xs_val **data, int *size, -- cgit v1.2.3 From 9a13e330f12aaf0fc1535e922efbf315308d252b Mon Sep 17 00:00:00 2001 From: default Date: Mon, 29 Apr 2024 08:29:18 +0200 Subject: More work in lists. --- data.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 14 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index ab597e7..46d95b4 100644 --- a/data.c +++ b/data.c @@ -1731,9 +1731,9 @@ xs_list *tag_search(char *tag, int skip, int show) /** lists **/ -xs_list *list_maint(snac *user, const char *list, int op) +xs_val *list_maint(snac *user, const char *list, int op) { - xs_list *l = NULL; + xs_val *l = NULL; switch (op) { case 0: /** list of lists **/ @@ -1752,10 +1752,12 @@ xs_list *list_maint(snac *user, const char *list, int op) fclose(f); title = xs_strip_i(title); - xs *md5 = xs_md5_hex(title, strlen(title)); + + xs *v2 = xs_replace(v, ".id", ""); + xs *l2 = xs_split(v2, "/"); /* return [ list_id, list_title ] */ - l = xs_list_append(l, xs_list_append(xs_list_new(), md5, title)); + l = xs_list_append(l, xs_list_append(xs_list_new(), xs_list_get(l2, -1), title)); } } } @@ -1764,26 +1766,58 @@ xs_list *list_maint(snac *user, const char *list, int op) case 1: /** create new list (list is the name) **/ { - FILE *f; - xs *dir = xs_fmt("%s/list/", user->basedir); - xs *md5 = xs_md5_hex(list, strlen(list)); + xs *lol = list_maint(user, NULL, 0); + int c = 0; + xs_list *v; + int add = 1; - mkdirx(dir); + /* check if this list name already exists */ + while (xs_list_next(lol, &v, &c)) { + if (strcmp(xs_list_get(v, 1), list) == 0) { + add = 0; + break; + } + } - xs *fn = xs_fmt("%s%s.id", dir, md5); + if (add) { + FILE *f; + xs *dir = xs_fmt("%s/list/", user->basedir); + xs *id = xs_fmt("%010x", time(NULL)); - if ((f = fopen(fn, "w")) != NULL) { - fprintf(f, "%s\n", list); - fclose(f); + mkdirx(dir); + + xs *fn = xs_fmt("%s%s.id", dir, id); + + if ((f = fopen(fn, "w")) != NULL) { + fprintf(f, "%s\n", list); + fclose(f); + } + + l = xs_stock(XSTYPE_TRUE); } + else + l = xs_stock(XSTYPE_FALSE); } break; - case 2: /** delete list (list is md5 id) **/ + case 2: /** delete list (list is the id) **/ + { + if (xs_is_hex(list)) { + xs *fn = xs_fmt("%s/list/%s.id", user->basedir, list); + unlink(fn); + + fn = xs_replace_i(fn, ".id", ".lst"); + unlink(fn); + + fn = xs_replace_i(fn, ".list", ".idx"); + unlink(fn); + } + } + break; - case 3: /** list content (list is md5 id) **/ + case 3: /** list content (list is the id) **/ break; } -- cgit v1.2.3 From 29fb43079761796e34209611ec93bd651b871cab Mon Sep 17 00:00:00 2001 From: default Date: Mon, 29 Apr 2024 09:26:37 +0200 Subject: More work in lists. --- data.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 46d95b4..ed65d32 100644 --- a/data.c +++ b/data.c @@ -1732,6 +1732,7 @@ xs_list *tag_search(char *tag, int skip, int show) /** lists **/ xs_val *list_maint(snac *user, const char *list, int op) +/* list maintenance */ { xs_val *l = NULL; @@ -1810,15 +1811,48 @@ xs_val *list_maint(snac *user, const char *list, int op) fn = xs_replace_i(fn, ".id", ".lst"); unlink(fn); - fn = xs_replace_i(fn, ".list", ".idx"); + fn = xs_replace_i(fn, ".lst", ".idx"); unlink(fn); } } break; + } + + return l; +} + + +xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op) +/* list content management */ +{ + xs_val *l = NULL; + + if (!xs_is_hex(list)) + return NULL; + + if (actor_md5 != NULL && !xs_is_hex(actor_md5)) + return NULL; + + xs *fn = xs_fmt("%s/list/%s.lst", user->basedir, list); + + switch (op) { + case 0: /** list content **/ + l = index_list(fn, XS_ALL); - case 3: /** list content (list is the id) **/ break; + + case 1: /** append actor to list **/ + if (actor_md5 != NULL) { + if (!index_in(fn, actor_md5)) + index_add_md5(fn, actor_md5); + } + + break; + + case 2: /** delete actor from list **/ + if (actor_md5 != NULL) + index_del_md5(fn, actor_md5); } return l; -- cgit v1.2.3 From 7f322302e5b5cf0345de110afe78767bfb03ae51 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 29 Apr 2024 09:50:22 +0200 Subject: New function list_distribute(). --- data.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index ed65d32..07b38ec 100644 --- a/data.c +++ b/data.c @@ -1154,6 +1154,8 @@ int timeline_add(snac *snac, const char *id, const xs_dict *o_msg) tag_index(id, o_msg); + list_distribute(snac, o_msg); + snac_debug(snac, 1, xs_fmt("timeline_add %s", id)); return ret; @@ -1859,6 +1861,32 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op } +void list_distribute(snac *user, const xs_dict *post) +/* distributes the post to all appropriate lists */ +{ + char *atto = get_atto(post); + char *id = xs_dict_get(post, "id"); + + if (xs_type(atto) == XSTYPE_STRING && xs_type(id) == XSTYPE_STRING) { + xs *a_md5 = xs_md5_hex(atto, strlen(atto)); + xs *i_md5 = xs_md5_hex(id, strlen(id)); + xs *spec = xs_fmt("%s/list/" "*.lst", user->basedir); + xs *ls = xs_glob(spec, 0, 0); + int c = 0; + char *v; + + while (xs_list_next(ls, &v, &c)) { + /* is the actor in this list? */ + if (index_in_md5(v, a_md5)) { + /* it is; add post md5 to its timeline */ + xs *idx = xs_replace(v, ".lst", ".idx"); + index_add(idx, i_md5); + } + } + } +} + + /** static data **/ static int _load_raw_file(const char *fn, xs_val **data, int *size, -- cgit v1.2.3 From f1221808a858b0d205f3acdb028d58d362ef22e6 Mon Sep 17 00:00:00 2001 From: default Date: Mon, 29 Apr 2024 10:15:04 +0200 Subject: More work in lists. --- data.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 07b38ec..be8edaa 100644 --- a/data.c +++ b/data.c @@ -1855,6 +1855,15 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op case 2: /** delete actor from list **/ if (actor_md5 != NULL) index_del_md5(fn, actor_md5); + + break; + + case 3: /** list timeline **/ + fn = xs_replace_i(fn, ".lst", ".idx"); + + l = index_list_desc(fn, 0, 2048); + + break; } return l; @@ -1880,7 +1889,9 @@ void list_distribute(snac *user, const xs_dict *post) if (index_in_md5(v, a_md5)) { /* it is; add post md5 to its timeline */ xs *idx = xs_replace(v, ".lst", ".idx"); - index_add(idx, i_md5); + index_add_md5(idx, i_md5); + + snac_debug(user, 1, xs_fmt("listed post %s in %s", id, idx)); } } } -- cgit v1.2.3 From 96830967e15bd6b1a89686c8c729b096ae6c4550 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 30 Apr 2024 09:14:03 +0200 Subject: Also purge lists. --- data.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index be8edaa..0d8aa8b 100644 --- a/data.c +++ b/data.c @@ -3012,6 +3012,19 @@ void purge_user(snac *snac) srv_debug(1, xs_fmt("purge: %s %d", idx, gc)); } + /* purge lists */ + { + xs *spec = xs_fmt("%s/list/" "*.idx", snac->basedir); + xs *lol = xs_glob(spec, 0, 0); + int c = 0; + char *v; + + while (xs_list_next(lol, &v, &c)) { + int gc = index_gc(v); + srv_debug(1, xs_fmt("purge: %s %d", v, gc)); + } + } + /* unrelated to purging, but it's a janitorial process, so what the hell */ verify_links(snac); } -- cgit v1.2.3 From 4e23570c215aaa2bc2611056b57d90e41621a001 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 30 Apr 2024 09:27:33 +0200 Subject: Added more internal integrity checks. index_add_md5() barfs if the md5 is not valid. --- data.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 0d8aa8b..82d0acc 100644 --- a/data.c +++ b/data.c @@ -340,6 +340,12 @@ double f_ctime(const char *fn) } +int is_md5_hex(const char *md5) +{ + return xs_is_hex(md5) && strlen(md5) == 32; +} + + /** database 2.1+ **/ /** indexes **/ @@ -351,6 +357,11 @@ int index_add_md5(const char *fn, const char *md5) int status = 201; /* Created */ FILE *f; + if (!is_md5_hex(md5)) { + srv_log(xs_fmt("index_add_md5: bad md5 %s %s", fn, md5)); + return 400; + } + pthread_mutex_lock(&data_mutex); if ((f = fopen(fn, "a")) != NULL) { @@ -606,7 +617,7 @@ static xs_str *_object_fn_by_md5(const char *md5, const char *func) if (md5[0] == '-') ok = 0; else - if (!xs_is_hex(md5) || strlen(md5) != 32) { + if (!is_md5_hex(md5)) { srv_log(xs_fmt("_object_fn_by_md5() [from %s()]: bad md5 '%s'", func, md5)); ok = 0; } -- cgit v1.2.3 From 6a77c634ad9938744bae6d718b209557fa37018c Mon Sep 17 00:00:00 2001 From: default Date: Tue, 30 Apr 2024 19:41:08 +0200 Subject: Also add announces to lists. --- data.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 82d0acc..db544f4 100644 --- a/data.c +++ b/data.c @@ -1165,7 +1165,7 @@ int timeline_add(snac *snac, const char *id, const xs_dict *o_msg) tag_index(id, o_msg); - list_distribute(snac, o_msg); + list_distribute(snac, NULL, o_msg); snac_debug(snac, 1, xs_fmt("timeline_add %s", id)); @@ -1881,14 +1881,17 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op } -void list_distribute(snac *user, const xs_dict *post) +void list_distribute(snac *user, const char *who, const xs_dict *post) /* distributes the post to all appropriate lists */ { - char *atto = get_atto(post); - char *id = xs_dict_get(post, "id"); + char *id = xs_dict_get(post, "id"); - if (xs_type(atto) == XSTYPE_STRING && xs_type(id) == XSTYPE_STRING) { - xs *a_md5 = xs_md5_hex(atto, strlen(atto)); + /* if who is not set, use the attributedTo in the message */ + if (xs_is_null(who)) + who = get_atto(post); + + if (xs_type(who) == XSTYPE_STRING && xs_type(id) == XSTYPE_STRING) { + xs *a_md5 = xs_md5_hex(who, strlen(who)); xs *i_md5 = xs_md5_hex(id, strlen(id)); xs *spec = xs_fmt("%s/list/" "*.lst", user->basedir); xs *ls = xs_glob(spec, 0, 0); -- cgit v1.2.3 From fc76ae4e9e721a1ec5fbcf3b509d5a47cf48cd61 Mon Sep 17 00:00:00 2001 From: default Date: Sun, 5 May 2024 01:38:22 +0200 Subject: New function enqueue_object_request(). --- data.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index db544f4..4d753a9 100644 --- a/data.c +++ b/data.c @@ -2651,6 +2651,21 @@ void enqueue_close_question(snac *user, const char *id, int end_secs) } +void enqueue_object_request(snac *user, const char *id, int forward_secs) +/* enqueues the request of an object in the future */ +{ + xs *qmsg = _new_qmsg("object_request", id, 0); + xs *ntid = tid(forward_secs); + xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); + + qmsg = xs_dict_set(qmsg, "ntid", ntid); + + qmsg = _enqueue_put(fn, qmsg); + + snac_debug(user, 0, xs_fmt("enqueue_object_request %s", id)); +} + + void enqueue_verify_links(snac *user) /* enqueues a link verification */ { -- cgit v1.2.3 From be9cf2f5550f68ef4e86b547d7247a0bd498521d Mon Sep 17 00:00:00 2001 From: default Date: Sun, 5 May 2024 01:58:27 +0200 Subject: Enqueue an object request for closed polls. It seems that Pleroma does not send poll updates on close (or never). --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 4d753a9..b9c1141 100644 --- a/data.c +++ b/data.c @@ -2662,7 +2662,7 @@ void enqueue_object_request(snac *user, const char *id, int forward_secs) qmsg = _enqueue_put(fn, qmsg); - snac_debug(user, 0, xs_fmt("enqueue_object_request %s", id)); + snac_debug(user, 0, xs_fmt("enqueue_object_request %s %d", id, forward_secs)); } -- cgit v1.2.3 From 6b1721c977294ee28f54150579c36514aa3ee62a Mon Sep 17 00:00:00 2001 From: default Date: Tue, 7 May 2024 19:40:28 +0200 Subject: List timelines can now be (manually) navigated from the web UI. URLs are {srv_baseurl}/{user}/list/{list_id} (you must know the list id). --- data.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index b9c1141..5b4936b 100644 --- a/data.c +++ b/data.c @@ -1836,6 +1836,23 @@ xs_val *list_maint(snac *user, const char *list, int op) } +xs_list *list_timeline(snac *user, const char *list, int skip, int show) +/* returns the timeline of a list */ +{ + xs_list *l = NULL; + + if (!xs_is_hex(list)) + return NULL; + + xs *fn = xs_fmt("%s/list/%s.idx", user->basedir, list); + + if (mtime(fn) > 0.0) + l = index_list_desc(fn, skip, show); + + return l; +} + + xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op) /* list content management */ { @@ -1869,11 +1886,8 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op break; - case 3: /** list timeline **/ - fn = xs_replace_i(fn, ".lst", ".idx"); - - l = index_list_desc(fn, 0, 2048); - + default: + srv_log(xs_fmt("ERROR: list_content: bad op %d", op)); break; } -- cgit v1.2.3 From 3355d5559dc03f01382282409f33ca6908e495fe Mon Sep 17 00:00:00 2001 From: default Date: Tue, 7 May 2024 20:51:24 +0200 Subject: New op #3 to list_maint() (get list name). --- data.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 5b4936b..4e1682c 100644 --- a/data.c +++ b/data.c @@ -1829,6 +1829,19 @@ xs_val *list_maint(snac *user, const char *list, int op) } } + break; + + case 3: /** get list name **/ + if (xs_is_hex(list)) { + FILE *f; + xs *fn = xs_fmt("%s/list/%s.id", user->basedir, list); + + if ((f = fopen(fn, "r")) != NULL) { + l = xs_strip_i(xs_readline(f)); + fclose(f); + } + } + break; } -- cgit v1.2.3 From 3ab733cdf5a71b9a27399e8336e0c236c13d67fb Mon Sep 17 00:00:00 2001 From: default Date: Wed, 8 May 2024 10:20:25 +0200 Subject: New function search_by_content(). --- data.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 4e1682c..bc9f979 100644 --- a/data.c +++ b/data.c @@ -2488,6 +2488,64 @@ void notify_clear(snac *snac) } +/** searches **/ + +xs_list *search_by_content(snac *user, const xs_list *timeline, + const char *regex, int timeout) +/* returns a list of posts which content matches the regex */ +{ + xs_list *r = xs_list_new(); + + if (timeout == 0) + timeout = 3; + + int c = 0; + char *v; + + time_t t = time(NULL) + timeout; + + while (xs_list_next(timeline, &v, &c)) { + xs *post = NULL; + + /* timeout? */ + if (time(NULL) > t) + break; + + int status; + + if (user) + status = timeline_get_by_md5(user, v, &post); + else + status = object_get_by_md5(v, &post); + + if (!valid_status(status)) + continue; + + /* must be a Note */ + if (strcmp(xs_dict_get_def(post, "type", ""), "Note")) + continue; + + char *content = xs_dict_get(post, "content"); + + if (xs_is_null(content)) + continue; + + /* strip HTML */ + xs *c = xs_regex_replace(content, "<[^>]+>", " "); + c = xs_regex_replace_i(c, " {2,}", " "); + c = xs_tolower_i(c); + + /* apply regex */ + xs *l = xs_regex_select_n(c, regex, 1); + + if (xs_list_len(l)) + r = xs_list_append(r, v); + } + + return r; +} + + /** the queue **/ static xs_dict *_enqueue_put(const char *fn, xs_dict *msg) -- cgit v1.2.3 From dc74cac6c9c3f6e9edc848381422a1f124abac73 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 8 May 2024 10:27:30 +0200 Subject: Added a timeout flag to search_by_content(). --- data.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index bc9f979..82f36a4 100644 --- a/data.c +++ b/data.c @@ -2491,25 +2491,28 @@ void notify_clear(snac *snac) /** searches **/ xs_list *search_by_content(snac *user, const xs_list *timeline, - const char *regex, int timeout) + const char *regex, int max_secs, int *timeout) /* returns a list of posts which content matches the regex */ { xs_list *r = xs_list_new(); - if (timeout == 0) - timeout = 3; + if (max_secs == 0) + max_secs = 3; int c = 0; char *v; - time_t t = time(NULL) + timeout; + time_t t = time(NULL) + max_secs; + *timeout = 0; while (xs_list_next(timeline, &v, &c)) { xs *post = NULL; /* timeout? */ - if (time(NULL) > t) + if (time(NULL) > t) { + *timeout = 1; break; + } int status; -- cgit v1.2.3 From 52ba7f030ed50f22b7fbf437e83c9415ed0e91ed Mon Sep 17 00:00:00 2001 From: default Date: Wed, 8 May 2024 11:00:50 +0200 Subject: Renamed to content_search(). --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 82f36a4..e3292c8 100644 --- a/data.c +++ b/data.c @@ -2490,7 +2490,7 @@ void notify_clear(snac *snac) /** searches **/ -xs_list *search_by_content(snac *user, const xs_list *timeline, +xs_list *content_search(snac *user, const xs_list *timeline, const char *regex, int max_secs, int *timeout) /* returns a list of posts which content matches the regex */ { -- cgit v1.2.3 From 34c8968cfb0aaa14ed901115c1addd1886916b79 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 8 May 2024 11:06:33 +0200 Subject: Minor tweaks to content_search(). --- data.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index e3292c8..1421f17 100644 --- a/data.c +++ b/data.c @@ -2491,7 +2491,7 @@ void notify_clear(snac *snac) /** searches **/ xs_list *content_search(snac *user, const xs_list *timeline, - const char *regex, int max_secs, int *timeout) + const char *regex, int max_secs, int *timeout) /* returns a list of posts which content matches the regex */ { xs_list *r = xs_list_new(); @@ -2514,14 +2514,11 @@ xs_list *content_search(snac *user, const xs_list *timeline, break; } - int status; - - if (user) - status = timeline_get_by_md5(user, v, &post); - else - status = object_get_by_md5(v, &post); + /* if from a user, must be in any timeline */ + if (user && !timeline_here(user, v)) + continue; - if (!valid_status(status)) + if (!valid_status(object_get_by_md5(v, &post))) continue; /* must be a Note */ -- cgit v1.2.3 From 979f2ad1400111bcd36da980ba8f78f25bb5390e Mon Sep 17 00:00:00 2001 From: default Date: Wed, 8 May 2024 16:43:02 +0200 Subject: Rewritten content_search() to read from both timelines. --- data.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 14 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 1421f17..d9449d8 100644 --- a/data.c +++ b/data.c @@ -2490,23 +2490,35 @@ void notify_clear(snac *snac) /** searches **/ -xs_list *content_search(snac *user, const xs_list *timeline, - const char *regex, int max_secs, int *timeout) +xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, int *timeout) /* returns a list of posts which content matches the regex */ { - xs_list *r = xs_list_new(); + xs_set seen; + + xs_set_init(&seen); if (max_secs == 0) max_secs = 3; - int c = 0; - char *v; - time_t t = time(NULL) + max_secs; *timeout = 0; - while (xs_list_next(timeline, &v, &c)) { - xs *post = NULL; + /* iterate both timelines simultaneously */ + xs *pub_tl = timeline_simple_list(user, "public", 0, XS_ALL); + int pub_c = 0; + char *pub_md5 = NULL; + + xs *priv_tl = priv ? timeline_simple_list(user, "private", 0, XS_ALL) : xs_list_new(); + int priv_c = 0; + char *priv_md5 = NULL; + + /* first positioning */ + xs_list_next(pub_tl, &pub_md5, &pub_c); + xs_list_next(priv_tl, &priv_md5, &priv_c); + + for (;;) { + char *md5 = NULL; + enum { NONE, PUBLIC, PRIVATE } from = NONE; /* timeout? */ if (time(NULL) > t) { @@ -2514,11 +2526,48 @@ xs_list *content_search(snac *user, const xs_list *timeline, break; } - /* if from a user, must be in any timeline */ - if (user && !timeline_here(user, v)) - continue; + if (pub_md5 == NULL) { + /* out of both lists? done */ + if (priv_md5 == NULL) + break; - if (!valid_status(object_get_by_md5(v, &post))) + /* out of public: take element from the private timeline and advance */ + from = PRIVATE; + } + else + if (priv_md5 == NULL) { + /* out of private: take element from the public timeline and advance */ + from = PUBLIC; + } + else { + /* candidates from both: choose one from the file dates */ + xs *pub_fn = xs_fmt("%s/public/%s.json", user->basedir, pub_md5); + xs *priv_fn = xs_fmt("%s/private/%s.json", user->basedir, priv_md5); + + if (mtime(pub_fn) < mtime(priv_fn)) + from = PRIVATE; + else + from = PUBLIC; + } + + if (from == PUBLIC) { /* public */ + md5 = pub_md5; + if (!xs_list_next(pub_tl, &pub_md5, &pub_c)) + pub_md5 = NULL; + } + else + if (from == PRIVATE) { /* private */ + md5 = priv_md5; + if (!xs_list_next(priv_tl, &priv_md5, &priv_c)) + priv_md5 = NULL; + } + + if (md5 == NULL) + break; + + xs *post = NULL; + + if (!valid_status(timeline_get_by_md5(user, md5, &post))) continue; /* must be a Note */ @@ -2539,10 +2588,10 @@ xs_list *content_search(snac *user, const xs_list *timeline, xs *l = xs_regex_select_n(c, regex, 1); if (xs_list_len(l)) - r = xs_list_append(r, v); + xs_set_add(&seen, md5); } - return r; + return xs_set_result(&seen); } -- cgit v1.2.3 From 8de93b9cd72ef0cde8b5bb620f376e9b926354dd Mon Sep 17 00:00:00 2001 From: default Date: Thu, 9 May 2024 09:24:39 +0200 Subject: mastoapi: some search by content tweaks. --- data.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index d9449d8..75149e2 100644 --- a/data.c +++ b/data.c @@ -10,6 +10,7 @@ #include "xs_set.h" #include "xs_time.h" #include "xs_regex.h" +#include "xs_match.h" #include "snac.h" @@ -2570,8 +2571,7 @@ xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, i if (!valid_status(timeline_get_by_md5(user, md5, &post))) continue; - /* must be a Note */ - if (strcmp(xs_dict_get_def(post, "type", ""), "Note")) + if (!xs_match(xs_dict_get_def(post, "type", "-"), "Note|Question|Page|Article|Video")) continue; char *content = xs_dict_get(post, "content"); -- cgit v1.2.3 From cccc5454c259d0d4ca600b3e1165979c352be54f Mon Sep 17 00:00:00 2001 From: default Date: Thu, 9 May 2024 09:31:10 +0200 Subject: Added a maximum results argument to content_search(). --- data.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 75149e2..78de21b 100644 --- a/data.c +++ b/data.c @@ -2491,9 +2491,12 @@ void notify_clear(snac *snac) /** searches **/ -xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, int *timeout) +xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, int max_res, int *timeout) /* returns a list of posts which content matches the regex */ { + if (regex == NULL || *regex == '\0') + return xs_list_new(); + xs_set seen; xs_set_init(&seen); @@ -2517,7 +2520,7 @@ xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, i xs_list_next(pub_tl, &pub_md5, &pub_c); xs_list_next(priv_tl, &priv_md5, &priv_c); - for (;;) { + while (max_res > 0) { char *md5 = NULL; enum { NONE, PUBLIC, PRIVATE } from = NONE; @@ -2587,8 +2590,10 @@ xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, i /* apply regex */ xs *l = xs_regex_select_n(c, regex, 1); - if (xs_list_len(l)) + if (xs_list_len(l)) { xs_set_add(&seen, md5); + max_res--; + } } return xs_set_result(&seen); -- cgit v1.2.3 From 1531e81a310311656d06c9ee0d31da31493e6de2 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 10 May 2024 11:29:18 +0200 Subject: Added a skip argument to content_search(). --- data.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 78de21b..e284696 100644 --- a/data.c +++ b/data.c @@ -2491,7 +2491,8 @@ void notify_clear(snac *snac) /** searches **/ -xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, int max_res, int *timeout) +xs_list *content_search(snac *user, const char *regex, + int priv, int skip, int show, int max_secs, int *timeout) /* returns a list of posts which content matches the regex */ { if (regex == NULL || *regex == '\0') @@ -2520,7 +2521,7 @@ xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, i xs_list_next(pub_tl, &pub_md5, &pub_c); xs_list_next(priv_tl, &priv_md5, &priv_c); - while (max_res > 0) { + while (show > 0) { char *md5 = NULL; enum { NONE, PUBLIC, PRIVATE } from = NONE; @@ -2591,8 +2592,12 @@ xs_list *content_search(snac *user, const char *regex, int priv, int max_secs, i xs *l = xs_regex_select_n(c, regex, 1); if (xs_list_len(l)) { - xs_set_add(&seen, md5); - max_res--; + if (skip) + skip--; + else { + xs_set_add(&seen, md5); + show--; + } } } -- cgit v1.2.3 From 1632e009a429a45f374b5595d128da9db810b948 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 10 May 2024 11:42:15 +0200 Subject: More content_search() tweaks. --- data.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index e284696..2e682b3 100644 --- a/data.c +++ b/data.c @@ -2592,12 +2592,11 @@ xs_list *content_search(snac *user, const char *regex, xs *l = xs_regex_select_n(c, regex, 1); if (xs_list_len(l)) { - if (skip) + if (skip > 0) skip--; - else { - xs_set_add(&seen, md5); + else + if (xs_set_add(&seen, md5) == 1) show--; - } } } -- cgit v1.2.3 From 5d1577af3ceaad8e3e89cf53a1c523e6a5c710a6 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 10 May 2024 11:55:45 +0200 Subject: More web ui search tweaks baaaaah I'm boring. --- data.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 2e682b3..60eda25 100644 --- a/data.c +++ b/data.c @@ -2499,8 +2499,10 @@ xs_list *content_search(snac *user, const char *regex, return xs_list_new(); xs_set seen; + xs_set skipped; xs_set_init(&seen); + xs_set_init(&skipped); if (max_secs == 0) max_secs = 3; @@ -2592,14 +2594,19 @@ xs_list *content_search(snac *user, const char *regex, xs *l = xs_regex_select_n(c, regex, 1); if (xs_list_len(l)) { - if (skip > 0) - skip--; - else - if (xs_set_add(&seen, md5) == 1) - show--; + if (skip > 0) { + if (xs_set_add(&skipped, md5) == 1) + skip--; + } + else { + if (xs_set_add(&seen, md5) == 1) + show--; + } } } + xs_set_free(&skipped); + return xs_set_result(&seen); } -- cgit v1.2.3 From d12ebcef82d274aef0930c94ba90b2b40d91828c Mon Sep 17 00:00:00 2001 From: default Date: Fri, 10 May 2024 12:22:36 +0200 Subject: More search tweaks MUAHAHAHA. --- data.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 60eda25..d037af0 100644 --- a/data.c +++ b/data.c @@ -2499,10 +2499,8 @@ xs_list *content_search(snac *user, const char *regex, return xs_list_new(); xs_set seen; - xs_set skipped; xs_set_init(&seen); - xs_set_init(&skipped); if (max_secs == 0) max_secs = 3; @@ -2523,6 +2521,8 @@ xs_list *content_search(snac *user, const char *regex, xs_list_next(pub_tl, &pub_md5, &pub_c); xs_list_next(priv_tl, &priv_md5, &priv_c); + show += skip; + while (show > 0) { char *md5 = NULL; enum { NONE, PUBLIC, PRIVATE } from = NONE; @@ -2594,20 +2594,21 @@ xs_list *content_search(snac *user, const char *regex, xs *l = xs_regex_select_n(c, regex, 1); if (xs_list_len(l)) { - if (skip > 0) { - if (xs_set_add(&skipped, md5) == 1) - skip--; - } - else { - if (xs_set_add(&seen, md5) == 1) - show--; - } + if (xs_set_add(&seen, md5) == 1) + show--; } } - xs_set_free(&skipped); + xs_list *r = xs_set_result(&seen); - return xs_set_result(&seen); + if (skip) { + /* BAD */ + while (skip--) { + r = xs_list_del(r, 0); + } + } + + return r; } -- cgit v1.2.3 From e1ce85debd5b192b5dc56a4e9810839cc52b0f8b Mon Sep 17 00:00:00 2001 From: default Date: Sat, 11 May 2024 18:46:15 +0200 Subject: Unified post-like object type match. --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index d037af0..108354c 100644 --- a/data.c +++ b/data.c @@ -2577,7 +2577,7 @@ xs_list *content_search(snac *user, const char *regex, if (!valid_status(timeline_get_by_md5(user, md5, &post))) continue; - if (!xs_match(xs_dict_get_def(post, "type", "-"), "Note|Question|Page|Article|Video")) + if (!xs_match(xs_dict_get_def(post, "type", "-"), POSTLIKE_OBJECT_TYPE)) continue; char *content = xs_dict_get(post, "content"); -- cgit v1.2.3 From 4d53a7b6f7f45f524313980461f5d2a6ef965949 Mon Sep 17 00:00:00 2001 From: default Date: Sat, 11 May 2024 19:16:54 +0200 Subject: In timeline_request(), call enqueue_actor_request on actor errors. --- data.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index d037af0..8016ce1 100644 --- a/data.c +++ b/data.c @@ -1632,7 +1632,7 @@ int actor_get_refresh(snac *user, const char *actor, xs_dict **data) int status = actor_get(actor, data); if (status == 205 && user && !xs_startswith(actor, srv_baseurl)) - enqueue_actor_refresh(user, actor); + enqueue_actor_refresh(user, actor, 0); return status; } @@ -2830,13 +2830,14 @@ void enqueue_verify_links(snac *user) } -void enqueue_actor_refresh(snac *user, const char *actor) +void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs) /* enqueues an actor refresh */ { - xs *qmsg = _new_qmsg("actor_refresh", "", 0); - char *ntid = xs_dict_get(qmsg, "ntid"); - xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); + xs *qmsg = _new_qmsg("actor_refresh", "", 0); + xs *ntid = tid(forward_secs); + xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); + qmsg = xs_dict_set(qmsg, "ntid", ntid); qmsg = xs_dict_append(qmsg, "actor", actor); qmsg = _enqueue_put(fn, qmsg); -- cgit v1.2.3 From 281f934f74c662d3c2e58db556f3046a736a2f00 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 14 May 2024 05:17:33 +0200 Subject: content_search() also searches the instance timeline. --- data.c | 79 ++++++++++++++++++++++++++++-------------------------------------- 1 file changed, 33 insertions(+), 46 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 706e8e1..6df5f5c 100644 --- a/data.c +++ b/data.c @@ -2508,73 +2508,56 @@ xs_list *content_search(snac *user, const char *regex, time_t t = time(NULL) + max_secs; *timeout = 0; - /* iterate both timelines simultaneously */ - xs *pub_tl = timeline_simple_list(user, "public", 0, XS_ALL); - int pub_c = 0; - char *pub_md5 = NULL; + /* iterate all timelines simultaneously */ + xs_list *tls[3] = {0}; + char *md5s[3] = {0}; + int c[3] = {0}; - xs *priv_tl = priv ? timeline_simple_list(user, "private", 0, XS_ALL) : xs_list_new(); - int priv_c = 0; - char *priv_md5 = NULL; + tls[0] = timeline_simple_list(user, "public", 0, XS_ALL); /* public */ + tls[1] = timeline_instance_list(0, XS_ALL); /* instance */ + tls[2] = priv ? timeline_simple_list(user, "private", 0, XS_ALL) : xs_list_new(); /* private or none */ /* first positioning */ - xs_list_next(pub_tl, &pub_md5, &pub_c); - xs_list_next(priv_tl, &priv_md5, &priv_c); + for (int n = 0; n < 3; n++) + xs_list_next(tls[n], &md5s[n], &c[n]); show += skip; while (show > 0) { - char *md5 = NULL; - enum { NONE, PUBLIC, PRIVATE } from = NONE; - /* timeout? */ if (time(NULL) > t) { *timeout = 1; break; } - if (pub_md5 == NULL) { - /* out of both lists? done */ - if (priv_md5 == NULL) - break; - - /* out of public: take element from the private timeline and advance */ - from = PRIVATE; - } - else - if (priv_md5 == NULL) { - /* out of private: take element from the public timeline and advance */ - from = PUBLIC; - } - else { - /* candidates from both: choose one from the file dates */ - xs *pub_fn = xs_fmt("%s/public/%s.json", user->basedir, pub_md5); - xs *priv_fn = xs_fmt("%s/private/%s.json", user->basedir, priv_md5); + /* find the newest post */ + int newest = -1; + double mtime = 0.0; - if (mtime(pub_fn) < mtime(priv_fn)) - from = PRIVATE; - else - from = PUBLIC; - } + for (int n = 0; n < 3; n++) { + if (md5s[n] != NULL) { + xs *fn = _object_fn_by_md5(md5s[n], "content_search"); + double mt = mtime(fn); - if (from == PUBLIC) { /* public */ - md5 = pub_md5; - if (!xs_list_next(pub_tl, &pub_md5, &pub_c)) - pub_md5 = NULL; - } - else - if (from == PRIVATE) { /* private */ - md5 = priv_md5; - if (!xs_list_next(priv_tl, &priv_md5, &priv_c)) - priv_md5 = NULL; + if (mt > mtime) { + newest = n; + mtime = mt; + } + } } - if (md5 == NULL) + if (newest == -1) break; + char *md5 = md5s[newest]; + + /* advance the chosen timeline */ + if (!xs_list_next(tls[newest], &md5s[newest], &c[newest])) + md5s[newest] = NULL; + xs *post = NULL; - if (!valid_status(timeline_get_by_md5(user, md5, &post))) + if (!valid_status(object_get_by_md5(md5, &post))) continue; if (!xs_match(xs_dict_get_def(post, "type", "-"), POSTLIKE_OBJECT_TYPE)) @@ -2608,6 +2591,10 @@ xs_list *content_search(snac *user, const char *regex, } } + xs_free(tls[0]); + xs_free(tls[1]); + xs_free(tls[2]); + return r; } -- cgit v1.2.3 From 2ed0a08f9fbaac8adbf1d84aa149b9f7959a965b Mon Sep 17 00:00:00 2001 From: default Date: Wed, 15 May 2024 06:07:33 +0200 Subject: Convert the regex to lowercase in content_search(). Is this a good idea? --- data.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 6df5f5c..2410f5b 100644 --- a/data.c +++ b/data.c @@ -2498,6 +2498,8 @@ xs_list *content_search(snac *user, const char *regex, if (regex == NULL || *regex == '\0') return xs_list_new(); + xs *i_regex = xs_tolower_i(xs_dup(regex)); + xs_set seen; xs_set_init(&seen); @@ -2574,7 +2576,7 @@ xs_list *content_search(snac *user, const char *regex, c = xs_tolower_i(c); /* apply regex */ - xs *l = xs_regex_select_n(c, regex, 1); + xs *l = xs_regex_select_n(c, i_regex, 1); if (xs_list_len(l)) { if (xs_set_add(&seen, md5) == 1) -- cgit v1.2.3 From ff8d49a8991977e07cf6bb50156b2ffda08d0c0e Mon Sep 17 00:00:00 2001 From: default Date: Wed, 15 May 2024 13:27:23 +0200 Subject: Use xs_regex_match() where applicable. --- data.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 2410f5b..65100de 100644 --- a/data.c +++ b/data.c @@ -2293,13 +2293,9 @@ int content_check(const char *file, const xs_dict *msg) while (!r && !feof(f)) { xs *rx = xs_strip_i(xs_readline(f)); - if (*rx) { - xs *l = xs_regex_select_n(c, rx, 1); - - if (xs_list_len(l)) { - srv_debug(1, xs_fmt("content_check: match for '%s'", rx)); - r = 1; - } + if (*rx && xs_regex_match(c, rx)) { + srv_debug(1, xs_fmt("content_check: match for '%s'", rx)); + r = 1; } } @@ -2576,9 +2572,7 @@ xs_list *content_search(snac *user, const char *regex, c = xs_tolower_i(c); /* apply regex */ - xs *l = xs_regex_select_n(c, i_regex, 1); - - if (xs_list_len(l)) { + if (xs_regex_match(c, i_regex)) { if (xs_set_add(&seen, md5) == 1) show--; } -- cgit v1.2.3 From 0a6cfba399cbd7510b6ffa9ddfde5a8ca31c4828 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 15 May 2024 13:29:07 +0200 Subject: Moved functions around. --- data.c | 220 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 109 insertions(+), 111 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 65100de..61045c6 100644 --- a/data.c +++ b/data.c @@ -2270,7 +2270,7 @@ int instance_unblock(const char *instance) } -/** content filtering **/ +/** operations by content **/ int content_check(const char *file, const xs_dict *msg) /* checks if a message's content matches any of the regexes in file */ @@ -2307,6 +2307,114 @@ int content_check(const char *file, const xs_dict *msg) } +xs_list *content_search(snac *user, const char *regex, + int priv, int skip, int show, int max_secs, int *timeout) +/* returns a list of posts which content matches the regex */ +{ + if (regex == NULL || *regex == '\0') + return xs_list_new(); + + xs *i_regex = xs_tolower_i(xs_dup(regex)); + + xs_set seen; + + xs_set_init(&seen); + + if (max_secs == 0) + max_secs = 3; + + time_t t = time(NULL) + max_secs; + *timeout = 0; + + /* iterate all timelines simultaneously */ + xs_list *tls[3] = {0}; + char *md5s[3] = {0}; + int c[3] = {0}; + + tls[0] = timeline_simple_list(user, "public", 0, XS_ALL); /* public */ + tls[1] = timeline_instance_list(0, XS_ALL); /* instance */ + tls[2] = priv ? timeline_simple_list(user, "private", 0, XS_ALL) : xs_list_new(); /* private or none */ + + /* first positioning */ + for (int n = 0; n < 3; n++) + xs_list_next(tls[n], &md5s[n], &c[n]); + + show += skip; + + while (show > 0) { + /* timeout? */ + if (time(NULL) > t) { + *timeout = 1; + break; + } + + /* find the newest post */ + int newest = -1; + double mtime = 0.0; + + for (int n = 0; n < 3; n++) { + if (md5s[n] != NULL) { + xs *fn = _object_fn_by_md5(md5s[n], "content_search"); + double mt = mtime(fn); + + if (mt > mtime) { + newest = n; + mtime = mt; + } + } + } + + if (newest == -1) + break; + + char *md5 = md5s[newest]; + + /* advance the chosen timeline */ + if (!xs_list_next(tls[newest], &md5s[newest], &c[newest])) + md5s[newest] = NULL; + + xs *post = NULL; + + if (!valid_status(object_get_by_md5(md5, &post))) + continue; + + if (!xs_match(xs_dict_get_def(post, "type", "-"), POSTLIKE_OBJECT_TYPE)) + continue; + + char *content = xs_dict_get(post, "content"); + + if (xs_is_null(content)) + continue; + + /* strip HTML */ + xs *c = xs_regex_replace(content, "<[^>]+>", " "); + c = xs_regex_replace_i(c, " {2,}", " "); + c = xs_tolower_i(c); + + /* apply regex */ + if (xs_regex_match(c, i_regex)) { + if (xs_set_add(&seen, md5) == 1) + show--; + } + } + + xs_list *r = xs_set_result(&seen); + + if (skip) { + /* BAD */ + while (skip--) { + r = xs_list_del(r, 0); + } + } + + xs_free(tls[0]); + xs_free(tls[1]); + xs_free(tls[2]); + + return r; +} + + /** notifications **/ xs_str *notify_check_time(snac *snac, int reset) @@ -2485,116 +2593,6 @@ void notify_clear(snac *snac) } -/** searches **/ - -xs_list *content_search(snac *user, const char *regex, - int priv, int skip, int show, int max_secs, int *timeout) -/* returns a list of posts which content matches the regex */ -{ - if (regex == NULL || *regex == '\0') - return xs_list_new(); - - xs *i_regex = xs_tolower_i(xs_dup(regex)); - - xs_set seen; - - xs_set_init(&seen); - - if (max_secs == 0) - max_secs = 3; - - time_t t = time(NULL) + max_secs; - *timeout = 0; - - /* iterate all timelines simultaneously */ - xs_list *tls[3] = {0}; - char *md5s[3] = {0}; - int c[3] = {0}; - - tls[0] = timeline_simple_list(user, "public", 0, XS_ALL); /* public */ - tls[1] = timeline_instance_list(0, XS_ALL); /* instance */ - tls[2] = priv ? timeline_simple_list(user, "private", 0, XS_ALL) : xs_list_new(); /* private or none */ - - /* first positioning */ - for (int n = 0; n < 3; n++) - xs_list_next(tls[n], &md5s[n], &c[n]); - - show += skip; - - while (show > 0) { - /* timeout? */ - if (time(NULL) > t) { - *timeout = 1; - break; - } - - /* find the newest post */ - int newest = -1; - double mtime = 0.0; - - for (int n = 0; n < 3; n++) { - if (md5s[n] != NULL) { - xs *fn = _object_fn_by_md5(md5s[n], "content_search"); - double mt = mtime(fn); - - if (mt > mtime) { - newest = n; - mtime = mt; - } - } - } - - if (newest == -1) - break; - - char *md5 = md5s[newest]; - - /* advance the chosen timeline */ - if (!xs_list_next(tls[newest], &md5s[newest], &c[newest])) - md5s[newest] = NULL; - - xs *post = NULL; - - if (!valid_status(object_get_by_md5(md5, &post))) - continue; - - if (!xs_match(xs_dict_get_def(post, "type", "-"), POSTLIKE_OBJECT_TYPE)) - continue; - - char *content = xs_dict_get(post, "content"); - - if (xs_is_null(content)) - continue; - - /* strip HTML */ - xs *c = xs_regex_replace(content, "<[^>]+>", " "); - c = xs_regex_replace_i(c, " {2,}", " "); - c = xs_tolower_i(c); - - /* apply regex */ - if (xs_regex_match(c, i_regex)) { - if (xs_set_add(&seen, md5) == 1) - show--; - } - } - - xs_list *r = xs_set_result(&seen); - - if (skip) { - /* BAD */ - while (skip--) { - r = xs_list_del(r, 0); - } - } - - xs_free(tls[0]); - xs_free(tls[1]); - xs_free(tls[2]); - - return r; -} - - /** the queue **/ static xs_dict *_enqueue_put(const char *fn, xs_dict *msg) -- cgit v1.2.3 From 0a6df8e504569be4caf39930c473f12b328e5b2a Mon Sep 17 00:00:00 2001 From: default Date: Wed, 15 May 2024 13:31:53 +0200 Subject: Renamed content_check() to content_match(). --- data.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 61045c6..5abbeaf 100644 --- a/data.c +++ b/data.c @@ -2272,7 +2272,7 @@ int instance_unblock(const char *instance) /** operations by content **/ -int content_check(const char *file, const xs_dict *msg) +int content_match(const char *file, const xs_dict *msg) /* checks if a message's content matches any of the regexes in file */ /* file format: one regex per line */ { @@ -2283,7 +2283,7 @@ int content_check(const char *file, const xs_dict *msg) if (xs_type(v) == XSTYPE_STRING && *v) { if ((f = fopen(fn, "r")) != NULL) { - srv_debug(1, xs_fmt("content_check: loading regexes from %s", fn)); + srv_debug(1, xs_fmt("content_match: loading regexes from %s", fn)); /* massage content (strip HTML tags, etc.) */ xs *c = xs_regex_replace(v, "<[^>]+>", " "); @@ -2294,7 +2294,7 @@ int content_check(const char *file, const xs_dict *msg) xs *rx = xs_strip_i(xs_readline(f)); if (*rx && xs_regex_match(c, rx)) { - srv_debug(1, xs_fmt("content_check: match for '%s'", rx)); + srv_debug(1, xs_fmt("content_match: match for '%s'", rx)); r = 1; } } -- cgit v1.2.3 From e7fa6d992061b04038128320acef4c894ae69500 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 15 May 2024 13:36:59 +0200 Subject: Skip hidden posts in content_search(). --- data.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 5abbeaf..0cceefd 100644 --- a/data.c +++ b/data.c @@ -2381,6 +2381,11 @@ xs_list *content_search(snac *user, const char *regex, if (!xs_match(xs_dict_get_def(post, "type", "-"), POSTLIKE_OBJECT_TYPE)) continue; + const char *id = xs_dict_get(post, "id"); + + if (id == NULL || is_hidden(user, id)) + continue; + char *content = xs_dict_get(post, "content"); if (xs_is_null(content)) -- cgit v1.2.3 From 4777fc86cb962917a8f34afb3bfa40f26290815d Mon Sep 17 00:00:00 2001 From: default Date: Tue, 21 May 2024 14:12:15 +0200 Subject: Added const everywhere. --- data.c | 130 +++++++++++++++++++++++++---------------------------------------- 1 file changed, 49 insertions(+), 81 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 0cceefd..3377f3e 100644 --- a/data.c +++ b/data.c @@ -29,7 +29,7 @@ pthread_mutex_t data_mutex = {0}; int snac_upgrade(xs_str **error); -int srv_open(char *basedir, int auto_upgrade) +int srv_open(const char *basedir, int auto_upgrade) /* opens a server */ { int ret = 0; @@ -58,10 +58,10 @@ int srv_open(char *basedir, int auto_upgrade) if (srv_config == NULL) error = xs_fmt("ERROR: cannot parse '%s'", cfg_file); else { - char *host; - char *prefix; - char *dbglvl; - char *proto; + const char *host; + const char *prefix; + const char *dbglvl; + const char *proto; host = xs_dict_get(srv_config, "host"); prefix = xs_dict_get(srv_config, "prefix"); @@ -710,7 +710,7 @@ int _object_add(const char *id, const xs_dict *obj, int ow) fclose(f); /* does this object has a parent? */ - char *in_reply_to = xs_dict_get(obj, "inReplyTo"); + const char *in_reply_to = xs_dict_get(obj, "inReplyTo"); if (!xs_is_null(in_reply_to) && *in_reply_to) { /* update the children index of the parent */ @@ -1124,7 +1124,7 @@ int timeline_get_by_md5(snac *snac, const char *md5, xs_dict **msg) } -int timeline_del(snac *snac, char *id) +int timeline_del(snac *snac, const char *id) /* deletes a message from the timeline */ { /* delete from the user's caches */ @@ -1192,17 +1192,16 @@ int timeline_admire(snac *snac, const char *id, const char *admirer, int like) } -xs_list *timeline_top_level(snac *snac, xs_list *list) +xs_list *timeline_top_level(snac *snac, const xs_list *list) /* returns the top level md5 entries from this index */ { xs_set seen; - xs_list *p; xs_str *v; xs_set_init(&seen); - p = list; - while (xs_list_iter(&p, &v)) { + int c = 0; + while (xs_list_next(list, &v, &c)) { char line[256] = ""; strncpy(line, v, sizeof(line)); @@ -1290,7 +1289,7 @@ int following_add(snac *snac, const char *actor, const xs_dict *msg) /* object already exists; if it's of type Accept, the actor is already being followed and confirmed, so do nothing */ - char *type = xs_dict_get(p_object, "type"); + const char *type = xs_dict_get(p_object, "type"); if (!xs_is_null(type) && strcmp(type, "Accept") == 0) { snac_debug(snac, 1, xs_fmt("following_add actor already confirmed %s", actor)); @@ -1546,8 +1545,9 @@ void hide(snac *snac, const char *id) /* resolve to get the id */ if (valid_status(object_get_by_md5(v, &co))) { - if ((v = xs_dict_get(co, "id")) != NULL) - hide(snac, v); + const char *id = xs_dict_get(co, "id"); + if (id != NULL) + hide(snac, id); } } } @@ -1563,7 +1563,7 @@ int is_hidden(snac *snac, const char *id) } -int actor_add(const char *actor, xs_dict *msg) +int actor_add(const char *actor, const xs_dict *msg) /* adds an actor */ { return object_add_ow(actor, msg); @@ -1687,7 +1687,7 @@ int limited(snac *user, const char *id, int cmd) void tag_index(const char *id, const xs_dict *obj) /* update the tag indexes for this object */ { - xs_list *tags = xs_dict_get(obj, "tag"); + const xs_list *tags = xs_dict_get(obj, "tag"); if (is_msg_public(obj) && xs_type(tags) == XSTYPE_LIST && xs_list_len(tags) > 0) { xs *g_tag_dir = xs_fmt("%s/tag", srv_basedir); @@ -1695,9 +1695,10 @@ void tag_index(const char *id, const xs_dict *obj) mkdirx(g_tag_dir); xs_dict *v; - while (xs_list_iter(&tags, &v)) { - char *type = xs_dict_get(v, "type"); - char *name = xs_dict_get(v, "name"); + int ct = 0; + while (xs_list_next(tags, &v, &ct)) { + const char *type = xs_dict_get(v, "type"); + const char *name = xs_dict_get(v, "name"); if (!xs_is_null(type) && !xs_is_null(name) && strcmp(type, "Hashtag") == 0) { while (*name == '#' || *name == '@') @@ -1706,7 +1707,7 @@ void tag_index(const char *id, const xs_dict *obj) if (*name == '\0') continue; - name = xs_tolower_i(name); + name = xs_tolower_i((xs_str *)name); xs *md5_tag = xs_md5_hex(name, strlen(name)); xs *tag_dir = xs_fmt("%s/%c%c", g_tag_dir, md5_tag[0], md5_tag[1]); @@ -1729,7 +1730,7 @@ void tag_index(const char *id, const xs_dict *obj) } -xs_list *tag_search(char *tag, int skip, int show) +xs_list *tag_search(const char *tag, int skip, int show) /* returns the list of posts tagged with tag */ { if (*tag == '#') @@ -1912,7 +1913,7 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op void list_distribute(snac *user, const char *who, const xs_dict *post) /* distributes the post to all appropriate lists */ { - char *id = xs_dict_get(post, "id"); + const char *id = xs_dict_get(post, "id"); /* if who is not set, use the attributedTo in the message */ if (xs_is_null(who)) @@ -2164,7 +2165,7 @@ void inbox_add(const char *inbox) void inbox_add_by_actor(const xs_dict *actor) /* collects an actor's shared inbox, if it has one */ { - char *v; + const char *v; if (!xs_is_null(v = xs_dict_get(actor, "endpoints")) && !xs_is_null(v = xs_dict_get(v, "sharedInbox"))) { @@ -2210,7 +2211,7 @@ xs_str *_instance_block_fn(const char *instance) xs *s = xs_replace(instance, "http:/" "/", ""); xs *s1 = xs_replace(s, "https:/" "/", ""); xs *l = xs_split(s1, "/"); - char *p = xs_list_get(l, 0); + const char *p = xs_list_get(l, 0); xs *md5 = xs_md5_hex(p, strlen(p)); return xs_fmt("%s/block/%s", srv_basedir, md5); @@ -2279,7 +2280,7 @@ int content_match(const char *file, const xs_dict *msg) xs *fn = xs_fmt("%s/%s", srv_basedir, file); FILE *f; int r = 0; - char *v = xs_dict_get(msg, "content"); + const char *v = xs_dict_get(msg, "content"); if (xs_type(v) == XSTYPE_STRING && *v) { if ((f = fopen(fn, "r")) != NULL) { @@ -2386,7 +2387,7 @@ xs_list *content_search(snac *user, const char *regex, if (id == NULL || is_hidden(user, id)) continue; - char *content = xs_dict_get(post, "content"); + const char *content = xs_dict_get(post, "content"); if (xs_is_null(content)) continue; @@ -2639,7 +2640,7 @@ void enqueue_input(snac *snac, const xs_dict *msg, const xs_dict *req, int retri /* enqueues an input message */ { xs *qmsg = _new_qmsg("input", msg, retries); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", snac->basedir, ntid); qmsg = xs_dict_append(qmsg, "req", req); @@ -2654,7 +2655,7 @@ void enqueue_shared_input(const xs_dict *msg, const xs_dict *req, int retries) /* enqueues an input message from the shared input */ { xs *qmsg = _new_qmsg("input", msg, retries); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); qmsg = xs_dict_append(qmsg, "req", req); @@ -2666,11 +2667,12 @@ void enqueue_shared_input(const xs_dict *msg, const xs_dict *req, int retries) void enqueue_output_raw(const char *keyid, const char *seckey, - xs_dict *msg, xs_str *inbox, int retries, int p_status) + const xs_dict *msg, const xs_str *inbox, + int retries, int p_status) /* enqueues an output message to an inbox */ { xs *qmsg = _new_qmsg("output", msg, retries); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); xs *ns = xs_number_new(p_status); @@ -2690,7 +2692,8 @@ void enqueue_output_raw(const char *keyid, const char *seckey, } -void enqueue_output(snac *snac, xs_dict *msg, xs_str *inbox, int retries, int p_status) +void enqueue_output(snac *snac, const xs_dict *msg, + const xs_str *inbox, int retries, int p_status) /* enqueues an output message to an inbox */ { if (xs_startswith(inbox, snac->actor)) { @@ -2698,13 +2701,14 @@ void enqueue_output(snac *snac, xs_dict *msg, xs_str *inbox, int retries, int p_ return; } - char *seckey = xs_dict_get(snac->key, "secret"); + const char *seckey = xs_dict_get(snac->key, "secret"); enqueue_output_raw(snac->actor, seckey, msg, inbox, retries, p_status); } -void enqueue_output_by_actor(snac *snac, xs_dict *msg, const xs_str *actor, int retries) +void enqueue_output_by_actor(snac *snac, const xs_dict *msg, + const xs_str *actor, int retries) /* enqueues an output message for an actor */ { xs *inbox = get_actor_inbox(actor); @@ -2716,11 +2720,11 @@ void enqueue_output_by_actor(snac *snac, xs_dict *msg, const xs_str *actor, int } -void enqueue_email(xs_str *msg, int retries) +void enqueue_email(const xs_str *msg, int retries) /* enqueues an email message to be sent */ { xs *qmsg = _new_qmsg("email", msg, retries); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); qmsg = _enqueue_put(fn, qmsg); @@ -2733,7 +2737,7 @@ void enqueue_telegram(const xs_str *msg, const char *bot, const char *chat_id) /* enqueues a message to be sent via Telegram */ { xs *qmsg = _new_qmsg("telegram", msg, 0); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); qmsg = xs_dict_append(qmsg, "bot", bot); @@ -2748,7 +2752,7 @@ void enqueue_ntfy(const xs_str *msg, const char *ntfy_server, const char *ntfy_t /* enqueues a message to be sent via ntfy */ { xs *qmsg = _new_qmsg("ntfy", msg, 0); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); qmsg = xs_dict_append(qmsg, "ntfy_server", ntfy_server); @@ -2764,7 +2768,7 @@ void enqueue_message(snac *snac, const xs_dict *msg) /* enqueues an output message */ { xs *qmsg = _new_qmsg("message", msg, 0); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", snac->basedir, ntid); qmsg = _enqueue_put(fn, qmsg); @@ -2807,7 +2811,7 @@ void enqueue_verify_links(snac *user) /* enqueues a link verification */ { xs *qmsg = _new_qmsg("verify_links", "", 0); - char *ntid = xs_dict_get(qmsg, "ntid"); + const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); qmsg = _enqueue_put(fn, qmsg); @@ -2832,42 +2836,6 @@ void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs) } -void enqueue_request_replies(snac *user, const char *id) -/* enqueues a request for the replies of a message */ -{ - /* test first if this precise request is already in the queue */ - xs *queue = user_queue(user); - xs_list *p = queue; - xs_str *v; - - while (xs_list_iter(&p, &v)) { - xs *q_item = queue_get(v); - - if (q_item != NULL) { - const char *type = xs_dict_get(q_item, "type"); - const char *msg = xs_dict_get(q_item, "message"); - - if (type && msg && strcmp(type, "request_replies") == 0 && strcmp(msg, id) == 0) { - /* don't requeue */ - snac_debug(user, 1, xs_fmt("enqueue_request_replies already here %s", id)); - return; - } - } - } - - /* not there; enqueue the request with a small delay */ - xs *qmsg = _new_qmsg("request_replies", id, 0); - xs *ntid = tid(10); - xs *fn = xs_fmt("%s/queue/%s.json", user->basedir, ntid); - - qmsg = xs_dict_set(qmsg, "ntid", ntid); - - qmsg = _enqueue_put(fn, qmsg); - - snac_debug(user, 2, xs_fmt("enqueue_request_replies %s", id)); -} - - int was_question_voted(snac *user, const char *id) /* returns true if the user voted in this poll */ { @@ -2881,7 +2849,7 @@ int was_question_voted(snac *user, const char *id) xs *obj = NULL; if (valid_status(object_get_by_md5(md5, &obj))) { - char *atto = get_atto(obj); + const char *atto = get_atto(obj); if (atto && strcmp(atto, user->actor) == 0 && !xs_is_null(xs_dict_get(obj, "name"))) { voted = 1; @@ -3055,7 +3023,7 @@ void purge_server(void) if (mtime_nl(v2, &n_link) < mt && n_link < 2) { xs *s1 = xs_replace(v2, ".json", ""); xs *l = xs_split(s1, "/"); - char *md5 = xs_list_get(l, -1); + const char *md5 = xs_list_get(l, -1); object_del_by_md5(md5); cnt++; @@ -3147,7 +3115,7 @@ void purge_user(snac *snac) /* do the purge for this user */ { int priv_days, pub_days, user_days = 0; - char *v; + const char *v; int n; priv_days = xs_number_get(xs_dict_get(srv_config, "timeline_purge_days")); @@ -3256,7 +3224,7 @@ void srv_archive(const char *direction, const char *url, xs_dict *req, if (p_size && payload) { xs *payload_fn = NULL; xs *payload_fn_raw = NULL; - char *v = xs_dict_get(req, "content-type"); + const char *v = xs_dict_get(req, "content-type"); if (v && xs_str_in(v, "json") != -1) { payload_fn = xs_fmt("%s/payload.json", dir); @@ -3287,7 +3255,7 @@ void srv_archive(const char *direction, const char *url, xs_dict *req, if (b_size && body) { xs *body_fn = NULL; - char *v = xs_dict_get(headers, "content-type"); + const char *v = xs_dict_get(headers, "content-type"); if (v && xs_str_in(v, "json") != -1) { body_fn = xs_fmt("%s/body.json", dir); @@ -3356,7 +3324,7 @@ void srv_archive_error(const char *prefix, const xs_str *err, } -void srv_archive_qitem(char *prefix, xs_dict *q_item) +void srv_archive_qitem(const char *prefix, xs_dict *q_item) /* archives a q_item in the error folder */ { xs *ntid = tid(0); -- cgit v1.2.3 From 8fd070bb9a1a8e355f0899ef2f02c55ab90a09d8 Mon Sep 17 00:00:00 2001 From: default Date: Wed, 22 May 2024 14:14:29 +0200 Subject: Fixed warning. --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 3377f3e..6ac115d 100644 --- a/data.c +++ b/data.c @@ -114,7 +114,7 @@ int srv_open(const char *basedir, int auto_upgrade) #endif #ifdef __OpenBSD__ - char *v = xs_dict_get(srv_config, "disable_openbsd_security"); + const char *v = xs_dict_get(srv_config, "disable_openbsd_security"); if (v && xs_type(v) == XSTYPE_TRUE) { srv_debug(1, xs_dup("OpenBSD security disabled by admin")); -- cgit v1.2.3 From 8cf7559a7e21c5757455b948814d61e6e96f08f1 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 23 May 2024 10:01:37 +0200 Subject: Added more const. --- data.c | 58 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 27 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 6ac115d..f507078 100644 --- a/data.c +++ b/data.c @@ -193,7 +193,7 @@ int user_open(snac *user, const char *uid) xs *lcuid = xs_tolower_i(xs_dup(uid)); xs *ulist = user_list(); xs_list *p = ulist; - xs_str *v; + const xs_str *v; while (xs_list_iter(&p, &v)) { xs *v2 = xs_tolower_i(xs_dup(v)); @@ -289,7 +289,7 @@ int user_open_by_md5(snac *snac, const char *md5) { xs *ulist = user_list(); xs_list *p = ulist; - xs_str *v; + const xs_str *v; while (xs_list_iter(&p, &v)) { user_open(snac, v); @@ -772,7 +772,8 @@ int object_del_by_md5(const char *md5) xs *spec = xs_dup(fn); spec = xs_replace_i(spec, ".json", "*.idx"); xs *files = xs_glob(spec, 0, 0); - char *p, *v; + char *p; + const char *v; p = files; while (xs_list_iter(&p, &v)) { @@ -1033,7 +1034,8 @@ xs_list *follower_list(snac *snac) { xs *list = object_user_cache_list(snac, "followers", XS_ALL, 0); xs_list *fwers = xs_list_new(); - char *p, *v; + char *p; + const char *v; /* resolve the list of md5 to be a list of actors */ p = list; @@ -1196,7 +1198,7 @@ xs_list *timeline_top_level(snac *snac, const xs_list *list) /* returns the top level md5 entries from this index */ { xs_set seen; - xs_str *v; + const xs_str *v; xs_set_init(&seen); @@ -1367,7 +1369,7 @@ xs_list *following_list(snac *snac) xs *spec = xs_fmt("%s/following/" "*.json", snac->basedir); xs *glist = xs_glob(spec, 0, 0); xs_list *p; - xs_str *v; + const xs_str *v; xs_list *list = xs_list_new(); /* iterate the list of files */ @@ -1537,7 +1539,8 @@ void hide(snac *snac, const char *id) /* hide all the children */ xs *chld = object_children(id); - char *p, *v; + char *p; + const char *v; p = chld; while (xs_list_iter(&p, &v)) { @@ -1694,7 +1697,7 @@ void tag_index(const char *id, const xs_dict *obj) mkdirx(g_tag_dir); - xs_dict *v; + const xs_dict *v; int ct = 0; while (xs_list_next(tags, &v, &ct)) { const char *type = xs_dict_get(v, "type"); @@ -1758,7 +1761,7 @@ xs_val *list_maint(snac *user, const char *list, int op) xs *spec = xs_fmt("%s/list/" "*.id", user->basedir); xs *ls = xs_glob(spec, 0, 0); int c = 0; - char *v; + const char *v; l = xs_list_new(); @@ -1784,7 +1787,7 @@ xs_val *list_maint(snac *user, const char *list, int op) { xs *lol = list_maint(user, NULL, 0); int c = 0; - xs_list *v; + const xs_list *v; int add = 1; /* check if this list name already exists */ @@ -1925,7 +1928,7 @@ void list_distribute(snac *user, const char *who, const xs_dict *post) xs *spec = xs_fmt("%s/list/" "*.lst", user->basedir); xs *ls = xs_glob(spec, 0, 0); int c = 0; - char *v; + const char *v; while (xs_list_next(ls, &v, &c)) { /* is the actor in this list? */ @@ -2183,7 +2186,7 @@ xs_list *inbox_list(void) xs *spec = xs_fmt("%s/inbox/" "*", srv_basedir); xs *files = xs_glob(spec, 0, 0); xs_list *p = files; - xs_val *v; + const xs_val *v; while (xs_list_iter(&p, &v)) { FILE *f; @@ -2329,8 +2332,8 @@ xs_list *content_search(snac *user, const char *regex, /* iterate all timelines simultaneously */ xs_list *tls[3] = {0}; - char *md5s[3] = {0}; - int c[3] = {0}; + const char *md5s[3] = {0}; + int c[3] = {0}; tls[0] = timeline_simple_list(user, "public", 0, XS_ALL); /* public */ tls[1] = timeline_instance_list(0, XS_ALL); /* instance */ @@ -2368,7 +2371,7 @@ xs_list *content_search(snac *user, const char *regex, if (newest == -1) break; - char *md5 = md5s[newest]; + const char *md5 = md5s[newest]; /* advance the chosen timeline */ if (!xs_list_next(tls[newest], &md5s[newest], &c[newest])) @@ -2534,7 +2537,7 @@ xs_list *notify_list(snac *snac, int skip, int show) xs *spec = xs_fmt("%s/notify/" "*.json", snac->basedir); xs *lst = xs_glob(spec, 1, 0); xs_list *p = lst; - char *v; + const char *v; while (xs_list_iter(&p, &v)) { char *p = strrchr(v, '.'); @@ -2562,7 +2565,7 @@ int notify_new_num(snac *snac) int cnt = 0; xs_list *p = lst; - xs_str *v; + const xs_str *v; while (xs_list_iter(&p, &v)) { xs *id = xs_strip_i(xs_dup(v)); @@ -2584,7 +2587,7 @@ void notify_clear(snac *snac) xs *spec = xs_fmt("%s/notify/" "*", snac->basedir); xs *lst = xs_glob(spec, 0, 0); xs_list *p = lst; - xs_str *v; + const xs_str *v; while (xs_list_iter(&p, &v)) unlink(v); @@ -2842,7 +2845,7 @@ int was_question_voted(snac *user, const char *id) xs *children = object_children(id); int voted = 0; xs_list *p; - xs_str *md5; + const xs_str *md5; p = children; while (xs_list_iter(&p, &md5)) { @@ -2869,7 +2872,7 @@ xs_list *user_queue(snac *snac) xs_list *list = xs_list_new(); time_t t = time(NULL); xs_list *p; - xs_val *v; + const xs_val *v; xs *fns = xs_glob(spec, 0, 0); @@ -2898,7 +2901,7 @@ xs_list *queue(void) xs_list *list = xs_list_new(); time_t t = time(NULL); xs_list *p; - xs_val *v; + const xs_val *v; xs *fns = xs_glob(spec, 0, 0); @@ -2974,7 +2977,7 @@ static void _purge_dir(const char *dir, int days) xs *spec = xs_fmt("%s/" "*", dir); xs *list = xs_glob(spec, 0, 0); xs_list *p; - xs_str *v; + const xs_str *v; p = list; while (xs_list_iter(&p, &v)) @@ -3000,7 +3003,7 @@ void purge_server(void) xs *spec = xs_fmt("%s/object/??", srv_basedir); xs *dirs = xs_glob(spec, 0, 0); xs_list *p; - xs_str *v; + const xs_str *v; int cnt = 0; int icnt = 0; @@ -3009,7 +3012,7 @@ void purge_server(void) p = dirs; while (xs_list_iter(&p, &v)) { xs_list *p2; - xs_str *v2; + const xs_str *v2; { xs *spec2 = xs_fmt("%s/" "*.json", v); @@ -3088,7 +3091,7 @@ void purge_server(void) xs *spec2 = xs_fmt("%s/" "*.idx", v); xs *files = xs_glob(spec2, 0, 0); xs_list *p2; - xs_str *v2; + const xs_str *v2; p2 = files; while (xs_list_iter(&p2, &v2)) { @@ -3152,7 +3155,7 @@ void purge_user(snac *snac) xs *spec = xs_fmt("%s/list/" "*.idx", snac->basedir); xs *lol = xs_glob(spec, 0, 0); int c = 0; - char *v; + const char *v; while (xs_list_next(lol, &v, &c)) { int gc = index_gc(v); @@ -3170,7 +3173,8 @@ void purge_all(void) { snac snac; xs *list = user_list(); - char *p, *uid; + char *p; + const char *uid; p = list; while (xs_list_iter(&p, &uid)) { -- cgit v1.2.3 From fcead8ea9686d4707f95e9249d955284d22d4ec2 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 24 May 2024 12:05:31 +0200 Subject: Also delete the list .idx.bak. --- data.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index f507078..1866d5e 100644 --- a/data.c +++ b/data.c @@ -1831,6 +1831,9 @@ xs_val *list_maint(snac *user, const char *list, int op) fn = xs_replace_i(fn, ".lst", ".idx"); unlink(fn); + + fn = xs_append(fn, ".bak"); + unlink(fn); } } -- cgit v1.2.3 From a787c818b2c52b5bf30d13bb8f3490a92dd8bdcb Mon Sep 17 00:00:00 2001 From: default Date: Fri, 24 May 2024 12:12:03 +0200 Subject: Added links to the lists in html_timeline(). --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 1866d5e..edbc64f 100644 --- a/data.c +++ b/data.c @@ -1832,7 +1832,7 @@ xs_val *list_maint(snac *user, const char *list, int op) fn = xs_replace_i(fn, ".lst", ".idx"); unlink(fn); - fn = xs_append(fn, ".bak"); + fn = xs_str_cat(fn, ".bak"); unlink(fn); } } -- cgit v1.2.3