From bebada66517e95a3684e6469e01071279dbdb7cf Mon Sep 17 00:00:00 2001 From: huayadong Date: Wed, 21 Jun 2023 17:17:50 +0800 Subject: [PATCH] add background file support --- ...55-kylin-add-background-file-support.patch | 300 ++++++++++++++++++ accountsservice.spec | 6 +- 2 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 accountsservice-0.6.55-kylin-add-background-file-support.patch diff --git a/accountsservice-0.6.55-kylin-add-background-file-support.patch b/accountsservice-0.6.55-kylin-add-background-file-support.patch new file mode 100644 index 0000000..6b284f9 --- /dev/null +++ b/accountsservice-0.6.55-kylin-add-background-file-support.patch @@ -0,0 +1,300 @@ +From 030c318f18ce50fa183d79ea493ae336ab40475d Mon Sep 17 00:00:00 2001 +From: huayadong +Date: Wed, 21 Jun 2023 15:28:28 +0800 +Subject: [PATCH] add-background-file-support + +--- + data/org.freedesktop.Accounts.User.xml | 45 ++++++++++++++ + src/libaccountsservice/act-user.c | 56 ++++++++++++++++++ + src/libaccountsservice/act-user.h | 3 + + src/user.c | 81 ++++++++++++++++++++++++++ + 4 files changed, 185 insertions(+) + +diff --git a/data/org.freedesktop.Accounts.User.xml b/data/org.freedesktop.Accounts.User.xml +index 8d3fe1c..5302e20 100644 +--- a/data/org.freedesktop.Accounts.User.xml ++++ b/data/org.freedesktop.Accounts.User.xml +@@ -379,6 +379,41 @@ + + + ++ ++ ++ ++ ++ ++ The absolute filename of a png file to use as the users background. ++ ++ ++ ++ ++ ++ ++ Sets the users background. ++ ++ ++ ++ The caller needs one of the following PolicyKit authorizations: ++ ++ ++ org.freedesktop.accounts.change-own-user-data ++ To change his own background ++ ++ ++ org.freedesktop.accounts.user-administration ++ To change the background of another user ++ ++ ++ ++ ++ if the caller lacks the appropriate PolicyKit authorization ++ if the operation failed ++ ++ ++ ++ + + + +@@ -828,6 +863,16 @@ + + + ++ ++ ++ ++ ++ The filename of a png file containing the users background. ++ ++ ++ ++ ++ + + + +diff --git a/src/libaccountsservice/act-user.c b/src/libaccountsservice/act-user.c +index e66acb1..25a28b6 100644 +--- a/src/libaccountsservice/act-user.c ++++ b/src/libaccountsservice/act-user.c +@@ -93,6 +93,7 @@ enum { + PROP_LOGIN_FREQUENCY, + PROP_LOGIN_TIME, + PROP_LOGIN_HISTORY, ++ PROP_BACKGROUND_FILE, + PROP_ICON_FILE, + PROP_LANGUAGE, + PROP_X_SESSION, +@@ -372,6 +373,14 @@ act_user_class_init (ActUserClass *class) + G_VARIANT_TYPE ("a(xxa{sv})"), + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); ++ g_object_class_install_property (gobject_class, ++ PROP_BACKGROUND_FILE, ++ g_param_spec_string ("background-file", ++ "Background File", ++ "The path to a background for this user.", ++ NULL, ++ G_PARAM_READABLE)); ++ + g_object_class_install_property (gobject_class, + PROP_ICON_FILE, + g_param_spec_string ("icon-file", +@@ -988,6 +997,25 @@ act_user_is_nonexistent (ActUser *user) + return user->nonexistent; + } + ++/** ++ * act_user_get_background_file: ++ * @user: a #ActUser ++ * ++ * Returns the path to the account background belonging to @user. ++ * ++ * Returns: (transfer none): a path to a background ++ */ ++const char * ++act_user_get_background_file (ActUser *user) ++{ ++ g_return_val_if_fail (ACT_IS_USER (user), NULL); ++ ++ if (user->accounts_proxy == NULL) ++ return NULL; ++ ++ return accounts_user_get_background_file (user->accounts_proxy); ++} ++ + /** + * act_user_get_icon_file: + * @user: a #ActUser +@@ -1366,6 +1394,34 @@ act_user_set_language (ActUser *user, + } + } + ++/** ++ * act_user_set_background_file: ++ * @user: the user object to alter. ++ * @background_file: path to an background ++ * ++ * Assigns a new background for @user. ++ * ++ * Note this function is synchronous and ignores errors. ++ **/ ++void ++act_user_set_background_file (ActUser *user, ++ const char *background_file) ++{ ++ g_autoptr(GError) error = NULL; ++ ++ g_return_if_fail (ACT_IS_USER (user)); ++ g_return_if_fail (background_file != NULL); ++ g_return_if_fail (ACCOUNTS_IS_USER (user->accounts_proxy)); ++ ++ if (!accounts_user_call_set_background_file_sync (user->accounts_proxy, ++ background_file, ++ NULL, ++ &error)) { ++ g_warning ("SetBackgroundFile call failed: %s", error->message); ++ return; ++ } ++} ++ + /** + * act_user_set_x_session: + * @user: the user object to alter. +diff --git a/src/libaccountsservice/act-user.h b/src/libaccountsservice/act-user.h +index 34d7fe3..af66542 100644 +--- a/src/libaccountsservice/act-user.h ++++ b/src/libaccountsservice/act-user.h +@@ -76,6 +76,7 @@ gboolean act_user_get_automatic_login (ActUser *user); + gboolean act_user_is_system_account (ActUser *user); + gboolean act_user_is_local_account (ActUser *user); + gboolean act_user_is_nonexistent (ActUser *user); ++const char *act_user_get_background_file (ActUser *user); + const char *act_user_get_icon_file (ActUser *user); + const char *act_user_get_language (ActUser *user); + const char *act_user_get_x_session (ActUser *user); +@@ -99,6 +100,8 @@ void act_user_set_email (ActUser *user, + const char *email); + void act_user_set_language (ActUser *user, + const char *language); ++void act_user_set_background_file (ActUser *user, ++ const char *background_file); + void act_user_set_x_session (ActUser *user, + const char *x_session); + void act_user_set_session (ActUser *user, +diff --git a/src/user.c b/src/user.c +index 9f57af5..60b97b0 100644 +--- a/src/user.c ++++ b/src/user.c +@@ -295,6 +295,12 @@ user_update_from_keyfile (User *user, + g_clear_pointer (&s, g_free); + } + ++ s = g_key_file_get_string (keyfile, "User", "Background", NULL); ++ if (s != NULL) { ++ accounts_user_set_background_file (ACCOUNTS_USER (user), s); ++ g_clear_pointer (&s, g_free); ++ } ++ + s = g_key_file_get_string (keyfile, "User", "Icon", NULL); + if (s != NULL) { + accounts_user_set_icon_file (ACCOUNTS_USER (user), s); +@@ -357,6 +363,9 @@ user_save_to_keyfile (User *user, + if (accounts_user_get_password_hint (ACCOUNTS_USER (user))) + g_key_file_set_string (keyfile, "User", "PasswordHint", accounts_user_get_password_hint (ACCOUNTS_USER (user))); + ++ if (accounts_user_get_background_file (ACCOUNTS_USER (user))) ++ g_key_file_set_string (keyfile, "User", "Background", accounts_user_get_background_file (ACCOUNTS_USER (user))); ++ + if (accounts_user_get_icon_file (ACCOUNTS_USER (user))) + g_key_file_set_string (keyfile, "User", "Icon", accounts_user_get_icon_file (ACCOUNTS_USER (user))); + +@@ -1427,6 +1436,77 @@ become_user (gpointer data) + } + } + ++static void ++user_change_background_file_authorized_cb (Daemon *daemon, ++ User *user, ++ GDBusMethodInvocation *context, ++ gpointer data) ++{ ++ g_autofree gchar *filename = NULL; ++ g_autoptr(GFile) file = NULL; ++ g_autoptr(GFileInfo) info = NULL; ++ GFileType type; ++ ++ filename = g_strdup (data); ++ ++ if (filename == NULL || ++ *filename == '\0') { ++ g_free (filename); ++ filename = NULL; ++ ++ goto background_saved; ++ } ++ ++ file = g_file_new_for_path (filename); ++ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, ++ 0, NULL, NULL); ++ type = g_file_info_get_file_type (info); ++ ++ if (type != G_FILE_TYPE_REGULAR) { ++ g_debug ("not a regular file\n"); ++ throw_error (context, ERROR_FAILED, "file '%s' is not a regular file", filename); ++ return; ++ } ++ ++background_saved: ++ accounts_user_set_background_file (ACCOUNTS_USER (user), filename); ++ ++ save_extra_data (user); ++ ++ accounts_user_complete_set_background_file (ACCOUNTS_USER (user), context); ++} ++ ++static gboolean ++user_set_background_file (AccountsUser *auser, ++ GDBusMethodInvocation *context, ++ const gchar *filename) ++{ ++ User *user = (User*)auser; ++ int uid; ++ const gchar *action_id; ++ ++ if (!get_caller_uid (context, &uid)) { ++ throw_error (context, ERROR_FAILED, "identifying caller failed"); ++ return FALSE; ++ } ++ ++ if (accounts_user_get_uid (ACCOUNTS_USER (user)) == (uid_t) uid) ++ action_id = "org.freedesktop.accounts.change-own-user-data"; ++ else ++ action_id = "org.freedesktop.accounts.user-administration"; ++ ++ daemon_local_check_auth (user->daemon, ++ user, ++ action_id, ++ TRUE, ++ user_change_background_file_authorized_cb, ++ context, ++ g_strdup (filename), ++ (GDestroyNotify)g_free); ++ ++ return TRUE; ++} ++ + static void + user_change_icon_file_authorized_cb (Daemon *daemon, + User *user, +@@ -2109,6 +2189,7 @@ user_accounts_user_iface_init (AccountsUserIface *iface) + { + iface->handle_set_account_type = user_set_account_type; + iface->handle_set_automatic_login = user_set_automatic_login; ++ iface->handle_set_background_file = user_set_background_file; + iface->handle_set_email = user_set_email; + iface->handle_set_home_directory = user_set_home_directory; + iface->handle_set_icon_file = user_set_icon_file; +-- +2.36.1 + diff --git a/accountsservice.spec b/accountsservice.spec index 68ab458..84b8887 100644 --- a/accountsservice.spec +++ b/accountsservice.spec @@ -1,6 +1,6 @@ Name: accountsservice Version: 0.6.55 -Release: 2 +Release: 3 Summary: D-Bus service for accessing the list of user accounts and information attached to those accounts. License: GPLv3+ @@ -8,6 +8,7 @@ URL: https://www.freedesktop.org/wiki/Software/AccountsService/ Source0: https://www.freedesktop.org/software/%{name}/%{name}-%{version}.tar.xz Patch1: 0001-exclude-pcpqa-user-who-cannot-login-because-of-SELin.patch +Patch2: accountsservice-0.6.55-kylin-add-background-file-support.patch BuildRequires: gtk-doc polkit-devel libxslt pkgconfig(dbus-1) systemd systemd-devel BuildRequires: meson gobject-introspection-devel gettext-devel glib2-devel @@ -89,6 +90,9 @@ are contained in %{name}-devel package. %{_datadir}/gtk-doc/html/libaccountsservice/* %changelog +* Wed Jun 21 2023 huayadong - 0.6.55-3 +- add patch2:accountsservice-0.6.55-kylin-add-background-file-support.patch + * Wed Mar 30 2022 ouyangminxiang - 0.6.55-2 - exclude pcpqa user who cannot login because of SELinux