Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:zhy20120210:home:zhy20120210:SLES-11-SP1-x86-64
gdm
gdm-language-selection.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gdm-language-selection.patch of Package gdm
diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c index b6c04f7..0992861 100644 --- a/daemon/gdm-session-settings.c +++ b/daemon/gdm-session-settings.c @@ -37,6 +37,7 @@ struct _GdmSessionSettingsPrivate char *session_name; char *language_name; char *layout_name; + gboolean is_loaded_from_file; }; static void gdm_session_settings_finalize (GObject *object); @@ -108,7 +109,7 @@ gdm_session_settings_init (GdmSessionSettings *settings) settings->priv = G_TYPE_INSTANCE_GET_PRIVATE (settings, GDM_TYPE_SESSION_SETTINGS, GdmSessionSettingsPrivate); - + settings->priv->is_loaded_from_file = FALSE; } static void @@ -266,6 +267,12 @@ gdm_session_settings_is_loaded (GdmSessionSettings *settings) } gboolean +gdm_session_settings_is_loaded_from_file(GdmSessionSettings *settings) +{ + return settings->priv->is_loaded_from_file; +} + +gboolean gdm_session_settings_load (GdmSessionSettings *settings, const char *home_directory, GError **error) @@ -274,7 +281,7 @@ gdm_session_settings_load (GdmSessionSettings *settings, GError *load_error; gboolean is_loaded; char *session_name; - char *language_name; + char *language_name = NULL; char *layout_name; char *filename; @@ -321,6 +328,7 @@ gdm_session_settings_load (GdmSessionSettings *settings, goto out; } + layout_name = g_key_file_get_string (key_file, "Desktop", "Layout", &load_error); @@ -340,6 +348,7 @@ out: g_key_file_free (key_file); g_free (filename); + settings->priv->is_loaded_from_file = is_loaded; return is_loaded; } diff --git a/daemon/gdm-session-settings.h b/daemon/gdm-session-settings.h index a546598..d36d2e7 100644 --- a/daemon/gdm-session-settings.h +++ b/daemon/gdm-session-settings.h @@ -60,6 +60,7 @@ gboolean gdm_session_settings_save (GdmSessionSettings const char *home_directory, GError **error); gboolean gdm_session_settings_is_loaded (GdmSessionSettings *settings); +gboolean gdm_session_settings_is_loaded_from_file(GdmSessionSettings *settings); char *gdm_session_settings_get_language_name (GdmSessionSettings *settings); char *gdm_session_settings_get_layout_name (GdmSessionSettings *settings); char *gdm_session_settings_get_session_name (GdmSessionSettings *settings); diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c index a5de412..bef60fe 100644 --- a/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c @@ -116,6 +116,7 @@ struct GdmSessionWorkerPrivate char *display_device; char *hostname; char *username; + char *pam_username; uid_t uid; gboolean password_is_required; @@ -569,19 +570,11 @@ static gboolean gdm_session_worker_get_username (GdmSessionWorker *worker, char **username) { - gconstpointer item; - - g_assert (worker->priv->pam_handle != NULL); - - if (pam_get_item (worker->priv->pam_handle, PAM_USER, &item) == PAM_SUCCESS) { - if (username != NULL) { - *username = g_strdup ((char *) item); - g_debug ("GdmSessionWorker: username is '%s'", - *username != NULL ? *username : "<unset>"); + if (username != NULL) + if (worker->priv->pam_username) { + *username = g_strdup (worker->priv->pam_username); + return TRUE; } - return TRUE; - } - return FALSE; } @@ -652,23 +645,27 @@ gdm_session_worker_update_username (GdmSessionWorker *worker) worker->priv->username != NULL ? worker->priv->username : "<unset>", username != NULL ? username : "<unset>"); - gdm_session_auditor_set_username (worker->priv->auditor, worker->priv->username); + if ((worker->priv->username == username) || + ((worker->priv->username != NULL) && (username != NULL) && + (strcmp (worker->priv->username, username) == 0))) + goto out; + + send_dbus_string_method (worker->priv->connection, + "UsernameChanged", + username); + /* We have a new username to try. If we haven't been able to * read user settings up until now, then give it a go now * (see the comment in do_setup for rationale on why it's useful * to keep trying to read settings) */ if (username != NULL && - !gdm_session_settings_is_loaded (worker->priv->user_settings)) { + !gdm_session_settings_is_loaded_from_file (worker->priv->user_settings)) { attempt_to_load_user_settings (worker, username); } - if ((worker->priv->username == username) || - ((worker->priv->username != NULL) && (username != NULL) && - (strcmp (worker->priv->username, username) == 0))) - goto out; g_debug ("GdmSessionWorker: setting username to '%s'", username); @@ -676,9 +673,6 @@ gdm_session_worker_update_username (GdmSessionWorker *worker) worker->priv->username = username; username = NULL; - send_dbus_string_method (worker->priv->connection, - "UsernameChanged", - worker->priv->username); } out: @@ -845,6 +839,7 @@ gdm_session_worker_process_pam_message (GdmSessionWorker *worker, res = gdm_session_worker_ask_for_secret (worker, utf8_msg, &user_answer); break; case PAM_TEXT_INFO: + g_warning ("%s: PAM_TEXT_INFO: %s", __func__, utf8_msg); res = gdm_session_worker_report_info (worker, utf8_msg); break; case PAM_ERROR_MSG: @@ -861,6 +856,13 @@ gdm_session_worker_process_pam_message (GdmSessionWorker *worker, } if (user_answer != NULL) { + if (res && query->msg_style == PAM_PROMPT_ECHO_ON) { + g_debug ("GdmSessionWorker : username %s", user_answer); + if (worker->priv->pam_username) + g_free (worker->priv->pam_username); + worker->priv->pam_username = g_strdup (user_answer); + } + /* we strdup and g_free to make sure we return malloc'd * instead of g_malloc'd memory */ @@ -2726,6 +2728,11 @@ gdm_session_worker_finalize (GObject *object) worker->priv->username = NULL; } + if (worker->priv->pam_username != NULL) { + g_free (worker->priv->pam_username); + worker->priv->pam_username = NULL; + } + if (worker->priv->arguments != NULL) { g_strfreev (worker->priv->arguments); worker->priv->arguments = NULL;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor