From 75ca1eb525afa1245087dc14663d14c98759cb87 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 3 Jun 2011 20:46:21 +1000 Subject: [PATCH] More guest account work, change liblightdm API --- NEWS | 8 ++ doc/lightdm-gobject-0-sections.txt | 14 ++- doc/tmpl/greeter.sgml | 25 ++++-- doc/tmpl/user.sgml | 9 ++ greeters/gtk/lightdm-example-gtk-greeter.c | 6 +- greeters/qt/loginprompt.cpp | 4 +- .../lightdm-example-vala-gtk-greeter.vala | 6 +- liblightdm-gobject/greeter-protocol.h | 16 ++-- liblightdm-gobject/greeter.c | 83 +++++++---------- liblightdm-gobject/liblightdm-gobject-0.vapi | 7 +- liblightdm-gobject/lightdm/greeter.h | 12 ++- liblightdm-qt/QLightDM/greeter.cpp | 51 +++++------ liblightdm-qt/QLightDM/greeter.h | 9 +- src/display.c | 29 ++---- src/greeter-protocol.h | 12 +-- src/greeter.c | 89 ++++++++++--------- src/greeter.h | 3 +- src/ldm-marshal.list | 1 - 18 files changed, 191 insertions(+), 193 deletions(-) diff --git a/NEWS b/NEWS index 909e1f7a..e2ea7d20 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,11 @@ +Overview of changes in lightdm 0.3.8 + + * liblightdm API change: + - ldm_greeter_start_authentication becomes ldm_greeter_login + - The existing ldm_greeter_login is now ldm_greeter_start_session + and the username parameter is not required. + * Add guest account logins + Overview of changes in lightdm 0.3.7 * Fix autologin broken in 0.3.3 diff --git a/doc/lightdm-gobject-0-sections.txt b/doc/lightdm-gobject-0-sections.txt index 92d95907..59c2cb65 100644 --- a/doc/lightdm-gobject-0-sections.txt +++ b/doc/lightdm-gobject-0-sections.txt @@ -50,6 +50,7 @@ LdmUser ldm_user_get_name ldm_user_get_real_name ldm_user_get_display_name +ldm_user_get_home_directory ldm_user_get_image ldm_user_get_language ldm_user_get_layout @@ -67,9 +68,12 @@ LDM_USER_GET_CLASS LdmUserClass LdmUserPrivate ldm_user_new +ldm_user_set_name +ldm_user_set_real_name +ldm_user_set_home_directory ldm_user_set_image ldm_user_set_logged_in -ldm_user_set_real_name +ldm_user_update
@@ -115,17 +119,19 @@ ldm_greeter_get_layout ldm_greeter_set_layout ldm_greeter_get_sessions ldm_greeter_get_default_session +ldm_greeter_get_has_guest_session ldm_greeter_get_timed_login_user ldm_greeter_get_timed_login_delay ldm_greeter_cancel_timed_login -ldm_greeter_start_authentication +ldm_greeter_login +ldm_greeter_login_as_guest ldm_greeter_provide_secret ldm_greeter_cancel_authentication ldm_greeter_get_in_authentication ldm_greeter_get_is_authenticated ldm_greeter_get_authentication_user -ldm_greeter_login -ldm_greeter_login_with_defaults +ldm_greeter_start_session +ldm_greeter_start_session_with_defaults ldm_greeter_get_can_suspend ldm_greeter_suspend ldm_greeter_get_can_hibernate diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index e48354be..94f879e4 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -388,6 +388,15 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: + + + + + +@greeter: +@Returns: + + @@ -414,7 +423,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @greeter: - + @@ -423,6 +432,14 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @username: + + + + + +@greeter: + + @@ -467,24 +484,22 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + @greeter: -@username: @session: @language: - + @greeter: -@username: diff --git a/doc/tmpl/user.sgml b/doc/tmpl/user.sgml index 2ca73579..8119af65 100644 --- a/doc/tmpl/user.sgml +++ b/doc/tmpl/user.sgml @@ -119,6 +119,15 @@ A user has the following properties: @Returns: + + + + + +@user: +@Returns: + + diff --git a/greeters/gtk/lightdm-example-gtk-greeter.c b/greeters/gtk/lightdm-example-gtk-greeter.c index 77cbe15a..4e2f8a46 100644 --- a/greeters/gtk/lightdm-example-gtk-greeter.c +++ b/greeters/gtk/lightdm-example-gtk-greeter.c @@ -89,7 +89,7 @@ start_authentication (const gchar *username) g_free (session); } - ldm_greeter_start_authentication (greeter, username); + ldm_greeter_login (greeter, username); } void user_treeview_row_activated_cb (GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *column); @@ -186,7 +186,7 @@ authentication_complete_cb (LdmGreeter *greeter) if (ldm_greeter_get_is_authenticated (greeter)) { gchar *session = get_session (); - ldm_greeter_login (greeter, ldm_greeter_get_authentication_user (greeter), session, NULL); + ldm_greeter_start_session (greeter, session, NULL); g_free (session); } else @@ -199,7 +199,7 @@ authentication_complete_cb (LdmGreeter *greeter) static void timed_login_cb (LdmGreeter *greeter, const gchar *username) { - ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter), NULL, NULL); + ldm_greeter_start_session (greeter, NULL, NULL); // FIXME: timed user is not authenticated... } void suspend_cb (GtkWidget *widget, LdmGreeter *greeter); diff --git a/greeters/qt/loginprompt.cpp b/greeters/qt/loginprompt.cpp index 3a17ee77..64bcd759 100644 --- a/greeters/qt/loginprompt.cpp +++ b/greeters/qt/loginprompt.cpp @@ -38,14 +38,14 @@ void LoginPrompt::onLoginButtonClicked() ui->feedbackLabel->setText(QString()); QModelIndex currentIndex = ui->userListView->currentIndex(); if (currentIndex.isValid()) { - m_greeter->startAuthentication(currentIndex.data(QLightDM::UsersModel::NameRole).toString()); + m_greeter->login(currentIndex.data(QLightDM::UsersModel::NameRole).toString()); } } void LoginPrompt::onAuthenticationComplete(bool success) { if (success) { - m_greeter->loginWithDefaults(m_greeter->authenticationUser()); + m_greeter->startSessionWithDefaults(); } else { ui->feedbackLabel->setText("Sorry, you suck. Try again."); } diff --git a/greeters/vala-gtk/lightdm-example-vala-gtk-greeter.vala b/greeters/vala-gtk/lightdm-example-vala-gtk-greeter.vala index 9620a03d..2bf051a0 100644 --- a/greeters/vala-gtk/lightdm-example-vala-gtk-greeter.vala +++ b/greeters/vala-gtk/lightdm-example-vala-gtk-greeter.vala @@ -25,7 +25,7 @@ class Greeter private void username_activate_cb (Gtk.Entry entry) { username_entry.sensitive = false; - greeter.start_authentication (username_entry.text); + greeter.login (username_entry.text); } private void password_activate_cb (Gtk.Entry entry) @@ -97,7 +97,7 @@ class Greeter username_entry.sensitive = true; username_entry.grab_focus (); if (greeter.is_authenticated) - greeter.login (greeter.get_authentication_user (), null, null); + greeter.start_session_with_defaults (); else { message_label.label = "Failed to authenticate"; @@ -107,7 +107,7 @@ class Greeter private void timed_login_cb (LightDM.Greeter greeter, string username) { - greeter.login (greeter.get_timed_login_user (), null, null); + greeter.start_session_with_defaults (); // FIXME: timed user is not authenticated... } private void quit_cb (LightDM.Greeter greeter) diff --git a/liblightdm-gobject/greeter-protocol.h b/liblightdm-gobject/greeter-protocol.h index e4e9bd24..cd15cf3b 100644 --- a/liblightdm-gobject/greeter-protocol.h +++ b/liblightdm-gobject/greeter-protocol.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Robert Ancell. + * Copyright (C) 2010-2011 Robert Ancell. * Author: Robert Ancell * * This program is free software: you can redistribute it and/or modify it under @@ -16,19 +16,19 @@ typedef enum { /* Messages from the greeter to the server */ GREETER_MESSAGE_CONNECT = 1, - GREETER_MESSAGE_START_AUTHENTICATION = 2, - GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 3, - GREETER_MESSAGE_LOGIN = 4, - GREETER_MESSAGE_CANCEL_AUTHENTICATION = 5, - GREETER_MESSAGE_GET_USER_DEFAULTS = 6, - GREETER_MESSAGE_LOGIN_AS_GUEST = 7, + GREETER_MESSAGE_LOGIN = 2, + GREETER_MESSAGE_LOGIN_AS_GUEST = 3, + GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 4, + GREETER_MESSAGE_START_SESSION = 5, + GREETER_MESSAGE_CANCEL_AUTHENTICATION = 6, + GREETER_MESSAGE_GET_USER_DEFAULTS = 7, /* Messages from the server to the greeter */ GREETER_MESSAGE_CONNECTED = 101, GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, GREETER_MESSAGE_END_AUTHENTICATION = 104, - GREETER_MESSAGE_USER_DEFAULTS = 106 + GREETER_MESSAGE_USER_DEFAULTS = 106 } GreeterMessage; #endif /* _GREETER_PROTOCOL_H_ */ diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 6c2469e7..1286963d 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -1246,14 +1246,14 @@ ldm_greeter_cancel_timed_login (LdmGreeter *greeter) } /** - * ldm_greeter_start_authentication: + * ldm_greeter_login: * @greeter: A #LdmGreeter * @username: A username * * Starts the authentication procedure for a user. **/ void -ldm_greeter_start_authentication (LdmGreeter *greeter, const char *username) +ldm_greeter_login (LdmGreeter *greeter, const char *username) { g_return_if_fail (LDM_IS_GREETER (greeter)); g_return_if_fail (username != NULL); @@ -1263,11 +1263,31 @@ ldm_greeter_start_authentication (LdmGreeter *greeter, const char *username) g_free (greeter->priv->authentication_user); greeter->priv->authentication_user = g_strdup (username); g_debug ("Starting authentication for user %s...", username); - write_header (greeter, GREETER_MESSAGE_START_AUTHENTICATION, string_length (username)); + write_header (greeter, GREETER_MESSAGE_LOGIN, string_length (username)); write_string (greeter, username); flush (greeter); } +/** + * ldm_greeter_login_as_guest: + * @greeter: A #LdmGreeter + * + * Starts the authentication procedure for the guest user. + **/ +void +ldm_greeter_login_as_guest (LdmGreeter *greeter) +{ + g_return_if_fail (LDM_IS_GREETER (greeter)); + + greeter->priv->in_authentication = TRUE; + greeter->priv->is_authenticated = FALSE; + g_free (greeter->priv->authentication_user); + greeter->priv->authentication_user = NULL; + g_debug ("Starting authentication for guest account..."); + write_header (greeter, GREETER_MESSAGE_LOGIN_AS_GUEST, 0); + flush (greeter); +} + /** * ldm_greeter_provide_secret: * @greeter: A #LdmGreeter @@ -1349,81 +1369,40 @@ ldm_greeter_get_authentication_user (LdmGreeter *greeter) } /** - * ldm_greeter_login: + * ldm_greeter_start_session: * @greeter: A #LdmGreeter - * @username: The user to log in as * @session: (allow-none): The session to log into or NULL to use the default * @language: (allow-none): The language to use or NULL to use the default * - * Login a user to a session. + * Start a session for the logged in user. **/ void -ldm_greeter_login (LdmGreeter *greeter, const gchar *username, const gchar *session, const gchar *language) +ldm_greeter_start_session (LdmGreeter *greeter, const gchar *session, const gchar *language) { g_return_if_fail (LDM_IS_GREETER (greeter)); - g_return_if_fail (username != NULL); if (!session) session = ""; if (!language) language = ""; - g_debug ("Logging in as %s", username); - write_header (greeter, GREETER_MESSAGE_LOGIN, string_length (username) + string_length (session) + string_length (language)); - write_string (greeter, username); + g_debug ("Starting session %s with language %s", session, language); + write_header (greeter, GREETER_MESSAGE_START_SESSION, string_length (session) + string_length (language)); write_string (greeter, session); write_string (greeter, language); flush (greeter); } /** - * ldm_greeter_login_with_defaults: + * ldm_greeter_start_session_with_defaults: * @greeter: A #LdmGreeter - * @username: The user to log in as * * Login a user to a session using default settings for that user. **/ void -ldm_greeter_login_with_defaults (LdmGreeter *greeter, const gchar *username) -{ - ldm_greeter_login (greeter, username, NULL, NULL); -} - -/** - * ldm_greeter_login_as_guest: - * @greeter: A #LdmGreeter - * @session: (allow-none): The session to log into or NULL to use the default - * @language: (allow-none): The language to use or NULL to use the default - * - * Login a user into a guest session. - **/ -void -ldm_greeter_login_as_guest (LdmGreeter *greeter, const gchar *session, const gchar *language) -{ - g_return_if_fail (LDM_IS_GREETER (greeter)); - - if (!session) - session = ""; - if (!language) - language = ""; - - g_debug ("Logging into guest account"); - write_header (greeter, GREETER_MESSAGE_LOGIN_AS_GUEST, string_length (session) + string_length (language)); - write_string (greeter, session); - write_string (greeter, language); - flush (greeter); -} - -/** - * ldm_greeter_login_as_guest_with_defaults: - * @greeter: A #LdmGreeter - * - * Login a user into a guest session using default settings for that user. - **/ -void -ldm_greeter_login_as_guest_with_defaults (LdmGreeter *greeter) +ldm_greeter_start_session_with_defaults (LdmGreeter *greeter) { - ldm_greeter_login_as_guest (greeter, NULL, NULL); + ldm_greeter_start_session (greeter, NULL, NULL); } static gboolean diff --git a/liblightdm-gobject/liblightdm-gobject-0.vapi b/liblightdm-gobject/liblightdm-gobject-0.vapi index b0c375e1..6aa5d4db 100644 --- a/liblightdm-gobject/liblightdm-gobject-0.vapi +++ b/liblightdm-gobject/liblightdm-gobject-0.vapi @@ -31,13 +31,14 @@ namespace LightDM { public bool get_user_defaults (string username, out string language, out string layout, out string session); public unowned GLib.List get_users (); public void hibernate (); - public void login (string username, string? session, string? language); - public void login_with_defaults (string username); + public void start_session (string? session, string? language); + public void start_session_with_defaults (); public void provide_secret (string secret); public void restart (); public void set_layout (string layout); public void shutdown (); - public void start_authentication (string username); + public void login (string username); + public void login_as_guest (); public void suspend (); public string authentication_user { get; } public bool can_hibernate { get; } diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index 164385e5..03697858 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -101,7 +101,9 @@ gint ldm_greeter_get_timed_login_delay (LdmGreeter *greeter); void ldm_greeter_cancel_timed_login (LdmGreeter *greeter); -void ldm_greeter_start_authentication (LdmGreeter *greeter, const char *username); +void ldm_greeter_login (LdmGreeter *greeter, const char *username); + +void ldm_greeter_login_as_guest (LdmGreeter *greeter); void ldm_greeter_provide_secret (LdmGreeter *greeter, const gchar *secret); @@ -113,13 +115,9 @@ gboolean ldm_greeter_get_is_authenticated (LdmGreeter *greeter); const gchar *ldm_greeter_get_authentication_user (LdmGreeter *greeter); -void ldm_greeter_login (LdmGreeter *greeter, const gchar *username, const gchar *session, const gchar *language); - -void ldm_greeter_login_with_defaults (LdmGreeter *greeter, const gchar *username); - -void ldm_greeter_login_as_guest (LdmGreeter *greeter, const gchar *session, const gchar *language); +void ldm_greeter_start_session (LdmGreeter *greeter, const gchar *session, const gchar *language); -void ldm_greeter_login_as_guest_with_defaults (LdmGreeter *greeter); +void ldm_greeter_start_session_with_defaults (LdmGreeter *greeter); gboolean ldm_greeter_get_can_suspend (LdmGreeter *greeter); diff --git a/liblightdm-qt/QLightDM/greeter.cpp b/liblightdm-qt/QLightDM/greeter.cpp index 7b2b953b..9b5d7bca 100644 --- a/liblightdm-qt/QLightDM/greeter.cpp +++ b/liblightdm-qt/QLightDM/greeter.cpp @@ -20,12 +20,12 @@ typedef enum { /* Messages from the greeter to the server */ GREETER_MESSAGE_CONNECT = 1, - GREETER_MESSAGE_START_AUTHENTICATION = 2, - GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 3, - GREETER_MESSAGE_LOGIN = 4, - GREETER_MESSAGE_CANCEL_AUTHENTICATION = 5, - GREETER_MESSAGE_GET_USER_DEFAULTS = 6, - GREETER_MESSAGE_LOGIN_AS_GUEST = 7, + GREETER_MESSAGE_LOGIN = 2, + GREETER_MESSAGE_LOGIN_AS_GUEST = 3, + GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 4, + GREETER_MESSAGE_START_SESSION = 5, + GREETER_MESSAGE_CANCEL_AUTHENTICATION = 6, + GREETER_MESSAGE_GET_USER_DEFAULTS = 7, /* Messages from the server to the greeter */ GREETER_MESSAGE_CONNECTED = 101, @@ -201,14 +201,24 @@ void Greeter::connectToServer() flush(); } -void Greeter::startAuthentication(const QString &username) +void Greeter::login(const QString &username) { d->inAuthentication = true; d->isAuthenticated = false; d->authenticationUser = username; qDebug() << "Starting authentication for user " << username << "..."; - writeHeader(GREETER_MESSAGE_START_AUTHENTICATION, stringLength(username)); + writeHeader(GREETER_MESSAGE_LOGIN, stringLength(username)); writeString(username); + flush(); +} + +void Greeter::loginAsGuest() +{ + d->inAuthentication = true; + d->isAuthenticated = false; + d->authenticationUser = ""; + qDebug() << "Starting authentication for guest account"; + writeHeader(GREETER_MESSAGE_LOGIN_AS_GUEST, 0); flush(); } @@ -244,33 +254,18 @@ QString Greeter::authenticationUser() const return d->authenticationUser; } -void Greeter::login(const QString &username, const QString &session, const QString &language) +void Greeter::startSession(const QString &session, const QString &language) { - qDebug() << "Logging in as " << username << " for session " << session << " with language " << language; - writeHeader(GREETER_MESSAGE_LOGIN, stringLength(username) + stringLength(session) + stringLength(language)); - writeString(username); + qDebug() << "Starting session " << session << " with language " << language; + writeHeader(GREETER_MESSAGE_START_SESSION, stringLength(session) + stringLength(language)); writeString(session); writeString(language); flush(); } -void Greeter::loginWithDefaults(const QString &username) -{ - login(username, NULL, NULL); -} - -void Greeter::loginAsGuest(const QString &session, const QString &language) -{ - qDebug() << "Logging into guest account for session " << session << " with language " << language; - writeHeader(GREETER_MESSAGE_LOGIN_AS_GUEST, stringLength(session) + stringLength(language)); - writeString(session); - writeString(language); - flush(); -} - -void Greeter::loginAsGuestWithDefaults() +void Greeter::startSessionWithDefaults() { - loginAsGuest(NULL, NULL); + startSession(NULL, NULL); } void Greeter::onRead(int fd) diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index 98ff2da1..36d53de4 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -55,13 +55,12 @@ namespace QLightDM void connectToServer(); void cancelTimedLogin(); - void startAuthentication(const QString &username); + void login(const QString &username); + void loginAsGuest(); void provideSecret(const QString &secret); void cancelAuthentication(); - void login(const QString &username, const QString &session, const QString &language); - void loginWithDefaults(const QString &username); - void loginAsGuest(const QString &session, const QString &language); - void loginAsGuestWithDefaults(); + void startSession(const QString &session, const QString &language); + void startSessionWithDefaults(); bool canSuspend() const; bool canHibernate() const; diff --git a/src/display.c b/src/display.c index 452e210f..9f5c0995 100644 --- a/src/display.c +++ b/src/display.c @@ -606,13 +606,14 @@ static void start_default_session (Display *display, const gchar *session, const gchar *language) { /* Don't need to check authentication, just authorize */ + // FIXME: Not correct, should use lightdm-autologin pam session 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_service, display->priv->default_user); pam_session_authorize (display->priv->user_pam_session); display->priv->user_ck_cookie = start_ck_session (display, "", pam_session_get_username (display->priv->user_pam_session)); - start_user_session (display, session, language); + start_user_session (display, session, language); } static gboolean @@ -628,7 +629,7 @@ session_timeout_cb (Display *display) } static void -greeter_login_cb (Greeter *greeter, const gchar *username, const gchar *session, const gchar *language, Display *display) +greeter_start_session_cb (Greeter *greeter, const gchar *session, const gchar *language, Display *display) { /* Default session requested */ if (strcmp (session, "") == 0) @@ -641,18 +642,15 @@ greeter_login_cb (Greeter *greeter, const gchar *username, const gchar *session, display->priv->user_pam_session = greeter_get_pam_session (greeter); display->priv->user_ck_cookie = start_ck_session (display, "", pam_session_get_username (display->priv->user_pam_session)); - if (display->priv->default_user && strcmp (username, display->priv->default_user) == 0) - start_default_session (display, session, language); - else if (display->priv->user_pam_session && - pam_session_get_in_session (display->priv->user_pam_session) && - strcmp (username, pam_session_get_username (display->priv->user_pam_session)) == 0) - start_user_session (display, session, language); - else + if (!display->priv->user_pam_session || + !pam_session_get_in_session (display->priv->user_pam_session)) { g_warning ("Ignoring request for login with unauthenticated user"); return; } + start_user_session (display, session, language); + /* Stop session, waiting for user session to indicate it is ready (if supported) */ // FIXME: Hard-coded timeout // FIXME: Greeter quit timeout @@ -662,16 +660,6 @@ greeter_login_cb (Greeter *greeter, const gchar *username, const gchar *session, greeter_quit (display->priv->greeter_session); } -static void -greeter_login_as_guest_cb (Greeter *greeter, const gchar *session, const gchar *language, Display *display) -{ - //gchar *username; - - // FIXME: Create a guest session - - //greeter_login_cb (greeter, username, session, language, display); -} - static void greeter_quit_cb (Greeter *greeter, Display *display) { @@ -745,8 +733,7 @@ start_greeter (Display *display) greeter_set_default_user (display->priv->greeter_session, display->priv->default_user, display->priv->timeout); greeter_set_layout (display->priv->greeter_session, display->priv->default_layout); greeter_set_session (display->priv->greeter_session, display->priv->default_session); - g_signal_connect (G_OBJECT (display->priv->greeter_session), "login", G_CALLBACK (greeter_login_cb), display); - g_signal_connect (G_OBJECT (display->priv->greeter_session), "login-as-guest", G_CALLBACK (greeter_login_as_guest_cb), display); + 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), "quit", G_CALLBACK (greeter_quit_cb), display); session_set_username (SESSION (display->priv->greeter_session), username); session_set_command (SESSION (display->priv->greeter_session), command); diff --git a/src/greeter-protocol.h b/src/greeter-protocol.h index 0ca57abc..cd15cf3b 100644 --- a/src/greeter-protocol.h +++ b/src/greeter-protocol.h @@ -16,12 +16,12 @@ typedef enum { /* Messages from the greeter to the server */ GREETER_MESSAGE_CONNECT = 1, - GREETER_MESSAGE_START_AUTHENTICATION = 2, - GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 3, - GREETER_MESSAGE_LOGIN = 4, - GREETER_MESSAGE_CANCEL_AUTHENTICATION = 5, - GREETER_MESSAGE_GET_USER_DEFAULTS = 6, - GREETER_MESSAGE_LOGIN_AS_GUEST = 7, + GREETER_MESSAGE_LOGIN = 2, + GREETER_MESSAGE_LOGIN_AS_GUEST = 3, + GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 4, + GREETER_MESSAGE_START_SESSION = 5, + GREETER_MESSAGE_CANCEL_AUTHENTICATION = 6, + GREETER_MESSAGE_GET_USER_DEFAULTS = 7, /* Messages from the server to the greeter */ GREETER_MESSAGE_CONNECTED = 101, diff --git a/src/greeter.c b/src/greeter.c index 9405649b..6106147e 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -22,8 +22,7 @@ #define GREETER_QUIT_TIMEOUT 1000 enum { - LOGIN, - LOGIN_AS_GUEST, + START_SESSION, QUIT, LAST_SIGNAL }; @@ -211,7 +210,7 @@ authenticate_result_cb (PAMSession *session, int result, Greeter *greeter) } static void -handle_start_authentication (Greeter *greeter, const gchar *username) +handle_login (Greeter *greeter, const gchar *username) { GError *error = NULL; @@ -237,6 +236,37 @@ handle_start_authentication (Greeter *greeter, const gchar *username) g_warning ("Failed to start authentication: %s", error->message); } +static void +handle_login_as_guest (Greeter *greeter) +{ +#if 0 + GError *error = NULL; + + // FIXME + //if (greeter->priv->user_session) + // return; + + /* Abort existing authentication */ + if (greeter->priv->pam_session) + { + g_signal_handlers_disconnect_matched (greeter->priv->pam_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); + pam_session_end (greeter->priv->pam_session); + g_object_unref (greeter->priv->pam_session); + } + + // FIXME: Create guest account + + g_debug ("Greeter start authentication for guest account"); + + greeter->priv->pam_session = pam_session_new ("lightdm"/*FIXMEgreeter->priv->pam_service*/, username); + g_signal_connect (G_OBJECT (greeter->priv->pam_session), "got-messages", G_CALLBACK (pam_messages_cb), greeter); + g_signal_connect (G_OBJECT (greeter->priv->pam_session), "authentication-result", G_CALLBACK (authenticate_result_cb), greeter); + + if (!pam_session_start (greeter->priv->pam_session, &error)) + g_warning ("Failed to start authentication: %s", error->message); +#endif +} + static void handle_continue_authentication (Greeter *greeter, gchar **secrets) { @@ -324,7 +354,7 @@ greeter_quit (Greeter *greeter) } static void -handle_login (Greeter *greeter, gchar *username, gchar *session, gchar *language) +handle_start_session (Greeter *greeter, gchar *session, gchar *language) { /*if (greeter->priv->user_session != NULL) { @@ -332,23 +362,9 @@ handle_login (Greeter *greeter, gchar *username, gchar *session, gchar *language return; }*/ - g_debug ("Greeter login for user %s on session %s", username, session); + g_debug ("Greeter start session %s with language", session, language); - g_signal_emit (greeter, signals[LOGIN], 0, username, session, language); -} - -static void -handle_guest_login (Greeter *greeter, gchar *session, gchar *language) -{ - /*if (greeter->priv->user_session != NULL) - { - g_warning ("Ignoring request to log in when already logged in"); - return; - }*/ - - g_debug ("Greeter login to guest account on session %s", session); - - g_signal_emit (greeter, signals[LOGIN_AS_GUEST], 0, session, language); + g_signal_emit (greeter, signals[START_SESSION], 0, session, language); } static void @@ -507,11 +523,14 @@ got_data_cb (Greeter *greeter) case GREETER_MESSAGE_CONNECT: handle_connect (greeter); break; - case GREETER_MESSAGE_START_AUTHENTICATION: + case GREETER_MESSAGE_LOGIN: username = read_string (greeter, &offset); - handle_start_authentication (greeter, username); + handle_login (greeter, username); g_free (username); break; + case GREETER_MESSAGE_LOGIN_AS_GUEST: + handle_login_as_guest (greeter); + break; case GREETER_MESSAGE_CONTINUE_AUTHENTICATION: n_secrets = read_int (greeter, &offset); secrets = g_malloc (sizeof (gchar *) * (n_secrets + 1)); @@ -524,21 +543,13 @@ got_data_cb (Greeter *greeter) case GREETER_MESSAGE_CANCEL_AUTHENTICATION: handle_cancel_authentication (greeter); break; - case GREETER_MESSAGE_LOGIN: - username = read_string (greeter, &offset); + case GREETER_MESSAGE_START_SESSION: session_name = read_string (greeter, &offset); language = read_string (greeter, &offset); - handle_login (greeter, username, session_name, language); - g_free (username); + handle_start_session (greeter, session_name, language); g_free (session_name); g_free (language); break; - case GREETER_MESSAGE_LOGIN_AS_GUEST: - session_name = read_string (greeter, &offset); - language = read_string (greeter, &offset); - handle_guest_login (greeter, session_name, language); - g_free (session_name); - g_free (language); case GREETER_MESSAGE_GET_USER_DEFAULTS: username = read_string (greeter, &offset); handle_get_user_defaults (greeter, username); @@ -620,19 +631,11 @@ greeter_class_init (GreeterClass *klass) object_class->finalize = greeter_finalize; - signals[LOGIN] = - g_signal_new ("login", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GreeterClass, login), - NULL, NULL, - ldm_marshal_VOID__STRING_STRING_STRING, - G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - signals[LOGIN_AS_GUEST] = - g_signal_new ("login-as-guest", + signals[START_SESSION] = + g_signal_new ("start-session", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GreeterClass, login_as_guest), + G_STRUCT_OFFSET (GreeterClass, start_session), NULL, NULL, ldm_marshal_VOID__STRING_STRING, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); diff --git a/src/greeter.h b/src/greeter.h index 5ab9f3ab..adc3e9e8 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -31,8 +31,7 @@ typedef struct typedef struct { SessionClass parent_class; - void (*login)(Greeter *greeter, const gchar *username, const gchar *session, const gchar *language); - void (*login_as_guest)(Greeter *greeter, const gchar *session, const gchar *language); + void (*start_session)(Greeter *greeter, const gchar *session, const gchar *language); void (*quit)(Greeter *greeter); } GreeterClass; diff --git a/src/ldm-marshal.list b/src/ldm-marshal.list index 51b3eae1..98e9da78 100644 --- a/src/ldm-marshal.list +++ b/src/ldm-marshal.list @@ -2,4 +2,3 @@ BOOLEAN:OBJECT VOID:INT,POINTER VOID:OBJECT,BOOLEAN VOID:STRING,STRING -VOID:STRING,STRING,STRING -- 2.39.2