summaryrefslogtreecommitdiff
path: root/src/auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/auth.c')
-rw-r--r--src/auth.c144
1 files changed, 79 insertions, 65 deletions
diff --git a/src/auth.c b/src/auth.c
index 648c2c8..ab37016 100644
--- a/src/auth.c
+++ b/src/auth.c
@@ -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);
}