summaryrefslogtreecommitdiff
path: root/src/auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/auth.c')
-rw-r--r--src/auth.c347
1 files changed, 78 insertions, 269 deletions
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, &register_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;
}