Slon/Modules/ActivityPub: Sign GET request in @slon_activitypub_http_signature_is_valid

This commit is contained in:
Alec Murphy 2025-02-23 08:20:56 -05:00
parent 89e70359c4
commit 430e92cbe0

View file

@ -7,7 +7,7 @@ U8* @slon_activitypub_strip_double_quotes(U8* str)
return str; return str;
} }
Bool @slon_activitypub_http_signature_is_valid(SlonHttpSession* session) Bool @slon_activitypub_http_signature_is_valid(SlonHttpSession* session, U8* user)
{ {
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
no_warn scratch_buffer; no_warn scratch_buffer;
@ -93,17 +93,10 @@ Bool @slon_activitypub_http_signature_is_valid(SlonHttpSession* session)
U8* signatory_url_string = @slon_strnew(session, keyId); U8* signatory_url_string = @slon_strnew(session, keyId);
StrFind("#", signatory_url_string)[0] = NULL; StrFind("#", signatory_url_string)[0] = NULL;
HttpUrl* url = @http_parse_url(signatory_url_string);
@slon_free(session, signatory_url_string);
if (!url) {
@slon_log(LOG_HTTPD, "Could not fetch signatory's public key, malformed url or unspecified error");
return FALSE;
}
U8* fetch_buffer = CAlloc(HTTP_FETCH_BUFFER_SIZE, adam_task); U8* fetch_buffer = CAlloc(HTTP_FETCH_BUFFER_SIZE, adam_task);
JsonObject* http_headers = Json.CreateObject(); U8* signatory = db->o("actors")->o(user)->@("id");
http_headers->set("accept", "application/json", JSON_STRING); @http_response* resp = @slon_activitypub_signed_request(signatory_url_string, fetch_buffer, NULL, SLON_HTTP_VERB_GET, signatory);
@http_response* resp = Http.Get(url, fetch_buffer, NULL, http_headers); @slon_free(session, signatory_url_string);
if (!resp) { if (!resp) {
@slon_log(LOG_HTTPD, "Could not fetch signatory's public key, invalid response from remote server"); @slon_log(LOG_HTTPD, "Could not fetch signatory's public key, invalid response from remote server");
@ -111,10 +104,6 @@ Bool @slon_activitypub_http_signature_is_valid(SlonHttpSession* session)
return FALSE; return FALSE;
} }
while (resp->state != HTTP_STATE_DONE) {
Sleep(1);
}
if (!resp->body.length) { if (!resp->body.length) {
@slon_log(LOG_HTTPD, "Could not fetch signatory's public key, empty response from remote server"); @slon_log(LOG_HTTPD, "Could not fetch signatory's public key, empty response from remote server");
Free(fetch_buffer); Free(fetch_buffer);
@ -182,7 +171,6 @@ Bool @slon_activitypub_http_signature_is_valid(SlonHttpSession* session)
@slon_free(session, pem_single_line); @slon_free(session, pem_single_line);
Json.Delete(user_object); Json.Delete(user_object);
Json.Delete(http_headers);
} }
// Calculate our signature string allocation // Calculate our signature string allocation
@ -872,7 +860,7 @@ U0 @slon_activitypub_users_post(SlonHttpSession* session)
session->status(400); session->status(400);
goto slon_activitypub_users_post_return; goto slon_activitypub_users_post_return;
} }
if (!@slon_activitypub_http_signature_is_valid(session)) { if (!@slon_activitypub_http_signature_is_valid(session, user)) {
session->status(401); session->status(401);
goto slon_activitypub_users_post_return; goto slon_activitypub_users_post_return;
} }