Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1:kernel-2.6.32
gdm
gdm-autologin.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gdm-autologin.patch of Package gdm
2008-10-23 William Jon McCann <jmccann@redhat.com> * daemon/gdm-display.c (gdm_display_real_get_timed_login_details), (gdm_display_get_timed_login_details), (gdm_display_real_unmanage), (gdm_display_class_init): * daemon/gdm-display.h: * daemon/gdm-display.xml: * daemon/gdm-simple-slave.c (greeter_reset_timeout), (on_session_setup_failed), (on_session_authentication_failed), (on_session_authorized), (on_session_authorization_failed), (stop_greeter), (start_session_timeout), (on_session_accredited), (on_session_accreditation_failed), (on_session_info), (on_session_opened), (on_session_selected_user_changed), (on_default_language_name_changed), (on_default_layout_name_changed), (on_default_session_name_changed), (start_greeter), (idle_connect_to_display), (gdm_simple_slave_stop): * daemon/gdm-slave.c (gdm_slave_get_timed_login_details): * daemon/gdm-slave.h: * daemon/gdm-static-display.c (gdm_static_display_unmanage), (gdm_static_display_get_timed_login_details), (gdm_static_display_class_init), (gdm_static_display_init): * daemon/gdm-transient-display.c (gdm_transient_display_get_timed_login_details), (gdm_transient_display_class_init): * daemon/gdm-xdmcp-display.c (gdm_xdmcp_display_get_timed_login_details), (gdm_xdmcp_display_class_init): Add support for a real automatic login. Make automatic and timed login only work the first time a display is managed. Also prevent automatic and timed login from working on transient and xdmcp displays. 2008-10-22 William Jon McCann <jmccann@redhat.com> * gui/user-switch-applet/gdm-entry-menu-item.c Index: daemon/gdm-xdmcp-display.c =================================================================== --- daemon/gdm-xdmcp-display.c (revision 6581) +++ daemon/gdm-xdmcp-display.c (revision 6582) @@ -182,6 +182,17 @@ } static void +gdm_xdmcp_display_get_timed_login_details (GdmDisplay *display, + gboolean *enabledp, + char **usernamep, + int *delayp) +{ + *enabledp = FALSE; + *usernamep = g_strdup (""); + *delayp = 0; +} + +static void gdm_xdmcp_display_class_init (GdmXdmcpDisplayClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -196,6 +207,7 @@ display_class->remove_user_authorization = gdm_xdmcp_display_remove_user_authorization; display_class->manage = gdm_xdmcp_display_manage; display_class->unmanage = gdm_xdmcp_display_unmanage; + display_class->get_timed_login_details = gdm_xdmcp_display_get_timed_login_details; g_type_class_add_private (klass, sizeof (GdmXdmcpDisplayPrivate)); Index: daemon/gdm-display.xml =================================================================== --- daemon/gdm-display.xml (revision 6581) +++ daemon/gdm-display.xml (revision 6582) @@ -35,5 +35,10 @@ <method name="SetSlaveBusName"> <arg name="name" direction="in" type="s"/> </method> + <method name="GetTimedLoginDetails"> + <arg name="enabled" direction="out" type="b"/> + <arg name="username" direction="out" type="s"/> + <arg name="delay" direction="out" type="i"/> + </method> </interface> </node> Index: daemon/gdm-slave.c =================================================================== --- daemon/gdm-slave.c (revision 6581) +++ daemon/gdm-slave.c (revision 6582) @@ -701,6 +701,60 @@ return res; } +gboolean +gdm_slave_get_timed_login_details (GdmSlave *slave, + gboolean *enabledp, + char **usernamep, + int *delayp) +{ + GError *error; + gboolean res; + gboolean enabled; + char *username; + int delay; + + username = NULL; + enabled = FALSE; + delay = 0; + + g_debug ("GdmSlave: Requesting timed login details"); + + error = NULL; + res = dbus_g_proxy_call (slave->priv->display_proxy, + "GetTimedLoginDetails", + &error, + G_TYPE_INVALID, + G_TYPE_BOOLEAN, &enabled, + G_TYPE_STRING, &username, + G_TYPE_INT, &delay, + G_TYPE_INVALID); + + if (! res) { + if (error != NULL) { + g_warning ("Failed to get timed login details: %s", error->message); + g_error_free (error); + } else { + g_warning ("Failed to get timed login details"); + } + } else { + g_debug ("GdmSlave: Got timed login details: %d %s %d", enabled, username, delay); + } + + if (usernamep != NULL) { + *usernamep = username; + } else { + g_free (username); + } + if (enabledp != NULL) { + *enabledp = enabled; + } + if (delayp != NULL) { + *delayp = delay; + } + + return res; +} + static gboolean _get_uid_and_gid_for_user (const char *username, uid_t *uid, Index: daemon/gdm-slave.h =================================================================== --- daemon/gdm-slave.h (revision 6581) +++ daemon/gdm-slave.h (revision 6582) @@ -60,6 +60,11 @@ char * gdm_slave_get_primary_session_id_for_user (GdmSlave *slave, const char *username); +gboolean gdm_slave_get_timed_login_details (GdmSlave *slave, + gboolean *enabled, + char **username, + int *delay); + gboolean gdm_slave_add_user_authorization (GdmSlave *slave, const char *username, char **filename); Index: daemon/gdm-display.c =================================================================== --- daemon/gdm-display.c (revision 6581) +++ daemon/gdm-display.c (revision 6582) @@ -37,6 +37,9 @@ #include "gdm-display-glue.h" #include "gdm-display-access-file.h" +#include "gdm-settings-direct.h" +#include "gdm-settings-keys.h" + #include "gdm-slave-proxy.h" static guint32 display_serial = 1; @@ -299,6 +302,90 @@ return ret; } +static void +gdm_display_real_get_timed_login_details (GdmDisplay *display, + gboolean *enabledp, + char **usernamep, + int *delayp) +{ + gboolean res; + gboolean enabled; + int delay; + char *username; + + enabled = FALSE; + username = NULL; + delay = 0; + + res = gdm_settings_direct_get_boolean (GDM_KEY_AUTO_LOGIN_ENABLE, &enabled); + if (enabled) { + res = gdm_settings_direct_get_string (GDM_KEY_AUTO_LOGIN_USER, &username); + } + + if (enabled && username != NULL && username[0] != '\0') { + goto out; + } + + g_free (username); + username = NULL; + enabled = FALSE; + + res = gdm_settings_direct_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, &enabled); + if (! enabled) { + goto out; + } + + res = gdm_settings_direct_get_string (GDM_KEY_TIMED_LOGIN_USER, &username); + if (username == NULL || username[0] == '\0') { + enabled = FALSE; + g_free (username); + username = NULL; + /* FIXME: check if a valid username? */ + goto out; + } + + delay = 0; + res = gdm_settings_direct_get_int (GDM_KEY_TIMED_LOGIN_DELAY, &delay); + + if (delay <= 0) { + /* we don't allow the timed login to have a zero delay */ + delay = 10; + } + + out: + if (enabledp != NULL) { + *enabledp = enabled; + } + if (usernamep != NULL) { + *usernamep = username; + } else { + g_free (username); + } + if (delayp != NULL) { + *delayp = delay; + } +} + +gboolean +gdm_display_get_timed_login_details (GdmDisplay *display, + gboolean *enabled, + char **username, + int *delay, + GError **error) +{ + g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); + + GDM_DISPLAY_GET_CLASS (display)->get_timed_login_details (display, enabled, username, delay); + + g_debug ("GdmSlave: Got timed login details for display %s: %d '%s' %d", + display->priv->x11_display_name, + *enabled, + *username, + *delay); + + return TRUE; +} + static gboolean gdm_display_real_remove_user_authorization (GdmDisplay *display, const char *username, @@ -579,7 +666,7 @@ } elapsed = g_timer_elapsed (display->priv->slave_timer, NULL); - if (elapsed < 10) { + if (elapsed < 3) { g_warning ("GdmDisplay: display lasted %lf seconds", elapsed); _gdm_display_set_status (display, GDM_DISPLAY_FAILED); } else { @@ -897,6 +984,7 @@ klass->add_user_authorization = gdm_display_real_add_user_authorization; klass->remove_user_authorization = gdm_display_real_remove_user_authorization; klass->set_slave_bus_name = gdm_display_real_set_slave_bus_name; + klass->get_timed_login_details = gdm_display_real_get_timed_login_details; klass->manage = gdm_display_real_manage; klass->finish = gdm_display_real_finish; klass->unmanage = gdm_display_real_unmanage; Index: daemon/gdm-transient-display.c =================================================================== --- daemon/gdm-transient-display.c (revision 6581) +++ daemon/gdm-transient-display.c (revision 6582) @@ -145,6 +145,17 @@ } static void +gdm_transient_display_get_timed_login_details (GdmDisplay *display, + gboolean *enabledp, + char **usernamep, + int *delayp) +{ + *enabledp = FALSE; + *usernamep = g_strdup (""); + *delayp = 0; +} + +static void gdm_transient_display_class_init (GdmTransientDisplayClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -160,6 +171,7 @@ display_class->manage = gdm_transient_display_manage; display_class->finish = gdm_transient_display_finish; display_class->unmanage = gdm_transient_display_unmanage; + display_class->get_timed_login_details = gdm_transient_display_get_timed_login_details; g_type_class_add_private (klass, sizeof (GdmTransientDisplayPrivate)); Index: daemon/gdm-display.h =================================================================== --- daemon/gdm-display.h (revision 6581) +++ daemon/gdm-display.h (revision 6582) @@ -68,6 +68,10 @@ gboolean (*manage) (GdmDisplay *display); gboolean (*finish) (GdmDisplay *display); gboolean (*unmanage) (GdmDisplay *display); + void (*get_timed_login_details) (GdmDisplay *display, + gboolean *enabled, + char **username, + int *delay); } GdmDisplayClass; typedef enum @@ -110,6 +114,11 @@ gboolean gdm_display_is_local (GdmDisplay *display, gboolean *local, GError **error); +gboolean gdm_display_get_timed_login_details (GdmDisplay *display, + gboolean *enabled, + char **username, + int *delay, + GError **error); /* exported but protected */ gboolean gdm_display_get_x11_cookie (GdmDisplay *display, Index: daemon/gdm-static-display.c =================================================================== --- daemon/gdm-static-display.c (revision 6581) +++ daemon/gdm-static-display.c (revision 6582) @@ -45,7 +45,7 @@ struct GdmStaticDisplayPrivate { - gpointer dummy; + gboolean enable_timed_login; }; enum { @@ -121,6 +121,9 @@ { g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); + /* Only allow timed/automatic login once */ + GDM_STATIC_DISPLAY (display)->priv->enable_timed_login = FALSE; + GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->unmanage (display); return TRUE; @@ -153,6 +156,21 @@ } static void +gdm_static_display_get_timed_login_details (GdmDisplay *display, + gboolean *enabledp, + char **usernamep, + int *delayp) +{ + if (GDM_STATIC_DISPLAY (display)->priv->enable_timed_login) { + GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->get_timed_login_details (display, enabledp, usernamep, delayp); + } else { + *enabledp = FALSE; + *usernamep = g_strdup (""); + *delayp = 0; + } +} + +static void gdm_static_display_class_init (GdmStaticDisplayClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -168,6 +186,7 @@ display_class->manage = gdm_static_display_manage; display_class->finish = gdm_static_display_finish; display_class->unmanage = gdm_static_display_unmanage; + display_class->get_timed_login_details = gdm_static_display_get_timed_login_details; g_type_class_add_private (klass, sizeof (GdmStaticDisplayPrivate)); @@ -179,6 +198,8 @@ { static_display->priv = GDM_STATIC_DISPLAY_GET_PRIVATE (static_display); + + static_display->priv->enable_timed_login = TRUE; } static void Index: daemon/gdm-simple-slave.c =================================================================== --- daemon/gdm-simple-slave.c (revision 6581) +++ daemon/gdm-simple-slave.c (revision 6582) @@ -74,9 +74,10 @@ guint connection_attempts; GdmServer *server; + GdmSessionDirect *session; + GdmGreeterServer *greeter_server; GdmGreeterSession *greeter; - GdmSessionDirect *session; guint start_session_when_ready : 1; guint waiting_to_start_session : 1; @@ -93,6 +94,7 @@ G_DEFINE_TYPE (GdmSimpleSlave, gdm_simple_slave, GDM_TYPE_SLAVE) static void create_new_session (GdmSimpleSlave *slave); +static void start_greeter (GdmSimpleSlave *slave); static void on_session_started (GdmSession *session, @@ -176,8 +178,14 @@ greeter_reset_timeout (GdmSimpleSlave *slave) { g_debug ("GdmSimpleSlave: resetting greeter"); - gdm_greeter_server_reset (slave->priv->greeter_server); - reset_session (slave); + + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_reset (slave->priv->greeter_server); + reset_session (slave); + } else { + start_greeter (slave); + create_new_session (slave); + } slave->priv->greeter_reset_id = 0; return FALSE; } @@ -204,7 +212,10 @@ const char *message, GdmSimpleSlave *slave) { - gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to initialize login system")); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_problem (slave->priv->greeter_server, + _("Unable to initialize login system")); + } destroy_session (slave); queue_greeter_reset (slave); @@ -237,7 +248,10 @@ const char *message, GdmSimpleSlave *slave) { - gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authenticate user")); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_problem (slave->priv->greeter_server, + _("Unable to authenticate user")); + } destroy_session (slave); queue_greeter_reset (slave); } @@ -274,8 +288,13 @@ on_session_authorized (GdmSession *session, GdmSimpleSlave *slave) { - gdm_greeter_server_user_authorized (slave->priv->greeter_server); - gdm_simple_slave_accredit_when_ready (slave); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_user_authorized (slave->priv->greeter_server); + gdm_simple_slave_accredit_when_ready (slave); + } else { + slave->priv->start_session_when_ready = TRUE; + gdm_simple_slave_accredit_when_ready (slave); + } } static void @@ -283,7 +302,10 @@ const char *message, GdmSimpleSlave *slave) { - gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authorize user")); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_problem (slave->priv->greeter_server, + _("Unable to authorize user")); + } destroy_session (slave); queue_greeter_reset (slave); @@ -306,7 +328,26 @@ return res; } +static void +stop_greeter (GdmSimpleSlave *slave) +{ + g_debug ("GdmSimpleSlave: Stopping greeter"); + if (slave->priv->greeter == NULL) { + g_debug ("GdmSimpleSlave: No greeter running"); + return; + } + + /* Run the PostLogin script. gdmslave suspends until script has terminated */ + gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostLogin", GDM_USERNAME); + + gdm_welcome_session_stop (GDM_WELCOME_SESSION (slave->priv->greeter)); + gdm_greeter_server_stop (slave->priv->greeter_server); + + g_object_unref (slave->priv->greeter); + slave->priv->greeter = NULL; +} + static gboolean start_session_timeout (GdmSimpleSlave *slave) { @@ -330,8 +371,7 @@ goto out; } - gdm_welcome_session_stop (GDM_WELCOME_SESSION (slave->priv->greeter)); - gdm_greeter_server_stop (slave->priv->greeter_server); + stop_greeter (slave); auth_file = NULL; add_user_authorization (slave, &auth_file); @@ -365,9 +405,6 @@ GdmSimpleSlave *slave) { queue_start_session (slave); - - /* Run the PostLogin script. gdmslave suspends until script has terminated */ - gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostLogin", GDM_USERNAME); } static void @@ -384,7 +421,10 @@ /* If we switched to another session we don't care if accreditation fails */ if (! migrated) { - gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable establish credentials")); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_problem (slave->priv->greeter_server, + _("Unable establish credentials")); + } } /* We don't stop the slave here after migrating because @@ -402,7 +442,9 @@ GdmSimpleSlave *slave) { g_debug ("GdmSimpleSlave: Info: %s", text); - gdm_greeter_server_info (slave->priv->greeter_server, text); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_info (slave->priv->greeter_server, text); + } } static void @@ -433,64 +475,39 @@ gdm_greeter_server_secret_info_query (slave->priv->greeter_server, text); } -static gboolean -get_timed_login_details (GdmSimpleSlave *slave, - char **username, - int *delay) -{ - gboolean enabled; - gboolean res; - - enabled = FALSE; - res = gdm_settings_client_get_boolean (GDM_KEY_AUTO_LOGIN_ENABLE, &enabled); - if (enabled) { - - *username = NULL; - res = gdm_settings_client_get_string (GDM_KEY_AUTO_LOGIN_USER, username); - } - - if (enabled && *username != NULL) - { - *delay = 0; - return TRUE; - } - - *username = NULL; - enabled = FALSE; - res = gdm_settings_client_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, &enabled); - if (! enabled) { - return FALSE; - } - - res = gdm_settings_client_get_string (GDM_KEY_TIMED_LOGIN_USER, username); - - if (username == NULL) { - return FALSE; - } - - res = gdm_settings_client_get_int (GDM_KEY_TIMED_LOGIN_DELAY, delay); - - return TRUE; -} - static void on_session_opened (GdmSession *session, GdmSimpleSlave *slave) { gboolean res; + gboolean enabled; char *username; int delay; g_debug ("GdmSimpleSlave: session opened"); - res = gdm_greeter_server_ready (slave->priv->greeter_server); - if (! res) { - g_warning ("Unable to send ready"); + if (slave->priv->greeter_server != NULL) { + res = gdm_greeter_server_ready (slave->priv->greeter_server); + if (! res) { + g_warning ("Unable to send ready"); + } } - if (get_timed_login_details (slave, &username, &delay)) { + enabled = FALSE; + gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, &username, &delay); + if (! enabled) { + return; + } + + if (slave->priv->greeter_server != NULL) { gdm_greeter_server_request_timed_login (slave->priv->greeter_server, username, delay); - g_free (username); + } else { + g_debug ("GdmSimpleSlave: begin auto login for user '%s'", username); + gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), + "gdm-autologin", + username); } + + g_free (username); } static void @@ -500,7 +517,9 @@ { g_debug ("GdmSimpleSlave: Selected user changed: %s", text); - gdm_greeter_server_selected_user_changed (slave->priv->greeter_server, text); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_selected_user_changed (slave->priv->greeter_server, text); + } } static void @@ -510,7 +529,9 @@ { g_debug ("GdmSimpleSlave: Default language name changed: %s", text); - gdm_greeter_server_default_language_name_changed (slave->priv->greeter_server, text); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_default_language_name_changed (slave->priv->greeter_server, text); + } } static void @@ -520,7 +541,9 @@ { g_debug ("GdmSimpleSlave: Default layout name changed: %s", text); - gdm_greeter_server_default_layout_name_changed (slave->priv->greeter_server, text); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_default_layout_name_changed (slave->priv->greeter_server, text); + } } static void @@ -530,7 +553,9 @@ { g_debug ("GdmSimpleSlave: Default session name changed: %s", text); - gdm_greeter_server_default_session_name_changed (slave->priv->greeter_server, text); + if (slave->priv->greeter_server != NULL) { + gdm_greeter_server_default_session_name_changed (slave->priv->greeter_server, text); + } } static void @@ -828,7 +853,7 @@ } static void -run_greeter (GdmSimpleSlave *slave) +start_greeter (GdmSimpleSlave *slave) { gboolean display_is_local; char *display_id; @@ -871,8 +896,6 @@ /* Run the init script. gdmslave suspends until script has terminated */ gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", GDM_USERNAME); - create_new_session (slave); - slave->priv->greeter_server = gdm_greeter_server_new (display_id); g_signal_connect (slave->priv->greeter_server, "begin-auto-login", @@ -971,10 +994,22 @@ res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave)); if (res) { + gboolean enabled; + int delay; + /* FIXME: handle wait-for-go */ setup_server (slave); - run_greeter (slave); + + delay = 0; + enabled = FALSE; + gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, &delay); + if (! enabled || delay > 0) { + start_greeter (slave); + create_new_session (slave); + } else { + reset_session (slave); + } } else { if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) { g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts); @@ -1099,9 +1134,7 @@ GDM_SLAVE_CLASS (gdm_simple_slave_parent_class)->stop (slave); if (GDM_SIMPLE_SLAVE (slave)->priv->greeter != NULL) { - gdm_welcome_session_stop (GDM_WELCOME_SESSION (GDM_SIMPLE_SLAVE (slave)->priv->greeter)); - g_object_unref (GDM_SIMPLE_SLAVE (slave)->priv->greeter); - GDM_SIMPLE_SLAVE (slave)->priv->greeter = NULL; + stop_greeter (GDM_SIMPLE_SLAVE (slave)); } if (GDM_SIMPLE_SLAVE (slave)->priv->session != 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