Make status api provide status responses to unauthenticated users, handle note summary/spoiler text/content warning

master
teknomunk 1 year ago
parent 8dfd92e738
commit e2428eefae

@ -1 +1 @@
Subproject commit 1ff885b9b810503a2d98b8f78fb749ed07cd7ccf
Subproject commit 3996ded88621cc14518bbb964aa65aa99e7ef110

@ -19,6 +19,9 @@
#include "view/api/Account.h"
#include "view/api/Status.h"
// Controller
#include "controller/api/client_apps.h"
// Standard Library
#include <stdio.h>
#include <stdlib.h>
@ -275,6 +278,9 @@ bool route_statuses( struct http_request* req )
if( http_request_route_term( req, "" ) ) {
if( http_request_route_method( req, "POST" ) ) {
if( !check_authentication_header(req) ) { return false; }
struct account* owner = account_from_id(owner_account_id);
bool res = handle_post(req, owner);
account_free(owner);
@ -294,7 +300,14 @@ bool route_statuses( struct http_request* req )
if( http_request_route( req, "context" ) ) {
show_status_context( req, s );
goto success;
} else if( http_request_route_term( req, "reblog" ) ) {
} else if( http_request_route_term( req, "" ) ) {
show_status( req, s );
goto success;
}
if( !check_authentication_header(req) ) { return false; }
if( http_request_route_term( req, "reblog" ) ) {
if( handle_repost( req, s ) ) { goto success; }
} else if( http_request_route_term( req, "bookmark" ) ) {
if( handle_bookmark( req, s ) ) { goto success; }
@ -302,9 +315,6 @@ bool route_statuses( struct http_request* req )
if( handle_unbookmark( req, s ) ) { goto success; }
} else if( http_request_route_term( req, "favourite" ) ) {
if( handle_favorite( req, s ) ) { goto success; }
} else if( http_request_route_term( req, "" ) ) {
show_status( req, s );
goto success;
}
goto failed;

@ -206,6 +206,8 @@ bool route_mastodon_api( struct http_request* req )
return true;
} else if( http_request_route_term( req, "custom_emojis" ) ) {
return route_custom_emojis(req);
} else if( http_request_route( req, "statuses" ) ) {
return route_statuses(req);
}
if( !check_authentication_header(req) ) { return false; }
@ -221,8 +223,6 @@ bool route_mastodon_api( struct http_request* req )
FILE* f = http_request_get_response_body( req );
fprintf( f, "[]" );
return true;
} else if( http_request_route( req, "statuses" ) ) {
return route_statuses(req);
} else if( http_request_route_term( req, "scheduled_statuses" ) ) {
return handle_scheduled_statuses(req);
} else if( http_request_route( req, "timelines/" ) ) {

@ -50,8 +50,12 @@ bool pull_remote_file( const char* filename, const char* uri )
if( do_fetch( uri, f ) ) {
rename(tmp_filename,filename);
result = true;
fclose(f);
} else {
fclose(f);
// Dump file contents to prevent holding large amounts of disk space inadvertantly
truncate(tmp_filename,0);
}
fclose(f);
return result;
}

@ -41,6 +41,7 @@ static struct json_object_field status_layout[] = {
JSON_FIELD_STRING( content, false ),
JSON_FIELD_STRING( source, false ),
JSON_FIELD_STRING( spoiler_text, false ),
JSON_FIELD_BOOL( pinned, false ),
JSON_FIELD_BOOL( bookmarked, false ),
JSON_FIELD_DATETIME( published, false ),
@ -278,6 +279,9 @@ bool status_sync_from_activity_pub( struct status* s, struct ap_object* act )
s->remote = true;
s->stub = false;
s->sensitive = act->sensitive;
if( act->summary ) {
s->spoiler_text = strdup(act->summary);
}
// Force this status to have an id
status_save_new(s);
@ -390,29 +394,13 @@ failed:
bool status_sync_from_uri( struct status* s, const char* uri )
{
struct ap_object* act = NULL;
FILE* f = NULL;
bool result = false;
mkdir_p( "data/statuses/ap", 0755 );
// Fetch the object from the remote server
char filename[512];
snprintf( filename, sizeof(filename), "data/statuses/ap/%d.json", s->id );
f = fopen(filename,"r");
if( !f ) {
if( !pull_remote_file( filename, uri ) ) { goto failed; }
f = fopen(filename,"r");
if( !f ) { goto failed; }
}
// Load the activity and sync status
act = ap_object_from_FILE(f); f = NULL;
struct ap_object* act = fetch_ap_object_ref( uri );
if( !act ) { goto failed; }
if( !status_sync_from_activity_pub(s,act) ) { goto failed; }
result = true;
cleanup:
if( f ) { fclose(f); }
ap_object_free(act);
return result;
failed:
@ -606,6 +594,7 @@ void status_free( struct status* s )
free(s->content);
free(s->source);
free(s->spoiler_text);
// Free media
for( int i = 0; i < s->media.count; ++i ) {
@ -737,6 +726,7 @@ void status_get_context( struct status* s, void* ancestors_ptr, void* replies_pt
struct status* parent = NULL;
for( int i = s->in_reply_to; i != 0; i = parent->in_reply_to ) {
parent = status_from_id( i );
if( !parent ) { break; }
array_append( ancestors, sizeof(parent), &parent );
};
// reverse ancestors

@ -20,6 +20,7 @@ struct status
char* content;
char* source;
char* spoiler_text;
bool sensitive;
bool pinned;
bool bookmarked;

@ -518,7 +518,13 @@ struct json_object_field api_Status_layout[] = {
.type = &json_field_integer,
},
JSON_FIELD_BOOL( sensitive, false ),
JSON_FIELD_FIXED_STRING( spoiler_text, "", true ),
{
.key = "spoiler_text",
.offset = offsetof( OBJ_TYPE, spoiler_text ),
.required = false,
.allow_drop_empty = true,
.type = &json_field_string,
},
JSON_FIELD_EMPTY_ARRAY( tags, true ),
JSON_FIELD_FIXED_NULL( text ),
{

Loading…
Cancel
Save