#include "client_app.h" #include "json/json.h" #include "json/layout.h" #include #include #include #include #define OBJ_TYPE struct client_app static struct json_object_field client_app_layout[] = { { .key = "name", .offset = offsetof( struct client_app, client.name ), .required = false, .type = &json_field_string }, JSON_FIELD_STRING( auth_code, false ), JSON_FIELD_STRING( access_token, false ), JSON_FIELD_STRING( redirect_uri, false ), { .key = "secret", .offset = offsetof( struct client_app, client.secret ), .required = true, .type = &json_field_string }, JSON_FIELD_END, }; #undef OBJ_TYPE struct client_app* client_app_from_id( const char* client_id ) { char filename[512]; snprintf( filename, 512, "data/client_apps/%s.json", client_id ); struct client_app* app = malloc(sizeof(struct client_app)); app->client.name = NULL; app->client.id = strdup(client_id); app->client.secret = NULL; app->auth_code = NULL; app->redirect_uri = NULL; app->access_token = NULL; if( !json_read_object_layout_from_file( filename, client_app_layout, app ) ) { client_app_free(app); return NULL; } return app; } struct client_app* client_app_new( const char* client_name ) { char id[33]; for( int i = 0; i < 32; ++i ) { id[i] = 'a' + (rand() % 26); } id[32] = '\0'; char secret[65]; for( int i = 0; i < 64; ++i ) { secret[i] = 'a' + (rand() % 26); } secret[64] = '\0'; struct client_app* app = malloc(sizeof(struct client_app)); app->client.id = strdup(id); app->client.name = strdup(client_name); app->client.secret = strdup(secret); app->auth_code = NULL; app->redirect_uri = NULL; app->access_token = NULL; client_app_save(app); return app; } void client_app_save( struct client_app* app ) { char filename[512]; snprintf( filename, 512, "data/client_apps/%s.json", app->client.id ); json_write_object_layout_to_file( filename, "\t", client_app_layout, app ); } void client_app_free( struct client_app* app ) { if( !app ) { return; } free(app->client.name); free(app->client.secret); free(app->client.id); free(app->auth_code); free(app->redirect_uri); free(app->access_token); free(app); } void client_app_gen_auth_code( struct client_app* app ) { char* auth_code = app->auth_code = malloc(65); for( int i = 0; i < 64; ++i ) { auth_code[i] = 'a'+(rand()%26); } auth_code[64] = '\0'; client_app_save(app); } void client_app_generate_access_token( struct client_app* app ) { char code[33]; char* access_token = app->access_token = malloc(32+1+32+1); for( int i = 0; i < 32; ++i ) { code[i] = 'a'+(rand()%26); } code[32] = '\0'; snprintf( access_token, 32+1+32+1, "%s-%s", app->client.id, code ); client_app_save(app); }