* Enironment is no longer passed through to X servers and sessions, this is
no longer required now PAM works correctly.
* liblightdm API changes:
- - Added two signals: select-user and select-guest. This requires the
- greeter to select a user account for logging in.
- Drop ldm_greeter_get_is_first() - it was added for testing and doesn't
work well.
* Fix more errors where authentication messages from previous sessions could
@ldmgreeter: the object which received the signal.
-<!-- ##### SIGNAL LdmGreeter::select-guest ##### -->
-<para>
-
-</para>
-
-@ldmgreeter: the object which received the signal.
-
-<!-- ##### SIGNAL LdmGreeter::select-user ##### -->
-<para>
-
-</para>
-
-@ldmgreeter: the object which received the signal.
-@arg1:
-
<!-- ##### SIGNAL LdmGreeter::show-message ##### -->
<para>
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
}
-static void
-select_user_cb (LdmGreeter *greeter, const gchar *username)
-{
- // FIXME
-}
-
-static void
-select_guest_cb (LdmGreeter *greeter)
-{
- // FIXME
-}
-
static void
quit_cb (LdmGreeter *greeter, const gchar *username)
{
}
static void
-connect_cb (LdmGreeter *greeter)
+connected_cb (LdmGreeter *greeter)
{
GdkWindow *root;
GdkDisplay *display;
1, "Other...",
2, gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), "stock_person", 64, 0, NULL),
-1);
+
+ // FIXME: Select the requested user if ldm_greeter_get_timed_login_user () && ldm_greeter_get_timed_login_delay () == 0
renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
g_type_init ();
greeter = ldm_greeter_new ();
- g_signal_connect (G_OBJECT (greeter), "connected", G_CALLBACK (connect_cb), NULL);
+ g_signal_connect (G_OBJECT (greeter), "connected", G_CALLBACK (connected_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "show-message", G_CALLBACK (show_message_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "user-added", G_CALLBACK (user_added_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "user-changed", G_CALLBACK (user_changed_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "user-removed", G_CALLBACK (user_removed_cb), NULL);
- g_signal_connect (G_OBJECT (greeter), "select-user", G_CALLBACK (select_user_cb), NULL);
- g_signal_connect (G_OBJECT (greeter), "select-guest", G_CALLBACK (select_guest_cb), NULL);
g_signal_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
ldm_greeter_connect_to_server (greeter);
GREETER_MESSAGE_CONNECTED = 101,
GREETER_MESSAGE_QUIT = 102,
GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103,
- GREETER_MESSAGE_END_AUTHENTICATION = 104,
- GREETER_MESSAGE_SELECT_USER = 107,
- GREETER_MESSAGE_SELECT_GUEST = 108
+ GREETER_MESSAGE_END_AUTHENTICATION = 104
} GreeterMessage;
#endif /* _GREETER_PROTOCOL_H_ */
SHOW_MESSAGE,
AUTHENTICATION_COMPLETE,
TIMED_LOGIN,
- SELECT_USER,
- SELECT_GUEST,
USER_ADDED,
USER_CHANGED,
USER_REMOVED,
guint32 authenticate_sequence_number;
gboolean cancelling_authentication;
- gchar *timed_user;
+ gchar *selected_user;
gint login_delay;
guint login_timeout;
gboolean guest_account_supported;
LdmGreeter *greeter = data;
greeter->priv->login_timeout = 0;
- g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->timed_user);
+ g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->selected_user);
return FALSE;
}
{
greeter->priv->theme = read_string (greeter, offset);
greeter->priv->default_session = read_string (greeter, offset);
- greeter->priv->timed_user = read_string (greeter, offset);
+ greeter->priv->selected_user = read_string (greeter, offset);
greeter->priv->login_delay = read_int (greeter, offset);
greeter->priv->guest_account_supported = read_int (greeter, offset) != 0;
g_debug ("Connected theme=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s",
greeter->priv->theme,
greeter->priv->default_session,
- greeter->priv->timed_user, greeter->priv->login_delay,
+ greeter->priv->selected_user, greeter->priv->login_delay,
greeter->priv->guest_account_supported ? "true" : "false");
+ if (greeter->priv->selected_user[0] == '\0')
+ greeter->priv->selected_user = NULL;
+
/* Set timeout for default login */
- if (greeter->priv->timed_user[0] != '\0' && greeter->priv->login_delay > 0)
+ if (greeter->priv->selected_user && greeter->priv->login_delay > 0)
{
- g_debug ("Logging in as %s in %d seconds", greeter->priv->timed_user, greeter->priv->login_delay);
+ g_debug ("Logging in as %s in %d seconds", greeter->priv->selected_user, greeter->priv->login_delay);
greeter->priv->login_timeout = g_timeout_add (greeter->priv->login_delay * 1000, timed_login_cb, greeter);
}
g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0);
}
-static void
-handle_select_user (LdmGreeter *greeter, gsize *offset)
-{
- gchar *username;
-
- username = read_string (greeter, offset);
- g_debug ("Got request to select user %s", username);
- g_signal_emit (G_OBJECT (greeter), signals[SELECT_USER], 0, username);
- g_free (username);
-}
-
-static void
-handle_select_guest (LdmGreeter *greeter, gsize *offset)
-{
- g_debug ("Got request to select guest account");
- g_signal_emit (G_OBJECT (greeter), signals[SELECT_GUEST], 0);
-}
-
static void
handle_prompt_authentication (LdmGreeter *greeter, gsize *offset)
{
case GREETER_MESSAGE_CONNECTED:
handle_connected (greeter, &offset);
break;
- case GREETER_MESSAGE_SELECT_USER:
- handle_select_user (greeter, &offset);
- break;
- case GREETER_MESSAGE_SELECT_GUEST:
- handle_select_guest (greeter, &offset);
- break;
case GREETER_MESSAGE_PROMPT_AUTHENTICATION:
handle_prompt_authentication (greeter, &offset);
break;
ldm_greeter_get_timed_login_user (LdmGreeter *greeter)
{
g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL);
- return greeter->priv->timed_user;
+ return greeter->priv->selected_user;
}
/**
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
- /**
- * LdmGreeter::select-user:
- * @greeter: A #LdmGreeter
- * @username: A username
- *
- * The ::select-user signal gets emitted when the daemon request the greeter to select a user to log in as.
- **/
- signals[SELECT_USER] =
- g_signal_new ("select-user",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (LdmGreeterClass, select_user),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1, G_TYPE_STRING);
-
- /**
- * LdmGreeter::select-guest:
- * @greeter: A #LdmGreeter
- *
- * The ::select-guest signal gets emitted when the deamon requests the greeter to select the guest account.
- **/
- signals[SELECT_GUEST] =
- g_signal_new ("select-guest",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (LdmGreeterClass, select_guest),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
/**
* LdmGreeter::user-added:
* @greeter: A #LdmGreeter
void (*show_message)(LdmGreeter *greeter, const gchar *text, LdmMessageType type);
void (*authentication_complete)(LdmGreeter *greeter);
void (*timed_login)(LdmGreeter *greeter, const gchar *username);
- void (*select_user)(LdmGreeter *greeter, const gchar *username);
- void (*select_guest)(LdmGreeter *greeter);
void (*user_added)(LdmGreeter *greeter, LdmUser *user);
void (*user_changed)(LdmGreeter *greeter, LdmUser *user);
void (*user_removed)(LdmGreeter *greeter, LdmUser *user);
GREETER_MESSAGE_CONNECTED = 101,
GREETER_MESSAGE_QUIT = 102,
GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103,
- GREETER_MESSAGE_END_AUTHENTICATION = 104,
- GREETER_MESSAGE_SELECT_USER = 107,
- GREETER_MESSAGE_SELECT_GUEST = 108
+ GREETER_MESSAGE_END_AUTHENTICATION = 104
} GreeterMessage;
#define HEADER_SIZE 8
else
qDebug () << "Ignoring end authentication with invalid sequence number " << sequenceNumber;
break;
- case GREETER_MESSAGE_SELECT_USER:
- username = readString(&offset);
- qDebug() << "Got request to select user " << username;
- emit selectUser(username);
- break;
- case GREETER_MESSAGE_SELECT_GUEST:
- qDebug() << "Got request to select guest account";
- emit selectGuest();
- break;
default:
qDebug() << "Unknown message from server: " << id;
}
void showError(QString message);
void authenticationComplete(bool isAuthenticated);
void timedLogin(QString username);
- void selectUser(QString username);
- void selectGuest();
void quit();
private slots:
}
static gboolean
-switch_to_user (DisplayManager *manager, const gchar *username)
+switch_to_user (DisplayManager *manager, const gchar *username, gboolean is_guest)
{
GList *link;
- Display *greeter_display = NULL;
+ Display *display = NULL;
XServer *xserver;
/* Switch to active display if it exists */
for (link = manager->priv->displays; link; link = link->next)
{
- Display *display = link->data;
+ display = link->data;
- /* If running a greeter can't use this one */
+ /* Shouldn't be any other greeters running, close them if so */
if (display_get_greeter (display))
{
- greeter_display = display;
+ display_stop (display);
continue;
}
}
}
- /* If there is an existing greeter then switch to that */
- if (greeter_display)
- {
- g_debug ("Switching to greeter session on display %s", xserver_get_address (display_get_xserver (greeter_display)));
- if (strcmp (username, guest_account_get_username ()) == 0)
- greeter_select_guest (display_get_greeter (greeter_display));
- else
- greeter_select_user (display_get_greeter (greeter_display), username);
- display_show (greeter_display);
- return TRUE;
- }
-
g_debug ("Starting new display to switch user");
-
+
xserver = make_xserver (manager, NULL);
- greeter_display = add_display (manager, xserver);
- // FIXME: Add selected user hint
+ display = add_display (manager, xserver);
+ if (is_guest)
+ display_set_default_user (display, NULL, TRUE, FALSE, 0);
+ else if (username)
+ display_set_default_user (display, username, FALSE, TRUE, 0);
g_object_unref (xserver);
- display_start (greeter_display);
+ display_start (display);
return FALSE;
}
g_return_if_fail (manager != NULL);
g_debug ("Showing greeter");
- switch_to_user (manager, NULL);
+ switch_to_user (manager, NULL, FALSE);
}
gboolean
g_return_val_if_fail (username != NULL, FALSE);
g_debug ("Switching to user %s", username);
- return switch_to_user (manager, username);
+ return switch_to_user (manager, username, FALSE);
}
gboolean
return FALSE;
g_debug ("Switching to guest account");
- return switch_to_user (manager, guest_account_get_username ());
+ return switch_to_user (manager, guest_account_get_username (), TRUE);
}
static gboolean
user_timeout = 0;
if (default_user)
- {
- display_set_default_user (display, default_user);
- display_set_default_user_timeout (display, user_timeout);
- if (user_timeout == 0)
- g_debug ("Starting session for user %s", default_user);
- else
- g_debug ("Starting session for user %s in %d seconds", default_user, user_timeout);
- }
+ display_set_default_user (display, default_user, FALSE, FALSE, user_timeout);
/* Stop Plymouth when the X server starts/fails */
if (replaces_plymouth)
/* X server */
XServer *xserver;
- /* Number of times have logged in */
- gint login_count;
-
/* User to run greeter as */
gchar *greeter_user;
/* User session process */
Session *user_session;
+ gboolean using_guest_account;
guint user_session_timer;
PAMSession *user_pam_session;
gchar *user_ck_cookie;
- /* Default login hint */
+ /* User that should be automatically logged in */
gchar *default_user;
- gint timeout;
+ gboolean default_user_is_guest;
+ gboolean default_user_requires_password;
+ gint default_user_timeout;
/* Default session */
gchar *default_session;
}
void
-display_set_default_user (Display *display, const gchar *username)
+display_set_default_user (Display *display, const gchar *username, gboolean is_guest, gboolean requires_password, gint timeout)
{
g_return_if_fail (display != NULL);
-
g_free (display->priv->default_user);
display->priv->default_user = g_strdup (username);
+ display->priv->default_user_is_guest = is_guest;
+ display->priv->default_user_requires_password = requires_password;
+ display->priv->default_user_timeout = timeout;
}
const gchar *
return display->priv->default_user;
}
-void
-display_set_default_user_timeout (Display *display, gint timeout)
+gboolean
+display_get_default_user_requires_password (Display *display)
{
- g_return_if_fail (display != NULL);
- display->priv->timeout = timeout;
+ g_return_val_if_fail (display != NULL, FALSE);
+ return display->priv->default_user_requires_password;
}
gint
display_get_default_user_timeout (Display *display)
{
g_return_val_if_fail (display != NULL, 0);
- return display->priv->timeout;
+ return display->priv->default_user_timeout;
}
void
g_signal_handlers_disconnect_matched (display->priv->user_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
/* If a guest account, remove the account on exit */
- if (g_strcmp0 (user_get_name (session_get_user (session)), guest_account_get_username ()) == 0)
+ if (display->priv->using_guest_account)
guest_account_unref ();
g_object_unref (display->priv->user_session);
result = session_start (display->priv->user_session, FALSE);
/* Create guest account */
- if (result && g_strcmp0 (user_get_name (session_get_user (display->priv->user_session)), guest_account_get_username ()) == 0)
+ if (result && display->priv->using_guest_account)
guest_account_ref ();
return result;
run_script ("PreSession");
g_debug ("Preparing '%s' session for user %s", session, pam_session_get_username (display->priv->user_pam_session));
- display->priv->login_count++;
+
+ /* Once logged in, don't autologin again */
+ g_free (display->priv->default_user);
+ display->priv->default_user = NULL;
+ display->priv->default_user_is_guest = FALSE;
/* Load the users login settings (~/.dmrc) */
dmrc_file = dmrc_load (pam_session_get_username (display->priv->user_pam_session));
return result;
}
-static void
-default_session_pam_message_cb (PAMSession *session, int num_msg, const struct pam_message **msg, Display *display)
-{
- g_debug ("Aborting automatic login, PAM requests input");
- pam_session_cancel (session);
-}
-
static gboolean
activate_user (Display *display, const gchar *username)
{
}
static void
-default_session_authentication_result_cb (PAMSession *session, int result, Display *display)
+start_greeter_for_autologin (Display *display)
+{
+ /* Cancel attempt at autologin */
+ pam_session_cancel (display->priv->user_pam_session);
+ g_object_unref (display->priv->user_pam_session);
+ display->priv->user_pam_session = NULL;
+
+ /* Start greeter and select user that failed */
+ start_greeter (display);
+}
+
+static void
+autologin_pam_message_cb (PAMSession *session, int num_msg, const struct pam_message **msg, Display *display)
+{
+ g_debug ("Aborting automatic login and starting greeter, PAM requests input");
+ start_greeter_for_autologin (display);
+}
+
+static void
+autologin_authentication_result_cb (PAMSession *session, int result, Display *display)
{
if (result == PAM_SUCCESS)
{
start_user_session (display, display->priv->default_session);
}
else
- {
- g_debug ("Failed to authorize default user, starting greeter");
- start_greeter (display);
- }
+ start_greeter_for_autologin (display);
}
-static gboolean
-start_autologin_session (Display *display, GError **error)
-{
- /* Open guest account if necessary */
- if (g_strcmp0 (display->priv->default_user, guest_account_get_username ()) == 0)
- guest_account_ref ();
-
- /* Run using autologin PAM session, abort if get asked any questions */
- if (display->priv->user_pam_session)
- pam_session_end (display->priv->user_pam_session);
- display->priv->user_pam_session = pam_session_new (display->priv->pam_autologin_service, display->priv->default_user);
- g_signal_connect (display->priv->user_pam_session, "got-messages", G_CALLBACK (default_session_pam_message_cb), display);
- g_signal_connect (display->priv->user_pam_session, "authentication-result", G_CALLBACK (default_session_authentication_result_cb), display);
- if (!pam_session_start (display->priv->user_pam_session, error))
- return FALSE;
-
- return TRUE;
-}
-
static gboolean
session_timeout_cb (Display *display)
{
}
static void
-greeter_start_session_cb (Greeter *greeter, const gchar *session, Display *display)
+greeter_start_session_cb (Greeter *greeter, const gchar *session, gboolean is_guest, Display *display)
{
/* Default session requested */
if (strcmp (session, "") == 0)
display->priv->greeter_ck_cookie = start_ck_session (display, "LoginWindow", user);
display->priv->greeter_session = greeter_new (display->priv->greeter_theme);
- greeter_set_default_user (display->priv->greeter_session, display->priv->default_user, display->priv->timeout);
+ if (display->priv->default_user)
+ greeter_set_selected_user (display->priv->greeter_session, display->priv->default_user, display->priv->default_user_timeout);
+ else if (display->priv->default_user_is_guest)
+ greeter_set_selected_user (display->priv->greeter_session, guest_account_get_username (), 0);
greeter_set_default_session (display->priv->greeter_session, display->priv->default_session);
g_signal_connect (G_OBJECT (display->priv->greeter_session), "start-session", G_CALLBACK (greeter_start_session_cb), display);
g_signal_connect (G_OBJECT (display->priv->greeter_session), "stopped", G_CALLBACK (greeter_stopped_cb), display);
static void
xserver_ready_cb (XServer *xserver, Display *display)
{
+ const gchar *autologin_user = NULL;
+
run_script ("Init"); // FIXME: Async
/* Don't run any sessions on local terminals */
return;
/* If have user then automatically login the first time */
- if (display->priv->default_user && display->priv->timeout == 0 && display->priv->login_count == 0)
+ if (display->priv->default_user_is_guest)
+ {
+ autologin_user = guest_account_get_username ();
+ guest_account_ref ();
+ }
+ else if (display->priv->default_user)
+ autologin_user = display->priv->default_user;
+
+ if (autologin_user)
{
GError *error = NULL;
- gboolean result;
+ gchar *pam_service;
+
+ /* Run using autologin PAM session, abort if get asked any questions */
+ g_debug ("Automatically logging in user %s", autologin_user);
- g_debug ("Automatically logging in user %s", display->priv->default_user);
- result = start_autologin_session (display, &error);
- if (!result)
- g_warning ("Failed to autologin user %s, starting greeter instead: %s", display->priv->default_user, error->message);
- g_clear_error (&error);
- if (result)
+ if (display->priv->default_user_requires_password)
+ pam_service = display->priv->pam_service;
+ else
+ pam_service = display->priv->pam_autologin_service;
+
+ display->priv->user_pam_session = pam_session_new (pam_service, autologin_user);
+ g_signal_connect (display->priv->user_pam_session, "got-messages", G_CALLBACK (autologin_pam_message_cb), display);
+ g_signal_connect (display->priv->user_pam_session, "authentication-result", G_CALLBACK (autologin_authentication_result_cb), display);
+ if (pam_session_start (display->priv->user_pam_session, &error))
return;
+ else
+ g_warning ("Failed to autologin user %s, starting greeter instead: %s", autologin_user, error->message);
+ g_clear_error (&error);
}
start_greeter (display);
const gchar *display_get_session_wrapper (Display *display);
-void display_set_default_user (Display *display, const gchar *username);
+void display_set_default_user (Display *display, const gchar *username, gboolean is_guest, gboolean requires_password, gint timeout);
const gchar *display_get_default_user (Display *display);
-void display_set_default_user_timeout (Display *display, gint timeout);
+gboolean display_get_default_user_requires_password (Display *display);
gint display_get_default_user_timeout (Display *display);
GREETER_MESSAGE_CONNECTED = 101,
GREETER_MESSAGE_QUIT = 102,
GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103,
- GREETER_MESSAGE_END_AUTHENTICATION = 104,
- GREETER_MESSAGE_SELECT_USER = 107,
- GREETER_MESSAGE_SELECT_GUEST = 108
+ GREETER_MESSAGE_END_AUTHENTICATION = 104
} GreeterMessage;
#endif /* _GREETER_PROTOCOL_H_ */
/* Default session to use */
gchar *default_session;
- /* Default user to log in as, or NULL for no default */
- gchar *default_user;
+ /* Hint for user to select */
+ gchar *selected_user;
/* Time in seconds to wait until logging in as default user */
gint autologin_timeout;
}
void
-greeter_set_default_user (Greeter *greeter, const gchar *username, gint timeout)
+greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout)
{
g_return_if_fail (greeter != NULL);
- g_free (greeter->priv->default_user);
- greeter->priv->default_user = g_strdup (username);
+ g_free (greeter->priv->selected_user);
+ greeter->priv->selected_user = g_strdup (username);
greeter->priv->autologin_timeout = timeout;
}
static void
write_string (guint8 *buffer, gint buffer_length, const gchar *value, gsize *offset)
{
- gint length = strlen (value);
+ gint length;
+
+ if (value)
+ length = strlen (value);
+ else
+ length = 0;
write_int (buffer, buffer_length, length, offset);
if (*offset + length >= buffer_length)
return;
- memcpy (buffer + *offset, value, length);
- *offset += length;
+ if (length > 0)
+ {
+ memcpy (buffer + *offset, value, length);
+ *offset += length;
+ }
}
static void
static guint32
string_length (const gchar *value)
{
- return int_length () + strlen (value);
+ if (value == NULL)
+ return int_length ();
+ else
+ return int_length () + strlen (value);
}
static void
theme = g_build_filename (theme_dir, greeter->priv->theme, "index.theme", NULL);
g_free (theme_dir);
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->default_session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length () + int_length (), &offset);
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->default_session) + string_length (greeter->priv->selected_user) + int_length () + int_length (), &offset);
write_string (message, MAX_MESSAGE_LENGTH, theme, &offset);
write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_session, &offset);
- write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_user ? greeter->priv->default_user : "", &offset);
+ write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->selected_user, &offset);
write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->autologin_timeout, &offset);
write_int (message, MAX_MESSAGE_LENGTH, guest_account_get_is_enabled (), &offset);
write_message (greeter, message, offset);
pam_session_cancel (greeter->priv->pam_session);
}
-void
-greeter_select_user (Greeter *greeter, const gchar *username)
-{
- guint8 message[MAX_MESSAGE_LENGTH];
- gsize offset = 0;
-
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SELECT_USER, string_length (username), &offset);
- write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
- write_message (greeter, message, offset);
-}
-
-void
-greeter_select_guest (Greeter *greeter)
-{
- guint8 message[MAX_MESSAGE_LENGTH];
- gsize offset = 0;
-
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SELECT_GUEST, 0, &offset);
- write_message (greeter, message, offset);
-}
-
static gboolean
quit_greeter_cb (gpointer data)
{
g_debug ("Greeter start session %s", session);
- g_signal_emit (greeter, signals[START_SESSION], 0, session);
+ g_signal_emit (greeter, signals[START_SESSION], 0, session, greeter->priv->using_guest_account);
}
static guint32
g_free (self->priv->read_buffer);
g_free (self->priv->theme);
g_free (self->priv->default_session);
- g_free (self->priv->default_user);
+ g_free (self->priv->selected_user);
if (self->priv->using_guest_account)
guest_account_unref ();
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GreeterClass, start_session),
NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1, G_TYPE_STRING);
+ ldm_marshal_VOID__STRING_BOOLEAN,
+ G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN);
g_type_class_add_private (klass, sizeof (GreeterPrivate));
}
Greeter *greeter_new (const gchar *theme);
-void greeter_set_default_user (Greeter *greeter, const gchar *username, gint timeout);
+void greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout);
const gchar *greeter_get_theme (Greeter *greeter);
PAMSession *greeter_get_pam_session (Greeter *greeter);
-void greeter_select_user (Greeter *greeter, const gchar *username);
-
-void greeter_select_guest (Greeter *greeter);
-
void greeter_quit (Greeter *greeter);
G_END_DECLS
VOID:INT,POINTER
VOID:OBJECT,BOOLEAN
BOOLEAN:STRING
+VOID:STRING,BOOLEAN
{
g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_CONV_ERR);
}
- else
+ else if (session->priv->authentication_thread)
{
- g_return_if_fail (session->priv->authentication_thread != NULL);
session->priv->cancel = TRUE;
g_async_queue_push (session->priv->authentication_response_queue, GINT_TO_POINTER (-1));
}
*SWITCH-TO-GUEST
RUNNER SWITCH-TO-GUEST
-# Existing greeter does the action
-GREETER LOGIN-GUEST
-GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
+# Existing X server and greeter stops
+XSERVER :50 TERMINATE SIGNAL=15
+GREETER TERMINATE SIGNAL=15
-# Greeter quits, guest session starts
-GREETER QUIT
+# New X server starts
+XSERVER :51 START
+XSERVER :51 INDICATE-READY
+XSERVER :51 ACCEPT-CONNECT
+
+# Guest session starts
SESSION START USER=guest
-XSERVER :50 ACCEPT-CONNECT
+XSERVER :51 ACCEPT-CONNECT
SESSION CONNECT-XSERVER
# Switch again, should not do anything as guest already running
# Cleanup
*STOP-DAEMON
# Don't know what order they will terminate
-(SESSION TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
-(SESSION TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+(SESSION TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+(SESSION TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
RUNNER DAEMON-EXIT STATUS=0
*SWITCH-TO-USER USERNAME=alice
RUNNER SWITCH-TO-USER USERNAME=alice
-# Existing greeter does the action
-GREETER LOGIN USERNAME=alice
+# Existing X server and greeter stops
+XSERVER :50 TERMINATE SIGNAL=15
+GREETER TERMINATE SIGNAL=15
+
+# New X server starts
+XSERVER :51 START
+XSERVER :51 INDICATE-READY
+XSERVER :51 ACCEPT-CONNECT
+
+# New greeter starts
+GREETER START
+XSERVER :51 ACCEPT-CONNECT
+GREETER CONNECT-XSERVER :51
+GREETER CONNECT-TO-DAEMON
+GREETER CONNECTED-TO-DAEMON
+
+# Alice is automatically selected
+GREETER LOGIN-SELECTED USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
# Cleanup
*STOP-DAEMON
# Don't know what order they will terminate
-(GREETER TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
-(GREETER TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+(GREETER TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+(GREETER TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
RUNNER DAEMON-EXIT STATUS=0
xcb_flush (connection);
}
+ /* Automatically log in as requested user */
+ if (ldm_greeter_get_timed_login_user (greeter) && ldm_greeter_get_timed_login_delay (greeter) == 0)
+ {
+ notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", ldm_greeter_get_timed_login_user (greeter));
+ ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter));
+ return;
+ }
+
login_lock = g_build_filename (g_getenv ("LIGHTDM_TEST_HOME_DIR"), ".greeter-logged-in", NULL);
f = fopen (login_lock, "r");
if (f == NULL)
ldm_greeter_start_default_session (greeter);
}
-static void
-select_user_cb (LdmGreeter *greeter, const gchar *username)
-{
- notify_status ("GREETER LOGIN USERNAME=%s", username);
- ldm_greeter_login (greeter, username);
-}
-
-static void
-select_guest_cb (LdmGreeter *greeter)
-{
- notify_status ("GREETER LOGIN-GUEST");
- ldm_greeter_login_as_guest (greeter);
-}
-
static void
quit_cb (LdmGreeter *greeter)
{
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, "select-user", G_CALLBACK (select_user_cb), NULL);
- g_signal_connect (greeter, "select-guest", G_CALLBACK (select_guest_cb), NULL);
g_signal_connect (greeter, "quit", G_CALLBACK (quit_cb), NULL);
notify_status ("GREETER CONNECT-TO-DAEMON");