|
|
@ -1,6 +1,6 @@ |
|
|
|
From 51d5c9e9baec33aa74a60a4ac11f1de8f71acb2a Mon Sep 17 00:00:00 2001 |
|
|
|
From 5124220f12a157ff285072a4f786db2c94c3ca8a Mon Sep 17 00:00:00 2001 |
|
|
|
From: Ray Strode <rstrode@redhat.com> |
|
|
|
Date: Fri, 12 Oct 2018 15:53:52 -0400 |
|
|
|
Date: Thu, 14 Jan 2021 15:07:34 -0500 |
|
|
|
Subject: [PATCH] lib: save os when creating user |
|
|
|
|
|
|
|
In order to identify that a user has upgraded from rhel 7 to |
|
|
@ -9,76 +9,15 @@ rhel 8, we need to know what os they were using when created. |
|
|
|
This commit saves that information using a red hat specific |
|
|
|
extension to accountsservice. |
|
|
|
---
|
|
|
|
data/Makefile.am | 14 +- |
|
|
|
.../com.redhat.AccountsServiceUser.System.xml | 10 ++ |
|
|
|
src/libaccountsservice/Makefile.am | 12 +- |
|
|
|
data/meson.build | 1 + |
|
|
|
meson.build | 1 + |
|
|
|
meson_post_install.py | 15 +++ |
|
|
|
src/libaccountsservice/act-user-manager.c | 123 ++++++++++++++++++ |
|
|
|
4 files changed, 157 insertions(+), 2 deletions(-) |
|
|
|
src/libaccountsservice/meson.build | 7 + |
|
|
|
6 files changed, 157 insertions(+) |
|
|
|
create mode 100644 data/com.redhat.AccountsServiceUser.System.xml |
|
|
|
|
|
|
|
diff --git a/data/Makefile.am b/data/Makefile.am
|
|
|
|
index 6cf5e30..648774c 100644
|
|
|
|
--- a/data/Makefile.am
|
|
|
|
+++ b/data/Makefile.am
|
|
|
|
@@ -1,45 +1,57 @@
|
|
|
|
|
|
|
|
dbusifdir = $(datadir)/dbus-1/interfaces |
|
|
|
dbusif_DATA = \ |
|
|
|
org.freedesktop.Accounts.xml \ |
|
|
|
- org.freedesktop.Accounts.User.xml
|
|
|
|
+ org.freedesktop.Accounts.User.xml \
|
|
|
|
+ com.redhat.AccountsServiceUser.System.xml
|
|
|
|
|
|
|
|
dbusconfdir = $(sysconfdir)/dbus-1/system.d |
|
|
|
dbusconf_DATA = org.freedesktop.Accounts.conf |
|
|
|
|
|
|
|
+accountsserviceifdir = $(datadir)/accountsservice/interfaces
|
|
|
|
+
|
|
|
|
servicedir = $(datadir)/dbus-1/system-services |
|
|
|
service_in_files = org.freedesktop.Accounts.service.in |
|
|
|
service_DATA = $(service_in_files:.service.in=.service) |
|
|
|
|
|
|
|
$(service_DATA): $(service_in_files) Makefile |
|
|
|
@sed -e "s|\@libexecdir\@|$(libexecdir)|" $< >$@ |
|
|
|
|
|
|
|
policydir = $(datadir)/polkit-1/actions |
|
|
|
policy_in_files = org.freedesktop.accounts.policy.in |
|
|
|
policy_DATA = $(policy_in_files:.policy.in=.policy) |
|
|
|
|
|
|
|
@INTLTOOL_POLICY_RULE@ |
|
|
|
|
|
|
|
if HAVE_SYSTEMD |
|
|
|
systemdsystemunit_DATA = \ |
|
|
|
accounts-daemon.service |
|
|
|
|
|
|
|
accounts-daemon.service: accounts-daemon.service.in |
|
|
|
@sed -e "s|\@libexecdir\@|$(libexecdir)|" $< >$@ |
|
|
|
|
|
|
|
endif |
|
|
|
|
|
|
|
EXTRA_DIST = \ |
|
|
|
$(dbusif_DATA) \ |
|
|
|
$(dbusconf_DATA) \ |
|
|
|
$(service_in_files) \ |
|
|
|
$(policy_in_files) \ |
|
|
|
org.freedesktop.realmd.xml \ |
|
|
|
accounts-daemon.service.in |
|
|
|
|
|
|
|
DISTCLEANFILES = \ |
|
|
|
$(service_DATA) \ |
|
|
|
$(policy_DATA) |
|
|
|
|
|
|
|
CLEANFILES = \ |
|
|
|
accounts-daemon.service |
|
|
|
+
|
|
|
|
+install-data-hook: com.redhat.AccountsServiceUser.System.xml
|
|
|
|
+ if test '!' -d $(DESTDIR)$(accountsserviceifdir); then \
|
|
|
|
+ $(mkinstalldirs) $(DESTDIR)$(accountsserviceifdir); \
|
|
|
|
+ chmod 755 $(DESTDIR)$(accountsserviceifdir); \
|
|
|
|
+ fi
|
|
|
|
+ if test '!' -L $(DESTDIR)$(accountsserviceifdir)/com.redhat.AccountsServiceUser.System.xml; then \
|
|
|
|
+ (cd $(DESTDIR)$(accountsserviceifdir); $(LN_S) ../../dbus-1/interfaces/com.redhat.AccountsServiceUser.System.xml) \
|
|
|
|
+ fi
|
|
|
|
diff --git a/data/com.redhat.AccountsServiceUser.System.xml b/data/com.redhat.AccountsServiceUser.System.xml
|
|
|
|
new file mode 100644 |
|
|
|
index 0000000..67f5f30
|
|
|
@ -95,93 +34,129 @@ index 0000000..67f5f30 |
|
|
|
+
|
|
|
|
+ </interface>
|
|
|
|
+</node>
|
|
|
|
diff --git a/src/libaccountsservice/Makefile.am b/src/libaccountsservice/Makefile.am
|
|
|
|
index 408d91f..d711d65 100644
|
|
|
|
--- a/src/libaccountsservice/Makefile.am
|
|
|
|
+++ b/src/libaccountsservice/Makefile.am
|
|
|
|
@@ -20,69 +20,79 @@ act-user-enum-types.h: act-user.h act-user-manager.h
|
|
|
|
$(AM_V_GEN) (cd $(srcdir) && \ |
|
|
|
glib-mkenums \ |
|
|
|
--fhead "#ifndef __ACT_USER_ENUM_TYPES_H__\n#define __ACT_USER_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \ |
|
|
|
--fprod "/* enumerations from \"@filename@\" */\n" \ |
|
|
|
--vhead "GType @enum_name@_get_type (void);\n#define ACT_USER_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ |
|
|
|
--ftail "G_END_DECLS\n\n#endif /* __ACT_USER_ENUM_TYPES_H__ */" \ |
|
|
|
$(^F) ) > $@ |
|
|
|
|
|
|
|
act-user-enum-types.c: act-user.h act-user-manager.h act-user-enum-types.h |
|
|
|
$(AM_V_GEN) (cd $(srcdir) && \ |
|
|
|
glib-mkenums \ |
|
|
|
--fhead "#include \"act-user.h\"\n" \ |
|
|
|
--fhead "#include \"act-user-manager.h\"\n" \ |
|
|
|
--fhead "#include \"act-user-enum-types.h\"\n" \ |
|
|
|
--fhead "#include <glib-object.h>" \ |
|
|
|
--fprod "\n/* enumerations from \"@filename@\" */" \ |
|
|
|
--vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \ |
|
|
|
--vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ |
|
|
|
--vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \ |
|
|
|
$(^F) ) > $@ |
|
|
|
|
|
|
|
ck-manager-generated.c ck-manager-generated.h: org.freedesktop.ConsoleKit.Manager.xml Makefile |
|
|
|
$(AM_V_GEN) gdbus-codegen --generate-c-code ck-manager-generated --c-namespace ConsoleKit --interface-prefix=org.freedesktop.ConsoleKit $(srcdir)/org.freedesktop.ConsoleKit.Manager.xml |
|
|
|
|
|
|
|
ck-seat-generated.c ck-seat-generated.h: org.freedesktop.ConsoleKit.Seat.xml Makefile |
|
|
|
$(AM_V_GEN) gdbus-codegen --generate-c-code ck-seat-generated --c-namespace ConsoleKit --interface-prefix=org.freedesktop.ConsoleKit $(srcdir)/org.freedesktop.ConsoleKit.Seat.xml |
|
|
|
|
|
|
|
ck-session-generated.c ck-session-generated.h: org.freedesktop.ConsoleKit.Session.xml Makefile |
|
|
|
$(AM_V_GEN) gdbus-codegen --generate-c-code ck-session-generated --c-namespace ConsoleKit --interface-prefix=org.freedesktop.ConsoleKit $(srcdir)/org.freedesktop.ConsoleKit.Session.xml |
|
|
|
|
|
|
|
+com.redhat.AccountsServiceUser.System.c com.redhat.AccountsServiceUser.System.h: $(top_srcdir)/data/com.redhat.AccountsServiceUser.System.xml Makefile
|
|
|
|
+ $(AM_V_GEN)gdbus-codegen \
|
|
|
|
+ --c-namespace=Act \
|
|
|
|
+ --interface-prefix=com.redhat.AccountsService \
|
|
|
|
+ --generate-c-code=com.redhat.AccountsServiceUser.System \
|
|
|
|
+ $(top_srcdir)/data/com.redhat.AccountsServiceUser.System.xml
|
|
|
|
+
|
|
|
|
+
|
|
|
|
BUILT_SOURCES += \ |
|
|
|
act-user-enum-types.c \ |
|
|
|
act-user-enum-types.h \ |
|
|
|
ck-manager-generated.c \ |
|
|
|
ck-manager-generated.h \ |
|
|
|
ck-seat-generated.c \ |
|
|
|
ck-seat-generated.h \ |
|
|
|
ck-session-generated.c \ |
|
|
|
- ck-session-generated.h
|
|
|
|
+ ck-session-generated.h \
|
|
|
|
+ com.redhat.AccountsServiceUser.System.h \
|
|
|
|
+ com.redhat.AccountsServiceUser.System.c
|
|
|
|
|
|
|
|
CLEANFILES += $(BUILT_SOURCES) |
|
|
|
|
|
|
|
libaccountsservicedir = $(includedir)/accountsservice-1.0/act |
|
|
|
libaccountsservice_headers = \ |
|
|
|
act-user.h \ |
|
|
|
act-user-manager.h \ |
|
|
|
act-user-enum-types.h \ |
|
|
|
$(END_OF_LIST) |
|
|
|
|
|
|
|
libaccountsservice_HEADERS = \ |
|
|
|
act.h \ |
|
|
|
$(libaccountsservice_headers) \ |
|
|
|
$(END_OF_LIST) |
|
|
|
|
|
|
|
|
|
|
|
libaccountsservice_la_CFLAGS = $(LIBACCOUNTSSERVICE_CFLAGS) |
|
|
|
libaccountsservice_la_LDFLAGS = \ |
|
|
|
-export-symbols-regex '^[^_].*' \ |
|
|
|
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ |
|
|
|
-no-undefined \ |
|
|
|
$(END_OF_LIST) |
|
|
|
|
|
|
|
libaccountsservice_la_LIBADD = \ |
|
|
|
../libaccounts-generated.la \ |
|
|
|
$(LIBACCOUNTSSERVICE_LIBS) \ |
|
|
|
-lcrypt \ |
|
|
|
$(END_OF_LIST) |
|
|
|
|
|
|
|
libaccountsservice_la_sources = \ |
|
|
|
diff --git a/data/meson.build b/data/meson.build
|
|
|
|
index 4987937..2dc57c2 100644
|
|
|
|
--- a/data/meson.build
|
|
|
|
+++ b/data/meson.build
|
|
|
|
@@ -1,33 +1,34 @@
|
|
|
|
ifaces = files( |
|
|
|
act_namespace + '.xml', |
|
|
|
act_namespace + '.User.xml', |
|
|
|
+ 'com.redhat.AccountsServiceUser.System.xml',
|
|
|
|
) |
|
|
|
|
|
|
|
install_data( |
|
|
|
ifaces, |
|
|
|
install_dir: dbus_ifaces_dir, |
|
|
|
) |
|
|
|
|
|
|
|
install_data( |
|
|
|
act_namespace + '.conf', |
|
|
|
install_dir: dbus_conf_dir, |
|
|
|
) |
|
|
|
|
|
|
|
service_conf = configuration_data() |
|
|
|
service_conf.set('libexecdir', act_libexecdir) |
|
|
|
|
|
|
|
service = act_namespace + '.service' |
|
|
|
|
|
|
|
configure_file( |
|
|
|
input: service + '.in', |
|
|
|
output: service, |
|
|
|
configuration: service_conf, |
|
|
|
install: true, |
|
|
|
install_dir: dbus_sys_dir, |
|
|
|
) |
|
|
|
|
|
|
|
policy = act_namespace.to_lower() + '.policy' |
|
|
|
|
|
|
|
i18n.merge_file( |
|
|
|
policy, |
|
|
|
input: policy + '.in', |
|
|
|
diff --git a/meson.build b/meson.build
|
|
|
|
index 4465a26..e37c451 100644
|
|
|
|
--- a/meson.build
|
|
|
|
+++ b/meson.build
|
|
|
|
@@ -174,38 +174,39 @@ assert(not enable_systemd or not enable_elogind, 'systemd and elogind support re
|
|
|
|
if enable_systemd |
|
|
|
logind_dep = dependency('libsystemd', version: '>= 186') |
|
|
|
endif |
|
|
|
|
|
|
|
if enable_elogind |
|
|
|
logind_dep = dependency('libelogind', version: '>= 229.4') |
|
|
|
endif |
|
|
|
config_h.set('WITH_SYSTEMD', enable_systemd or enable_elogind) |
|
|
|
|
|
|
|
subdir('data') |
|
|
|
subdir('src') |
|
|
|
subdir('po') |
|
|
|
|
|
|
|
enable_docbook = get_option('docbook') |
|
|
|
if enable_docbook |
|
|
|
subdir('doc/dbus') |
|
|
|
endif |
|
|
|
|
|
|
|
if get_option('gtk_doc') |
|
|
|
subdir('doc/libaccountsservice') |
|
|
|
endif |
|
|
|
|
|
|
|
configure_file( |
|
|
|
output: 'config.h', |
|
|
|
configuration: config_h, |
|
|
|
) |
|
|
|
|
|
|
|
meson.add_install_script( |
|
|
|
'meson_post_install.py', |
|
|
|
act_localstatedir, |
|
|
|
+ act_datadir,
|
|
|
|
) |
|
|
|
|
|
|
|
output = '\n' + meson.project_name() + ' was configured with the following options:\n' |
|
|
|
output += '** DocBook documentation build: ' + enable_docbook.to_string() + '\n' |
|
|
|
output += '** Administrator group: ' + admin_group + '\n' |
|
|
|
output += '** Extra administrator groups: ' + extra_admin_groups + '\n' |
|
|
|
output += '** GDM configuration: ' + gdm_conf_file |
|
|
|
message(output) |
|
|
|
diff --git a/meson_post_install.py b/meson_post_install.py
|
|
|
|
index 5cc2dc4..e1d5a71 100644
|
|
|
|
--- a/meson_post_install.py
|
|
|
|
+++ b/meson_post_install.py
|
|
|
|
@@ -1,18 +1,33 @@
|
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
|
|
import os |
|
|
|
import sys |
|
|
|
|
|
|
|
destdir = os.environ.get('DESTDIR', '') |
|
|
|
localstatedir = os.path.normpath(destdir + os.sep + sys.argv[1]) |
|
|
|
+datadir = os.path.normpath(destdir + os.sep + sys.argv[2])
|
|
|
|
+interfacedir = os.path.join(datadir, 'accountsservice', 'interfaces')
|
|
|
|
|
|
|
|
# FIXME: meson will not track the creation of these directories |
|
|
|
# https://github.com/mesonbuild/meson/blob/master/mesonbuild/scripts/uninstall.py#L39 |
|
|
|
dst_dirs = [ |
|
|
|
(os.path.join(localstatedir, 'lib', 'AccountsService', 'icons'), 0o775), |
|
|
|
(os.path.join(localstatedir, 'lib', 'AccountsService', 'users'), 0o700), |
|
|
|
+ (interfacedir, 0o775),
|
|
|
|
] |
|
|
|
|
|
|
|
for (dst_dir, dst_dir_mode) in dst_dirs: |
|
|
|
if not os.path.exists(dst_dir): |
|
|
|
os.makedirs(dst_dir, mode=dst_dir_mode) |
|
|
|
+
|
|
|
|
+interface_files = [
|
|
|
|
+ 'com.redhat.AccountsServiceUser.System.xml',
|
|
|
|
+]
|
|
|
|
+
|
|
|
|
+for interface_file in interface_files:
|
|
|
|
+ src_path = os.path.join('../../dbus-1/interfaces', interface_file)
|
|
|
|
+ dst_path = os.path.join(interfacedir, interface_file)
|
|
|
|
+ if not os.path.exists(dst_path):
|
|
|
|
+ os.symlink(src_path, dst_path)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
|
|
|
|
index e7e26b1..9f3d6e5 100644
|
|
|
|
index 1b5298d..f4598c4 100644
|
|
|
|
--- a/src/libaccountsservice/act-user-manager.c
|
|
|
|
+++ b/src/libaccountsservice/act-user-manager.c
|
|
|
|
@@ -27,60 +27,61 @@
|
|
|
@ -246,7 +221,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
* @ACT_USER_MANAGER_ERROR_FAILED: Generic failure |
|
|
|
* @ACT_USER_MANAGER_ERROR_USER_EXISTS: The user already exists |
|
|
|
* @ACT_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST: The user does not exist |
|
|
|
@@ -167,60 +168,63 @@ typedef struct
|
|
|
|
@@ -165,60 +166,63 @@ typedef struct
|
|
|
|
ActUser *user; |
|
|
|
ActUserManagerFetchUserRequestType type; |
|
|
|
union { |
|
|
@ -257,7 +232,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
char *description; |
|
|
|
} ActUserManagerFetchUserRequest; |
|
|
|
|
|
|
|
struct ActUserManagerPrivate |
|
|
|
typedef struct |
|
|
|
{ |
|
|
|
GHashTable *normal_users_by_name; |
|
|
|
GHashTable *system_users_by_name; |
|
|
@ -286,7 +261,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
gboolean has_multiple_users; |
|
|
|
gboolean getting_sessions; |
|
|
|
gboolean list_cached_users_done; |
|
|
|
}; |
|
|
|
} ActUserManagerPrivate; |
|
|
|
|
|
|
|
enum { |
|
|
|
PROP_0, |
|
|
@ -310,30 +285,30 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
static void act_user_manager_init (ActUserManager *user_manager); |
|
|
|
static void act_user_manager_finalize (GObject *object); |
|
|
|
|
|
|
|
@@ -2763,101 +2767,174 @@ ensure_accounts_proxy (ActUserManager *manager)
|
|
|
|
G_DBUS_PROXY_FLAGS_NONE, |
|
|
|
ACCOUNTS_NAME, |
|
|
|
ACCOUNTS_PATH, |
|
|
|
NULL, |
|
|
|
&error); |
|
|
|
@@ -2942,100 +2946,173 @@ ensure_accounts_proxy (ActUserManager *manager)
|
|
|
|
G_DBUS_PROXY_FLAGS_NONE, |
|
|
|
ACCOUNTS_NAME, |
|
|
|
ACCOUNTS_PATH, |
|
|
|
NULL, |
|
|
|
&error); |
|
|
|
if (error != NULL) { |
|
|
|
g_debug ("ActUserManager: getting account proxy failed: %s", error->message); |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (manager->priv->accounts_proxy), G_MAXINT); |
|
|
|
g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (priv->accounts_proxy), G_MAXINT); |
|
|
|
|
|
|
|
g_object_bind_property (G_OBJECT (manager->priv->accounts_proxy), |
|
|
|
g_object_bind_property (G_OBJECT (priv->accounts_proxy), |
|
|
|
"has-multiple-users", |
|
|
|
G_OBJECT (manager), |
|
|
|
"has-multiple-users", |
|
|
|
G_BINDING_SYNC_CREATE); |
|
|
|
|
|
|
|
g_signal_connect (manager->priv->accounts_proxy, |
|
|
|
g_signal_connect (priv->accounts_proxy, |
|
|
|
"user-added", |
|
|
|
G_CALLBACK (on_new_user_in_accounts_service), |
|
|
|
manager); |
|
|
|
g_signal_connect (manager->priv->accounts_proxy, |
|
|
|
g_signal_connect (priv->accounts_proxy, |
|
|
|
"user-deleted", |
|
|
|
G_CALLBACK (on_user_removed_in_accounts_service), |
|
|
|
manager); |
|
|
@ -353,7 +328,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
+static void
|
|
|
|
+load_os_release (ActUserManager *manager)
|
|
|
|
+{
|
|
|
|
+ ActUserManagerPrivate *priv = manager->priv;
|
|
|
|
+ ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager);
|
|
|
|
+ g_autoptr(GFile) file = NULL;
|
|
|
|
+ g_autoptr(GError) error = NULL;
|
|
|
|
+ g_autofree char *contents = NULL;
|
|
|
@ -415,34 +390,33 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
static void |
|
|
|
act_user_manager_init (ActUserManager *manager) |
|
|
|
{ |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
g_autoptr(GError) error = NULL; |
|
|
|
|
|
|
|
manager->priv = ACT_USER_MANAGER_GET_PRIVATE (manager); |
|
|
|
|
|
|
|
act_user_manager_error_quark (); /* register dbus errors */ |
|
|
|
|
|
|
|
/* sessions */ |
|
|
|
manager->priv->sessions = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
g_free, |
|
|
|
g_object_unref); |
|
|
|
priv->sessions = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
g_free, |
|
|
|
g_object_unref); |
|
|
|
|
|
|
|
/* users */ |
|
|
|
manager->priv->normal_users_by_name = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
g_free, |
|
|
|
g_object_unref); |
|
|
|
manager->priv->system_users_by_name = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
g_free, |
|
|
|
g_object_unref); |
|
|
|
manager->priv->users_by_object_path = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
NULL, |
|
|
|
g_object_unref); |
|
|
|
|
|
|
|
manager->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); |
|
|
|
if (manager->priv->connection == NULL) { |
|
|
|
priv->normal_users_by_name = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
g_free, |
|
|
|
g_object_unref); |
|
|
|
priv->system_users_by_name = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
g_free, |
|
|
|
g_object_unref); |
|
|
|
priv->users_by_object_path = g_hash_table_new_full (g_str_hash, |
|
|
|
g_str_equal, |
|
|
|
NULL, |
|
|
|
g_object_unref); |
|
|
|
|
|
|
|
priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); |
|
|
|
if (priv->connection == NULL) { |
|
|
|
if (error != NULL) { |
|
|
|
g_warning ("Failed to connect to the D-Bus daemon: %s", error->message); |
|
|
|
} else { |
|
|
@ -455,69 +429,69 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
|
|
|
|
+ load_os_release (manager);
|
|
|
|
+
|
|
|
|
manager->priv->seat.state = ACT_USER_MANAGER_SEAT_STATE_UNLOADED; |
|
|
|
priv->seat.state = ACT_USER_MANAGER_SEAT_STATE_UNLOADED; |
|
|
|
} |
|
|
|
|
|
|
|
static void |
|
|
|
act_user_manager_finalize (GObject *object) |
|
|
|
{ |
|
|
|
ActUserManager *manager; |
|
|
|
ActUserManager *manager = ACT_USER_MANAGER (object); |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
GSList *node; |
|
|
|
|
|
|
|
g_debug ("ActUserManager: finalizing user manager"); |
|
|
|
|
|
|
|
g_return_if_fail (object != NULL); |
|
|
|
g_return_if_fail (ACT_IS_USER_MANAGER (object)); |
|
|
|
|
|
|
|
manager = ACT_USER_MANAGER (object); |
|
|
|
|
|
|
|
g_return_if_fail (manager->priv != NULL); |
|
|
|
|
|
|
|
g_slist_foreach (manager->priv->new_sessions, |
|
|
|
g_slist_foreach (priv->new_sessions, |
|
|
|
(GFunc) unload_new_session, NULL); |
|
|
|
g_slist_free (manager->priv->new_sessions); |
|
|
|
g_slist_free (priv->new_sessions); |
|
|
|
|
|
|
|
g_slist_foreach (manager->priv->fetch_user_requests, |
|
|
|
g_slist_foreach (priv->fetch_user_requests, |
|
|
|
(GFunc) free_fetch_user_request, NULL); |
|
|
|
g_slist_free (manager->priv->fetch_user_requests); |
|
|
|
g_slist_free (priv->fetch_user_requests); |
|
|
|
|
|
|
|
g_slist_free (manager->priv->new_users_inhibiting_load); |
|
|
|
g_slist_free (priv->new_users_inhibiting_load); |
|
|
|
|
|
|
|
node = manager->priv->new_users; |
|
|
|
node = priv->new_users; |
|
|
|
while (node != NULL) { |
|
|
|
@@ -2899,141 +2976,179 @@ act_user_manager_finalize (GObject *object)
|
|
|
|
ActUser *user; |
|
|
|
GSList *next_node; |
|
|
|
|
|
|
|
user = ACT_USER (node->data); |
|
|
|
next_node = node->next; |
|
|
|
|
|
|
|
@@ -3071,143 +3148,181 @@ act_user_manager_finalize (GObject *object)
|
|
|
|
|
|
|
|
#ifdef WITH_SYSTEMD |
|
|
|
if (manager->priv->seat.session_monitor != NULL) { |
|
|
|
sd_login_monitor_unref (manager->priv->seat.session_monitor); |
|
|
|
if (priv->seat.session_monitor != NULL) { |
|
|
|
sd_login_monitor_unref (priv->seat.session_monitor); |
|
|
|
} |
|
|
|
|
|
|
|
if (manager->priv->seat.session_monitor_stream != NULL) { |
|
|
|
g_object_unref (manager->priv->seat.session_monitor_stream); |
|
|
|
if (priv->seat.session_monitor_stream != NULL) { |
|
|
|
g_object_unref (priv->seat.session_monitor_stream); |
|
|
|
} |
|
|
|
|
|
|
|
if (manager->priv->seat.session_monitor_source_id != 0) { |
|
|
|
g_source_remove (manager->priv->seat.session_monitor_source_id); |
|
|
|
if (priv->seat.session_monitor_source_id != 0) { |
|
|
|
g_source_remove (priv->seat.session_monitor_source_id); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
if (manager->priv->accounts_proxy != NULL) { |
|
|
|
g_object_unref (manager->priv->accounts_proxy); |
|
|
|
if (priv->accounts_proxy != NULL) { |
|
|
|
g_object_unref (priv->accounts_proxy); |
|
|
|
} |
|
|
|
|
|
|
|
if (manager->priv->load_id > 0) { |
|
|
|
g_source_remove (manager->priv->load_id); |
|
|
|
manager->priv->load_id = 0; |
|
|
|
if (priv->load_id > 0) { |
|
|
|
g_source_remove (priv->load_id); |
|
|
|
priv->load_id = 0; |
|
|
|
} |
|
|
|
|
|
|
|
g_hash_table_destroy (manager->priv->sessions); |
|
|
|
g_hash_table_destroy (priv->sessions); |
|
|
|
|
|
|
|
g_hash_table_destroy (manager->priv->normal_users_by_name); |
|
|
|
g_hash_table_destroy (manager->priv->system_users_by_name); |
|
|
|
g_hash_table_destroy (manager->priv->users_by_object_path); |
|
|
|
g_hash_table_destroy (priv->normal_users_by_name); |
|
|
|
g_hash_table_destroy (priv->system_users_by_name); |
|
|
|
g_hash_table_destroy (priv->users_by_object_path); |
|
|
|
|
|
|
|
+ g_free (manager->priv->os_id);
|
|
|
|
+ g_free (manager->priv->os_version_id);
|
|
|
|
+ g_free (priv->os_id);
|
|
|
|
+ g_free (priv->os_version_id);
|
|
|
|
+
|
|
|
|
G_OBJECT_CLASS (act_user_manager_parent_class)->finalize (object); |
|
|
|
} |
|
|
@ -556,14 +530,15 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
gboolean |
|
|
|
act_user_manager_no_service (ActUserManager *manager) |
|
|
|
{ |
|
|
|
return manager->priv->accounts_proxy == NULL; |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
return priv->accounts_proxy == NULL; |
|
|
|
} |
|
|
|
|
|
|
|
+static void
|
|
|
|
+save_system_info (ActUserManager *manager,
|
|
|
|
+ const char *user_path)
|
|
|
|
+{
|
|
|
|
+ ActUserManagerPrivate *priv = manager->priv;
|
|
|
|
+ ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager);
|
|
|
|
+ ActUserSystem *user_system_proxy = NULL;
|
|
|
|
+ g_autoptr(GError) error = NULL;
|
|
|
|
+
|
|
|
@ -611,6 +586,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
ActUserAccountType accounttype, |
|
|
|
GError **error) |
|
|
|
{ |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
GError *local_error = NULL; |
|
|
|
gboolean res; |
|
|
|
g_autofree gchar *path = NULL; |
|
|
@ -619,9 +595,9 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
g_debug ("ActUserManager: Creating user '%s', '%s', %d", |
|
|
|
username, fullname, accounttype); |
|
|
|
|
|
|
|
g_assert (manager->priv->accounts_proxy != NULL); |
|
|
|
g_assert (priv->accounts_proxy != NULL); |
|
|
|
|
|
|
|
res = accounts_accounts_call_create_user_sync (manager->priv->accounts_proxy, |
|
|
|
res = accounts_accounts_call_create_user_sync (priv->accounts_proxy, |
|
|
|
username, |
|
|
|
fullname, |
|
|
|
accounttype, |
|
|
@ -665,8 +641,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
* |
|
|
|
* Asynchronously creates a user account on the system. |
|
|
|
* |
|
|
|
@@ -3077,105 +3192,110 @@ act_user_manager_create_user_async (ActUserManager *manager,
|
|
|
|
* act_user_manager_create_user_finish: |
|
|
|
@@ -3253,106 +3368,111 @@ act_user_manager_create_user_async (ActUserManager *manager,
|
|
|
|
* @manager: a #ActUserManager |
|
|
|
* @result: a #GAsyncResult |
|
|
|
* @error: a #GError |
|
|
@ -684,6 +659,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
GAsyncResult *result, |
|
|
|
GError **error) |
|
|
|
{ |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
GAsyncResult *inner_result; |
|
|
|
ActUser *user = NULL; |
|
|
|
g_autofree gchar *path = NULL; |
|
|
@ -694,7 +670,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if (accounts_accounts_call_create_user_finish (manager->priv->accounts_proxy, |
|
|
|
if (accounts_accounts_call_create_user_finish (priv->accounts_proxy, |
|
|
|
&path, inner_result, &remote_error)) { |
|
|
|
+
|
|
|
|
+ save_system_info (manager, path);
|
|
|
@ -725,6 +701,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
const char *username, |
|
|
|
GError **error) |
|
|
|
{ |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
GError *local_error = NULL; |
|
|
|
gboolean res; |
|
|
|
g_autofree gchar *path = NULL; |
|
|
@ -732,9 +709,9 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
g_debug ("ActUserManager: Caching user '%s'", |
|
|
|
username); |
|
|
|
|
|
|
|
g_assert (manager->priv->accounts_proxy != NULL); |
|
|
|
g_assert (priv->accounts_proxy != NULL); |
|
|
|
|
|
|
|
res = accounts_accounts_call_cache_user_sync (manager->priv->accounts_proxy, |
|
|
|
res = accounts_accounts_call_cache_user_sync (priv->accounts_proxy, |
|
|
|
username, |
|
|
|
&path, |
|
|
|
NULL, |
|
|
@ -775,9 +752,8 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
GAsyncReadyCallback callback, |
|
|
|
gpointer user_data) |
|
|
|
{ |
|
|
|
GTask *task; |
|
|
|
@@ -3199,60 +3319,63 @@ act_user_manager_cache_user_async (ActUserManager *manager,
|
|
|
|
* act_user_manager_cache_user_finish: |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
@@ -3378,60 +3498,63 @@ act_user_manager_cache_user_async (ActUserManager *manager,
|
|
|
|
* @manager: a #ActUserManager |
|
|
|
* @result: a #GAsyncResult |
|
|
|
* @error: a #GError |
|
|
@ -795,6 +771,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
GAsyncResult *result, |
|
|
|
GError **error) |
|
|
|
{ |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
GAsyncResult *inner_result; |
|
|
|
ActUser *user = NULL; |
|
|
|
g_autofree gchar *path = NULL; |
|
|
@ -805,7 +782,7 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if (accounts_accounts_call_cache_user_finish (manager->priv->accounts_proxy, |
|
|
|
if (accounts_accounts_call_cache_user_finish (priv->accounts_proxy, |
|
|
|
&path, inner_result, &remote_error)) { |
|
|
|
+
|
|
|
|
+ save_system_info (manager, path);
|
|
|
@ -839,7 +816,79 @@ index e7e26b1..9f3d6e5 100644 |
|
|
|
const char *username, |
|
|
|
GError **error) |
|
|
|
{ |
|
|
|
GError *local_error = NULL; |
|
|
|
ActUserManagerPrivate *priv = act_user_manager_get_instance_private (manager); |
|
|
|
diff --git a/src/libaccountsservice/meson.build b/src/libaccountsservice/meson.build
|
|
|
|
index 4e134db..9e85bba 100644
|
|
|
|
--- a/src/libaccountsservice/meson.build
|
|
|
|
+++ b/src/libaccountsservice/meson.build
|
|
|
|
@@ -21,60 +21,67 @@ enum_types = 'act-user-enum-types'
|
|
|
|
|
|
|
|
enum_sources = gnome.mkenums( |
|
|
|
enum_types, |
|
|
|
sources: headers, |
|
|
|
c_template: enum_types + '.c.template', |
|
|
|
h_template: enum_types + '.h.template', |
|
|
|
install_header: true, |
|
|
|
install_dir: join_paths(act_pkgincludedir, subdir), |
|
|
|
) |
|
|
|
|
|
|
|
dbus_sources = [] |
|
|
|
|
|
|
|
ifaces = [ |
|
|
|
'Manager', |
|
|
|
'Seat', |
|
|
|
'Session', |
|
|
|
] |
|
|
|
|
|
|
|
namespace = 'ConsoleKit' |
|
|
|
prefix = 'org.freedesktop.' + namespace |
|
|
|
|
|
|
|
foreach iface: ifaces |
|
|
|
dbus_sources += gnome.gdbus_codegen( |
|
|
|
'ck-@0@-generated'.format(iface.to_lower()), |
|
|
|
'@0@.@1@.xml'.format(prefix, iface), |
|
|
|
interface_prefix: prefix, |
|
|
|
namespace: namespace, |
|
|
|
) |
|
|
|
endforeach |
|
|
|
|
|
|
|
+dbus_sources += gnome.gdbus_codegen(
|
|
|
|
+ 'com.redhat.AccountsServiceUser.System',
|
|
|
|
+ join_paths(data_dir, 'com.redhat.AccountsServiceUser.System.xml'),
|
|
|
|
+ interface_prefix: 'com.redhat.AccountsService',
|
|
|
|
+ namespace: 'Act',
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
deps = [ |
|
|
|
crypt_dep, |
|
|
|
gio_unix_dep, |
|
|
|
glib_dep, |
|
|
|
libaccounts_generated_dep, |
|
|
|
] |
|
|
|
|
|
|
|
symbol_map = join_paths(meson.current_source_dir(), 'symbol.map') |
|
|
|
ldflags = cc.get_supported_link_arguments('-Wl,--version-script,@0@'.format(symbol_map)) |
|
|
|
|
|
|
|
if enable_systemd or enable_elogind |
|
|
|
deps += logind_dep |
|
|
|
endif |
|
|
|
|
|
|
|
libaccountsservice = shared_library( |
|
|
|
act_name, |
|
|
|
sources: sources + enum_sources + dbus_sources, |
|
|
|
version: libversion, |
|
|
|
include_directories: top_inc, |
|
|
|
dependencies: deps, |
|
|
|
c_args: '-DG_LOG_DOMAIN="@0@"'.format(meson.project_name()), |
|
|
|
link_args: ldflags, |
|
|
|
link_depends: symbol_map, |
|
|
|
install: true, |
|
|
|
) |
|
|
|
|
|
|
|
libaccountsservice_dep = declare_dependency( |
|
|
|
sources: enum_sources[1], |
|
|
|
include_directories: include_directories('.'), |
|
|
|
dependencies: [gio_dep, glib_dep], |
|
|
|
--
|
|
|
|
2.21.0 |
|
|
|
2.27.0 |
|
|
|
|