summaryrefslogtreecommitdiff
path: root/data.c
diff options
context:
space:
mode:
authorGravatar shtrophic2024-12-23 13:42:45 +0100
committerGravatar shtrophic2024-12-23 13:42:45 +0100
commita7ca4007f2a55a8becab1e4595d2696dd6e7bfd1 (patch)
tree3128196bd7eb298be5a37edac5922009ec5fcac1 /data.c
parentMerge tag '2.66' (diff)
parentVersion 2.67 RELEASED. (diff)
downloadpenes-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.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/data.c b/data.c
index 8a3fe2d..eb4c9d5 100644
--- a/data.c
+++ b/data.c
@@ -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
2806xs_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
2831xs_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
2790void notify_add(snac *snac, const char *type, const char *utype, 2875void 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
3859xs_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
3870int _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
3892int 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
3936void 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}