summaryrefslogtreecommitdiff
path: root/libgs/src/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgs/src/config.c')
-rw-r--r--libgs/src/config.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/libgs/src/config.c b/libgs/src/config.c
new file mode 100644
index 0000000..167c9af
--- /dev/null
+++ b/libgs/src/config.c
@@ -0,0 +1,174 @@
+#define _POSIX_C_SOURCE 200809L
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <err.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <limits.h>
+#include <libgen.h>
+#include <jansson.h>
+#include "string-util.h"
+#include "config.h"
+#include "log.h"
+
+#define CONFIG_PATH_SUFFIX "/.config/ap_client/config"
+
+struct config _config;
+const struct config *config = (const struct config *)&_config;
+
+bool is_logged_in()
+{
+ if (!(config->access_token) || !*(config->access_token) ||
+ !(config->instance_url) || !*(config->instance_url)) {
+ return false;
+ }
+ return true;
+}
+
+const char *get_access_token()
+{
+ return (const char *)config->access_token;
+}
+
+const char *get_instance_url()
+{
+ return (const char *)config->instance_url;
+}
+
+bool is_registered()
+{
+ if (!(_config.client_id) || !*(_config.client_id) ||
+ !(_config.client_secret) || !*(_config.client_secret) ||
+ !(_config.instance_url) || !*(_config.instance_url)) {
+ return false;
+ }
+ return true;
+}
+
+char *get_config_path()
+{
+ char *home = getenv("HOME");
+ if (!home || !*home) {
+ return NULL;
+ }
+ char config_path[PATH_MAX];
+ strlcpy(config_path, home, sizeof(config_path));
+ strlcat(config_path, CONFIG_PATH_SUFFIX, sizeof(config_path));
+ return strdup(config_path);
+}
+
+void config_load()
+{
+ json_t *root;
+ json_error_t error;
+
+ char *path = get_config_path();
+ root = json_load_file(path, 0, &error);
+ if (!root) {
+ gs_log(GS_WARNING, "config_load", "json parse error: line %d: %s",
+ error.line, error.text);
+ free(path);
+ return;
+ }
+ free(path);
+
+ if (!json_is_object(root)) {
+ gs_log(GS_WARNING, "config_load", "json root is not object");
+ json_decref(root);
+ return;
+ }
+
+ json_t *instance_url = json_object_get(root, "instance_url");
+ if (json_is_string(instance_url)) {
+ _config.instance_url = strdup(json_string_value(instance_url));
+ }
+
+ json_t *client_id = json_object_get(root, "client_id");
+ if (json_is_string(client_id)) {
+ _config.client_id = strdup(json_string_value(client_id));
+ }
+
+ json_t *client_secret = json_object_get(root, "client_secret");
+ if (json_is_string(client_secret)) {
+ _config.client_secret = strdup(json_string_value(client_secret));
+ }
+
+ json_t *access_token = json_object_get(root, "access_token");
+ if (json_is_string(access_token)) {
+ _config.access_token = strdup(json_string_value(access_token));
+ }
+
+ json_decref(root);
+}
+
+int config_save()
+{
+ json_t *root;
+ json_error_t error;
+
+ root = json_pack_ex(&error, 1, "{s:s, s:s, s:s, s:s}", "instance_url",
+ _config.instance_url, "client_id", _config.client_id,
+ "client_secret", _config.client_secret, "access_token",
+ _config.access_token);
+
+ if (!root) {
+ gs_log(GS_WARNING, "register_app", "json pack error: line %d: %s",
+ error.line, error.text);
+ return -1;
+ }
+
+ char *config_path = get_config_path();
+ struct stat st;
+ char *dir = dirname(config_path);
+ if (stat(dir, &st)) {
+ if (mkdir(dir, S_IRWXU)) {
+ free(config_path);
+ gs_log(GS_WARNING, "config_save", "failed to create config dir");
+ return -1;
+ }
+ }
+ free(config_path);
+
+ if (json_dump_file(root, get_config_path(), 0)) {
+ gs_log(GS_WARNING, "config_save", "unable to save json");
+ json_decref(root);
+ return -1;
+ }
+
+ json_decref(root);
+ return 0;
+}
+
+void config_set_client_id(const char *cid)
+{
+ _config.client_id = strdup(cid);
+}
+
+void config_set_client_secret(const char *cs)
+{
+ _config.client_secret = strdup(cs);
+}
+
+void config_set_instance_url(const char *iu)
+{
+ _config.instance_url = strdup(iu);
+}
+
+void config_set_access_token(const char *a)
+{
+ _config.access_token = strdup(a);
+}
+
+void config_cleanup()
+{
+ if (_config.client_id)
+ free(_config.client_id);
+ if (_config.client_secret)
+ free(_config.client_secret);
+ if (_config.instance_url)
+ free(_config.instance_url);
+ if (_config.access_token)
+ free(_config.access_token);
+}