]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
More plumbing for guest logins
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 3 Jun 2011 04:29:00 +0000 (14:29 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 3 Jun 2011 04:29:00 +0000 (14:29 +1000)
liblightdm-gobject/greeter-protocol.h
liblightdm-gobject/greeter.c
liblightdm-gobject/lightdm/greeter.h
liblightdm-qt/QLightDM/greeter.cpp
liblightdm-qt/QLightDM/greeter.h
src/display.c
src/greeter-protocol.h
src/greeter.c
src/greeter.h
src/ldm-marshal.list

index c72fc63621008c9a964d1201e1b8293250e281dd..e4e9bd24c8ac93e812c84a8fb9683d44c056b4d5 100644 (file)
@@ -21,6 +21,7 @@ typedef enum
     GREETER_MESSAGE_LOGIN                   = 4,
     GREETER_MESSAGE_CANCEL_AUTHENTICATION   = 5,
     GREETER_MESSAGE_GET_USER_DEFAULTS       = 6,
+    GREETER_MESSAGE_LOGIN_AS_GUEST          = 7,
 
     /* Messages from the server to the greeter */
     GREETER_MESSAGE_CONNECTED               = 101,
index c9136b742032497d25c2fdc4497a1a893b063869..6c2469e739f4de1d3a64471a9c56e96613feb713 100644 (file)
@@ -111,6 +111,7 @@ struct _LdmGreeterPrivate
     gchar *timed_user;
     gint login_delay;
     guint login_timeout;
+    gboolean guest_account_supported;
 };
 
 G_DEFINE_TYPE (LdmGreeter, ldm_greeter, G_TYPE_OBJECT);
@@ -330,11 +331,13 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data)
         greeter->priv->default_session = read_string (greeter, &offset);
         greeter->priv->timed_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-layout=%s default-session=%s timed-user=%s login-delay=%d",
+        g_debug ("Connected theme=%s default-layout=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s",
                  greeter->priv->theme,
                  greeter->priv->default_layout, greeter->priv->default_session,
-                 greeter->priv->timed_user, greeter->priv->login_delay);
+                 greeter->priv->timed_user, greeter->priv->login_delay,
+                 greeter->priv->guest_account_supported ? "true" : "false");
 
         /* Set timeout for default login */
         if (greeter->priv->timed_user[0] != '\0' && greeter->priv->login_delay > 0)
@@ -1181,6 +1184,21 @@ ldm_greeter_get_default_session (LdmGreeter *greeter)
     return greeter->priv->default_session;
 }
 
