summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar default2022-09-22 10:15:24 +0200
committerGravatar default2022-09-22 10:15:24 +0200
commit00a89295817dd9dc1b29f1718e1efeaa57ea5900 (patch)
treef5bb9aaa7a244f71dfd69213b9f2dde11057cb86
parentAdded a webfinger handler. (diff)
downloadsnac2-00a89295817dd9dc1b29f1718e1efeaa57ea5900.tar.gz
snac2-00a89295817dd9dc1b29f1718e1efeaa57ea5900.tar.xz
snac2-00a89295817dd9dc1b29f1718e1efeaa57ea5900.zip
New function webfinger_request() (incomplete).
-rw-r--r--Makefile2
-rw-r--r--snac.h1
-rw-r--r--webfinger.c46
3 files changed, 47 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index eec1008..3f72197 100644
--- a/Makefile
+++ b/Makefile
@@ -21,4 +21,4 @@ httpd.o: httpd.c xs.h xs_io.h xs_encdec.h xs_json.h xs_socket.h \
21main.o: main.c xs.h xs_encdec.h xs_json.h snac.h 21main.o: main.c xs.h xs_encdec.h xs_json.h snac.h
22snac.o: snac.c xs.h xs_io.h xs_encdec.h xs_json.h xs_curl.h \ 22snac.o: snac.c xs.h xs_io.h xs_encdec.h xs_json.h xs_curl.h \
23 xs_openssl.h xs_socket.h xs_httpd.h snac.h 23 xs_openssl.h xs_socket.h xs_httpd.h snac.h
24webfinger.o: webfinger.c xs.h xs_encdec.h xs_json.h snac.h 24webfinger.o: webfinger.c xs.h xs_encdec.h xs_json.h xs_curl.h snac.h
diff --git a/snac.h b/snac.h
index 238fcac..7cce8f2 100644
--- a/snac.h
+++ b/snac.h
@@ -70,5 +70,6 @@ d_char *http_signed_request(snac *snac, char *method, char *url,
70 70
71void httpd(void); 71void httpd(void);
72 72
73void webfinger_request(char *qs, int *status, char **actor, char **user);
73void webfinger_get_handler(d_char *req, char *q_path, int *status, 74void webfinger_get_handler(d_char *req, char *q_path, int *status,
74 char **body, int *b_size, char **ctype); 75 char **body, int *b_size, char **ctype);
diff --git a/webfinger.c b/webfinger.c
index be89ea9..bcc5982 100644
--- a/webfinger.c
+++ b/webfinger.c
@@ -4,11 +4,55 @@
4#include "xs.h" 4#include "xs.h"
5#include "xs_encdec.h" 5#include "xs_encdec.h"
6#include "xs_json.h" 6#include "xs_json.h"
7#include "xs_curl.h"
7 8
8#include "snac.h" 9#include "snac.h"
9 10
11void webfinger_request(char *qs, int *status, char **actor, char **user)
12/* queries the webfinger for qs and fills the required fields */
13{
14 xs *payload = NULL;
15 int p_size = 0;
16 xs *url = NULL;
17 xs *headers = xs_dict_new();
18
19 if (xs_startswith(qs, "https:/" "/")) {
20 /* actor query: pick the host */
21 xs *s = xs_replace(qs, "https:/" "/", "");
22 xs *l = xs_split_n(s, "/", 1);
23
24 url = xs_fmt("https:/" "/%s/.well-known/webfinger?resource=%s",
25 xs_list_get(l, 0), qs);
26 }
27 else {
28 /* it's a user */
29 xs *s = xs_dup(qs);
30 xs *l;
31
32 if (xs_startswith(s, "@"))
33 s = xs_crop(s, 1, 0);
34
35 l = xs_split_n(s, "@", 1);
36
37 if (xs_list_len(l) == 2) {
38 url = xs_fmt("https:/" "/%s/.well-known/webfinger?resource:acct:%s",
39 xs_list_get(l, 1), qs);
40 }
41 }
42
43 if (url == NULL) {
44 *status = 400;
45 return;
46 }
47
48 headers = xs_dict_append(headers, "accept", "application/json");
49
50 xs_http_request("GET", url, headers, NULL, 0, status, &payload, &p_size);
51}
52
53
10void webfinger_get_handler(d_char *req, char *q_path, int *status, 54void webfinger_get_handler(d_char *req, char *q_path, int *status,
11 char **body, int *b_size, char **ctype) 55 char **body, int *b_size, char **ctype)
12/* serves webfinger queries */ 56/* serves webfinger queries */
13{ 57{
14 if (strcmp(q_path, "/.well-known/webfinger") != 0) 58 if (strcmp(q_path, "/.well-known/webfinger") != 0)