diff options
| author | 2023-03-01 08:25:36 +0100 | |
|---|---|---|
| committer | 2023-03-01 08:25:36 +0100 | |
| commit | d75a22adab5b93c0705b9f58fe660d82219ad573 (patch) | |
| tree | 85db34cf165305d6a751e30a55464692deb2d966 | |
| parent | Moved srv_archive() to data.c. (diff) | |
| download | penes-snac2-d75a22adab5b93c0705b9f58fe660d82219ad573.tar.gz penes-snac2-d75a22adab5b93c0705b9f58fe660d82219ad573.tar.xz penes-snac2-d75a22adab5b93c0705b9f58fe660d82219ad573.zip | |
New function srv_archive_error().
| -rw-r--r-- | activitypub.c | 9 | ||||
| -rw-r--r-- | data.c | 30 | ||||
| -rw-r--r-- | http.c | 35 | ||||
| -rw-r--r-- | snac.h | 4 |
4 files changed, 45 insertions, 33 deletions
diff --git a/activitypub.c b/activitypub.c index cef5c02..bb68a7d 100644 --- a/activitypub.c +++ b/activitypub.c | |||
| @@ -930,8 +930,13 @@ int process_input_message(snac *snac, char *msg, char *req) | |||
| 930 | } | 930 | } |
| 931 | 931 | ||
| 932 | /* check the signature */ | 932 | /* check the signature */ |
| 933 | if (!check_signature(snac, req)) { | 933 | xs *sig_err = NULL; |
| 934 | snac_log(snac, xs_fmt("bad signature %s", actor)); | 934 | |
| 935 | if (!check_signature(snac, req, &sig_err)) { | ||
| 936 | snac_log(snac, xs_fmt("bad signature %s (%s)", actor, sig_err)); | ||
| 937 | |||
| 938 | srv_archive_error("check_signature", sig_err, req, msg); | ||
| 939 | |||
| 935 | return 1; | 940 | return 1; |
| 936 | } | 941 | } |
| 937 | 942 | ||
| @@ -1844,3 +1844,33 @@ void srv_archive(const char *direction, xs_dict *req, | |||
| 1844 | } | 1844 | } |
| 1845 | } | 1845 | } |
| 1846 | } | 1846 | } |
| 1847 | |||
| 1848 | |||
| 1849 | void srv_archive_error(const char *prefix, const xs_str *err, | ||
| 1850 | const xs_dict *req, const xs_dict *data) | ||
| 1851 | /* archives an error */ | ||
| 1852 | { | ||
| 1853 | xs *ntid = tid(0); | ||
| 1854 | xs *fn = xs_fmt("%s/error/%s_%s", srv_basedir, prefix, ntid); | ||
| 1855 | FILE *f; | ||
| 1856 | |||
| 1857 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 1858 | fprintf(f, "Error: %s\n", err); | ||
| 1859 | |||
| 1860 | if (req) { | ||
| 1861 | fprintf(f, "Request headers:\n"); | ||
| 1862 | |||
| 1863 | xs *j = xs_json_dumps_pp(req, 4); | ||
| 1864 | fwrite(j, strlen(j), 1, f); | ||
| 1865 | } | ||
| 1866 | |||
| 1867 | if (data) { | ||
| 1868 | fprintf(f, "Data:\n"); | ||
| 1869 | |||
| 1870 | xs *j = xs_json_dumps_pp(data, 4); | ||
| 1871 | fwrite(j, strlen(j), 1, f); | ||
| 1872 | } | ||
| 1873 | |||
| 1874 | fclose(f); | ||
| 1875 | } | ||
| 1876 | } | ||
| @@ -119,7 +119,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url, | |||
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | 121 | ||
| 122 | static int _check_signature(snac *snac, char *req, char **err) | 122 | int check_signature(snac *snac, xs_dict *req, xs_str **err) |
| 123 | /* check the signature */ | 123 | /* check the signature */ |
| 124 | { | 124 | { |
| 125 | char *sig_hdr = xs_dict_get(req, "signature"); | 125 | char *sig_hdr = xs_dict_get(req, "signature"); |
| @@ -134,7 +134,8 @@ static int _check_signature(snac *snac, char *req, char **err) | |||
| 134 | { | 134 | { |
| 135 | /* extract the values */ | 135 | /* extract the values */ |
| 136 | xs *l = xs_split(sig_hdr, ","); | 136 | xs *l = xs_split(sig_hdr, ","); |
| 137 | char *v; | 137 | xs_list *p; |
| 138 | xs_val *v; | ||
| 138 | 139 | ||
| 139 | p = l; | 140 | p = l; |
| 140 | while (xs_list_iter(&p, &v)) { | 141 | while (xs_list_iter(&p, &v)) { |
| @@ -182,7 +183,8 @@ static int _check_signature(snac *snac, char *req, char **err) | |||
| 182 | 183 | ||
| 183 | { | 184 | { |
| 184 | xs *l = xs_split(headers, " "); | 185 | xs *l = xs_split(headers, " "); |
| 185 | char *v; | 186 | xs_list *p; |
| 187 | xs_val *v; | ||
| 186 | 188 | ||
| 187 | p = l; | 189 | p = l; |
| 188 | while (xs_list_iter(&p, &v)) { | 190 | while (xs_list_iter(&p, &v)) { |
| @@ -224,30 +226,3 @@ static int _check_signature(snac *snac, char *req, char **err) | |||
| 224 | 226 | ||
| 225 | return 1; | 227 | return 1; |
| 226 | } | 228 | } |
| 227 | |||
| 228 | |||
| 229 | int check_signature(snac *snac, char *req) | ||
| 230 | /* checks the signature and archives the error */ | ||
| 231 | { | ||
| 232 | int ret; | ||
| 233 | xs *err = NULL; | ||
| 234 | |||
| 235 | if ((ret = _check_signature(snac, req, &err)) == 0) { | ||
| 236 | snac_debug(snac, 1, xs_fmt("check_signature %s", err)); | ||
| 237 | |||
| 238 | xs *ntid = tid(0); | ||
| 239 | xs *fn = xs_fmt("%s/error/check_signature_%s", srv_basedir, ntid); | ||
| 240 | FILE *f; | ||
| 241 | |||
| 242 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 243 | fprintf(f, "Error: %s\nRequest headers:\n", err); | ||
| 244 | |||
| 245 | xs *j = xs_json_dumps_pp(req, 4); | ||
| 246 | |||
| 247 | fwrite(j, strlen(j), 1, f); | ||
| 248 | fclose(f); | ||
| 249 | } | ||
| 250 | } | ||
| 251 | |||
| 252 | return ret; | ||
| 253 | } | ||
| @@ -55,6 +55,8 @@ void srv_archive(const char *direction, xs_dict *req, | |||
| 55 | const char *payload, int p_size, | 55 | const char *payload, int p_size, |
| 56 | int status, xs_dict *headers, | 56 | int status, xs_dict *headers, |
| 57 | const char *body, int b_size); | 57 | const char *body, int b_size); |
| 58 | void srv_archive_error(const char *prefix, const xs_str *err, | ||
| 59 | const xs_dict *req, const xs_dict *data); | ||
| 58 | 60 | ||
| 59 | double mtime_nl(const char *fn, int *n_link); | 61 | double mtime_nl(const char *fn, int *n_link); |
| 60 | #define mtime(fn) mtime_nl(fn, NULL) | 62 | #define mtime(fn) mtime_nl(fn, NULL) |
| @@ -157,7 +159,7 @@ xs_dict *http_signed_request(snac *snac, const char *method, const char *url, | |||
| 157 | const char *body, int b_size, | 159 | const char *body, int b_size, |
| 158 | int *status, xs_str **payload, int *p_size, | 160 | int *status, xs_str **payload, int *p_size, |
| 159 | int timeout); | 161 | int timeout); |
| 160 | int check_signature(snac *snac, char *req); | 162 | int check_signature(snac *snac, xs_dict *req, xs_str **err); |
| 161 | 163 | ||
| 162 | void httpd(void); | 164 | void httpd(void); |
| 163 | 165 | ||