summaryrefslogtreecommitdiff
path: root/src/gclue-config.c
diff options
context:
space:
mode:
authorZeeshan Ali (Khattak) <zeeshanak@gnome.org>2014-04-16 20:40:12 +0100
committerZeeshan Ali (Khattak) <zeeshanak@gnome.org>2014-04-16 20:40:12 +0100
commit57d456f72d12f0182345c6586e71b27f2c5b79df (patch)
tree9baa4b8ea6395957d111d783e27881f42eceed06 /src/gclue-config.c
parentaa4ef88eea3a5fba96113d76a470f2e3e7efe84b (diff)
config: Load all config at startup
We'll need this later when we'll override the config parameters with values passed from commandline.
Diffstat (limited to 'src/gclue-config.c')
-rw-r--r--src/gclue-config.c324
1 files changed, 203 insertions, 121 deletions
diff --git a/src/gclue-config.c b/src/gclue-config.c
index 67b5111..f99c296 100644
--- a/src/gclue-config.c
+++ b/src/gclue-config.c
@@ -30,9 +30,35 @@
G_DEFINE_TYPE (GClueConfig, gclue_config, G_TYPE_OBJECT)
+typedef struct
+{
+ char *id;
+ gboolean allowed;
+ int* users;
+ gsize num_users;
+} AppConfig;
+
+static void
+app_config_free (AppConfig *app_config)
+{
+ g_free (app_config->id);
+ g_free (app_config->users);
+ g_slice_free (AppConfig, app_config);
+}
+
struct _GClueConfigPrivate
{
GKeyFile *key_file;
+
+ char **agents;
+ gsize num_agents;
+
+ char *wifi_url;
+ gboolean wifi_submit;
+ char *wifi_submit_url;
+ char *wifi_submit_nick;
+
+ GList *app_configs;
};
static void
@@ -43,6 +69,12 @@ gclue_config_finalize (GObject *object)
priv = GCLUE_CONFIG (object)->priv;
g_clear_pointer (&priv->key_file, g_key_file_unref);
+ g_clear_pointer (&priv->agents, g_strfreev);
+ g_clear_pointer (&priv->wifi_url, g_free);
+ g_clear_pointer (&priv->wifi_submit_url, g_free);
+ g_clear_pointer (&priv->wifi_submit_nick, g_free);
+
+ g_list_foreach (priv->app_configs, (GFunc) app_config_free, NULL);
G_OBJECT_CLASS (gclue_config_parent_class)->finalize (object);
}
@@ -58,6 +90,139 @@ gclue_config_class_init (GClueConfigClass *klass)
}
static void
+load_agent_config (GClueConfig *config)
+{
+ GClueConfigPrivate *priv = config->priv;
+ GError *error = NULL;
+
+ priv->agents = g_key_file_get_string_list (priv->key_file,
+ "agent",
+ "whitelist",
+ &priv->num_agents,
+ &error);
+ if (error != NULL) {
+ g_critical ("Failed to read 'agent/whitelist' key: %s",
+ error->message);
+ g_error_free (error);
+ }
+}
+
+static void
+load_app_configs (GClueConfig *config)
+{
+ const char *known_groups[] = { "agent", "wifi", NULL };
+ GClueConfigPrivate *priv = config->priv;
+ gsize num_groups, i;
+ char **groups;
+
+ groups = g_key_file_get_groups (priv->key_file, &num_groups);
+ if (num_groups == 0)
+ return;
+
+ for (i = 0; i < num_groups; i++) {
+ AppConfig *app_config;
+ int* users;
+ gsize num_users, j;
+ gboolean allowed;
+ gboolean ignore = FALSE;
+ GError *error = NULL;
+
+ for (j = 0; known_groups[j] != NULL; j++)
+ if (strcmp (groups[i], known_groups[j]) == 0) {
+ ignore = TRUE;
+
+ continue;
+ }
+
+ if (ignore)
+ continue;
+
+ allowed = g_key_file_get_boolean (priv->key_file,
+ groups[i],
+ "allowed",
+ &error);
+ if (error != NULL)
+ goto error_out;
+
+ users = g_key_file_get_integer_list (priv->key_file,
+ groups[i],
+ "users",
+ &num_users,
+ &error);
+ if (error != NULL)
+ goto error_out;
+
+ app_config = g_slice_new0 (AppConfig);
+ app_config->id = g_strdup (groups[i]);
+ app_config->allowed = allowed;
+ app_config->users = users;
+ app_config->num_users = num_users;
+
+ priv->app_configs = g_list_prepend (priv->app_configs, app_config);
+
+ continue;
+error_out:
+ g_warning ("Failed to load configuration for app '%s': %s",
+ groups[i],
+ error->message);
+ g_error_free (error);
+ }
+
+ g_strfreev (groups);
+}
+
+#define DEFAULT_WIFI_URL "https://location.services.mozilla.com/v1/geolocate?key=geoclue"
+#define DEFAULT_WIFI_SUBMIT_URL "https://location.services.mozilla.com/v1/submit?key=geoclue"
+
+static void
+load_wifi_config (GClueConfig *config)
+{
+ GClueConfigPrivate *priv = config->priv;
+ GError *error = NULL;
+
+ priv->wifi_url = g_key_file_get_string (priv->key_file,
+ "wifi",
+ "url",
+ &error);
+ if (error != NULL) {
+ g_warning ("%s", error->message);
+ g_clear_error (&error);
+ priv->wifi_url = g_strdup (DEFAULT_WIFI_URL);
+ }
+
+ priv->wifi_submit = g_key_file_get_boolean (priv->key_file,
+ "wifi",
+ "submit-data",
+ &error);
+ if (error != NULL) {
+ g_debug ("Failed to get config wifi/submit-data: %s",
+ error->message);
+ g_error_free (error);
+
+ return;
+ }
+
+ priv->wifi_submit_url = g_key_file_get_string (priv->key_file,
+ "wifi",
+ "submission-url",
+ &error);
+ if (error != NULL) {
+ g_debug ("No wifi submission URL: %s", error->message);
+ g_error_free (error);
+ priv->wifi_submit_url = g_strdup (DEFAULT_WIFI_SUBMIT_URL);
+ }
+
+ priv->wifi_submit_nick = g_key_file_get_string (priv->key_file,
+ "wifi",
+ "submission-nick",
+ &error);
+ if (error != NULL) {
+ g_debug ("No wifi submission nick: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
gclue_config_init (GClueConfig *config)
{
GError *error = NULL;
@@ -75,7 +240,13 @@ gclue_config_init (GClueConfig *config)
g_critical ("Failed to load configuration file '%s': %s",
CONFIG_FILE_PATH, error->message);
g_error_free (error);
+
+ return;
}
+
+ load_agent_config (config);
+ load_app_configs (config);
+ load_wifi_config (config);
}
GClueConfig *
@@ -94,35 +265,14 @@ gclue_config_is_agent_allowed (GClueConfig *config,
const char *desktop_id,
GClueClientInfo *agent_info)
{
- GClueConfigPrivate *priv = config->priv;
- char **agents;
- gsize num_agents, i;
- gboolean allowed = FALSE;
- GError *error = NULL;
-
- agents = g_key_file_get_string_list (priv->key_file,
- "agent",
- "whitelist",
- &num_agents,
- &error);
- if (error != NULL) {
- g_critical ("Failed to read 'agent/whitelist' key: %s",
- error->message);
- g_error_free (error);
+ gsize i;
- return FALSE;
- }
-
- for (i = 0; i < num_agents; i++) {
- if (g_strcmp0 (desktop_id, agents[i]) == 0) {
- allowed = TRUE;
-
- break;
- }
+ for (i = 0; i < config->priv->num_agents; i++) {
+ if (g_strcmp0 (desktop_id, config->priv->agents[i]) == 0)
+ return TRUE;
}
- g_strfreev (agents);
- return allowed;
+ return FALSE;
}
gboolean
@@ -131,128 +281,60 @@ gclue_config_is_app_allowed (GClueConfig *config,
GClueClientInfo *app_info)
{
GClueConfigPrivate *priv = config->priv;
- int* users = NULL;
+ GList *node;
+ AppConfig *app_config;
+ gsize i;
guint64 uid;
- gsize num_users, i;
- gboolean allowed = FALSE;
- GError *error = NULL;
g_return_val_if_fail (desktop_id != NULL, FALSE);
- allowed = g_key_file_get_boolean (priv->key_file,
- desktop_id,
- "allowed",
- &error);
- if (error != NULL || !allowed) {
- g_debug ("'%s' not in configuration or not allowed", desktop_id);
- goto out;
- }
-
- uid = gclue_client_info_get_user_id (app_info);
- users = g_key_file_get_integer_list (priv->key_file,
- desktop_id,
- "users",
- &num_users,
- &error);
- if (error != NULL) {
- g_warning ("%s", error->message);
- goto out;
- }
- if (num_users == 0) {
- allowed = TRUE;
- goto out;
- }
-
- for (i = 0; i < num_users; i++) {
- if (users[i] == uid) {
- allowed = TRUE;
+ for (node = priv->app_configs; node != NULL; node = node->next) {
+ if (strcmp (((AppConfig *) node->data)->id, desktop_id) == 0) {
+ app_config = (AppConfig *) node->data;
break;
}
}
-out:
- g_clear_pointer (&users, g_free);
- g_clear_error (&error);
+ if (app_config == NULL || !app_config->allowed) {
+ g_debug ("'%s' not in configuration or not allowed", desktop_id);
- return allowed;
-}
+ return FALSE;
+ }
-#define DEFAULT_WIFI_URL "https://location.services.mozilla.com/v1/geolocate?key=geoclue"
+ if (app_config->num_users == 0)
+ return TRUE;
-char *
-gclue_config_get_wifi_url (GClueConfig *config)
-{
- char *url;
- GError *error = NULL;
+ uid = gclue_client_info_get_user_id (app_info);
- url = g_key_file_get_string (config->priv->key_file,
- "wifi",
- "url",
- &error);
- if (error != NULL) {
- g_warning ("%s", error->message);
- g_error_free (error);
- url = g_strdup (DEFAULT_WIFI_URL);
+ for (i = 0; i < app_config->num_users; i++) {
+ if (app_config->users[i] == uid)
+ return TRUE;
}
- return url;
+ return FALSE;
}
-#define DEFAULT_WIFI_SUBMIT_URL "https://location.services.mozilla.com/v1/submit?key=geoclue"
+const char *
+gclue_config_get_wifi_url (GClueConfig *config)
+{
+ return config->priv->wifi_url;
+}
-char *
+const char *
gclue_config_get_wifi_submit_url (GClueConfig *config)
{
- char *url;
- GError *error = NULL;
-
- url = g_key_file_get_string (config->priv->key_file,
- "wifi",
- "submission-url",
- &error);
- if (error != NULL) {
- g_debug ("No wifi submission URL: %s", error->message);
- g_error_free (error);
- url = g_strdup (DEFAULT_WIFI_SUBMIT_URL);
- }
-
- return url;
+ return config->priv->wifi_submit_url;
}
-char *
+const char *
gclue_config_get_wifi_submit_nick (GClueConfig *config)
{
- char *nick;
- GError *error = NULL;
-
- nick = g_key_file_get_string (config->priv->key_file,
- "wifi",
- "submission-nick",
- &error);
- if (error != NULL) {
- g_debug ("No wifi submission nick: %s", error->message);
- g_error_free (error);
- }
-
- return nick;
+ return config->priv->wifi_submit_nick;
}
gboolean
gclue_config_get_wifi_submit_data (GClueConfig *config)
{
- gboolean submit = FALSE;
- GError *error = NULL;
-
- submit = g_key_file_get_boolean (config->priv->key_file,
- "wifi",
- "submit-data",
- &error);
- if (error != NULL) {
- g_debug ("Failed to get config wifi/submit-data: %s",
- error->message);
- g_error_free (error);
- }
-
- return submit;
+ return config->priv->wifi_submit;
}