diff options
author | Björn Esser <[email protected]> | 2017-05-07 12:43:48 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2017-05-25 19:33:52 +0200 |
commit | 0495fb8fa8f584a4f294254e39cbdc5615defc87 (patch) | |
tree | 86fddf181e5b557c8075afb7f86eaae627645fc1 | |
parent | da4fc8a9904b518e75b460adc50b8c5a1e45eca2 (diff) | |
download | mate-session-manager-0495fb8fa8f584a4f294254e39cbdc5615defc87.tar.bz2 mate-session-manager-0495fb8fa8f584a4f294254e39cbdc5615defc87.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.c | 123 | ||||
-rw-r--r-- | mate-session/gsm-util.h | 2 | ||||
-rw-r--r-- | mate-session/main.c | 3 |
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; } + |