summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Esser <[email protected]>2017-05-07 12:43:48 +0200
committerraveit65 <[email protected]>2017-05-25 19:36:39 +0200
commit7b1d2e7109caa4ae42a197fdc0450d5796bf3f47 (patch)
treefef0f90b93cc0ff4be9ac0cbbcd63046f744a3bc
parentdee9b00521e3ea5bd5b3a62de714595346308fe9 (diff)
downloadmate-session-manager-7b1d2e7109caa4ae42a197fdc0450d5796bf3f47.tar.bz2
mate-session-manager-7b1d2e7109caa4ae42a197fdc0450d5796bf3f47.tar.xz
dbus needs to be updated to get all user-defined environment when
the session starts. dbus-update-activation-environment excepts certain environment variables, that systemd won't. We're going to want to eventually send the environment to systemd, too, so we should make sure the same set of variables get sent to both. See: https://bugzilla.gnome.org/show_bug.cgi?id=736660
-rw-r--r--mate-session/gsm-util.c123
-rw-r--r--mate-session/gsm-util.h2
-rw-r--r--mate-session/main.c3
3 files changed, 99 insertions, 29 deletions
diff --git a/mate-session/gsm-util.c b/mate-session/gsm-util.c
index 6320b24..b026f12 100644
--- a/mate-session/gsm-util.c
+++ b/mate-session/gsm-util.c
@@ -435,54 +435,119 @@ gsm_util_update_activation_environment (const char *variable,
const char *value,
GError **error)
{
- DBusGConnection *dbus_connection;
- DBusGProxy *bus_proxy;
- GHashTable *environment;
+ GDBusConnection *connection;
gboolean environment_updated;
+ GVariantBuilder builder;
+ GVariant *reply;
+ GError *bus_error = NULL;
environment_updated = FALSE;
- bus_proxy = NULL;
- environment = NULL;
+ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error);
- dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, error);
+ if (connection == NULL) {
+ return FALSE;
+ }
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}"));
+ g_variant_builder_add (&builder, "{ss}", variable, value);
+
+ reply = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "UpdateActivationEnvironment",
+ g_variant_new ("(@a{ss})",
+ g_variant_builder_end (&builder)),
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &bus_error);
+
+ if (bus_error != NULL) {
+ g_propagate_error (error, bus_error);
+ } else {
+ environment_updated = TRUE;
+ g_variant_unref (reply);
+ }
- if (dbus_connection == NULL) {
+ g_clear_object (&connection);
+
+ return environment_updated;
+}
+
+gboolean
+gsm_util_export_activation_environment (GError **error)
+{
+ GDBusConnection *connection;
+ gboolean environment_updated = FALSE;
+ char **entry_names;
+ int i = 0;
+ GVariantBuilder builder;
+ GRegex *name_regex, *value_regex;
+ GVariant *reply;
+ GError *bus_error = NULL;
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error);
+
+ if (connection == NULL) {
return FALSE;
}
- bus_proxy = dbus_g_proxy_new_for_name_owner (dbus_connection,
- DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS,
- error);
+ name_regex = g_regex_new ("^[a-zA-Z_][a-zA-Z0-9_]*$", G_REGEX_OPTIMIZE, 0, error);
- if (bus_proxy == NULL) {
- goto out;
+ if (name_regex == NULL) {
+ return FALSE;
}
- environment = g_hash_table_new (g_str_hash, g_str_equal);
+ value_regex = g_regex_new ("^([[:blank:]]|[^[:cntrl:]])*$", G_REGEX_OPTIMIZE, 0, error);
- g_hash_table_insert (environment, (void *) variable, (void *) value);
+ if (value_regex == NULL) {
+ return FALSE;
+ }
- if (!dbus_g_proxy_call (bus_proxy,
- "UpdateActivationEnvironment", error,
- DBUS_TYPE_G_STRING_STRING_HASHTABLE,
- environment, G_TYPE_INVALID,
- G_TYPE_INVALID))
- goto out;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}"));
+ for (entry_names = g_listenv (); entry_names[i] != NULL; i++) {
+ const char *entry_name = entry_names[i];
+ const char *entry_value = g_getenv (entry_name);
- environment_updated = TRUE;
+ if (!g_utf8_validate (entry_name, -1, NULL))
+ continue;
- out:
+ if (!g_regex_match (name_regex, entry_name, 0, NULL))
+ continue;
- if (bus_proxy != NULL) {
- g_object_unref (bus_proxy);
- }
+ if (!g_utf8_validate (entry_value, -1, NULL))
+ continue;
- if (environment != NULL) {
- g_hash_table_destroy (environment);
+ if (!g_regex_match (value_regex, entry_value, 0, NULL))
+ continue;
+
+ g_variant_builder_add (&builder, "{ss}", entry_name, entry_value);
+ }
+ g_regex_unref (name_regex);
+ g_regex_unref (value_regex);
+
+ g_strfreev (entry_names);
+
+ reply = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "UpdateActivationEnvironment",
+ g_variant_new ("(@a{ss})",
+ g_variant_builder_end (&builder)),
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &bus_error);
+
+ if (bus_error != NULL) {
+ g_propagate_error (error, bus_error);
+ } else {
+ environment_updated = TRUE;
+ g_variant_unref (reply);
}
+ g_clear_object (&connection);
+
return environment_updated;
}
diff --git a/mate-session/gsm-util.h b/mate-session/gsm-util.h
index efc980c..112ce6f 100644
--- a/mate-session/gsm-util.h
+++ b/mate-session/gsm-util.h
@@ -48,6 +48,8 @@ void gsm_util_init_error (gboolean fatal,
char * gsm_util_generate_startup_id (void);
+gboolean gsm_util_export_activation_environment (GError **error);
+
void gsm_util_setenv (const char *variable,
const char *value);
diff --git a/mate-session/main.c b/mate-session/main.c
index db55ebd..da931af 100644
--- a/mate-session/main.c
+++ b/mate-session/main.c
@@ -620,6 +620,8 @@ int main(int argc, char** argv)
exit(1);
}
+ gsm_util_export_activation_environment (NULL);
+
mdm_log_init();
/* Allows to enable/disable debug from GSettings only if it is not set from argument */
@@ -727,3 +729,4 @@ int main(int argc, char** argv)
return 0;
}
+