]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Add Lock D-Bus method that locks the seat and provides a hint to the greeter to be...
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 9 Feb 2012 05:33:51 +0000 (16:33 +1100)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 9 Feb 2012 05:33:51 +0000 (16:33 +1100)
19 files changed:
NEWS
liblightdm-gobject/greeter.c
liblightdm-gobject/liblightdm-gobject-1.vapi
liblightdm-gobject/lightdm/greeter.h
liblightdm-qt/QLightDM/greeter.h
liblightdm-qt/greeter.cpp
src/display.c
src/display.h
src/lightdm.c
src/seat.c
src/seat.h
tests/Makefile.am
tests/scripts/lock-seat.conf [new file with mode: 0644]
tests/src/test-gobject-greeter.c
tests/src/test-python-greeter
tests/src/test-qt-greeter.cpp
tests/src/test-runner.c
tests/test-lock-seat [new file with mode: 0755]
utils/dm-tool.c

diff --git a/NEWS b/NEWS
index 5f77cec6552c1b77ecd4b92b28d3bdb3e49ee8bd..023e07dee4e3bb2e547c39d3201eb31346bf3395 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+Overview of changes in lightdm 1.1.3
+
+    * Add Lock D-Bus method that locks the seat and provides a hint to the
+      greeter to be in lock mode.
+
 Overview of changes in lightdm 1.1.2
 
     * Add regression tests for getting the user language and layout
index 3c10007e72a7dfc8de3faa1e4e5670685d910d2a..ee3960f87acfb59af1dca4b17fd967b1028518bc 100644 (file)
@@ -21,6 +21,7 @@ enum {
     PROP_0,
     PROP_DEFAULT_SESSION_HINT,
     PROP_HIDE_USERS_HINT,
+    PROP_LOCK_HINT,
     PROP_HAS_GUEST_ACCOUNT_HINT,
     PROP_SELECT_USER_HINT,
     PROP_SELECT_GUEST_HINT,
@@ -560,6 +561,25 @@ lightdm_greeter_get_hide_users_hint (LightDMGreeter *greeter)
     return g_strcmp0 (value, "true") == 0;
 }
 
