commit 8c959fc

David Vaughan  ·  2026-02-06 23:45:48 +0000 UTC
parent fdb2be4
Prevent voting via mastoapi if closed or we already voted
1 files changed,  +40, -24
+40, -24
 1@@ -3693,41 +3693,57 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
 2                 if (found) {
 3                     const char *id   = xs_dict_get(msg, "id");
 4                     const char *atto = get_atto(msg);
 5+                    int closed = 0;
 6+                    const char *f_closed = NULL;
 7 
 8-                    const xs_list *opts = xs_dict_get(msg, "oneOf");
 9-                    if (opts == NULL)
10-                        opts = xs_dict_get(msg, "anyOf");
11+                    if ((f_closed = xs_dict_get(msg, "closed")) != NULL) {
12+                        /* it has a closed date... but is it in the past? */
13+                        time_t t0 = time(NULL);
14+                        time_t t1 = xs_parse_iso_date(f_closed, 0);
15 
16-                    if (op == NULL) {
17+                        if (t1 < t0)
18+                            closed = 1;
19                     }
20-                    else
21-                    if (strcmp(op, "votes") == 0) {
22-                        const xs_list *choices = xs_dict_get(args, "choices[]");
23 
24-                        if (xs_is_null(choices))
25-                            choices = xs_dict_get(args, "choices");
26+                    if (closed || was_question_voted(&snac, id))
27+                        status = HTTP_STATUS_UNPROCESSABLE_CONTENT;
28+                    else {
29+                        const xs_list *opts = xs_dict_get(msg, "oneOf");
30+                        if (opts == NULL)
31+                            opts = xs_dict_get(msg, "anyOf");
32+
33+                        if (op == NULL) {
34+                        }
35+                        else {
36+                            if (strcmp(op, "votes") == 0) {
37+                                const xs_list *choices = xs_dict_get(args, "choices[]");
38 
39-                        if (xs_type(choices) == XSTYPE_LIST) {
40-                            const xs_str *v;
41+                                if (xs_is_null(choices))
42+                                    choices = xs_dict_get(args, "choices");
43 
44-                            int c = 0;
45-                            while (xs_list_next(choices, &v, &c)) {
46-                                int io           = atoi(v);
47-                                const xs_dict *o = xs_list_get(opts, io);
48+                                if (xs_type(choices) == XSTYPE_LIST) {
49+                                    const xs_str *v;
50 
51-                                if (o) {
52-                                    const char *name = xs_dict_get(o, "name");
53+                                    int c = 0;
54+                                    while (xs_list_next(choices, &v, &c)) {
55+                                        int io           = atoi(v);
56+                                        const xs_dict *o = xs_list_get(opts, io);
57 
58-                                    xs *msg = msg_note(&snac, "", atto, (char *)id, NULL, 1, NULL, NULL);
59-                                    msg = xs_dict_append(msg, "name", name);
60+                                        if (o) {
61+                                            const char *name = xs_dict_get(o, "name");
62 
63-                                    xs *c_msg = msg_create(&snac, msg);
64-                                    enqueue_message(&snac, c_msg);
65-                                    timeline_add(&snac, xs_dict_get(msg, "id"), msg);
66+                                            xs *msg = msg_note(&snac, "", atto, (char *)id, NULL, 1, NULL, NULL);
67+                                            msg = xs_dict_append(msg, "name", name);
68+
69+                                            xs *c_msg = msg_create(&snac, msg);
70+                                            enqueue_message(&snac, c_msg);
71+                                            timeline_add(&snac, xs_dict_get(msg, "id"), msg);
72+                                        }
73+                                    }
74+
75+                                    out = mastoapi_poll(&snac, msg);
76                                 }
77                             }
78-
79-                            out = mastoapi_poll(&snac, msg);
80                         }
81                     }
82                 }