summaryrefslogtreecommitdiff
path: root/activitypub.c
diff options
context:
space:
mode:
authorpoesty <poesty@noreply.codeberg.org>2023-05-07 07:27:24 +0000
committerpoesty <poesty@noreply.codeberg.org>2023-05-07 07:27:24 +0000
commite65760a349112abce39404ca50f6bc2f1301bed9 (patch)
treec2484af8006961d95dcf39cf16c3749100a713c9 /activitypub.c
parent7d3a909598c1fc9def2069aeeccda58e305c738a (diff)
parent6a1cc55676eaf18ecadb42b86474aaef73cf9805 (diff)
Merge pull request 'master' (#1) from grunfink/snac2:master into master
Reviewed-on: https://codeberg.org/poesty/snac2/pulls/1
Diffstat (limited to 'activitypub.c')
-rw-r--r--activitypub.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/activitypub.c b/activitypub.c
index c8c166d..9069d03 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -109,7 +109,7 @@ int actor_request(snac *snac, const char *actor, xs_dict **data)
if (valid_status(status2)) {
/* renew data */
- status = actor_add(snac, actor, payload);
+ status = actor_add(actor, payload);
if (data != NULL) {
*data = payload;
@@ -437,7 +437,8 @@ void process_tags(snac *snac, const char *content, d_char **n_content, d_char **
/** messages **/
-d_char *msg_base(snac *snac, char *type, char *id, char *actor, char *date, char *object)
+xs_dict *msg_base(snac *snac, const char *type, const char *id,
+ const char *actor, const char *date, const char *object)
/* creates a base ActivityPub message */
{
xs *did = NULL;
@@ -467,7 +468,7 @@ d_char *msg_base(snac *snac, char *type, char *id, char *actor, char *date, char
}
}
- d_char *msg = xs_dict_new();
+ xs_dict *msg = xs_dict_new();
msg = xs_dict_append(msg, "@context", "https:/" "/www.w3.org/ns/activitystreams");
msg = xs_dict_append(msg, "type", type);
@@ -845,6 +846,28 @@ xs_dict *msg_note(snac *snac, const xs_str *content, const xs_val *rcpts,
}
+xs_dict *msg_ping(snac *user, const char *rcpt)
+/* creates a Ping message (https://humungus.tedunangst.com/r/honk/v/tip/f/docs/ping.txt) */
+{
+ xs_dict *msg = msg_base(user, "Ping", "@dummy", user->actor, NULL, NULL);
+
+ msg = xs_dict_append(msg, "to", rcpt);
+
+ return msg;
+}
+
+
+xs_dict *msg_pong(snac *user, const char *rcpt, const char *object)
+/* creates a Pong message (https://humungus.tedunangst.com/r/honk/v/tip/f/docs/ping.txt) */
+{
+ xs_dict *msg = msg_base(user, "Pong", "@dummy", user->actor, NULL, object);
+
+ msg = xs_dict_append(msg, "to", rcpt);
+
+ return msg;
+}
+
+
void notify(snac *snac, xs_str *type, xs_str *utype, xs_str *actor, xs_dict *msg)
/* notifies the user of relevant events */
{
@@ -1121,7 +1144,7 @@ int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
else
if (strcmp(type, "Update") == 0) {
if (strcmp(utype, "Person") == 0) {
- actor_add(snac, actor, xs_dict_get(msg, "object"));
+ actor_add(actor, xs_dict_get(msg, "object"));
snac_log(snac, xs_fmt("updated actor %s", actor));
}
@@ -1147,7 +1170,19 @@ int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
snac_debug(snac, 1, xs_fmt("ignored 'Delete' for unknown object %s", object));
}
else
- snac_debug(snac, 1, xs_fmt("process_message type '%s' ignored", type));
+ if (strcmp(type, "Pong") == 0) {
+ snac_log(snac, xs_fmt("'Pong' received from %s", actor));
+ }
+ else
+ if (strcmp(type, "Ping") == 0) {
+ snac_log(snac, xs_fmt("'Ping' requested from %s", actor));
+
+ xs *rsp = msg_pong(snac, actor, xs_dict_get(msg, "id"));
+
+ enqueue_output_by_actor(snac, rsp, actor, 0);
+ }
+ else
+ snac_debug(snac, 1, xs_fmt("process_input_message type '%s' ignored", type));
if (do_notify) {
notify(snac, type, utype, actor, msg);
@@ -1384,8 +1419,9 @@ void process_queue_item(xs_dict *q_item)
xs *headers = xs_dict_new();
headers = xs_dict_append(headers, "content-type", "application/json");
- xs *rsp = xs_http_request("POST", url, headers,
+ xs *rsp = xs_http_request("POST", url, headers,
body, strlen(body), &status, NULL, NULL, 0);
+ rsp = xs_free(rsp);
srv_debug(0, xs_fmt("telegram post %d", status));
}
@@ -1426,7 +1462,7 @@ int process_queue(void)
/** HTTP handlers */
-int activitypub_get_handler(d_char *req, char *q_path,
+int activitypub_get_handler(const xs_dict *req, const char *q_path,
char **body, int *b_size, char **ctype)
{
int status = 200;
@@ -1519,11 +1555,13 @@ int activitypub_get_handler(d_char *req, char *q_path,
}
-int activitypub_post_handler(d_char *req, char *q_path,
- d_char *payload, int p_size,
+int activitypub_post_handler(const xs_dict *req, const char *q_path,
+ char *payload, int p_size,
char **body, int *b_size, char **ctype)
/* processes an input message */
{
+ (void)b_size;
+
int status = 202; /* accepted */
char *i_ctype = xs_dict_get(req, "content-type");
snac snac;