+/**
+ * lightdm_greeter_get_lock_hint:
+ * @greeter: A #LightDMGreeter
+ *
+ * Check if the greeter is acting as a lock screen.
+ *
+ * Return value: #TRUE if the greeter was triggered by locking the seat.
+ */
+gboolean
+lightdm_greeter_get_lock_hint (LightDMGreeter *greeter)
+{
+    const gchar *value;
+
+    g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
+    value = lightdm_greeter_get_hint (greeter, "lock-screen");
+
+    return g_strcmp0 (value, "true") == 0;
+}
+
 /**
  * lightdm_greeter_get_has_guest_account_hint:
  * @greeter: A #LightDMGreeter
@@ -970,6 +990,9 @@ lightdm_greeter_get_property (GObject    *object,
     case PROP_HIDE_USERS_HINT:
         g_value_set_boolean (value, lightdm_greeter_get_hide_users_hint (self));
         break;
+    case PROP_LOCK_HINT:
+        g_value_set_boolean (value, lightdm_greeter_get_lock_hint (self));
+        break;
     case PROP_HAS_GUEST_ACCOUNT_HINT:
         g_value_set_boolean (value, lightdm_greeter_get_has_guest_account_hint (self));
         break;
@@ -1078,7 +1101,15 @@ lightdm_greeter_class_init (LightDMGreeterClass *klass)
                                      PROP_HIDE_USERS_HINT,
                                      g_param_spec_boolean ("hide-users-hint",
                                                            "hide-users-hint",
-                                                           "hide users hint",
+                                                           "Hide users hint",
+                                                           FALSE,
+                                                           G_PARAM_READABLE));
+
+    g_object_class_install_property (object_class,
+                                     PROP_LOCK_HINT,
+                                     g_param_spec_boolean ("lock-hint",
+                                                           "lock-hint",
+                                                           "Lock hint",
                                                            FALSE,
                                                            G_PARAM_READABLE));
 
index a9ac2431173eb94a3a7b5fee67851c650278fcef..c35774d422205c39e23f9073e9296039df5d00e8 100644 (file)
@@ -27,6 +27,7 @@ namespace LightDM {
         public unowned string get_hint (string name);
         public unowned string default_session_hint { get; }
         public bool hide_users_hint { get; }
+        public bool lock_hint { get; }
         public bool has_guest_account_hint { get; }
         public unowned string select_user_hint { get; }
         public bool select_guest_hint { get; }
index c1b281d5281f4765c4d005a8685269ed860f2154..1b76be98c9463a7af91db7ebcf43c44cdf9bfe35 100644 (file)
@@ -80,6 +80,8 @@ const gchar *lightdm_greeter_get_default_session_hint (LightDMGreeter *greeter);
 
 gboolean lightdm_greeter_get_hide_users_hint (LightDMGreeter *greeter);
 
+gboolean lightdm_greeter_get_lock_hint (LightDMGreeter *greeter);
+
 gboolean lightdm_greeter_get_has_guest_account_hint (LightDMGreeter *greeter);
 
 const gchar *lightdm_greeter_get_select_user_hint (LightDMGreeter *greeter);
index 5f82b52bf780c62e80c2e4c1250387ac009b3750..f5ccce53ca7325b2a93041febeb7f113d2f247d4 100644 (file)
@@ -46,6 +46,7 @@ public:
     QString getHint(const QString &name) const;   
     QString defaultSessionHint() const;
     bool hideUsersHint() const;
+    bool lockHint () const;
     bool hasGuestAccountHint() const;
     QString selectUserHint() const;
     bool selectGuestHint() const;
index 6c43448bfedc9d8f60a14349ee77cc5af09ad08e..23756a8894ea749223b77304474b04653d5f2982 100644 (file)
@@ -181,6 +181,12 @@ bool Greeter::hideUsersHint() const
     return lightdm_greeter_get_hide_users_hint(d->ldmGreeter);
 }
 
+bool Greeter::lockHint() const
+{
+    Q_D(const Greeter);
+    return lightdm_greeter_get_lock_hint(d->ldmGreeter);
+}
+
 bool Greeter::hasGuestAccountHint() const
 {
     Q_D(const Greeter);
index 2cf75a2c92eacca886b75f08cabde10f48354f21..a9b1739618b379ec9e9def99526cc28dfa096b21 100644 (file)
@@ -55,6 +55,9 @@ struct DisplayPrivate
     /* TRUE if the user list should be shown */
     gboolean greeter_hide_users;
 
+    /* TRUE if the greeter is a lock screen */
+    gboolean greeter_is_lock;
+
     /* Session requested to log into */
     gchar *user_session;
 
@@ -193,6 +196,13 @@ display_set_hide_users_hint (Display *display, gboolean hide_users)
     display->priv->greeter_hide_users = hide_users;
 }
 
