diff options
| author | 2024-12-23 13:42:45 +0100 | |
|---|---|---|
| committer | 2024-12-23 13:42:45 +0100 | |
| commit | a7ca4007f2a55a8becab1e4595d2696dd6e7bfd1 (patch) | |
| tree | 3128196bd7eb298be5a37edac5922009ec5fcac1 /data.c | |
| parent | Merge tag '2.66' (diff) | |
| parent | Version 2.67 RELEASED. (diff) | |
| download | penes-snac2-a7ca4007f2a55a8becab1e4595d2696dd6e7bfd1.tar.gz penes-snac2-a7ca4007f2a55a8becab1e4595d2696dd6e7bfd1.tar.xz penes-snac2-a7ca4007f2a55a8becab1e4595d2696dd6e7bfd1.zip | |
Merge tag '2.67'
Version 2.67 RELEASED.
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 190 |
1 files changed, 190 insertions, 0 deletions
| @@ -2705,6 +2705,23 @@ xs_list *content_search(snac *user, const char *regex, | |||
| 2705 | if (id == NULL || is_hidden(user, id)) | 2705 | if (id == NULL || is_hidden(user, id)) |
| 2706 | continue; | 2706 | continue; |
| 2707 | 2707 | ||
| 2708 | /* test for the post URL */ | ||
| 2709 | if (strcmp(id, regex) == 0) { | ||
| 2710 | if (xs_set_add(&seen, md5) == 1) | ||
| 2711 | show--; | ||
| 2712 | |||
| 2713 | continue; | ||
| 2714 | } | ||
| 2715 | |||
| 2716 | /* test for the alternate post id */ | ||
| 2717 | const char *url = xs_dict_get(post, "url"); | ||
| 2718 | if (xs_type(url) == XSTYPE_STRING && strcmp(url, regex) == 0) { | ||
| 2719 | if (xs_set_add(&seen, md5) == 1) | ||
| 2720 | show--; | ||
| 2721 | |||
| 2722 | continue; | ||
| 2723 | } | ||
| 2724 | |||
| 2708 | xs *c = xs_str_new(NULL); | 2725 | xs *c = xs_str_new(NULL); |
| 2709 | const char *content = xs_dict_get(post, "content"); | 2726 | const char *content = xs_dict_get(post, "content"); |
| 2710 | const char *name = xs_dict_get(post, "name"); | 2727 | const char *name = xs_dict_get(post, "name"); |
| @@ -2786,6 +2803,74 @@ xs_str *notify_check_time(snac *snac, int reset) | |||
| 2786 | return t; | 2803 | return t; |
| 2787 | } | 2804 | } |
| 2788 | 2805 | ||
| 2806 | xs_dict *markers_get(snac *snac, const xs_list *markers) | ||
| 2807 | { | ||
| 2808 | xs *data = NULL; | ||
| 2809 | xs_dict *returns = xs_dict_new(); | ||
| 2810 | xs *fn = xs_fmt("%s/markers.json", snac->basedir); | ||
| 2811 | const xs_str *v = NULL; | ||
| 2812 | FILE *f; | ||
| 2813 | |||
| 2814 | if ((f = fopen(fn, "r")) != NULL) { | ||
| 2815 | data = xs_json_load(f); | ||
| 2816 | fclose(f); | ||
| 2817 | } | ||
| 2818 | |||
| 2819 | if (xs_is_null(data)) | ||
| 2820 | data = xs_dict_new(); | ||
| 2821 | |||
| 2822 | xs_list_foreach(markers, v) { | ||
| 2823 | const xs_dict *mark = xs_dict_get(data, v); | ||
| 2824 | if (!xs_is_null(mark)) { | ||
| 2825 | returns = xs_dict_append(returns, v, mark); | ||
| 2826 | } | ||
| 2827 | } | ||
| 2828 | return returns; | ||
| 2829 | } | ||
| 2830 | |||
| 2831 | xs_dict *markers_set(snac *snac, const char *home_marker, const char *notify_marker) | ||
| 2832 | /* gets or sets notification marker */ | ||
| 2833 | { | ||
| 2834 | xs *data = NULL; | ||
| 2835 | xs_dict *written = xs_dict_new(); | ||
| 2836 | xs *fn = xs_fmt("%s/markers.json", snac->basedir); | ||
| 2837 | FILE *f; | ||
| 2838 | |||
| 2839 | if ((f = fopen(fn, "r")) != NULL) { | ||
| 2840 | data = xs_json_load(f); | ||
| 2841 | fclose(f); | ||
| 2842 | } | ||
| 2843 | |||
| 2844 | if (xs_is_null(data)) | ||
| 2845 | data = xs_dict_new(); | ||
| 2846 | |||
| 2847 | if (!xs_is_null(home_marker)) { | ||
| 2848 | xs *home = xs_dict_new(); | ||
| 2849 | xs *s_tid = tid(0); | ||
| 2850 | home = xs_dict_append(home, "last_read_id", home_marker); | ||
| 2851 | home = xs_dict_append(home, "version", xs_stock(0)); | ||
| 2852 | home = xs_dict_append(home, "updated_at", s_tid); | ||
| 2853 | data = xs_dict_set(data, "home", home); | ||
| 2854 | written = xs_dict_append(written, "home", home); | ||
| 2855 | } | ||
| 2856 | |||
| 2857 | if (!xs_is_null(notify_marker)) { | ||
| 2858 | xs *notify = xs_dict_new(); | ||
| 2859 | xs *s_tid = tid(0); | ||
| 2860 | notify = xs_dict_append(notify, "last_read_id", notify_marker); | ||
| 2861 | notify = xs_dict_append(notify, "version", xs_stock(0)); | ||
| 2862 | notify = xs_dict_append(notify, "updated_at", s_tid); | ||
| 2863 | data = xs_dict_set(data, "notifications", notify); | ||
| 2864 | written = xs_dict_append(written, "notifications", notify); | ||
| 2865 | } | ||
| 2866 | |||
| 2867 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 2868 | xs_json_dump(data, 4, f); | ||
| 2869 | fclose(f); | ||
| 2870 | } | ||
| 2871 | |||
| 2872 | return written; | ||
| 2873 | } | ||
| 2789 | 2874 | ||
| 2790 | void notify_add(snac *snac, const char *type, const char *utype, | 2875 | void notify_add(snac *snac, const char *type, const char *utype, |
| 2791 | const char *actor, const char *objid, const xs_dict *msg) | 2876 | const char *actor, const char *objid, const xs_dict *msg) |
| @@ -3767,3 +3852,108 @@ xs_str *make_url(const char *href, const char *proxy, int by_token) | |||
| 3767 | 3852 | ||
| 3768 | return url; | 3853 | return url; |
| 3769 | } | 3854 | } |
| 3855 | |||
| 3856 | |||
| 3857 | /** bad login throttle **/ | ||
| 3858 | |||
| 3859 | xs_str *_badlogin_fn(const char *addr) | ||
| 3860 | { | ||
| 3861 | xs *md5 = xs_md5_hex(addr, strlen(addr)); | ||
| 3862 | xs *dir = xs_fmt("%s/badlogin", srv_basedir); | ||
| 3863 | |||
| 3864 | mkdirx(dir); | ||
| 3865 | |||
| 3866 | return xs_fmt("%s/%s", dir, md5); | ||
| 3867 | } | ||
| 3868 | |||
| 3869 | |||
| 3870 | int _badlogin_read(const char *fn, int *failures) | ||
| 3871 | /* reads a badlogin file */ | ||
| 3872 | { | ||
| 3873 | int ok = 0; | ||
| 3874 | FILE *f; | ||
| 3875 | |||
| 3876 | pthread_mutex_lock(&data_mutex); | ||
| 3877 | |||
| 3878 | if ((f = fopen(fn, "r")) != NULL) { | ||
| 3879 | xs *l = xs_readline(f); | ||
| 3880 | fclose(f); | ||
| 3881 | |||
| 3882 | if (sscanf(l, "%d", failures) == 1) | ||
| 3883 | ok = 1; | ||
| 3884 | } | ||
| 3885 | |||
| 3886 | pthread_mutex_unlock(&data_mutex); | ||
| 3887 | |||
| 3888 | return ok; | ||
| 3889 | } | ||
| 3890 | |||
| 3891 | |||
| 3892 | int badlogin_check(const char *user, const char *addr) | ||
| 3893 | /* checks if this address is authorized to try a login */ | ||
| 3894 | { | ||
| 3895 | int valid = 1; | ||
| 3896 | |||
| 3897 | if (xs_type(addr) == XSTYPE_STRING) { | ||
| 3898 | xs *fn = _badlogin_fn(addr); | ||
| 3899 | double mt = mtime(fn); | ||
| 3900 | |||
| 3901 | if (mt > 0) { | ||
| 3902 | int badlogin_expire = xs_number_get(xs_dict_get_def(srv_config, | ||
| 3903 | "badlogin_expire", "300")); | ||
| 3904 | |||
| 3905 | mt += badlogin_expire; | ||
| 3906 | |||
| 3907 | /* if file is expired, delete and give pass */ | ||
| 3908 | if (mt < time(NULL)) { | ||
| 3909 | srv_debug(1, xs_fmt("Login from %s for %s allowed again", addr, user)); | ||
| 3910 | unlink(fn); | ||
| 3911 | } | ||
| 3912 | else { | ||
| 3913 | int failures; | ||
| 3914 | |||
| 3915 | if (_badlogin_read(fn, &failures)) { | ||
| 3916 | int badlogin_max = xs_number_get(xs_dict_get_def(srv_config, | ||
| 3917 | "badlogin_retries", "5")); | ||
| 3918 | |||
| 3919 | if (failures >= badlogin_max) { | ||
| 3920 | valid = 0; | ||
| 3921 | |||
| 3922 | xs *d = xs_str_iso_date((time_t) mt); | ||
| 3923 | |||
| 3924 | srv_debug(1, | ||
| 3925 | xs_fmt("Login from %s for %s forbidden until %s", addr, user, d)); | ||
| 3926 | } | ||
| 3927 | } | ||
| 3928 | } | ||
| 3929 | } | ||
| 3930 | } | ||
| 3931 | |||
| 3932 | return valid; | ||
| 3933 | } | ||
| 3934 | |||
| 3935 | |||
| 3936 | void badlogin_inc(const char *user, const char *addr) | ||
| 3937 | /* increments a bad login from this address */ | ||
| 3938 | { | ||
| 3939 | if (xs_type(addr) == XSTYPE_STRING) { | ||
| 3940 | int failures = 0; | ||
| 3941 | xs *fn = _badlogin_fn(addr); | ||
| 3942 | FILE *f; | ||
| 3943 | |||
| 3944 | _badlogin_read(fn, &failures); | ||
| 3945 | |||
| 3946 | pthread_mutex_lock(&data_mutex); | ||
| 3947 | |||
| 3948 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 3949 | failures++; | ||
| 3950 | |||
| 3951 | fprintf(f, "%d %s %s\n", failures, addr, user); | ||
| 3952 | fclose(f); | ||
| 3953 | |||
| 3954 | srv_log(xs_fmt("Registered %d login failure(s) from %s for %s", failures, addr, user)); | ||
| 3955 | } | ||
| 3956 | |||
| 3957 | pthread_mutex_unlock(&data_mutex); | ||
| 3958 | } | ||
| 3959 | } | ||