From 4b27c1a348d8de036dabd5525452f5b9ad08a32b Mon Sep 17 00:00:00 2001 From: nirav Date: Thu, 21 Mar 2019 16:34:24 +0530 Subject: Use g_threads, add builder ui for timeline --- src/auth.c | 347 ++++++++++++++----------------------------------------------- 1 file changed, 78 insertions(+), 269 deletions(-) (limited to 'src/auth.c') diff --git a/src/auth.c b/src/auth.c index 3a2ee17..c903e67 100644 --- a/src/auth.c +++ b/src/auth.c @@ -10,328 +10,137 @@ #include "config.h" #include "log.h" -#define CLIENT_NAME "ap_client" -#define PROTOCOL_PREFIX "https://" +#define LOGIN_URL "https://%s/oauth/token" -static const char *app_register_url = "/api/v1/apps"; -static const char *login_url = "/oauth/token"; - -int read_local_credentials() -{ - if (!(config->access_token) || !*(config->access_token) || - !(config->instance_url) || !*(config->instance_url)) { - log_msg(LOG_WARNING, "read_local_credentials", - "access_token not found"); - return -1; - } - printf("token: %s\niu: %s\n", config->access_token, config->instance_url); - return 0; -} +struct login_response { + char *access_token; + char *scope; +}; -bool is_logged_in() +static char *get_login_url(const char *domain) { - if (config->access_token) - return true; - return false; -} + char *url; + size_t size; -const char *get_access_token() -{ - return (const char *)config->access_token; -} + size = strlen(LOGIN_URL) + strlen(domain) - 1; + url = malloc(size); + if (!url) { + err(1, NULL); + return NULL; + } -const char *get_instance_url() -{ - return (const char *)config->instance_url; + sprintf(url, LOGIN_URL, domain); + return url; } -struct register_call_arg { - char *url; - char *domain; - char *post_data; - void (*callback)(bool); -}; - -static void *register_call(void *req_arg) +static char *get_login_req(const char *email, const char *password) { - struct register_call_arg *arg; - char *resp; - json_t *root; + char *req; + json_t *json_root; + json_error_t error; - arg = (struct register_call_arg *)req_arg; - if (!arg || !(arg->url)) { - log_msg(LOG_WARNING, "register_call", "invalid arguments"); - goto error; + json_root = json_pack_ex(&error, 1, "{s:s, s:s, s:s, s:s, s:s}", + "client_id", config->client_id, "client_secret", + config->client_secret, "grant_type", "password", "username", email, + "password", password); + if (!json_root) { + return NULL; } - resp = post_request(arg->url, arg->post_data); - if (!resp) { - log_msg(LOG_WARNING, "register_call", "failed to send http request"); - goto error; - } + req = json_dumps(json_root, 0); + json_decref(json_root); - if (!resp) { - log_msg(LOG_WARNING, "register_call", "null response"); - goto error; - } + return req; +} - root = json_loads(resp, 0, NULL); - if (!root) { - log_msg(LOG_WARNING, "register_call", "failed to parse json"); - goto error; - } +static struct login_response *get_login_resp(char *data) +{ + struct login_response *resp; + json_t *json_root; + json_t *access_token, *scope; - if (!json_is_object(root)) { - log_msg(LOG_WARNING, "register_call", "json root is not object"); - goto error; + json_root = json_loads(data, 0, NULL); + if (!json_root) { + return NULL; } - json_t *cid = json_object_get(root, "client_id"); - json_t *csec = json_object_get(root, "client_secret"); - if (!json_is_string(cid) || !json_is_string(csec)) { - log_msg(LOG_WARNING, "register_call", - "invalid client_id or client_secret"); - goto error; + if (!json_is_object(json_root)) { + json_decref(json_root); + return NULL; } - config_set_client_id(json_string_value(cid)); - config_set_client_secret(json_string_value(csec)); - config_set_instance_url(arg->domain); - if (!*(config->client_id) || !*(config->client_secret)) { - log_msg(LOG_WARNING, "register_call", - "invalid client_id or client_secret"); - goto error; + access_token = json_object_get(json_root, "access_token"); + scope = json_object_get(json_root, "scope"); + if (!json_is_string(access_token) || !json_is_string(scope)) { + json_decref(json_root); + return NULL; } - free(arg->url); - if (arg->post_data) - free(arg->post_data); - free(arg); - free(resp); - json_decref(root); - (*(arg->callback))(true); - return NULL; + resp = calloc(1, sizeof(struct login_response)); + resp->access_token = strdup(json_string_value(access_token)); + resp->scope = strdup(json_string_value(scope)); -error: - if (arg) { - if (arg->url) - free(arg->url); - if (arg->post_data) - free(arg->post_data); - free(arg); - } - if (resp) - free(resp); - if (root) - json_decref(root); - (*(arg->callback))(false); - return NULL; + json_decref(json_root); + return resp; } -int register_app(const char *instance, void (*callback)(bool success)) +int login(const char *email, const char *password) { - size_t size; - char *instance_prefix; - char *url, *req_data; - struct register_call_arg *arg; - json_t *root; - json_error_t error; - pthread_t t; + char *url, *req_data, *resp_data; + struct login_response *resp; - if (!instance || strlen(instance) < 1 || !callback) { - log_msg(LOG_WARNING, "register_app", "invalid argument"); + if (!email || !*email || !password || !*password) { + log_msg(LOG_WARNING, "login", "invalid argument"); return -1; } - size = sizeof(PROTOCOL_PREFIX) + sizeof(instance) + 1; - instance_prefix = malloc(size); - if (!instance_prefix) { - err(1, NULL); + if (!is_registered()) { + log_msg(LOG_WARNING, "login", "app not registred"); return -1; } - strlcpy(instance_prefix, PROTOCOL_PREFIX, size); - strlcat(instance_prefix, instance, size); - - root = json_pack_ex(&error, 1, "{s:s, s:s, s:s}", "client_name", - CLIENT_NAME, "redirect_uris", "urn:ietf:wg:oauth:2.0:oob", "scopes", - "read write push"); - if (!root) { - log_msg(LOG_WARNING, "register_app", "json pack error: line %d: %s", - error.line, error.text); + url = get_login_url(config->instance_url); + if (!url) { + err(1, NULL); return -1; } - req_data = json_dumps(root, 0); - json_decref(root); + req_data = get_login_req(email, password); if (!req_data) { - log_msg(LOG_WARNING, "register_app", "failed to dump json"); + free(url); return -1; } - size = strlen(instance_prefix) + strlen(app_register_url) + 1; - url = malloc(size); - if (!url) { - err(1, NULL); + resp_data = post_request(url, req_data); + free(url); + free(req_data); + if (!resp_data) { + log_msg(LOG_WARNING, "register_app", "login request failed"); return -1; } - strlcpy(url, instance_prefix, size); - strlcat(url, app_register_url, size); - - arg = calloc(1, sizeof(struct register_call_arg)); - if (!arg) { - err(1, NULL); + if (!resp_data) { + log_msg(LOG_WARNING, "register_app", "invalid response"); return -1; } - arg->url = url; - arg->domain = instance_prefix; - arg->post_data = req_data; - arg->callback = callback; - - return pthread_create(&t, NULL, ®ister_call, arg); -} - -struct login_call_arg { - char *url; - char *post_data; - void (*callback)(bool); -}; - -static void *login_call(void *req_arg) -{ - struct login_call_arg *arg = NULL; - char *resp = NULL; - json_t *root = NULL; - - arg = (struct login_call_arg *)req_arg; - if (!arg || !(arg->url)) { - log_msg(LOG_WARNING, "login_call", "invalid arguments"); - goto error; - } - - resp = post_request(arg->url, arg->post_data); - if (!resp) { - log_msg(LOG_WARNING, "login_call", "failed to send http request"); - goto error; - } + resp = get_login_resp(resp_data); + free(resp_data); if (!resp) { - log_msg(LOG_WARNING, "login_call", "null response"); - goto error; - } - - root = json_loads(resp, 0, NULL); - if (!root) { - log_msg(LOG_WARNING, "login_call", "failed to parse json"); - goto error; - } - - if (!json_is_object(root)) { - log_msg(LOG_WARNING, "login_call", "json root is not object"); - goto error; - } - - json_t *access_token_j = json_object_get(root, "access_token"); - json_t *scope_j = json_object_get(root, "scope"); - if (!json_is_string(access_token_j) || !json_is_string(scope_j) || - strlen(json_string_value(access_token_j)) < 1 || - strlen(json_string_value(scope_j)) < 1) { - log_msg(LOG_WARNING, "login_call", "invalid access_token or scope"); - goto error; + log_msg(LOG_WARNING, "register_app", "invalid response"); + return -1; } - config_set_access_token(json_string_value(access_token_j)); + config_set_access_token(resp->access_token); /* scope = strdup(json_string_value(scope_j)); */ if (config_save()) { log_msg(LOG_WARNING, "login_call", "failed to save config"); - goto error; } - free(arg->url); - if (arg->post_data) - free(arg->post_data); - free(arg); + free(resp->access_token); + free(resp->scope); free(resp); - json_decref(root); - (*(arg->callback))(true); - - printf("access_token: %s", config->access_token); - return NULL; - -error: - if (arg) { - if (arg->url) - free(arg->url); - if (arg->post_data) - free(arg->post_data); - free(arg); - } - if (resp) - free(resp); - if (root) - json_decref(root); - (*(arg->callback))(false); - return NULL; -} - -int login( - const char *email, const char *password, void (*callback)(bool success)) -{ - json_t *root; - json_error_t error; - pthread_t t; - size_t size; - char *url, *req_data; - struct login_call_arg *arg; - if (!email || strlen(email) < 1 || !password || strlen(password) < 1) { - log_msg(LOG_WARNING, "login", "invalid argument"); - return -1; - } - - if (!(config->client_id) || !*(config->client_id) || - !(config->client_secret) || !*(config->client_secret) || - !(config->instance_url) || !*(config->instance_url)) { - log_msg(LOG_WARNING, "login", "invalid client_id or client_secret"); - return -1; - } - - root = json_pack_ex(&error, 1, "{s:s, s:s, s:s, s:s, s:s}", "client_id", - config->client_id, "client_secret", config->client_secret, - "grant_type", "password", "username", email, "password", password); - - if (!root) { - log_msg(LOG_WARNING, "login", "json pack error: line %d: %s", - error.line, error.text); - return -1; - } - - req_data = json_dumps(root, 0); - json_decref(root); - if (!req_data) { - log_msg(LOG_WARNING, "login", "failed to dump json"); - return -1; - } - - size = strlen(config->instance_url) + strlen(login_url) + 1; - url = malloc(size); - if (!url) { - err(1, NULL); - return -1; - } - strlcpy(url, config->instance_url, size); - strlcat(url, login_url, size); - - arg = calloc(1, sizeof(struct login_call_arg)); - if (!arg) { - err(1, NULL); - return -1; - } - arg->url = url; - arg->post_data = req_data; - arg->callback = callback; - - return pthread_create(&t, NULL, &login_call, arg); + return 0; } -- cgit v1.2.3