+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
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,
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
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;
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));
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; }
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);
QString getHint(const QString &name) const;
QString defaultSessionHint() const;
bool hideUsersHint() const;
+ bool lockHint () const;
bool hasGuestAccountHint() const;
QString selectUserHint() const;
bool selectGuestHint() 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);
/* 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;
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)
{
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);
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);
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 *
" <method name='SwitchToGuest'>"
" <arg name='session-name' direction='in' type='s'/>"
" </method>"
+ " <method name='Lock'/>"
" </interface>"
"</node>";
const gchar *session_interface =
/* 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");
}
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;
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");
}
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);
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
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
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
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
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);
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 \
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 \
--- /dev/null
+#
+# 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
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);
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 ()
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();
}
{
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),
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-seat test-gobject-greeter
" 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"
}
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;