summaryrefslogtreecommitdiff
path: root/src/register.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/register.c')
-rw-r--r--src/register.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/register.c b/src/register.c
new file mode 100644
index 0000000..4885ec5
--- /dev/null
+++ b/src/register.c
@@ -0,0 +1,128 @@
+#define _POSIX_C_SOURCE 200809L
+#include <err.h>
+#include <string.h>
+#include <stdbool.h>
+#include <jansson.h>
+#include "http.h"
+#include "config.h"
+#include "log.h"
+
+#define CLIENT_NAME "ap_client"
+#define REGISTER_URL "https://%s/api/v1/apps"
+
+struct register_response {
+ char *client_id;
+ char *client_secret;
+};
+
+static char *get_register_url(const char *domain)
+{
+ char *url;
+ size_t size;
+
+ size = strlen(REGISTER_URL) + strlen(domain) - 1;
+ url = malloc(size);
+ if (!url) {
+ err(1, NULL);
+ return NULL;
+ }
+
+ sprintf(url, REGISTER_URL, domain);
+ return url;
+}
+
+static char *get_register_req()
+{
+ char *req;
+ json_t *json_root;
+
+ json_root = json_pack_ex(NULL, 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 (!json_root) {
+ return NULL;
+ }
+
+ req = json_dumps(json_root, 0);
+ json_decref(json_root);
+
+ return req;
+}
+
+static struct register_response *get_register_resp(const char *data)
+{
+ struct register_response *resp;
+ json_t *json_root;
+ json_t *cid, *csec;
+
+ json_root = json_loads(data, 0, NULL);
+ if (!json_root) {
+ return NULL;
+ }
+
+ if (!json_is_object(json_root)) {
+ json_decref(json_root);
+ return NULL;
+ }
+
+ cid = json_object_get(json_root, "client_id");
+ csec = json_object_get(json_root, "client_secret");
+ if (!json_is_string(cid) || !json_is_string(csec)) {
+ json_decref(json_root);
+ return NULL;
+ }
+
+ resp = calloc(1, sizeof(struct register_response));
+ resp->client_id = strdup(json_string_value(cid));
+ resp->client_secret = strdup(json_string_value(csec));
+
+ json_decref(json_root);
+ return resp;
+}
+
+int register_app(const char *domain)
+{
+ char *url, *req_data, *resp_data;
+ struct register_response *resp;
+
+ if (!domain || !*domain) {
+ log_msg(LOG_WARNING, "register_app", "invalid argument");
+ return -1;
+ }
+
+ url = get_register_url(domain);
+ if (!url) {
+ return -1;
+ }
+
+ req_data = get_register_req();
+ if (!req_data) {
+ free(url);
+ return -1;
+ }
+
+ resp_data = post_request(url, req_data);
+ free(url);
+ free(req_data);
+ if (!resp_data) {
+ log_msg(LOG_WARNING, "register_app", "register request failed");
+ return -1;
+ }
+
+ resp = get_register_resp(resp_data);
+ free(resp_data);
+ if (!resp) {
+ log_msg(LOG_WARNING, "register_app", "invalid response");
+ return -1;
+ }
+
+ config_set_client_id(resp->client_id);
+ config_set_client_secret(resp->client_secret);
+ config_set_instance_url(domain);
+
+ free(resp->client_id);
+ free(resp->client_secret);
+ free(resp);
+
+ return 0;
+}