+/**
+ * ldm_greeter_get_has_guest_session:
+ * @greeter: A #LdmGreeter
+ *
+ * Check if guest sessions are supported.
+ *
+ * Return value: TRUE if guest sessions are supported.
+ */
+gboolean
+ldm_greeter_get_has_guest_session (LdmGreeter *greeter)
+{
+    g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
+    return greeter->priv->guest_account_supported;
+}
+
 /**
  * ldm_greeter_get_timed_login_user:
  * @greeter: A #LdmGreeter
@@ -1350,7 +1368,7 @@ ldm_greeter_login (LdmGreeter *greeter, const gchar *username, const gchar *sess
     if (!language)
         language = "";
 
-    g_debug ("Logging in");
+    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);
     write_string (greeter, session);
@@ -1368,11 +1386,46 @@ ldm_greeter_login (LdmGreeter *greeter, const gchar *username, const gchar *sess
 void
 ldm_greeter_login_with_defaults (LdmGreeter *greeter, const gchar *username)
 {
-    g_return_if_fail (LDM_IS_GREETER (greeter));
-    g_return_if_fail (username != NULL);
     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_login_as_guest (greeter, NULL, NULL);  
+}
+
 static gboolean
 upower_call_function (LdmGreeter *greeter, const gchar *function, gboolean has_result)
 {
index 0d44d1e031131d0c732b219033fbf5a35767a4ca..164385e577df22c4942856937a61258be823bcb0 100644 (file)
@@ -93,6 +93,8 @@ const GList *ldm_greeter_get_sessions (LdmGreeter *greeter);
 
 const gchar *ldm_greeter_get_default_session (LdmGreeter *greeter);
 
+gboolean ldm_greeter_get_has_guest_session (LdmGreeter *greeter);
+
 const gchar *ldm_greeter_get_timed_login_user (LdmGreeter *greeter);
 
 gint ldm_greeter_get_timed_login_delay (LdmGreeter *greeter);
@@ -115,6 +117,10 @@ void ldm_greeter_login (LdmGreeter *greeter, const gchar *username, const gchar
 
 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_login_as_guest_with_defaults (LdmGreeter *greeter);
+
 gboolean ldm_greeter_get_can_suspend (LdmGreeter *greeter);
 
 void ldm_greeter_suspend (LdmGreeter *greeter);
index 56a719769d95c87e8fda81885d1608442acda594..7b2b953b63c9c6e64e5dff74cea9f9096c25b77a 100644 (file)
@@ -24,12 +24,15 @@ typedef enum
     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,
 
     /* 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_END_AUTHENTICATION      = 104,
+    GREETER_MESSAGE_USER_DEFAULTS           = 106
 } GreeterMessage;
 
 #define HEADER_SIZE 8
@@ -44,14 +47,15 @@ public:
     QString defaultSession;
     QString timedUser;
     int loginDelay;
-    
+    bool guestAccountSupported;
+
     SessionsModel *sessionsModel;
     Config *config;
 
     QDBusInterface* lightdmInterface;
     QDBusInterface* powerManagementInterface;
     QDBusInterface* consoleKitInterface;
-  
+
     int toServerFd;
     int fromServerFd;
     QSocketNotifier *n;
@@ -195,9 +199,6 @@ void Greeter::connectToServer()
     qDebug() << "Connecting to display manager...";
     writeHeader(GREETER_MESSAGE_CONNECT, 0);
     flush();
-
-
-
 }
 
 void Greeter::startAuthentication(const QString &username)
@@ -258,6 +259,20 @@ 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()
+{
+    loginAsGuest(NULL, NULL);
+}
+
 void Greeter::onRead(int fd)
 {
     //qDebug() << "Reading from server";
@@ -308,7 +323,8 @@ void Greeter::onRead(int fd)
         d->defaultSession = readString(&offset);
         d->timedUser = readString(&offset);
         d->loginDelay = readInt(&offset);
-        qDebug() << "Connected theme=" << d->theme << " default-layout=" << d->defaultLayout << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay;
+        d->guestAccountSupported = readInt(&offset) != 0;
+        qDebug() << "Connected theme=" << d->theme << " default-layout=" << d->defaultLayout << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay << " guestAccountSupported" << d->guestAccountSupported;
 
         /* Set timeout for default login */
         if(d->timedUser != "" && d->loginDelay > 0)
@@ -393,6 +409,11 @@ QString Greeter::defaultSession() const
     return d->defaultSession;
 }
 
+bool Greeter::guestAccountSupported() const
+{
+    return d->guestAccountSupported;
+}
+
 QString Greeter::timedLoginUser() const
 {
     return d->timedUser;
index 67b75be32d393c94d3e043e05fa31bfcdcbb1d66..98ff2da13356382194f77d165d1a336ba268dc3b 100644 (file)
@@ -21,8 +21,8 @@ namespace QLightDM
         explicit Greeter(QObject* parent=0);
         virtual ~Greeter();
 
-        Q_PROPERTY(bool canSuspend READ canSuspend);
-        Q_PROPERTY(bool canHibernate READ canHibernate);
+    Q_PROPERTY(bool canSuspend READ canSuspend);
+    Q_PROPERTY(bool canHibernate READ canHibernate);
        Q_PROPERTY(bool canShutdown READ canShutdown);
        Q_PROPERTY(bool canRestart READ canRestart);
 
@@ -44,9 +44,10 @@ namespace QLightDM
        QString defaultLayout() const;
        QString layout() const;
 
-        QLightDM::Config *config() const;
+    QLightDM::Config *config() const;
 
        QString defaultSession() const;
+    bool guestAccountSupported() const;
 
        bool inAuthentication() const;
        bool isAuthenticated() const;
@@ -59,6 +60,8 @@ namespace QLightDM
        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();
 
        bool canSuspend() const;
        bool canHibernate() const;
index ceb5c77fad465c734687139367eab30eb74e4fed..452e210f985d23703277f3938aa2b383b4cf83d4 100644 (file)
@@ -662,6 +662,16 @@ 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)
 {
@@ -736,6 +746,7 @@ start_greeter (Display *display)
         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), "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);
