|
|
|
#include "outbox.h"
|
|
|
|
|
|
|
|
#include "fs_list.h"
|
|
|
|
|
|
|
|
#include "model/crypto/keys.h"
|
|
|
|
#include "model/crypto/http_sign.h"
|
|
|
|
#include "model/account.h"
|
|
|
|
#include "model/ap/activity.h"
|
|
|
|
#include "model/ap/activity/rsa_signature_2017.h"
|
|
|
|
|
|
|
|
#include "collections/array.h"
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
static bool process_one( int id )
|
|
|
|
{
|
|
|
|
bool result = false;
|
|
|
|
struct crypto_keys* keys = crypto_keys_new();
|
|
|
|
FILE* f = NULL;
|
|
|
|
struct ap_activity* act = NULL;
|
|
|
|
ARRAY_OF(char*) inboxes;
|
|
|
|
memset( &inboxes, 0, sizeof(inboxes) );
|
|
|
|
|
|
|
|
if( !crypto_keys_load_private( keys, "data/owner/private.pem" ) ) {
|
|
|
|
printf( "Failed to load private key\n" );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
char buffer[512];
|
|
|
|
snprintf( buffer, 512, "data/outbox/%d.json", id );
|
|
|
|
f = fopen( buffer, "r" );
|
|
|
|
if( !f ) {
|
|
|
|
printf( "Unable to open file %s\n", buffer );
|
|
|
|
goto discard;
|
|
|
|
}
|
|
|
|
|
|
|
|
char* toline = NULL;
|
|
|
|
size_t n;
|
|
|
|
if( -1 == getline( &toline, &n, f ) ) {
|
|
|
|
printf( "no to line" );
|
|
|
|
free(toline);
|
|
|
|
goto failed;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( strlen(toline) < 5 ) {
|
|
|
|
printf( "too short.\n" );
|
|
|
|
goto failed;
|
|
|
|
}
|
|
|
|
|
|
|
|
act = ap_activity_from_FILE(f);
|
|
|
|
if( !act ) {
|
|
|
|
printf( "No activity\n" );
|
|
|
|
goto failed;
|
|
|
|
}
|
|
|
|
f = NULL;
|
|
|
|
|
|
|
|
char* remainder = NULL;
|
|
|
|
char* iter = strtok_r( &toline[4],",",&remainder);
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
int id;
|
|
|
|
if( sscanf( iter, "%d", &id ) ) {
|
|
|
|
int compare( void* a, void* b ) { return strcmp( (char*)a, (char*)b ); }
|
|
|
|
|
|
|
|
struct account* to_account = account_from_id( id );
|
|
|
|
if( to_account ) {
|
|
|
|
if( to_account->inbox ) {
|
|
|
|
char* item_to_add = strdup(to_account->inbox);
|
|
|
|
array_append_unique( &inboxes, sizeof(item_to_add), &item_to_add, compare );
|
|
|
|
}
|
|
|
|
account_free(to_account);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
iter = strtok_r( NULL,",",&remainder);
|
|
|
|
} while( iter );
|
|
|
|
free(toline);
|
|
|
|
|
|
|
|
ap_activity_create_rsa_signature_2017( act );
|
|
|
|
|
|
|
|
for( int i = 0; i < inboxes.count; ++i ) {
|
|
|
|
const char* inbox = inboxes.items[i];
|
|
|
|
printf( "item[%d] = %s\n", i, inbox );
|
|
|
|
|
|
|
|
struct http_signature hs;
|
|
|
|
if( !http_signature_make( inboxes.items[i], keys, &hs ) ) {
|
|
|
|
goto failed;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: HTTP POST request
|
|
|
|
|
|
|
|
http_signature_free( &hs );
|
|
|
|
}
|
|
|
|
|
|
|
|
// NOT FINISHED DEVELOPING
|
|
|
|
goto failed;
|
|
|
|
|
|
|
|
discard:
|
|
|
|
result = true;
|
|
|
|
cleanup:
|
|
|
|
void release( void* item ) { free( *(char**)item ); }
|
|
|
|
array_free( &inboxes, sizeof(char*), release );
|
|
|
|
|
|
|
|
ap_activity_free(act);
|
|
|
|
|
|
|
|
crypto_keys_free(keys);
|
|
|
|
if( f ) { fclose(f); }
|
|
|
|
|
|
|
|
return result;
|
|
|
|
failed:
|
|
|
|
result = false;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
void process_outbox()
|
|
|
|
{
|
|
|
|
int head = fs_list_get("data/outbox/HEAD");
|
|
|
|
int tail = fs_list_get("data/outbox/TAIL");
|
|
|
|
if( tail < head ) {
|
|
|
|
printf( "Processing outbox/%d.json\n", tail );
|
|
|
|
if( process_one(tail) ) {
|
|
|
|
printf( "Done with outbox/%d.json\n", tail );
|
|
|
|
fs_list_set( "data/outbox/TAIL", tail + 1 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
}
|