summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--doc/tmpl/greeter.sgml7
-rw-r--r--liblightdm-gobject/greeter-protocol.h3
-rw-r--r--liblightdm-gobject/greeter.c27
-rw-r--r--liblightdm-gobject/lightdm/greeter.h1
-rw-r--r--liblightdm-qt/QLightDM/greeter.cpp7
-rw-r--r--liblightdm-qt/QLightDM/greeter.h1
-rw-r--r--src/display.c2
-rw-r--r--src/greeter-protocol.h3
-rw-r--r--src/greeter.c8
-rw-r--r--tests/scripts/login-gobject-guest-fail-setup-script.script3
-rw-r--r--tests/scripts/login-gobject-guest-no-setup-script.script3
-rw-r--r--tests/scripts/login-gobject-guest.script8
-rw-r--r--tests/scripts/switch-to-greeter.script4
-rw-r--r--tests/src/test-gobject-greeter.c7
15 files changed, 77 insertions, 10 deletions
diff --git a/NEWS b/NEWS
index 511fa1a0..96680158 100644
--- a/NEWS
+++ b/NEWS
@@ -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");