+void
+display_set_lock_hint (Display *display, gboolean is_lock)
+{
+    g_return_if_fail (display != NULL);
+    display->priv->greeter_is_lock = is_lock;
+}
+
 void
 display_set_user_session (Display *display, const gchar *session_name)
 {
@@ -661,6 +671,8 @@ start_greeter_session (Display *display)
     greeter_set_allow_guest (display->priv->greeter, display->priv->allow_guest);
     greeter_set_hint (display->priv->greeter, "has-guest-account", display->priv->allow_guest ? "true" : "false");
     greeter_set_hint (display->priv->greeter, "hide-users", display->priv->greeter_hide_users ? "true" : "false");
+    if (display->priv->greeter_is_lock)
+        greeter_set_hint (display->priv->greeter, "lock-screen", "true");
 
     start_result = FALSE;
     g_signal_emit (display, signals[START_GREETER], 0, &start_result);
index f011616c47b11e30ec0dba00986d07b4f693874b..eb563974c4158cada85422654a7da3664c1d4a0f 100644 (file)
@@ -70,6 +70,8 @@ void display_set_select_user_hint (Display *display, const gchar *username, gboo
 
 void display_set_hide_users_hint (Display *display, gboolean hide_users);
 
+void display_set_lock_hint (Display *display, gboolean is_lock);
+
 void display_set_user_session (Display *display, const gchar *session_name);
 
 gboolean display_start (Display *display);
index 2f640063553b9f478ff5ff6b46df42961151300d..bbdf7034991983b2210fe8e529099a45b65c20ba 100644 (file)
@@ -417,6 +417,12 @@ handle_seat_call (GDBusConnection       *connection,
         seat_switch_to_guest (seat, session_name);
         g_dbus_method_invocation_return_value (invocation, NULL);
     }
+    else if (g_strcmp0 (method_name, "Lock") == 0)
+    {
+        /* FIXME: Should only allow locks if have a session on this seat */
+        seat_lock (seat);
+        g_dbus_method_invocation_return_value (invocation, NULL);
+    }
 }
 
 static GVariant *
@@ -666,6 +672,7 @@ bus_acquired_cb (GDBusConnection *connection,
         "    <method name='SwitchToGuest'>"
         "      <arg name='session-name' direction='in' type='s'/>"
         "    </method>"
+        "    <method name='Lock'/>"    
         "  </interface>"
         "</node>";
     const gchar *session_interface =
index 10b2ebcc3a67e88cce700d12fbdeab1f471652c1..87e62dedb1fcaba5f7948e4ee7daa43d776b81a7 100644 (file)
@@ -192,7 +192,7 @@ switch_to_user (Seat *seat, const gchar *username, gboolean unlock)
         /* If already logged in, then switch to that display */
         if (g_strcmp0 (display_get_username (display), username) == 0)        
         {
-           if (username)
+            if (username)
                 g_debug ("Switching to existing session for user %s", username);
             else
                 g_debug ("Switching to existing greeter");
@@ -432,7 +432,7 @@ display_stopped_cb (Display *display, Seat *seat)
 }
 
 static gboolean
-switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_guest, const gchar *session_name, gboolean autologin)
+switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_guest, const gchar *session_name, gboolean is_lock, gboolean autologin)
 {
     Display *display;
     DisplayServer *display_server;
@@ -457,6 +457,8 @@ switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_
             g_debug ("Starting new display for greeter with guest selected");
         else if (username)
             g_debug ("Starting new display for greeter with user %s selected", username);
+        else if (is_lock)
+            g_debug ("Starting new display for greeter (lock screen)");
         else
             g_debug ("Starting new display for greeter");
     }
@@ -478,6 +480,8 @@ switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_
     display_set_greeter_session (display, seat_get_string_property (seat, "greeter-session"));
     display_set_session_wrapper (display, seat_get_string_property (seat, "session-wrapper"));
     display_set_hide_users_hint (display, seat_get_boolean_property (seat, "greeter-hide-users"));
+    if (is_lock)
+        display_set_lock_hint (display, TRUE);
     display_set_allow_guest (display, seat_get_allow_guest (seat));
     if (autologin)
         display_set_autologin_user (display, username, is_guest, 0);
@@ -506,7 +510,7 @@ seat_switch_to_greeter (Seat *seat)
         return FALSE;
 
     g_debug ("Switching to greeter");
-    return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, FALSE);
+    return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, FALSE, FALSE);
 }
 
 gboolean
@@ -519,7 +523,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam
         return FALSE;
 
     g_debug ("Switching to user %s", username);
-    return switch_to_user_or_start_greeter (seat, username, FALSE, session_name, FALSE);
+    return switch_to_user_or_start_greeter (seat, username, FALSE, session_name, FALSE, FALSE);
 }
 
 gboolean
@@ -534,7 +538,19 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
         g_debug ("Switching to existing guest account %s", seat->priv->guest_username);
     else
         g_debug ("Switching to new guest account");
-    return switch_to_user_or_start_greeter (seat, seat->priv->guest_username, TRUE, session_name, TRUE);
+    return switch_to_user_or_start_greeter (seat, seat->priv->guest_username, TRUE, session_name, FALSE, TRUE);
+}
+
+gboolean
+seat_lock (Seat *seat)
+{
+    g_return_val_if_fail (seat != NULL, FALSE);
+
+    if (!seat->priv->can_switch)
+        return FALSE;
+
+    g_debug ("Locking seat");
+    return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, TRUE, FALSE);
 }
 
 void
@@ -575,11 +591,11 @@ seat_real_start (Seat *seat)
         autologin_username = NULL;
 
     if (autologin_username)
-        return switch_to_user_or_start_greeter (seat, autologin_username, FALSE, NULL, TRUE);
+        return switch_to_user_or_start_greeter (seat, autologin_username, FALSE, NULL, FALSE, TRUE);
     else if (seat_get_boolean_property (seat, "autologin-guest"))
