diff options
| -rw-r--r-- | activitypub.c | 18 | ||||
| -rw-r--r-- | data.c | 29 | ||||
| -rw-r--r-- | snac.h | 1 |
3 files changed, 46 insertions, 2 deletions
diff --git a/activitypub.c b/activitypub.c index bdee395..4a7c247 100644 --- a/activitypub.c +++ b/activitypub.c | |||
| @@ -165,6 +165,9 @@ int activitypub_get_handler(d_char *req, char *q_path, | |||
| 165 | snac snac; | 165 | snac snac; |
| 166 | xs *msg = xs_dict_new(); | 166 | xs *msg = xs_dict_new(); |
| 167 | 167 | ||
| 168 | if (accept == NULL) | ||
| 169 | return 400; | ||
| 170 | |||
| 168 | if (xs_str_in(accept, "application/activity+json") == -1 && | 171 | if (xs_str_in(accept, "application/activity+json") == -1 && |
| 169 | xs_str_in(accept, "application/ld+json") == -1) | 172 | xs_str_in(accept, "application/ld+json") == -1) |
| 170 | return 0; | 173 | return 0; |
| @@ -222,11 +225,14 @@ int activitypub_post_handler(d_char *req, char *q_path, | |||
| 222 | char **body, int *b_size, char **ctype) | 225 | char **body, int *b_size, char **ctype) |
| 223 | /* processes an input message */ | 226 | /* processes an input message */ |
| 224 | { | 227 | { |
| 225 | int status = 200; | 228 | int status = 202; /* accepted */ |
| 226 | char *headers = xs_dict_get(req, "headers"); | 229 | char *headers = xs_dict_get(req, "headers"); |
| 227 | char *i_ctype = xs_dict_get(headers, "content-type"); | 230 | char *i_ctype = xs_dict_get(headers, "content-type"); |
| 228 | snac snac; | 231 | snac snac; |
| 229 | 232 | ||
| 233 | if (i_ctype == NULL) | ||
| 234 | return 400; | ||
| 235 | |||
| 230 | if (xs_str_in(i_ctype, "application/activity+json") == -1 && | 236 | if (xs_str_in(i_ctype, "application/activity+json") == -1 && |
| 231 | xs_str_in(i_ctype, "application/ld+json") == -1) | 237 | xs_str_in(i_ctype, "application/ld+json") == -1) |
| 232 | return 0; | 238 | return 0; |
| @@ -247,6 +253,16 @@ int activitypub_post_handler(d_char *req, char *q_path, | |||
| 247 | return 404; | 253 | return 404; |
| 248 | } | 254 | } |
| 249 | 255 | ||
| 256 | /* decode */ | ||
| 257 | xs *msg = xs_json_loads(payload); | ||
| 258 | |||
| 259 | if (msg && xs_dict_get(msg, "actor") && xs_dict_get(msg, "type")) | ||
| 260 | enqueue_input(&snac, msg); | ||
| 261 | else { | ||
| 262 | srv_log(xs_fmt("activitypub_post_handler JSON error %s", q_path)); | ||
| 263 | status = 400; | ||
| 264 | } | ||
| 265 | |||
| 250 | user_free(&snac); | 266 | user_free(&snac); |
| 251 | 267 | ||
| 252 | return status; | 268 | return status; |
| @@ -709,6 +709,33 @@ int actor_get(snac *snac, char *actor, d_char **data) | |||
| 709 | } | 709 | } |
| 710 | 710 | ||
| 711 | 711 | ||
| 712 | void enqueue_input(snac *snac, char *msg) | ||
| 713 | /* enqueues an input message */ | ||
| 714 | { | ||
| 715 | xs *ntid = tid(0); | ||
| 716 | xs *fn = xs_fmt("%s/queue/%s.json", snac->basedir, ntid); | ||
| 717 | xs *tfn = xs_str_cat(fn, ".tmp"); | ||
| 718 | FILE *f; | ||
| 719 | |||
| 720 | if ((f = fopen(tfn, "w")) != NULL) { | ||
| 721 | xs *qmsg = xs_dict_new(); | ||
| 722 | xs *j; | ||
| 723 | |||
| 724 | qmsg = xs_dict_append(qmsg, "type", "input"); | ||
| 725 | qmsg = xs_dict_append(qmsg, "object", msg); | ||
| 726 | |||
| 727 | j = xs_json_dumps_pp(qmsg, 4); | ||
| 728 | |||
| 729 | fwrite(j, strlen(j), 1, f); | ||
| 730 | fclose(f); | ||
| 731 | |||
| 732 | rename(tfn, fn); | ||
| 733 | |||
| 734 | snac_debug(snac, 2, xs_fmt("enqueue_input %s", fn)); | ||
| 735 | } | ||
| 736 | } | ||
| 737 | |||
| 738 | |||
| 712 | void enqueue_output(snac *snac, char *actor, char *msg, int retries) | 739 | void enqueue_output(snac *snac, char *actor, char *msg, int retries) |
| 713 | /* enqueues an output message for an actor */ | 740 | /* enqueues an output message for an actor */ |
| 714 | { | 741 | { |
| @@ -740,7 +767,7 @@ void enqueue_output(snac *snac, char *actor, char *msg, int retries) | |||
| 740 | 767 | ||
| 741 | rename(tfn, fn); | 768 | rename(tfn, fn); |
| 742 | 769 | ||
| 743 | snac_debug(snac, 2, xs_fmt("enqueue %s %s %d", actor, fn, retries)); | 770 | snac_debug(snac, 2, xs_fmt("enqueue_output %s %s %d", actor, fn, retries)); |
| 744 | } | 771 | } |
| 745 | } | 772 | } |
| 746 | 773 | ||
| @@ -64,6 +64,7 @@ int is_muted(snac *snac, char *actor); | |||
| 64 | int actor_add(snac *snac, char *actor, char *msg); | 64 | int actor_add(snac *snac, char *actor, char *msg); |
| 65 | int actor_get(snac *snac, char *actor, d_char **data); | 65 | int actor_get(snac *snac, char *actor, d_char **data); |
| 66 | 66 | ||
| 67 | void enqueue_input(snac *snac, char *msg); | ||
| 67 | void enqueue_output(snac *snac, char *actor, char *msg, int retries); | 68 | void enqueue_output(snac *snac, char *actor, char *msg, int retries); |
| 68 | 69 | ||
| 69 | d_char *queue(snac *snac); | 70 | d_char *queue(snac *snac); |