summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/user-list.c58
-rw-r--r--data/Makefile.am13
-rw-r--r--data/org.freedesktop.DisplayManager.AccountsService.policy.in33
-rw-r--r--data/org.freedesktop.DisplayManager.AccountsService.xml26
-rw-r--r--debian/lightdm.install4
-rw-r--r--po/POTFILES.in1
-rw-r--r--tests/src/test-runner.c44
7 files changed, 153 insertions, 26 deletions
diff --git a/common/user-list.c b/common/user-list.c
index ee4063dd..b8e32826 100644
--- a/common/user-list.c
+++ b/common/user-list.c
@@ -494,6 +494,7 @@ load_accounts_user (CommonUser *user)
{
CommonUserPrivate *priv = GET_USER_PRIVATE (user);
g_autoptr(GVariant) result = NULL;
+ g_autoptr(GVariant) extra_result = NULL;
GVariant *value;
GVariantIter *iter;
gchar *name;
@@ -572,29 +573,50 @@ load_accounts_user (CommonUser *user)
g_free (priv->session);
priv->session = g_variant_dup_string (value, NULL);
}
- else if (strcmp (name, "BackgroundFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
- {
- g_free (priv->background);
- priv->background = g_variant_dup_string (value, NULL);
- if (strcmp (priv->background, "") == 0)
- g_clear_pointer (&priv->background, g_free);
- }
- else if (strcmp (name, "XKeyboardLayouts") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING_ARRAY))
+ else if (strcmp (name, "Uid") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_UINT64))
+ priv->uid = g_variant_get_uint64 (value);
+ }
+ g_variant_iter_free (iter);
+
+ extra_result = g_dbus_connection_call_sync (priv->bus,
+ "org.freedesktop.Accounts",
+ priv->path,
+ "org.freedesktop.DBus.Properties",
+ "GetAll",
+ g_variant_new ("(s)", "org.freedesktop.DisplayManager.AccountsService"),
+ G_VARIANT_TYPE ("(a{sv})"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (error)
+ g_warning ("Error updating user %s: %s", priv->path, error->message);
+ if (extra_result) {
+ g_variant_get (extra_result, "(a{sv})", &iter);
+ while (g_variant_iter_loop (iter, "{&sv}", &name, &value))
{
- g_strfreev (priv->layouts);
- priv->layouts = g_variant_dup_strv (value, NULL);
- if (!priv->layouts)
+ if (strcmp (name, "BackgroundFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ {
+ g_free (priv->background);
+ priv->background = g_variant_dup_string (value, NULL);
+ if (strcmp (priv->background, "") == 0)
+ g_clear_pointer (&priv->background, g_free);
+ }
+ else if (strcmp (name, "HasMessages") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN))
+ priv->has_messages = g_variant_get_boolean (value);
+ else if (strcmp (name, "XKeyboardLayouts") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING_ARRAY))
{
- priv->layouts = g_malloc (sizeof (gchar *) * 1);
- priv->layouts[0] = NULL;
+ g_strfreev (priv->layouts);
+ priv->layouts = g_variant_dup_strv (value, NULL);
+ if (!priv->layouts)
+ {
+ priv->layouts = g_malloc (sizeof (gchar *) * 1);
+ priv->layouts[0] = NULL;
+ }
}
}
- else if (strcmp (name, "XHasMessages") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN))
- priv->has_messages = g_variant_get_boolean (value);
- else if (strcmp (name, "Uid") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_UINT64))
- priv->uid = g_variant_get_uint64 (value);
+ g_variant_iter_free (iter);
}
- g_variant_iter_free (iter);
return !system_account;
}
diff --git a/data/Makefile.am b/data/Makefile.am
index b3dd2f80..32ab5a57 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -27,8 +27,17 @@ dist_apparmor_profile_abstractions_DATA = \
apparmor/abstractions/lightdm \
apparmor/abstractions/lightdm_chromium-browser
+accountsservicedir = $(datadir)/accountsservice/interfaces
+dist_accountsservice_DATA = \
+ org.freedesktop.DisplayManager.AccountsService.xml
+
+polkitdir = $(datadir)/polkit-1/actions
+polkit_in_files = org.freedesktop.DisplayManager.AccountsService.policy
+polkit_DATA = $(polkit_in_files:.policy.in=.policy)
+@INTLTOOL_POLICY_RULE@
+
dist_man1_MANS = dm-tool.1 \
lightdm.1
-EXTRA_DIST = apparmor/lightdm-guest-session.in
-CLEANFILES = lightdm-guest-session
+EXTRA_DIST = apparmor/lightdm-guest-session.in $(polkit_in_files)
+CLEANFILES = lightdm-guest-session $(polkit_DATA)
diff --git a/data/org.freedesktop.DisplayManager.AccountsService.policy.in b/data/org.freedesktop.DisplayManager.AccountsService.policy.in
new file mode 100644
index 00000000..d9899c20
--- /dev/null
+++ b/data/org.freedesktop.DisplayManager.AccountsService.policy.in
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<policyconfig>
+ <action id="org.freedesktop.DisplayManager.AccountsService.ModifyOwn">
+ <_description>Set properties of own user</_description>
+ <_message>Authentication is required to set one's own greeter properties.</_message>
+ <defaults>
+ <allow_any>yes</allow_any>
+ <allow_inactive>yes</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.freedesktop.DisplayManager.AccountsService.ReadAny">
+ <_description>Set properties of any user</_description>
+ <_message>Authentication is required to get another user's greeter properties.</_message>
+ <defaults>
+ <allow_any>yes</allow_any>
+ <allow_inactive>yes</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.freedesktop.DisplayManager.AccountsService.ModifyAny">
+ <_description>Set properties of any user</_description>
+ <_message>Authentication is required to set another user's greeter properties.</_message>
+ <defaults>
+ <allow_any>no</allow_any>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>no</allow_active>
+ </defaults>
+ </action>
+</policyconfig>
diff --git a/data/org.freedesktop.DisplayManager.AccountsService.xml b/data/org.freedesktop.DisplayManager.AccountsService.xml
new file mode 100644
index 00000000..07b0dab9
--- /dev/null
+++ b/data/org.freedesktop.DisplayManager.AccountsService.xml
@@ -0,0 +1,26 @@
+<node>
+ <interface name="org.freedesktop.DisplayManager.AccountsService">
+
+ <annotation name="org.freedesktop.Accounts.VendorExtension" value="true"/>
+
+ <annotation name="org.freedesktop.Accounts.Authentication.ChangeOwn"
+ value="org.freedesktop.DisplayManager.AccountsService.ModifyOwn"/>
+
+ <annotation name="org.freedesktop.Accounts.Authentication.ReadAny"
+ value="org.freedesktop.DisplayManager.AccountsService.ReadAny"/>
+
+ <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
+ value="org.freedesktop.DisplayManager.AccountsService.ModifyAny"/>
+
+ <property name="BackgroundFile" type="s" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value=""/>
+ </property>
+ <property name="HasMessages" type="b" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="false"/>
+ </property>
+ <property name="BackgroundFile" type="s" access="readwrite">
+ <annotation name="org.freedesktop.Accounts.DefaultValue" value=""/>
+ </property>
+
+ </interface>
+</node>
diff --git a/debian/lightdm.install b/debian/lightdm.install
index 14700b6d..cfc1f2de 100644
--- a/debian/lightdm.install
+++ b/debian/lightdm.install
@@ -1,7 +1,9 @@
usr/sbin/lightdm
+usr/share/accountsservice
+usr/share/bash-completion
usr/share/man
usr/share/locale
-usr/share/bash-completion
+usr/share/polkit-1
usr/lib/lightdm
usr/bin
etc/dbus-1/
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2668b565..68fb513d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,5 +1,6 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
[encoding: UTF-8]
+data/org.freedesktop.DisplayManager.AccountsService.policy.in
src/lightdm.c
src/dm-tool.c
diff --git a/tests/src/test-runner.c b/tests/src/test-runner.c
index 7a0dd75e..836e24fa 100644
--- a/tests/src/test-runner.c
+++ b/tests/src/test-runner.c
@@ -52,6 +52,7 @@ typedef struct
gchar *background;
gchar *path;
guint id;
+ guint extra_id;
gchar *language;
gchar *xsession;
gchar **layouts;
@@ -2122,8 +2123,6 @@ handle_user_get_property (GDBusConnection *connection,
return g_variant_new_string (user->home_directory);
else if (strcmp (property_name, "SystemAccount") == 0)
return g_variant_new_boolean (user->uid < 1000);
- else if (strcmp (property_name, "BackgroundFile") == 0)
- return g_variant_new_string (user->background ? user->background : "");
else if (strcmp (property_name, "Language") == 0)
return g_variant_new_string (user->language ? user->language : "");
else if (strcmp (property_name, "IconFile") == 0)
@@ -2134,6 +2133,25 @@ handle_user_get_property (GDBusConnection *connection,
return g_variant_new_uint64 (user->uid);
else if (strcmp (property_name, "XSession") == 0)
return g_variant_new_string (user->xsession ? user->xsession : "");
+
+ return NULL;
+}
+
+static GVariant *
+handle_user_get_extra_property (GDBusConnection *connection,
+ const gchar *sender,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *property_name,
+ GError **error,
+ gpointer user_data)
+{
+ AccountsUser *user = user_data;
+
+ if (strcmp (property_name, "BackgroundFile") == 0)
+ return g_variant_new_string (user->background ? user->background : "");
+ else if (strcmp (property_name, "HasMessages") == 0)
+ return g_variant_new_boolean (user->has_messages);
else if (strcmp (property_name, "XKeyboardLayouts") == 0)
{
if (user->layouts != NULL)
@@ -2141,8 +2159,6 @@ handle_user_get_property (GDBusConnection *connection,
else
return g_variant_new_strv (NULL, 0);
}
- else if (strcmp (property_name, "XHasMessages") == 0)
- return g_variant_new_boolean (user->has_messages);
return NULL;
}
@@ -2157,6 +2173,7 @@ accounts_user_set_hidden (AccountsUser *user, gboolean hidden, gboolean emit_sig
g_autoptr(GError) error = NULL;
g_dbus_connection_unregister_object (accounts_connection, user->id);
+ g_dbus_connection_unregister_object (accounts_connection, user->extra_id);
if (!g_dbus_connection_emit_signal (accounts_connection,
NULL,
"/org/freedesktop/Accounts",
@@ -2185,12 +2202,12 @@ accounts_user_set_hidden (AccountsUser *user, gboolean hidden, gboolean emit_sig
" <property name='Shell' type='s' access='read'/>"
" <property name='Uid' type='t' access='read'/>"
" <property name='XSession' type='s' access='read'/>"
- " <property name='XKeyboardLayouts' type='as' access='read'/>"
" <signal name='Changed' />"
" </interface>"
" <interface name='org.freedesktop.DisplayManager.AccountsService'>"
" <property name='BackgroundFile' type='s' access='read'/>"
" <property name='HasMessages' type='b' access='read'/>"
+ " <property name='XKeyboardLayouts' type='as' access='read'/>"
" </interface>"
"</node>";
g_autoptr(GDBusNodeInfo) user_info = NULL;
@@ -2200,6 +2217,11 @@ accounts_user_set_hidden (AccountsUser *user, gboolean hidden, gboolean emit_sig
handle_user_call,
handle_user_get_property,
};
+ static const GDBusInterfaceVTable user_extra_vtable =
+ {
+ NULL,
+ handle_user_get_extra_property,
+ };
user_info = g_dbus_node_info_new_for_xml (user_interface, &error);
if (!user_info)
@@ -2219,6 +2241,18 @@ accounts_user_set_hidden (AccountsUser *user, gboolean hidden, gboolean emit_sig
g_warning ("Failed to register user: %s", error->message);
return;
}
+ user->extra_id = g_dbus_connection_register_object (accounts_connection,
+ user->path,
+ user_info->interfaces[1],
+ &user_extra_vtable,
+ user,
+ NULL,
+ &error);
+ if (user->extra_id == 0)
+ {
+ g_warning ("Failed to register user: %s", error->message);
+ return;
+ }
if (!g_dbus_connection_emit_signal (accounts_connection,
NULL,