Required modifying PowerInterface::canRestart() and PowerInteface::canShutdown()
public Q_SLOTS:
void suspend();
void hibernate();
- void shutdown();
- void restart();
+ bool shutdown();
+ bool restart();
private:
class PowerInterfacePrivate;
return false;
}
-void PowerInterface::shutdown()
+bool PowerInterface::shutdown()
{
+ QDBusReply<void> reply;
if (d->login1Interface->isValid())
- d->login1Interface->call("PowerOff", false);
+ reply = d->login1Interface->call("PowerOff", false);
else
- d->consoleKitInterface->call("Stop");
+ reply = d->consoleKitInterface->call("Stop");
+ return reply.isValid();
}
bool PowerInterface::canRestart()
return false;
}
-void PowerInterface::restart()
+bool PowerInterface::restart()
{
+ QDBusReply<void> reply;
if (d->login1Interface->isValid())
- d->login1Interface->call("Reboot", false);
+ reply = d->login1Interface->call("Reboot", false);
else
- d->consoleKitInterface->call("Restart");
+ reply = d->consoleKitInterface->call("Restart");
+ return reply.isValid();
}
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
test-no-console-kit \
test-no-login1 \
test-no-console-kit-or-login1 \
+ test-gobject-power \
+ test-gobject-power-no-console-kit \
+ test-gobject-power-no-login1 \
+ test-gobject-power-no-console-kit-or-login1 \
+ test-python-power \
+ test-python-power-no-console-kit \
+ test-python-power-no-login1 \
+ test-python-power-no-console-kit-or-login1 \
test-open-file-descriptors \
test-xdmcp-open-file-descriptors
test-login-qt4-guest-no-setup-script \
test-login-qt4-guest-fail-setup-script \
test-login-qt4-guest-logout \
- test-login-qt4-remote-session
+ test-login-qt4-remote-session \
+ test-qt4-power \
+ test-qt4-power-no-console-kit \
+ test-qt4-power-no-login1 \
+ test-qt4-power-no-console-kit-or-login1
endif
if COMPILE_LIBLIGHTDM_QT5
test-login-qt5-guest-no-setup-script \
test-login-qt5-guest-fail-setup-script \
test-login-qt5-guest-logout \
- test-login-qt5-remote-session
+ test-login-qt5-remote-session \
+ test-qt4-power \
+ test-qt4-power-no-console-kit \
+ test-qt4-power-no-login1 \
+ test-qt4-power-no-console-kit-or-login1
endif
EXTRA_DIST = \
scripts/no-login1.conf \
scripts/open-file-descriptors.conf \
scripts/pam.conf \
+ scripts/power.conf \
+ scripts/power-no-console-kit.conf \
+ scripts/power-no-console-kit-or-login1.conf \
+ scripts/power-no-login1.conf \
scripts/plymouth-active-vt.conf \
scripts/plymouth-inactive-vt.conf \
scripts/plymouth-no-seat.conf \
--- /dev/null
+#
+# Check can do power operations from the greeter when not ConsoleKit or login1 service (disallowed)
+#
+
+[test-runner-config]
+disable-console-kit=true
+disable-login1=true
+
+[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
+
+# See if can restart
+#?*GREETER :50 GET-CAN-RESTART
+#?GREETER :50 CAN-RESTART ALLOWED=FALSE
+
+# Restart
+#?*GREETER :50 RESTART
+#?GREETER :50 FAIL-RESTART
+
+# See if can shutdown
+#?*GREETER :50 GET-CAN-SHUTDOWN
+#?GREETER :50 CAN-SHUTDOWN ALLOWED=FALSE
+
+# Shutdown
+#?*GREETER :50 SHUTDOWN
+#?GREETER :50 FAIL-SHUTDOWN
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?RUNNER DAEMON-EXIT STATUS=0
--- /dev/null
+#
+# Check can do power operations from the greeter when no ConsoleKit service
+#
+
+[test-runner-config]
+disable-console-kit=true
+
+[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
+
+# See if can restart
+#?*GREETER :50 GET-CAN-RESTART
+#?LOGIN1 CAN-REBOOT
+#?GREETER :50 CAN-RESTART ALLOWED=TRUE
+
+# Restart
+#?*GREETER :50 RESTART
+#?LOGIN1 REBOOT
+
+# See if can shutdown
+#?*GREETER :50 GET-CAN-SHUTDOWN
+#?LOGIN1 CAN-POWER-OFF
+#?GREETER :50 CAN-SHUTDOWN ALLOWED=TRUE
+
+# Shutdown
+#?*GREETER :50 SHUTDOWN
+#?LOGIN1 POWER-OFF
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?RUNNER DAEMON-EXIT STATUS=0
--- /dev/null
+#
+# Check can do power operations from the greeter when no login1 service (falls back to ConsoleKit)
+#
+
+[test-runner-config]
+disable-login1=true
+
+[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
+
+# See if can restart
+#?*GREETER :50 GET-CAN-RESTART
+#?CONSOLE-KIT CAN-RESTART
+#?GREETER :50 CAN-RESTART ALLOWED=TRUE
+
+# Restart
+#?*GREETER :50 RESTART
+#?CONSOLE-KIT RESTART
+
+# See if can shutdown
+#?*GREETER :50 GET-CAN-SHUTDOWN
+#?CONSOLE-KIT CAN-STOP
+#?GREETER :50 CAN-SHUTDOWN ALLOWED=TRUE
+
+# Shutdown
+#?*GREETER :50 SHUTDOWN
+#?CONSOLE-KIT STOP
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?RUNNER DAEMON-EXIT STATUS=0
--- /dev/null
+#
+# Check can do power operations from 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
+
+# See if can restart
+#?*GREETER :50 GET-CAN-RESTART
+#?LOGIN1 CAN-REBOOT
+#?GREETER :50 CAN-RESTART ALLOWED=TRUE
+
+# Restart
+#?*GREETER :50 RESTART
+#?LOGIN1 REBOOT
+
+# See if can shutdown
+#?*GREETER :50 GET-CAN-SHUTDOWN
+#?LOGIN1 CAN-POWER-OFF
+#?GREETER :50 CAN-SHUTDOWN ALLOWED=TRUE
+
+# Shutdown
+#?*GREETER :50 SHUTDOWN
+#?LOGIN1 POWER-OFF
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?(GREETER :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?RUNNER DAEMON-EXIT STATUS=0
status_notify ("GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", getenv ("DISPLAY"), username, language ? language : "");
}
g_free (r);
+
+ r = g_strdup_printf ("GREETER %s GET-CAN-RESTART", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ gboolean can_restart = lightdm_get_can_restart ();
+ status_notify ("GREETER %s CAN-RESTART ALLOWED=%s", getenv ("DISPLAY"), can_restart ? "TRUE" : "FALSE");
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("GREETER %s RESTART", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ GError *error = NULL;
+ if (!lightdm_restart (&error))
+ status_notify ("GREETER %s FAIL-RESTART", getenv ("DISPLAY"));
+ g_clear_error (&error);
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("GREETER %s GET-CAN-SHUTDOWN", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ gboolean can_shutdown = lightdm_get_can_shutdown ();
+ status_notify ("GREETER %s CAN-SHUTDOWN ALLOWED=%s", getenv ("DISPLAY"), can_shutdown ? "TRUE" : "FALSE");
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("GREETER %s SHUTDOWN", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ GError *error = NULL;
+ if (!lightdm_shutdown (&error))
+ status_notify ("GREETER %s FAIL-SHUTDOWN", getenv ("DISPLAY"));
+ g_clear_error (&error);
+ }
+ g_free (r);
}
int
language = ''
status_notify ('GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (os.getenv ('DISPLAY'), username, language))
+ r = 'GREETER %s GET-CAN-RESTART' % os.getenv ('DISPLAY')
+ if request == r:
+ if LightDM.get_can_restart ():
+ allowed = "TRUE"
+ else:
+ allowed = "FALSE"
+ status_notify ('GREETER %s CAN-RESTART ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
+
+ r = 'GREETER %s RESTART' % os.getenv ('DISPLAY')
+ if request == r:
+ try:
+ LightDM.restart ()
+ except:
+ status_notify ('GREETER %s FAIL-RESTART' % os.getenv ('DISPLAY'))
+
+ r = 'GREETER %s GET-CAN-SHUTDOWN' % os.getenv ('DISPLAY')
+ if request == r:
+ if LightDM.get_can_shutdown ():
+ allowed = "TRUE"
+ else:
+ allowed = "FALSE"
+ status_notify ('GREETER %s CAN-SHUTDOWN ALLOWED=%s' % (os.getenv ('DISPLAY'), allowed))
+
+ r = 'GREETER %s SHUTDOWN' % os.getenv ('DISPLAY')
+ if request == r:
+ try:
+ LightDM.shutdown ()
+ except:
+ status_notify ('GREETER %s FAIL-SHUTDOWN' % os.getenv ('DISPLAY'))
+
return True
path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.status-socket'
#include <glib-object.h>
#include <xcb/xcb.h>
#include <QLightDM/Greeter>
+#include <QLightDM/Power>
#include <QtCore/QSettings>
#include <QtCore/QDebug>
#include <QtCore/QCoreApplication>
static QCoreApplication *app = NULL;
static QSettings *config = NULL;
+static QLightDM::PowerInterface *power = NULL;
static TestGreeter *greeter = NULL;
TestGreeter::TestGreeter ()
status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY"));
}
g_free (r);
+
+ r = g_strdup_printf ("GREETER %s GET-CAN-RESTART", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ gboolean can_restart = power->canRestart ();
+ status_notify ("GREETER %s CAN-RESTART ALLOWED=%s", getenv ("DISPLAY"), can_restart ? "TRUE" : "FALSE");
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("GREETER %s RESTART", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ if (!power->restart ())
+ status_notify ("GREETER %s FAIL-RESTART", getenv ("DISPLAY"));
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("GREETER %s GET-CAN-SHUTDOWN", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ gboolean can_shutdown = power->canShutdown ();
+ status_notify ("GREETER %s CAN-SHUTDOWN ALLOWED=%s", getenv ("DISPLAY"), can_shutdown ? "TRUE" : "FALSE");
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("GREETER %s SHUTDOWN", getenv ("DISPLAY"));
+ if (strcmp (request, r) == 0)
+ {
+ if (!power->shutdown ())
+ status_notify ("GREETER %s FAIL-SHUTDOWN", getenv ("DISPLAY"));
+ }
+ g_free (r);
}
int
status_notify ("GREETER %s CONNECT-XSERVER", getenv ("DISPLAY"));
+ power = new QLightDM::PowerInterface();
+
greeter = new TestGreeter();
status_notify ("GREETER %s CONNECT-TO-DAEMON", getenv ("DISPLAY"));
gpointer user_data)
{
if (strcmp (method_name, "CanRestart") == 0)
+ {
+ check_status ("CONSOLE-KIT CAN-RESTART");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", TRUE));
+ }
else if (strcmp (method_name, "CanStop") == 0)
+ {
+ check_status ("CONSOLE-KIT CAN-STOP");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", TRUE));
+ }
else if (strcmp (method_name, "CloseSession") == 0)
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", TRUE));
else if (strcmp (method_name, "OpenSession") == 0)
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Unable to find session for cookie");
}
else if (strcmp (method_name, "Restart") == 0)
+ {
+ check_status ("CONSOLE-KIT RESTART");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
+ }
else if (strcmp (method_name, "Stop") == 0)
+ {
+ check_status ("CONSOLE-KIT STOP");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
+ }
else
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such method: %s", method_name);
}
gpointer user_data)
{
if (strcmp (method_name, "CanReboot") == 0)
+ {
+ check_status ("LOGIN1 CAN-REBOOT");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "yes"));
+ }
else if (strcmp (method_name, "Reboot") == 0)
{
gboolean interactive;
g_variant_get (parameters, "(b)", &interactive);
+ check_status ("LOGIN1 REBOOT");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
}
- if (strcmp (method_name, "CanPowerOff") == 0)
+ else if (strcmp (method_name, "CanPowerOff") == 0)
+ {
+ check_status ("LOGIN1 CAN-POWER-OFF");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "yes"));
+ }
else if (strcmp (method_name, "PowerOff") == 0)
{
gboolean interactive;
g_variant_get (parameters, "(b)", &interactive);
+ check_status ("LOGIN1 POWER-OFF");
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
}
else
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power test-gobject-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit test-gobject-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit-or-login1 test-gobject-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-login1 test-gobject-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power test-python-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit test-python-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit-or-login1 test-python-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-login1 test-python-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power test-qt4-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit test-qt4-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit-or-login1 test-qt4-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-login1 test-qt4-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power test-qt5-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit test-qt5-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-console-kit-or-login1 test-qt5-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner power-no-login1 test-qt5-greeter