diff options
Diffstat (limited to 'community/lightdm/lightdm-use-login1.patch')
-rwxr-xr-x | community/lightdm/lightdm-use-login1.patch | 514 |
1 files changed, 514 insertions, 0 deletions
diff --git a/community/lightdm/lightdm-use-login1.patch b/community/lightdm/lightdm-use-login1.patch new file mode 100755 index 000000000..89adbdbb7 --- /dev/null +++ b/community/lightdm/lightdm-use-login1.patch @@ -0,0 +1,514 @@ +=== modified file 'liblightdm-gobject/power.c' +--- liblightdm-gobject/power.c 2013-01-31 20:56:09 +0000 ++++ liblightdm-gobject/power.c 2013-04-15 02:21:06 +0000 +@@ -17,6 +17,7 @@ + + static GDBusProxy *upower_proxy = NULL; + static GDBusProxy *ck_proxy = NULL; ++static GDBusProxy *login1_proxy = NULL; + + static gboolean + upower_call_function (const gchar *function, gboolean default_result, GError **error) +@@ -109,11 +110,10 @@ + return upower_call_function ("Hibernate", TRUE, error); + } + +-static gboolean +-ck_call_function (const gchar *function, gboolean default_result, GError **error) ++static GVariant * ++ck_call_function (const gchar *function, GError **error) + { +- GVariant *result; +- gboolean function_result = FALSE; ++ GVariant *r; + + if (!ck_proxy) + { +@@ -129,22 +129,46 @@ + return FALSE; + } + +- result = g_dbus_proxy_call_sync (ck_proxy, +- function, +- NULL, +- G_DBUS_CALL_FLAGS_NONE, +- -1, +- NULL, +- error); +- +- if (!result) +- return default_result; +- +- if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) +- g_variant_get (result, "(b)", &function_result); +- +- g_variant_unref (result); +- return function_result; ++ r = g_dbus_proxy_call_sync (ck_proxy, ++ function, ++ NULL, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, ++ error); ++ ++ return r; ++} ++ ++static GVariant * ++login1_call_function (const gchar *function, GVariant *parameters, GError **error) ++{ ++ GVariant *r; ++ gchar *str_result; ++ ++ if (!login1_proxy) ++ { ++ login1_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, ++ G_DBUS_PROXY_FLAGS_NONE, ++ NULL, ++ "org.freedesktop.login1", ++ "/org/freedesktop/login1", ++ "org.freedesktop.login1.Manager", ++ NULL, ++ error); ++ if (!login1_proxy) ++ return NULL; ++ } ++ ++ r = g_dbus_proxy_call_sync (login1_proxy, ++ function, ++ parameters, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, ++ error); ++ ++ return r; + } + + /** +@@ -157,7 +181,29 @@ + gboolean + lightdm_get_can_restart (void) + { +- return ck_call_function ("CanRestart", FALSE, NULL); ++ gboolean can_restart = FALSE; ++ GVariant *r; ++ ++ r = login1_call_function ("CanReboot", NULL, NULL); ++ if (r) ++ { ++ gchar *result; ++ if (g_variant_is_of_type (r, G_VARIANT_TYPE ("(s)"))) ++ { ++ g_variant_get (r, "(&s)", &result); ++ can_restart = g_strcmp0 (result, "yes") == 0; ++ } ++ } ++ else ++ { ++ r = ck_call_function ("CanRestart", NULL); ++ if (r && g_variant_is_of_type (r, G_VARIANT_TYPE ("(b)"))) ++ g_variant_get (r, "(b)", &can_restart); ++ } ++ if (r) ++ g_variant_unref (r); ++ ++ return can_restart; + } + + /** +@@ -171,7 +217,20 @@ + gboolean + lightdm_restart (GError **error) + { +- return ck_call_function ("Restart", TRUE, error); ++ GVariant *r; ++ gboolean restarted; ++ ++ r = login1_call_function ("Reboot", g_variant_new("(b)", FALSE), error); ++ if (!r) ++ { ++ g_clear_error (error); ++ r = ck_call_function ("Restart", error); ++ } ++ restarted = r != NULL; ++ if (r) ++ g_variant_unref (r); ++ ++ return restarted; + } + + /** +@@ -184,7 +243,29 @@ + gboolean + lightdm_get_can_shutdown (void) + { +- return ck_call_function ("CanStop", FALSE, NULL); ++ gboolean can_shutdown = FALSE; ++ GVariant *r; ++ ++ r = login1_call_function ("CanPowerOff", NULL, NULL); ++ if (r) ++ { ++ gchar *result; ++ if (g_variant_is_of_type (r, G_VARIANT_TYPE ("(s)"))) ++ { ++ g_variant_get (r, "(&s)", &result); ++ can_shutdown = g_strcmp0 (result, "yes") == 0; ++ } ++ } ++ else ++ { ++ r = ck_call_function ("CanStop", NULL); ++ if (r && g_variant_is_of_type (r, G_VARIANT_TYPE ("(b)"))) ++ g_variant_get (r, "(b)", &can_shutdown); ++ } ++ if (r) ++ g_variant_unref (r); ++ ++ return can_shutdown; + } + + /** +@@ -198,5 +279,18 @@ + gboolean + lightdm_shutdown (GError **error) + { +- return ck_call_function ("Stop", TRUE, error); ++ GVariant *r; ++ gboolean shutdown; ++ ++ r = login1_call_function ("PowerOff", g_variant_new("(b)", FALSE), error); ++ if (!r) ++ { ++ g_clear_error (error); ++ r = ck_call_function ("Stop", error); ++ } ++ shutdown = r != NULL; ++ if (r) ++ g_variant_unref (r); ++ ++ return shutdown; + } + +=== modified file 'liblightdm-qt/power.cpp' +--- liblightdm-qt/power.cpp 2013-02-06 14:08:25 +0000 ++++ liblightdm-qt/power.cpp 2013-04-14 23:00:34 +0000 +@@ -15,6 +15,7 @@ + #include <QtCore/QVariant> + #include <QtDBus/QDBusInterface> + #include <QtDBus/QDBusReply> ++#include <QDebug> + + #include "config.h" + +@@ -26,11 +27,13 @@ + PowerInterfacePrivate(); + QScopedPointer<QDBusInterface> powerManagementInterface; + QScopedPointer<QDBusInterface> consoleKitInterface; ++ QScopedPointer<QDBusInterface> login1Interface; + }; + + PowerInterface::PowerInterfacePrivate::PowerInterfacePrivate() : + powerManagementInterface(new QDBusInterface("org.freedesktop.UPower","/org/freedesktop/UPower", "org.freedesktop.UPower", QDBusConnection::systemBus())), +- consoleKitInterface(new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus())) ++ consoleKitInterface(new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus())), ++ login1Interface(new QDBusInterface("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus())) + { + } + +@@ -80,34 +83,54 @@ + + bool PowerInterface::canShutdown() + { ++ if (d->login1Interface->isValid()) { ++ QDBusReply<QString> reply1 = d->login1Interface->call("CanPowerOff"); ++ if (reply1.isValid()) { ++ return reply1.value() == "yes"; ++ } ++ } ++ qWarning() << d->login1Interface->lastError(); ++ + QDBusReply<bool> reply = d->consoleKitInterface->call("CanStop"); + if (reply.isValid()) { + return reply.value(); + } +- else { +- return false; +- } ++ ++ return false; + } + + void PowerInterface::shutdown() + { +- d->consoleKitInterface->call("Stop"); ++ if (d->login1Interface->isValid()) ++ d->login1Interface->call("PowerOff", false); ++ else ++ d->consoleKitInterface->call("Stop"); + } + + bool PowerInterface::canRestart() + { ++ if (d->login1Interface->isValid()) { ++ QDBusReply<QString> reply1 = d->login1Interface->call("CanReboot"); ++ if (reply1.isValid()) { ++ return reply1.value() == "yes"; ++ } ++ } ++ qWarning() << d->login1Interface->lastError(); ++ + QDBusReply<bool> reply = d->consoleKitInterface->call("CanRestart"); + if (reply.isValid()) { + return reply.value(); + } +- else { +- return false; +- } ++ ++ return false; + } + + void PowerInterface::restart() + { +- d->consoleKitInterface->call("Restart"); ++ if (d->login1Interface->isValid()) ++ d->login1Interface->call("Reboot", false); ++ else ++ d->consoleKitInterface->call("Restart"); + } + + #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + +=== modified file 'tests/Makefile.am' +--- tests/Makefile.am 2013-04-12 03:46:06 +0000 ++++ tests/Makefile.am 2013-04-14 22:54:54 +0000 +@@ -135,6 +135,8 @@ + test-no-accounts-service \ + test-console-kit \ + test-no-console-kit \ ++ test-no-login1 \ ++ test-no-console-kit-or-login1 \ + test-open-file-descriptors \ + test-xdmcp-open-file-descriptors + +@@ -284,8 +286,10 @@ + scripts/no-accounts-service.conf \ + scripts/no-config.conf \ + scripts/no-console-kit.conf \ ++ scripts/no-console-kit-or-login1.conf \ + scripts/no-keyboard-layout.conf \ + scripts/no-language.conf \ ++ scripts/no-login1.conf \ + scripts/open-file-descriptors.conf \ + scripts/pam.conf \ + scripts/plymouth-active-vt.conf \ + +=== added file 'tests/scripts/no-console-kit-or-login1.conf' +--- tests/scripts/no-console-kit-or-login1.conf 1970-01-01 00:00:00 +0000 ++++ tests/scripts/no-console-kit-or-login1.conf 2013-04-14 22:54:54 +0000 +@@ -0,0 +1,34 @@ ++# ++# Check still works when neither ConsoleKit or login1 is available ++# ++ ++[test-runner-config] ++disable-console-kit=true ++disable-login1=true ++ ++[LightDM] ++minimum-display-number=50 ++ ++[SeatDefaults] ++autologin-user=have-password1 ++ ++#?RUNNER DAEMON-START ++ ++# X server starts ++#?XSERVER :50 START ++#?XSERVER :50 INDICATE-READY ++ ++# LightDM connects to X server ++#?XSERVER :50 ACCEPT-CONNECT ++ ++# Session starts ++#?SESSION :50 START USER=have-password1 ++#?XSERVER :50 ACCEPT-CONNECT ++#?SESSION :50 CONNECT-XSERVER ++ ++# Cleanup ++#?*STOP-DAEMON ++# Don't know what order they will terminate ++#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) ++#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) ++#?RUNNER DAEMON-EXIT STATUS=0 + +=== added file 'tests/scripts/no-login1.conf' +--- tests/scripts/no-login1.conf 1970-01-01 00:00:00 +0000 ++++ tests/scripts/no-login1.conf 2013-04-14 22:54:54 +0000 +@@ -0,0 +1,33 @@ ++# ++# Check still works when login1 is not available ++# ++ ++[test-runner-config] ++disable-login1=true ++ ++[LightDM] ++minimum-display-number=50 ++ ++[SeatDefaults] ++autologin-user=have-password1 ++ ++#?RUNNER DAEMON-START ++ ++# X server starts ++#?XSERVER :50 START ++#?XSERVER :50 INDICATE-READY ++ ++# LightDM connects to X server ++#?XSERVER :50 ACCEPT-CONNECT ++ ++# Session starts ++#?SESSION :50 START USER=have-password1 ++#?XSERVER :50 ACCEPT-CONNECT ++#?SESSION :50 CONNECT-XSERVER ++ ++# Cleanup ++#?*STOP-DAEMON ++# Don't know what order they will terminate ++#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) ++#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) ++#?RUNNER DAEMON-EXIT STATUS=0 + +=== modified file 'tests/src/test-runner.c' +--- tests/src/test-runner.c 2013-03-27 00:48:48 +0000 ++++ tests/src/test-runner.c 2013-04-14 22:54:54 +0000 +@@ -838,6 +838,101 @@ + } + + static void ++handle_login1_call (GDBusConnection *connection, ++ const gchar *sender, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *method_name, ++ GVariant *parameters, ++ GDBusMethodInvocation *invocation, ++ gpointer user_data) ++{ ++ if (strcmp (method_name, "CanReboot") == 0) ++ 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); ++ g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); ++ } ++ if (strcmp (method_name, "CanPowerOff") == 0) ++ 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); ++ 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); ++} ++ ++static void ++login1_name_acquired_cb (GDBusConnection *connection, ++ const gchar *name, ++ gpointer user_data) ++{ ++ const gchar *login1_interface = ++ "<node>" ++ " <interface name='org.freedesktop.login1.Manager'>" ++ " <method name='CanReboot'>" ++ " <arg name='result' direction='out' type='s'/>" ++ " </method>" ++ " <method name='Reboot'>" ++ " <arg name='interactive' direction='in' type='b'/>" ++ " </method>" ++ " <method name='CanPowerOff'>" ++ " <arg name='result' direction='out' type='s'/>" ++ " </method>" ++ " <method name='PowerOff'>" ++ " <arg name='interactive' direction='in' type='b'/>" ++ " </method>" ++ " </interface>" ++ "</node>"; ++ static const GDBusInterfaceVTable login1_vtable = ++ { ++ handle_login1_call, ++ }; ++ GDBusNodeInfo *login1_info; ++ GError *error = NULL; ++ ++ login1_info = g_dbus_node_info_new_for_xml (login1_interface, &error); ++ if (error) ++ g_warning ("Failed to parse D-Bus interface: %s", error->message); ++ g_clear_error (&error); ++ if (!login1_info) ++ return; ++ g_dbus_connection_register_object (connection, ++ "/org/freedesktop/login1", ++ login1_info->interfaces[0], ++ &login1_vtable, ++ NULL, NULL, ++ &error); ++ if (error) ++ g_warning ("Failed to register login1 service: %s", error->message); ++ g_clear_error (&error); ++ g_dbus_node_info_unref (login1_info); ++ ++ service_count--; ++ if (service_count == 0) ++ run_lightdm (); ++} ++ ++static void ++start_login1_daemon () ++{ ++ service_count++; ++ g_bus_own_name (G_BUS_TYPE_SYSTEM, ++ "org.freedesktop.login1", ++ G_BUS_NAME_OWNER_FLAGS_NONE, ++ login1_name_acquired_cb, ++ NULL, ++ NULL, ++ NULL, ++ NULL); ++} ++ ++static void + load_passwd_file () + { + gchar *path, *data, **lines; +@@ -1474,6 +1569,8 @@ + /* Start D-Bus services */ + if (!g_key_file_get_boolean (config, "test-runner-config", "disable-console-kit", NULL)) + start_console_kit_daemon (); ++ if (!g_key_file_get_boolean (config, "test-runner-config", "disable-login1", NULL)) ++ start_login1_daemon (); + if (!g_key_file_get_boolean (config, "test-runner-config", "disable-accounts-service", NULL)) + start_accounts_service_daemon (); + + +=== added file 'tests/test-no-console-kit-or-login1' +--- tests/test-no-console-kit-or-login1 1970-01-01 00:00:00 +0000 ++++ tests/test-no-console-kit-or-login1 2013-04-14 22:54:54 +0000 +@@ -0,0 +1,2 @@ ++#!/bin/sh ++./src/dbus-env ./src/test-runner no-console-kit-or-login1 test-gobject-greeter + +=== added file 'tests/test-no-login1' +--- tests/test-no-login1 1970-01-01 00:00:00 +0000 ++++ tests/test-no-login1 2013-04-14 22:54:54 +0000 +@@ -0,0 +1,2 @@ ++#!/bin/sh ++./src/dbus-env ./src/test-runner no-login1 test-gobject-greeter + |