diff options
Diffstat (limited to 'src/auth.c')
-rw-r--r-- | src/auth.c | 144 |
1 files changed, 79 insertions, 65 deletions
@@ -7,18 +7,43 @@ #include "string-util.h" #include "auth.h" #include "http.h" +#include "config.h" +#include "log.h" #define CLIENT_NAME "ap_client" #define PROTOCOL_PREFIX "https://" -char *instance_domain; -char *client_id; -char *client_secret; -char *access_token; -char *scope; +static const char *app_register_url = "/api/v1/apps"; +static const char *login_url = "/oauth/token"; -static char *app_register_url = "/api/v1/apps"; -static 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_ERROR, "read_local_credentials", + "access_token not found"); + return -1; + } + printf("token: %s\niu: %s\n", config->access_token, config->instance_url); + return 0; +} + +bool is_logged_in() +{ + if (config->access_token) + return true; + return false; +} + +const char *get_access_token() +{ + return (const char *)config->access_token; +} + +const char *get_instance_url() +{ + return (const char *)config->instance_url; +} struct register_call_arg { char *url; @@ -35,46 +60,46 @@ static void *register_call(void *req_arg) arg = (struct register_call_arg *)req_arg; if (!arg || !(arg->url)) { - fprintf(stderr, "register_call(): invalid arguments\n"); + log_msg(LOG_ERROR, "register_call", "invalid arguments"); goto error; } resp = post_request(arg->url, arg->post_data); if (!resp) { - fprintf(stderr, "register_call(): failed to send http request\n"); + log_msg(LOG_ERROR, "register_call", "failed to send http request"); goto error; } if (!resp) { - fprintf(stderr, "register_call(): null response\n"); + log_msg(LOG_ERROR, "register_call", "null response"); goto error; } root = json_loads(resp, 0, NULL); if (!root) { - fprintf(stderr, "register_call(): failed to parse json\n"); + log_msg(LOG_ERROR, "register_call", "failed to parse json"); goto error; } if (!json_is_object(root)) { - fprintf(stderr, "register_call(): json root is not object\n"); + log_msg(LOG_ERROR, "register_call", "json root is not object"); goto error; } 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)) { - fprintf(stderr, - "register_call(): invalid client_id or client_secret\n"); + log_msg(LOG_ERROR, "register_call", + "invalid client_id or client_secret"); goto error; } - client_id = strdup(json_string_value(cid)); - client_secret = strdup(json_string_value(csec)); - instance_domain = arg->domain; - if (strlen(client_id) < 1 || strlen(client_secret) < 1) { - fprintf(stderr, - "register_call(): invalid client_id or client_secret\n"); + 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_ERROR, "register_call", + "invalid client_id or client_secret"); goto error; } @@ -114,14 +139,14 @@ int register_app(const char *instance, void (*callback)(bool success)) pthread_t t; if (!instance || strlen(instance) < 1 || !callback) { - fprintf(stderr, "register_app(): invalid argument\n"); + log_msg(LOG_ERROR, "register_app", "invalid argument"); return -1; } size = sizeof(PROTOCOL_PREFIX) + sizeof(instance) + 1; instance_prefix = malloc(size); if (!instance_prefix) { - err(1, "register_app(): malloc failed"); + err(1, NULL); return -1; } strlcpy(instance_prefix, PROTOCOL_PREFIX, size); @@ -132,7 +157,7 @@ int register_app(const char *instance, void (*callback)(bool success)) "read write push"); if (!root) { - fprintf(stderr, "register_app(): json pack error: line %d: %s\n", + log_msg(LOG_ERROR, "register_app", "json pack error: line %d: %s", error.line, error.text); return -1; } @@ -140,14 +165,14 @@ int register_app(const char *instance, void (*callback)(bool success)) req_data = json_dumps(root, 0); json_decref(root); if (!req_data) { - fprintf(stderr, "register_app(): failed to dump json\n"); + log_msg(LOG_ERROR, "register_app", "failed to dump json"); return -1; } size = strlen(instance_prefix) + strlen(app_register_url) + 1; url = malloc(size); if (!url) { - err(1, "register_app(): malloc failed"); + err(1, NULL); return -1; } @@ -156,7 +181,7 @@ int register_app(const char *instance, void (*callback)(bool success)) arg = calloc(1, sizeof(struct register_call_arg)); if (!arg) { - err(1, "register_app(): calloc failed"); + err(1, NULL); return -1; } arg->url = url; @@ -181,29 +206,29 @@ static void *login_call(void *req_arg) arg = (struct login_call_arg *)req_arg; if (!arg || !(arg->url)) { - fprintf(stderr, "login_call(): invalid arguments\n"); + log_msg(LOG_ERROR, "login_call", "invalid arguments"); goto error; } resp = post_request(arg->url, arg->post_data); if (!resp) { - fprintf(stderr, "login_call(): failed to send http request\n"); + log_msg(LOG_ERROR, "login_call", "failed to send http request"); goto error; } if (!resp) { - fprintf(stderr, "login_call(): null response\n"); + log_msg(LOG_ERROR, "login_call", "null response"); goto error; } root = json_loads(resp, 0, NULL); if (!root) { - fprintf(stderr, "login_call(): failed to parse json\n"); + log_msg(LOG_ERROR, "login_call", "failed to parse json"); goto error; } if (!json_is_object(root)) { - fprintf(stderr, "login_call(): json root is not object\n"); + log_msg(LOG_ERROR, "login_call", "json root is not object"); goto error; } @@ -212,12 +237,17 @@ static void *login_call(void *req_arg) 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) { - fprintf(stderr, "login_call(): invalid access_token or scope\n"); + log_msg(LOG_ERROR, "login_call", "invalid access_token or scope"); goto error; } - access_token = strdup(json_string_value(access_token_j)); - scope = strdup(json_string_value(scope_j)); + config_set_access_token(json_string_value(access_token_j)); + /* scope = strdup(json_string_value(scope_j)); */ + + if (config_save()) { + log_msg(LOG_ERROR, "login_call", "failed to save config"); + goto error; + } free(arg->url); if (arg->post_data) @@ -227,7 +257,7 @@ static void *login_call(void *req_arg) json_decref(root); (*(arg->callback))(true); - printf("access_token: %s\n", access_token); + printf("access_token: %s", config->access_token); return NULL; error: @@ -257,49 +287,46 @@ int login( struct login_call_arg *arg; if (!email || strlen(email) < 1 || !password || strlen(password) < 1) { - fprintf(stderr, "login(): invalid argument\n"); + log_msg(LOG_ERROR, "login", "invalid argument"); return -1; } - if (!client_id || strlen(client_id) < 1 || !client_secret || - strlen(client_secret) < 1 || !instance_domain || - strlen(instance_domain) < 1) { - fprintf(stderr, "login(): invalid client_id or client_secret\n"); - printf("cid: %s\n", client_id); - printf("csec: %s\n", client_secret); - printf("in: %s\n", instance_domain); + if (!(config->client_id) || !*(config->client_id) || + !(config->client_secret) || !*(config->client_secret) || + !(config->instance_url) || !*(config->instance_url)) { + log_msg(LOG_ERROR, "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", - client_id, "client_secret", client_secret, "grant_type", "password", - "username", email, "password", password); + config->client_id, "client_secret", config->client_secret, + "grant_type", "password", "username", email, "password", password); if (!root) { - fprintf(stderr, "login(): json pack error: line %d: %s\n", error.line, - error.text); + log_msg(LOG_ERROR, "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) { - fprintf(stderr, "login(): failed to dump json\n"); + log_msg(LOG_ERROR, "login", "failed to dump json"); return -1; } - size = strlen(instance_domain) + strlen(login_url) + 1; + size = strlen(config->instance_url) + strlen(login_url) + 1; url = malloc(size); if (!url) { - err(1, "login(): malloc failed"); + err(1, NULL); return -1; } - strlcpy(url, instance_domain, size); + strlcpy(url, config->instance_url, size); strlcat(url, login_url, size); arg = calloc(1, sizeof(struct login_call_arg)); if (!arg) { - err(1, "login(): calloc failed"); + err(1, NULL); return -1; } arg->url = url; @@ -307,17 +334,4 @@ int login( arg->callback = callback; return pthread_create(&t, NULL, &login_call, arg); - return 0; -} - -void auth_cleanup() -{ - if (instance_domain) - free(instance_domain); - if (access_token) - free(access_token); - if (client_id) - free(client_id); - if (client_secret) - free(client_secret); } |