diff options
author | Ray Strode <rstrode@redhat.com> | 2012-09-17 15:18:02 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2012-09-17 16:41:26 -0400 |
commit | 6d5dd0936629d1d9754dfa93d4f4ac2738baaa84 (patch) | |
tree | d82c3269ad6f02d9559ef2d7da198bb3f8b53d32 /daemon/gdm-session-worker-job.c | |
parent | dfce1962cbb3ca95b0e407450179a0965e6f3ec3 (diff) | |
download | gdm-6d5dd0936629d1d9754dfa93d4f4ac2738baaa84.tar.gz |
worker: Copy environment from login session to reauth sessions
Reauthentication sessions depend on having the same environment
as the session they were initiated from. This is important to
make sure login prompts are in the right language, to make sure
the kerberos credentials cache is looked up, and for various
other reasons.
This commit copies the environment from the login session to
any new reauthentication sessions that get started after login.
https://bugzilla.gnome.org/show_bug.cgi?id=684241
Diffstat (limited to 'daemon/gdm-session-worker-job.c')
-rw-r--r-- | daemon/gdm-session-worker-job.c | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/daemon/gdm-session-worker-job.c b/daemon/gdm-session-worker-job.c index 66268adf..557c4527 100644 --- a/daemon/gdm-session-worker-job.c +++ b/daemon/gdm-session-worker-job.c @@ -57,11 +57,13 @@ struct GdmSessionWorkerJobPrivate guint child_watch_id; char *server_address; + char **environment; }; enum { PROP_0, PROP_SERVER_ADDRESS, + PROP_ENVIRONMENT, PROP_FOR_REAUTH, }; @@ -130,25 +132,30 @@ listify_hash (const char *key, } static void -copy_environment_to_hash (GHashTable *hash) +copy_environment_to_hash (GdmSessionWorkerJob *job, + GHashTable *hash) { - gchar **env_strv; - gint i; + char **environment; + gint i; - env_strv = g_listenv (); + if (job->priv->environment != NULL) { + environment = g_strdupv (job->priv->environment); + } else { + environment = g_get_environ (); + } + for (i = 0; environment[i]; i++) { + char **parts; - for (i = 0; env_strv [i]; i++) { - gchar *key = env_strv [i]; - const gchar *value; + parts = g_strsplit (environment[i], "=", 2); - value = g_getenv (key); - if (!value) - continue; + if (parts[0] != NULL && parts[1] != NULL) { + g_hash_table_insert (hash, g_strdup (parts[0]), g_strdup (parts[1])); + } - g_hash_table_insert (hash, g_strdup (key), g_strdup (value)); + g_strfreev (parts); } - g_strfreev (env_strv); + g_strfreev (environment); } static GPtrArray * @@ -192,7 +199,7 @@ get_job_environment (GdmSessionWorkerJob *job) /* create a hash table of current environment, then update keys has necessary */ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - copy_environment_to_hash (hash); + copy_environment_to_hash (job, hash); g_hash_table_insert (hash, g_strdup ("GDM_SESSION_DBUS_ADDRESS"), g_strdup (job->priv->server_address)); @@ -364,6 +371,15 @@ gdm_session_worker_job_set_for_reauth (GdmSessionWorkerJob *session_worker_job, session_worker_job->priv->for_reauth = for_reauth; } +void +gdm_session_worker_job_set_environment (GdmSessionWorkerJob *session_worker_job, + const char * const *environment) +{ + g_return_if_fail (GDM_IS_SESSION_WORKER_JOB (session_worker_job)); + + session_worker_job->priv->environment = g_strdupv ((char **) environment); +} + static void gdm_session_worker_job_set_property (GObject *object, guint prop_id, @@ -381,6 +397,9 @@ gdm_session_worker_job_set_property (GObject *object, case PROP_FOR_REAUTH: gdm_session_worker_job_set_for_reauth (self, g_value_get_boolean (value)); break; + case PROP_ENVIRONMENT: + gdm_session_worker_job_set_environment (self, g_value_get_pointer (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -404,6 +423,9 @@ gdm_session_worker_job_get_property (GObject *object, case PROP_FOR_REAUTH: g_value_set_boolean (value, self->priv->for_reauth); break; + case PROP_ENVIRONMENT: + g_value_set_pointer (value, self->priv->environment); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -450,6 +472,12 @@ gdm_session_worker_job_class_init (GdmSessionWorkerJobClass *klass) "for reauth", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_ENVIRONMENT, + g_param_spec_pointer ("environment", + "environment", + "environment", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); signals [STARTED] = g_signal_new ("started", G_OBJECT_CLASS_TYPE (object_class), |