diff options
| -rw-r--r-- | activitypub.c | 8 | ||||
| -rw-r--r-- | data.c | 81 | ||||
| -rw-r--r-- | html.c | 7 | ||||
| -rw-r--r-- | snac.h | 6 | ||||
| -rw-r--r-- | upgrade.c | 45 |
5 files changed, 84 insertions, 63 deletions
diff --git a/activitypub.c b/activitypub.c index 7360af1..d22261d 100644 --- a/activitypub.c +++ b/activitypub.c | |||
| @@ -192,12 +192,10 @@ d_char *recipient_list(snac *snac, char *msg, int expand_public) | |||
| 192 | if (expand_public && strcmp(v, public_address) == 0) { | 192 | if (expand_public && strcmp(v, public_address) == 0) { |
| 193 | /* iterate the followers and add them */ | 193 | /* iterate the followers and add them */ |
| 194 | xs *fwers = follower_list(snac); | 194 | xs *fwers = follower_list(snac); |
| 195 | char *fw; | 195 | char *actor; |
| 196 | 196 | ||
| 197 | char *p = fwers; | 197 | char *p = fwers; |
| 198 | while (xs_list_iter(&p, &fw)) { | 198 | while (xs_list_iter(&p, &actor)) { |
| 199 | char *actor = xs_dict_get(fw, "actor"); | ||
| 200 | |||
| 201 | if (xs_list_in(list, actor) == -1) | 199 | if (xs_list_in(list, actor) == -1) |
| 202 | list = xs_list_append(list, actor); | 200 | list = xs_list_append(list, actor); |
| 203 | } | 201 | } |
| @@ -832,7 +830,7 @@ int process_message(snac *snac, char *msg, char *req) | |||
| 832 | 830 | ||
| 833 | timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL); | 831 | timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL); |
| 834 | 832 | ||
| 835 | follower_add(snac, actor, f_msg); | 833 | follower_add(snac, actor); |
| 836 | 834 | ||
| 837 | snac_log(snac, xs_fmt("New follower %s", actor)); | 835 | snac_log(snac, xs_fmt("New follower %s", actor)); |
| 838 | do_notify = 1; | 836 | do_notify = 1; |
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <sys/file.h> | 15 | #include <sys/file.h> |
| 16 | #include <fcntl.h> | 16 | #include <fcntl.h> |
| 17 | 17 | ||
| 18 | double db_layout = 2.4; | 18 | double db_layout = 2.5; |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | int db_upgrade(d_char **error); | 21 | int db_upgrade(d_char **error); |
| @@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir) | |||
| 641 | } | 641 | } |
| 642 | 642 | ||
| 643 | 643 | ||
| 644 | /** specialized functions **/ | 644 | d_char *object_user_cache_list(snac *snac, const char *cachedir, int max) |
| 645 | 645 | /* returns the objects in a cache as a list */ | |
| 646 | d_char *_follower_fn(snac *snac, char *actor) | ||
| 647 | { | 646 | { |
| 648 | xs *md5 = xs_md5_hex(actor, strlen(actor)); | 647 | xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir); |
| 649 | return xs_fmt("%s/followers/%s.json", snac->basedir, md5); | 648 | return index_list(idx, max); |
| 650 | } | 649 | } |
| 651 | 650 | ||
| 652 | 651 | ||
| 653 | int follower_add(snac *snac, char *actor, char *msg) | 652 | /** specialized functions **/ |
| 654 | /* adds a follower */ | ||
| 655 | { | ||
| 656 | int ret = 201; /* created */ | ||
| 657 | xs *fn = _follower_fn(snac, actor); | ||
| 658 | FILE *f; | ||
| 659 | 653 | ||
| 660 | if ((f = fopen(fn, "w")) != NULL) { | 654 | /** followers **/ |
| 661 | xs *j = xs_json_dumps_pp(msg, 4); | ||
| 662 | 655 | ||
| 663 | fwrite(j, 1, strlen(j), f); | 656 | int follower_add(snac *snac, const char *actor) |
| 664 | fclose(f); | 657 | /* adds a follower */ |
| 665 | } | 658 | { |
| 666 | else | 659 | int status = object_user_cache_add(snac, actor, "followers"); |
| 667 | ret = 500; | ||
| 668 | 660 | ||
| 669 | snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn)); | 661 | snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor)); |
| 670 | 662 | ||
| 671 | return ret; | 663 | return status; |
| 672 | } | 664 | } |
| 673 | 665 | ||
| 674 | 666 | ||
| 675 | int follower_del(snac *snac, char *actor) | 667 | int follower_del(snac *snac, const char *actor) |
| 676 | /* deletes a follower */ | 668 | /* deletes a follower */ |
| 677 | { | 669 | { |
| 678 | int status = 200; | 670 | int status = object_user_cache_del(snac, actor, "followers"); |
| 679 | xs *fn = _follower_fn(snac, actor); | ||
| 680 | |||
| 681 | if (fn != NULL) | ||
| 682 | unlink(fn); | ||
| 683 | else | ||
| 684 | status = 404; | ||
| 685 | 671 | ||
| 686 | snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn)); | 672 | snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor)); |
| 687 | 673 | ||
| 688 | return status; | 674 | return status; |
| 689 | } | 675 | } |
| 690 | 676 | ||
| 691 | 677 | ||
| 692 | int follower_check(snac *snac, char *actor) | 678 | int follower_check(snac *snac, const char *actor) |
| 693 | /* checks if someone is a follower */ | 679 | /* checks if someone is a follower */ |
| 694 | { | 680 | { |
| 695 | xs *fn = _follower_fn(snac, actor); | 681 | return object_user_cache_in(snac, actor, "followers"); |
| 696 | |||
| 697 | return !!(mtime(fn) != 0.0); | ||
| 698 | } | 682 | } |
| 699 | 683 | ||
| 700 | 684 | ||
| 701 | d_char *follower_list(snac *snac) | 685 | d_char *follower_list(snac *snac) |
| 702 | /* returns the list of followers */ | 686 | /* returns the list of followers */ |
| 703 | { | 687 | { |
| 704 | xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir); | 688 | xs *list = object_user_cache_list(snac, "followers", XS_ALL); |
| 705 | xs *glist = xs_glob(spec, 0, 0); | 689 | d_char *fwers = xs_list_new(); |
| 706 | char *p, *v; | 690 | char *p, *v; |
| 707 | d_char *list = xs_list_new(); | ||
| 708 | 691 | ||
| 709 | /* iterate the list of files */ | 692 | /* resolve the list of md5 to be a list of actors */ |
| 710 | p = glist; | 693 | p = list; |
| 711 | while (xs_list_iter(&p, &v)) { | 694 | while (xs_list_iter(&p, &v)) { |
| 712 | FILE *f; | 695 | xs *a_obj = NULL; |
| 713 | 696 | ||
| 714 | /* load the follower data */ | 697 | if (valid_status(object_get_by_md5(v, &a_obj, NULL))) { |
| 715 | if ((f = fopen(v, "r")) != NULL) { | 698 | char *actor = xs_dict_get(a_obj, "id"); |
| 716 | xs *j = xs_readall(f); | ||
| 717 | fclose(f); | ||
| 718 | 699 | ||
| 719 | if (j != NULL) { | 700 | if (!xs_is_null(actor)) |
| 720 | xs *o = xs_json_loads(j); | 701 | fwers = xs_list_append(fwers, actor); |
| 721 | |||
| 722 | if (o != NULL) | ||
| 723 | list = xs_list_append(list, o); | ||
| 724 | } | ||
| 725 | } | 702 | } |
| 726 | } | 703 | } |
| 727 | 704 | ||
| 728 | return list; | 705 | return fwers; |
| 729 | } | 706 | } |
| 730 | 707 | ||
| 731 | 708 | ||
| 709 | /** timeline **/ | ||
| 710 | |||
| 732 | double timeline_mtime(snac *snac) | 711 | double timeline_mtime(snac *snac) |
| 733 | { | 712 | { |
| 734 | xs *fn = xs_fmt("%s/timeline", snac->basedir); | 713 | xs *fn = xs_fmt("%s/timeline", snac->basedir); |
| @@ -840,13 +840,12 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade | |||
| 840 | { | 840 | { |
| 841 | xs *s = xs_str_new(NULL); | 841 | xs *s = xs_str_new(NULL); |
| 842 | xs *h = xs_fmt("<h2>%s</h2>\n", header); | 842 | xs *h = xs_fmt("<h2>%s</h2>\n", header); |
| 843 | char *p, *v; | 843 | char *p, *actor_id; |
| 844 | 844 | ||
| 845 | s = xs_str_cat(s, h); | 845 | s = xs_str_cat(s, h); |
| 846 | 846 | ||
| 847 | p = list; | 847 | p = list; |
| 848 | while (xs_list_iter(&p, &v)) { | 848 | while (xs_list_iter(&p, &actor_id)) { |
| 849 | char *actor_id = xs_dict_get(v, "actor"); | ||
| 850 | xs *md5 = xs_md5_hex(actor_id, strlen(actor_id)); | 849 | xs *md5 = xs_md5_hex(actor_id, strlen(actor_id)); |
| 851 | xs *actor = NULL; | 850 | xs *actor = NULL; |
| 852 | 851 | ||
| @@ -939,7 +938,7 @@ d_char *html_people(snac *snac) | |||
| 939 | 938 | ||
| 940 | s = html_user_header(snac, s, 0); | 939 | s = html_user_header(snac, s, 0); |
| 941 | 940 | ||
| 942 | s = html_people_list(snac, s, wing, L("People you follow"), "i"); | 941 | // s = html_people_list(snac, s, wing, L("People you follow"), "i"); |
| 943 | 942 | ||
| 944 | s = html_people_list(snac, s, wers, L("People that follows you"), "e"); | 943 | s = html_people_list(snac, s, wers, L("People that follows you"), "e"); |
| 945 | 944 | ||
| @@ -62,9 +62,9 @@ d_char *index_list_desc(const char *fn, int max); | |||
| 62 | int object_del(const char *id); | 62 | int object_del(const char *id); |
| 63 | int object_del_if_unref(const char *id); | 63 | int object_del_if_unref(const char *id); |
| 64 | 64 | ||
| 65 | int follower_add(snac *snac, char *actor, char *msg); | 65 | int follower_add(snac *snac, const char *actor); |
| 66 | int follower_del(snac *snac, char *actor); | 66 | int follower_del(snac *snac, const char *actor); |
| 67 | int follower_check(snac *snac, char *actor); | 67 | int follower_check(snac *snac, const char *actor); |
| 68 | d_char *follower_list(snac *snac); | 68 | d_char *follower_list(snac *snac); |
| 69 | 69 | ||
| 70 | double timeline_mtime(snac *snac); | 70 | double timeline_mtime(snac *snac); |
| @@ -128,6 +128,51 @@ int db_upgrade(d_char **error) | |||
| 128 | 128 | ||
| 129 | nf = 2.4; | 129 | nf = 2.4; |
| 130 | } | 130 | } |
| 131 | else | ||
| 132 | if (f < 2.5) { | ||
| 133 | /* upgrade followers */ | ||
| 134 | xs *users = user_list(); | ||
| 135 | char *p, *v; | ||
| 136 | |||
| 137 | xs_debug(); | ||
| 138 | |||
| 139 | p = users; | ||
| 140 | while (xs_list_iter(&p, &v)) { | ||
| 141 | snac snac; | ||
| 142 | |||
| 143 | if (user_open(&snac, v)) { | ||
| 144 | xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir); | ||
| 145 | xs *dir = xs_glob(spec, 0, 0); | ||
| 146 | char *p, *v; | ||
| 147 | |||
| 148 | p = dir; | ||
| 149 | while (xs_list_iter(&p, &v)) { | ||
| 150 | FILE *f; | ||
| 151 | |||
| 152 | if ((f = fopen(v, "r")) != NULL) { | ||
| 153 | xs *s = xs_readall(f); | ||
| 154 | xs *o = xs_json_loads(s); | ||
| 155 | fclose(f); | ||
| 156 | |||
| 157 | char *type = xs_dict_get(o, "type"); | ||
| 158 | |||
| 159 | if (!xs_is_null(type) && strcmp(type, "Follow") == 0) { | ||
| 160 | unlink(v); | ||
| 161 | |||
| 162 | char *actor = xs_dict_get(o, "actor"); | ||
| 163 | |||
| 164 | if (!xs_is_null(actor)) | ||
| 165 | follower_add(&snac, actor); | ||
| 166 | } | ||
| 167 | } | ||
| 168 | } | ||
| 169 | |||
| 170 | user_free(&snac); | ||
| 171 | } | ||
| 172 | } | ||
| 173 | |||
| 174 | nf = 2.5; | ||
| 175 | } | ||
| 131 | 176 | ||
| 132 | if (f < nf) { | 177 | if (f < nf) { |
| 133 | f = nf; | 178 | f = nf; |