index 7037523e7bc9e041d2a89fb7f7845f0bf5045939..0ca57abc8b44bd62db819c6d5a220b26a810d7c9 100644 (file)
@@ -21,6 +21,7 @@ typedef enum
     GREETER_MESSAGE_LOGIN                   = 4,
     GREETER_MESSAGE_CANCEL_AUTHENTICATION   = 5,
     GREETER_MESSAGE_GET_USER_DEFAULTS       = 6,
+    GREETER_MESSAGE_LOGIN_AS_GUEST          = 7,
 
     /* Messages from the server to the greeter */
     GREETER_MESSAGE_CONNECTED               = 101,
index 368a3962e2394fae7c4ec142fb4b94102b8409d2..9405649b8afe00212866f124ffe5e9d49ed068ce 100644 (file)
@@ -23,6 +23,7 @@
 
 enum {
     LOGIN,
+    LOGIN_AS_GUEST,
     QUIT,
     LAST_SIGNAL
 };
@@ -159,12 +160,13 @@ handle_connect (Greeter *greeter)
 
     theme = g_build_filename (THEME_DIR, greeter->priv->theme, "index.theme", NULL);
 
-    write_header (greeter, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->layout) + string_length (greeter->priv->session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length ());
+    write_header (greeter, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->layout) + string_length (greeter->priv->session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length () + int_length ());
     write_string (greeter, theme);
     write_string (greeter, greeter->priv->layout);
     write_string (greeter, greeter->priv->session);
     write_string (greeter, greeter->priv->default_user ? greeter->priv->default_user : "");
     write_int (greeter, greeter->priv->autologin_timeout);
+    write_int (greeter, FALSE);
     flush (greeter);
 
     g_free (theme);
@@ -335,6 +337,20 @@ handle_login (Greeter *greeter, gchar *username, gchar *session, gchar *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);
+}
+
 static void
 handle_get_user_defaults (Greeter *greeter, gchar *username)
 {
@@ -517,6 +533,12 @@ got_data_cb (Greeter *greeter)
         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);
@@ -606,6 +628,14 @@ greeter_class_init (GreeterClass *klass)
                       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",
+                      G_TYPE_FROM_CLASS (klass),
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (GreeterClass, login_as_guest),
+                      NULL, NULL,
+                      ldm_marshal_VOID__STRING_STRING,
+                      G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
     signals[QUIT] =
         g_signal_new ("quit",
                       G_TYPE_FROM_CLASS (klass),
index ff82c22b1146372896bf57af4e8caff3f51bb4a4..5ab9f3ab43b8c8b835e6797333e4b552be51fda2 100644 (file)
@@ -32,6 +32,7 @@ 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 (*quit)(Greeter *greeter);
 } GreeterClass;
 
index 27d287b4f3477be1948749d1fa91bb967ed343a8..51b3eae12f0ce89ab279f177b135af155f62f68f 100644 (file)
@@ -1,4 +1,5 @@
 BOOLEAN:OBJECT
 VOID:INT,POINTER
 VOID:OBJECT,BOOLEAN
+VOID:STRING,STRING
 VOID:STRING,STRING,STRING