-        return switch_to_user_or_start_greeter (seat, NULL, TRUE, NULL, TRUE);
+        return switch_to_user_or_start_greeter (seat, NULL, TRUE, NULL, FALSE, TRUE);
     else
-        return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, FALSE);
+        return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, FALSE, FALSE);
 }
 
 static void
index 005c0f8b075d4432509fc797197b369d572fdbd8..dadbd0ee9a05d2f931a32d95e2f2035494b0cb41 100644 (file)
@@ -83,6 +83,8 @@ gboolean seat_switch_to_user (Seat *seat, const gchar *username, const gchar *se
 
 gboolean seat_switch_to_guest (Seat *seat, const gchar *session_name);
 
+gboolean seat_lock (Seat *seat);
+
 void seat_stop (Seat *seat);
 
 gboolean seat_get_is_stopping (Seat *seat);
index 8b837dbd3c0c9f21601d621198c32634e4eb5c88..8f63d2dbee1cc55b8a51e1447f9df3b460978209 100644 (file)
@@ -62,6 +62,7 @@ TESTS = \
        test-script-hook-fail-display-setup \
        test-script-hook-fail-greeter-setup \
        test-script-hook-fail-session-setup \
+    test-lock-seat \
        test-switch-to-greeter \
        test-switch-to-guest \
        test-switch-to-user \
@@ -126,6 +127,7 @@ EXTRA_DIST = \
        scripts/keyboard-layout.conf \
        scripts/language.conf \
        scripts/language-no-accounts-service.conf \
+       scripts/lock-seat.conf \
        scripts/login.conf \
        scripts/login-guest.conf \
        scripts/login-guest-disabled.conf \
diff --git a/tests/scripts/lock-seat.conf b/tests/scripts/lock-seat.conf
new file mode 100644 (file)
index 0000000..9549d98
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# Use D-Bus interface to show the greeter
+#
+
+[LightDM]
+minimum-display-number=50
+
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER :50 START
+#?XSERVER :50 INDICATE-READY
+
+# LightDM connects to X server
+#?XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER :50 START
+#?XSERVER :50 ACCEPT-CONNECT
+#?GREETER :50 CONNECT-XSERVER
+#?GREETER :50 CONNECT-TO-DAEMON
+#?GREETER :50 CONNECTED-TO-DAEMON
+
+# Login
+#?*GREETER :50 AUTHENTICATE USERNAME=alice
+#?GREETER :50 SHOW-PROMPT TEXT="Password:"
+#?*GREETER :50 RESPOND TEXT="password"
+#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
+#?*GREETER :50 START-SESSION
+#?GREETER :50 TERMINATE SIGNAL=15
+
+# Session starts
+#?SESSION :50 START USER=alice
+#?XSERVER :50 ACCEPT-CONNECT
+#?SESSION :50 CONNECT-XSERVER
+
+# Lock the seat
+#?*LOCK-SEAT
+#?RUNNER LOCK-SEAT
+
+# New X server starts
+#?XSERVER :51 START
+#?XSERVER :51 INDICATE-READY
+
+# LightDM connects to X server
+#?XSERVER :51 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER :51 START
+#?XSERVER :51 ACCEPT-CONNECT
+#?GREETER :51 CONNECT-XSERVER
+#?GREETER :51 CONNECT-TO-DAEMON
+#?GREETER :51 CONNECTED-TO-DAEMON
+#?GREETER :51 LOCK-HINT
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GREETER :51 TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GREETER :51 TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GREETER :51 TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GREETER :51 TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+#?RUNNER DAEMON-EXIT STATUS=0
index 3397f3dcfb9aad281a60d345006e44e3fd1ff672..7e4c4f1f341e65778aeb0303ca433b56a8fb6cd3 100644 (file)
@@ -169,9 +169,10 @@ main (int argc, char **argv)
 
     status_notify ("GREETER %s CONNECTED-TO-DAEMON", getenv ("DISPLAY"));
 
-    /* Automatically log in as requested user */
     if (lightdm_greeter_get_select_user_hint (greeter))
         status_notify ("GREETER %s SELECT-USER-HINT USERNAME=%s", getenv ("DISPLAY"), lightdm_greeter_get_select_user_hint (greeter));
+    if (lightdm_greeter_get_lock_hint (greeter))
+        status_notify ("GREETER %s LOCK-HINT", getenv ("DISPLAY"));
 
     g_main_loop_run (main_loop);
 
index c6ca2279df6e5d0fa651cf6bc2279b31ccdf0af2..78a23c2bb27acbe2dc9d08629d667db582173e57 100755 (executable)
@@ -157,5 +157,7 @@ status_notify ('GREETER %s CONNECTED-TO-DAEMON' % os.getenv ('DISPLAY'))
 
 if greeter.get_select_user_hint () is not None:
     status_notify ('GREETER %s SELECT-USER-HINT USERNAME=%s' % (os.getenv ('DISPLAY'), greeter.get_select_user_hint ()))
+if greeter.get_lock_hint ():
+        status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));
 
 loop.run ()
