From 9093a35aefe66a976d6f21748859fc23dba49359 Mon Sep 17 00:00:00 2001 From: "me@ow.nekobit.net" Date: Tue, 15 Feb 2022 20:32:50 +0000 Subject: [PATCH] OAuth token generation FossilOrigin-Name: 805b627e15039644eb40858b1497747ddef1a6f76a59789304e0e7167f87fe50 --- include/mastodont_application.h | 29 ++++++++- src/application.c | 105 ++++++++++++++++++++++++++++++-- 2 files changed, 127 insertions(+), 7 deletions(-) diff --git a/include/mastodont_application.h b/include/mastodont_application.h index 1a76ac8..31c0540 100644 --- a/include/mastodont_application.h +++ b/include/mastodont_application.h @@ -45,13 +45,36 @@ struct mstdnt_app char* vapid_key; }; -int mstdnt_load_app_result(struct mstdnt_storage* storage, - struct mstdnt_fetch_results* results, - struct mstdnt_app* app); +struct mstdnt_oauth_token +{ + char* access_token; + char* token_type; + char* scope; + char* id; + char* me; + time_t time; +}; + +struct mstdnt_oauth_token_args +{ + char* grant_type; + char* client_id; + char* client_secret; + char* redirect_uri; + char* scope; + char* code; + char* username; + char* password; +}; int mastodont_register_app(mastodont_t* data, struct mstdnt_app_register_args* args, struct mstdnt_storage* storage, struct mstdnt_app* app); +int mastodont_obtain_oauth_token(mastodont_t* data, + struct mstdnt_oauth_token_args* args, + struct mstdnt_storage* storage, + struct mstdnt_oauth_token* app); + #endif /* MASTODONT_ACCOUNT */ diff --git a/src/application.c b/src/application.c index 6755a43..d5f8631 100644 --- a/src/application.c +++ b/src/application.c @@ -18,9 +18,9 @@ #include #include -int mstdnt_load_app_result(struct mstdnt_storage* storage, - struct mstdnt_fetch_results* results, - struct mstdnt_app* app) +static int mstdnt_read_app_result(struct mstdnt_storage* storage, + struct mstdnt_fetch_results* results, + struct mstdnt_app* app) { cJSON* root, *v; if (_mstdnt_json_init(&root, results, storage)) @@ -46,6 +46,36 @@ int mstdnt_load_app_result(struct mstdnt_storage* storage, } } +static int mstdnt_read_token_result(struct mstdnt_storage* storage, + struct mstdnt_fetch_results* results, + struct mstdnt_oauth_token* app) +{ + cJSON* root, *v; + if (_mstdnt_json_init(&root, results, storage)) + return 1; + + struct _mstdnt_str_val strings[] = { + { "grant_type", &(app->grant_type) }, + { "client_id", &(app->client_id) }, + { "client_secret", &(app->client_secret) }, + { "redirect_uri", &(app->redirect_uri) }, + { "scope", &(app->scope) }, + { "code", &(app->code) }, + { "username", &(app->username) }, + { "password", &(app->password) }, + }; + + for (v = root->child; v; v = v->next) + { + if (_mstdnt_key_val_iter(v, strings, _mstdnt_arr_len(strings), + NULL, 0) == 1) + { + return 1; + } + } +} + + int mastodont_register_app(mastodont_t* data, struct mstdnt_app_register_args* args, @@ -91,7 +121,7 @@ int mastodont_register_app(mastodont_t* data, goto cleanup; } - res = mstdnt_load_app_result(storage, &results, app); + res = mstdnt_read_app_result(storage, &results, app); mastodont_fetch_results_cleanup(&results); @@ -100,3 +130,70 @@ cleanup: return res; } + +int mastodont_obtain_oauth_token(mastodont_t* data, + struct mstdnt_oauth_token_args* args, + struct mstdnt_storage* storage, + struct mstdnt_oauth_token* token) +{ + int res; + struct mstdnt_fetch_results results = { 0 }; + + /* Default args */ + struct mstdnt_oauth_token_args _args; + if (args == NULL) + { + _args.grant_type = NULL; + _args.client_id = NULL; + _args.client_secret = NULL; + _args.redirect_uri = NULL; + _args.scope = NULL; + _args.code = NULL; + _args.username = NULL; + _args.password = NULL; + args = &_args; + } + storage->needs_cleanup = 0; + + union param_value u_grant_type, u_client_id, + u_client_secret, u_redirect_uri, + u_scope, u_code, u_username, u_password; + u_grant_type.s = args->grant_type; + u_client_id.s = args->client_id; + u_client_secret.s = args->client_secret; + u_redirect_uri.s = args->redirect_uri; + u_scope.s = args->scope; + u_code.s = args->code; + u_username.s = args->username; + u_password.s = args->password; + + + struct _mstdnt_query_param params[] = { + { _MSTDNT_QUERY_STRING, "grant_type", u_grant_type }, + { _MSTDNT_QUERY_STRING, "client_id", u_client_id }, + { _MSTDNT_QUERY_STRING, "client_secret", u_client_secret }, + { _MSTDNT_QUERY_STRING, "redirect_uri", u_redirect_uri }, + { _MSTDNT_QUERY_STRING, "scope", u_scope }, + { _MSTDNT_QUERY_STRING, "code", u_code }, + { _MSTDNT_QUERY_STRING, "username", u_username }, + { _MSTDNT_QUERY_STRING, "password", u_password }, + }; + + char* post = _mstdnt_query_string(NULL, params, _mstdnt_arr_len(params)); + + curl_easy_setopt(data->curl, CURLOPT_POSTFIELDS, post); + + if (mastodont_fetch_curl(data, "oauth/token", &results) != CURLE_OK) + { + res = 1; + goto cleanup; + } + + res = mstdnt_read_token_result(storage, &results, token); + + mastodont_fetch_results_cleanup(&results); + +cleanup: + free(post); + return res; +}