diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | doc/tmpl/greeter.sgml | 7 | ||||
-rw-r--r-- | liblightdm-gobject/greeter-protocol.h | 3 | ||||
-rw-r--r-- | liblightdm-gobject/greeter.c | 27 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/greeter.h | 1 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.cpp | 7 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.h | 1 | ||||
-rw-r--r-- | src/display.c | 2 | ||||
-rw-r--r-- | src/greeter-protocol.h | 3 | ||||
-rw-r--r-- | src/greeter.c | 8 | ||||
-rw-r--r-- | tests/scripts/login-gobject-guest-fail-setup-script.script | 3 | ||||
-rw-r--r-- | tests/scripts/login-gobject-guest-no-setup-script.script | 3 | ||||
-rw-r--r-- | tests/scripts/login-gobject-guest.script | 8 | ||||
-rw-r--r-- | tests/scripts/switch-to-greeter.script | 4 | ||||
-rw-r--r-- | tests/src/test-gobject-greeter.c | 7 |
15 files changed, 77 insertions, 10 deletions
@@ -14,6 +14,9 @@ Overview of changes in lightdm 0.4.5 - Support setting autologin user to guest account - Split the user accounts configuration into /etc/lightdm/users.conf so the main config can be private. + * liblightdm API changes: + - Added a session-failed signal to indicate if the session didn't start + and the greeter should try authorizing again. * Drop most of the configure options, they aren't necessary * Removed the Vala and Python GTK+ greeters, they weren't being well maintained. diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index 79dc19bc..6b1e4d6b 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -101,6 +101,13 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @ldmgreeter: the object which received the signal. +<!-- ##### SIGNAL LdmGreeter::session-failed ##### --> +<para> + +</para> + +@ldmgreeter: the object which received the signal. + <!-- ##### SIGNAL LdmGreeter::show-message ##### --> <para> diff --git a/liblightdm-gobject/greeter-protocol.h b/liblightdm-gobject/greeter-protocol.h index f4931f7f..2853a656 100644 --- a/liblightdm-gobject/greeter-protocol.h +++ b/liblightdm-gobject/greeter-protocol.h @@ -26,7 +26,8 @@ typedef enum GREETER_MESSAGE_CONNECTED = 101, GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, - GREETER_MESSAGE_END_AUTHENTICATION = 104 + GREETER_MESSAGE_END_AUTHENTICATION = 104, + GREETER_MESSAGE_SESSION_FAILED = 105 } GreeterMessage; #endif /* _GREETER_PROTOCOL_H_ */ diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index dabf7bd1..3eee8813 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -49,6 +49,7 @@ enum { SHOW_PROMPT, SHOW_MESSAGE, AUTHENTICATION_COMPLETE, + SESSION_FAILED, TIMED_LOGIN, USER_ADDED, USER_CHANGED, @@ -342,6 +343,13 @@ handle_end_authentication (LdmGreeter *greeter, gsize *offset) } static void +handle_session_failed (LdmGreeter *greeter, gsize *offset) +{ + g_debug ("Session failed to start"); + g_signal_emit (G_OBJECT (greeter), signals[SESSION_FAILED], 0); +} + +static void handle_quit (LdmGreeter *greeter, gsize *offset) { g_debug ("Got quit request from server"); @@ -420,6 +428,9 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data) case GREETER_MESSAGE_END_AUTHENTICATION: handle_end_authentication (greeter, &offset); break; + case GREETER_MESSAGE_SESSION_FAILED: + handle_session_failed (greeter, &offset); + break; case GREETER_MESSAGE_QUIT: handle_quit (greeter, &offset); break; @@ -1862,6 +1873,22 @@ ldm_greeter_class_init (LdmGreeterClass *klass) G_TYPE_NONE, 0); /** + * LdmGreeter::session-failed: + * @greeter: A #LdmGreeter + * + * The ::session-failed signal gets emitted when the deamon has failed + * to start the requested session. + **/ + signals[SESSION_FAILED] = + g_signal_new ("session-failed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LdmGreeterClass, session_failed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** * LdmGreeter::timed-login: * @greeter: A #LdmGreeter * @username: A username diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index a1cf3249..b8dc4a31 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -59,6 +59,7 @@ struct _LdmGreeterClass void (*show_prompt)(LdmGreeter *greeter, const gchar *text, LdmPromptType type); void (*show_message)(LdmGreeter *greeter, const gchar *text, LdmMessageType type); void (*authentication_complete)(LdmGreeter *greeter); + void (*session_failed)(LdmGreeter *greeter); void (*timed_login)(LdmGreeter *greeter, const gchar *username); void (*user_added)(LdmGreeter *greeter, LdmUser *user); void (*user_changed)(LdmGreeter *greeter, LdmUser *user); diff --git a/liblightdm-qt/QLightDM/greeter.cpp b/liblightdm-qt/QLightDM/greeter.cpp index 4db55779..e81575c8 100644 --- a/liblightdm-qt/QLightDM/greeter.cpp +++ b/liblightdm-qt/QLightDM/greeter.cpp @@ -44,7 +44,8 @@ typedef enum GREETER_MESSAGE_CONNECTED = 101, GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, - GREETER_MESSAGE_END_AUTHENTICATION = 104 + GREETER_MESSAGE_END_AUTHENTICATION = 104, + GREETER_MESSAGE_SESSION_FAILED = 105 } GreeterMessage; #define HEADER_SIZE 8 @@ -387,6 +388,10 @@ void Greeter::onRead(int fd) else qDebug () << "Ignoring end authentication with invalid sequence number " << sequenceNumber; break; + case GREETER_MESSAGE_SESSION_FAILED: + qDebug() << "Session failed to start"; + emit sessionFailed(); + break; default: qDebug() << "Unknown message from server: " << id; } diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index 6fe3541b..1e2056a4 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -82,6 +82,7 @@ namespace QLightDM void showMessage(QString message); void showError(QString message); void authenticationComplete(bool isAuthenticated); + void sessionFailed(); void timedLogin(QString username); void quit(); diff --git a/src/display.c b/src/display.c index 8ff1f393..af4479ee 100644 --- a/src/display.c +++ b/src/display.c @@ -559,7 +559,7 @@ greeter_start_session_cb (Greeter *greeter, const gchar *session, gboolean is_gu { if (!guest_account_ref ()) { - g_debug ("Failed to create guest account"); + g_debug ("Failed to create guest account, aborting login"); return FALSE; } } diff --git a/src/greeter-protocol.h b/src/greeter-protocol.h index f4931f7f..2853a656 100644 --- a/src/greeter-protocol.h +++ b/src/greeter-protocol.h @@ -26,7 +26,8 @@ typedef enum GREETER_MESSAGE_CONNECTED = 101, GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, - GREETER_MESSAGE_END_AUTHENTICATION = 104 + GREETER_MESSAGE_END_AUTHENTICATION = 104, + GREETER_MESSAGE_SESSION_FAILED = 105 } GreeterMessage; #endif /* _GREETER_PROTOCOL_H_ */ diff --git a/src/greeter.c b/src/greeter.c index 8429c218..b6e4f2ca 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -238,7 +238,6 @@ authentication_result_cb (PAMSession *session, int result, Greeter *greeter) if (result == PAM_SUCCESS) { g_debug ("User %s authorized", pam_session_get_username (session)); - //run_script ("PostLogin"); pam_session_authorize (session); } @@ -393,9 +392,14 @@ handle_start_session (Greeter *greeter, gchar *session) session = NULL; g_signal_emit (greeter, signals[START_SESSION], 0, session, greeter->priv->using_guest_account, &result); + if (!result) { - // FIXME: Write back to greeter + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; + + write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SESSION_FAILED, 0, &offset); + write_message (greeter, message, offset); } } diff --git a/tests/scripts/login-gobject-guest-fail-setup-script.script b/tests/scripts/login-gobject-guest-fail-setup-script.script index cf7f84b3..90968647 100644 --- a/tests/scripts/login-gobject-guest-fail-setup-script.script +++ b/tests/scripts/login-gobject-guest-fail-setup-script.script @@ -17,7 +17,8 @@ GREETER CONNECTED-TO-DAEMON # Login as guest GREETER LOGIN-GUEST -GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE +GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE +GREETER SESSION-FAILED # Cleanup *STOP-DAEMON diff --git a/tests/scripts/login-gobject-guest-no-setup-script.script b/tests/scripts/login-gobject-guest-no-setup-script.script index 16341994..3524fffe 100644 --- a/tests/scripts/login-gobject-guest-no-setup-script.script +++ b/tests/scripts/login-gobject-guest-no-setup-script.script @@ -17,7 +17,8 @@ GREETER CONNECTED-TO-DAEMON # Login as guest GREETER LOGIN-GUEST -GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE +GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE +GREETER SESSION-FAILED # Cleanup *STOP-DAEMON diff --git a/tests/scripts/login-gobject-guest.script b/tests/scripts/login-gobject-guest.script index c8c63aef..22db7319 100644 --- a/tests/scripts/login-gobject-guest.script +++ b/tests/scripts/login-gobject-guest.script @@ -18,9 +18,13 @@ GREETER CONNECTED-TO-DAEMON # Login as guest GREETER LOGIN-GUEST GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE - -# Greeter quits, guest session starts GREETER QUIT + +# X server resets +XSERVER :50 DISCONNECT-CLIENTS +XSERVER :50 INDICATE-READY + +# Guest session starts SESSION START USER=guest XSERVER :50 ACCEPT-CONNECT SESSION CONNECT-XSERVER diff --git a/tests/scripts/switch-to-greeter.script b/tests/scripts/switch-to-greeter.script index 1630bb3e..71625f0a 100644 --- a/tests/scripts/switch-to-greeter.script +++ b/tests/scripts/switch-to-greeter.script @@ -22,6 +22,10 @@ GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE GREETER QUIT +# X server resets +XSERVER :50 DISCONNECT-CLIENTS +XSERVER :50 INDICATE-READY + # Session starts SESSION START USER=alice XSERVER :50 ACCEPT-CONNECT diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index 5afac623..dd003d3d 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -114,6 +114,12 @@ authentication_complete_cb (LdmGreeter *greeter) } static void +session_failed_cb (LdmGreeter *greeter) +{ + notify_status ("GREETER SESSION-FAILED"); +} + +static void quit_cb (LdmGreeter *greeter) { notify_status ("GREETER QUIT"); @@ -158,6 +164,7 @@ main (int argc, char **argv) g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL); g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL); g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL); + g_signal_connect (greeter, "session-failed", G_CALLBACK (session_failed_cb), NULL); g_signal_connect (greeter, "quit", G_CALLBACK (quit_cb), NULL); notify_status ("GREETER CONNECT-TO-DAEMON"); |