index 43609ae2bb2780a2e5efd826a750f07be8ae82e0..912719e3e9bd14bdb1c7ba9a084a3758a53b9889 100644 (file)
@@ -137,6 +137,8 @@ main(int argc, char *argv[])
 
     if (greeter->selectUserHint() != "")
         status_notify ("GREETER %s SELECT-USER-HINT USERNAME=%s", getenv ("DISPLAY"), greeter->selectUserHint ().toAscii ().constData ());
+    if (greeter->lockHint())
+        status_notify ("GREETER %s LOCK-HINT", getenv ("DISPLAY"));
 
     return app.exec();
 }
index 27d5204d394279d9ab565ca63085040f84dbb195..62f36d243c92cf169c87b00f3b7decf97d509b30 100644 (file)
@@ -316,6 +316,21 @@ handle_command (const gchar *command)
     {
         sleep (1);
     }
+    else if (strcmp (name, "LOCK-SEAT") == 0)
+    {
+        g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
+                                     "org.freedesktop.DisplayManager",
+                                     "/org/freedesktop/DisplayManager/Seat0",
+                                     "org.freedesktop.DisplayManager.Seat",
+                                     "Lock",
+                                     g_variant_new ("()"),
+                                     G_VARIANT_TYPE ("()"),
+                                     G_DBUS_CALL_FLAGS_NONE,
+                                     1000,
+                                     NULL,
+                                     NULL);
+        check_status ("RUNNER LOCK-SEAT");
+    }
     else if (strcmp (name, "SWITCH-TO-GREETER") == 0)
     {
         g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
diff --git a/tests/test-lock-seat b/tests/test-lock-seat
new file mode 100755 (executable)
index 0000000..8ea1f52
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-seat test-gobject-greeter
index 2d2c65a30db89bb97d5cf031c76f0af563ffd1db..d955efd1ca1fa98befd3f14573779e0160bafb10 100644 (file)
@@ -101,6 +101,7 @@ main (int argc, char **argv)
                         "  switch-to-greeter                   Switch to the greeter\n"
                         "  switch-to-user USERNAME [SESSION]   Switch to a user session\n"
                         "  switch-to-guest [SESSION]           Switch to a guest session\n"
+                        "  lock                                Lock the current seat\n"
                         "  list-seats                          List the active seats\n"
                         "  add-nested-seat                     Start a nested display\n"
                         "  add-local-x-seat DISPLAY_NUMBER     Add a local X seat\n"
@@ -247,6 +248,28 @@ main (int argc, char **argv)
         }
         return EXIT_SUCCESS;
     }
+    else if (strcmp (command, "lock") == 0)
+    {
+        if (n_options != 0)
+        {
+            g_printerr ("Usage lock\n");
+            usage ();
+            return EXIT_FAILURE;
+        }
+
+        if (!g_dbus_proxy_call_sync (seat_proxy,
+                                     "Lock",
+                                     g_variant_new ("()"),
+                                     G_DBUS_CALL_FLAGS_NONE,
+                                     -1,
+                                     NULL,
+                                     &error))
+        {
+            g_printerr ("Unable to lock seat: %s\n", error->message);
+            return EXIT_FAILURE;
+        }
+        return EXIT_SUCCESS;
+    }
     else if (strcmp (command, "list-seats") == 0)
     {
         GVariant *seats, *sessions;