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 }