1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
4 * This file is part of gsignond
6 * Copyright (C) 2012 - 2014 Intel Corporation.
8 * Contact: Jussi Laako <jussi.laako@linux.intel.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
30 #include "gsignond-daemon.h"
32 #include "gsignond/gsignond-config.h"
33 #include "gsignond/gsignond-log.h"
34 #include "gsignond/gsignond-error.h"
35 #include "gsignond/gsignond-extension-interface.h"
36 #include "gsignond/gsignond-utils.h"
37 #include "daemon/gsignond-identity.h"
38 #include "daemon/db/gsignond-db-credentials-database.h"
40 struct _GSignondDaemonPrivate
42 GSignondConfig *config;
43 GHashTable *identities;
44 GModule *extension_module;
45 GSignondExtension *extension;
46 GSignondStorageManager *storage_manager;
47 GSignondSecretStorage *secret_storage;
48 GSignondDbCredentialsDatabase *db;
49 GSignondAccessControlManager *acm;
50 GSignondPluginProxyFactory *plugin_proxy_factory;
51 GSignondSignonuiProxy *ui;
54 G_DEFINE_TYPE (GSignondDaemon, gsignond_daemon, G_TYPE_OBJECT)
57 #define GSIGNOND_DAEMON_PRIV(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSIGNOND_TYPE_DAEMON, GSignondDaemonPrivate)
59 static GObject *self = 0;
62 _constructor (GType type,
63 guint n_construct_params,
64 GObjectConstructParam *construct_params)
70 self = G_OBJECT_CLASS (gsignond_daemon_parent_class)->constructor (
71 type, n_construct_params, construct_params);
72 g_object_add_weak_pointer (self, (gpointer) &self);
82 _free_identity (gpointer data, gpointer user_data)
85 GObject *identity = G_OBJECT (data);
87 DBG ("free identity %p", identity);
88 g_object_unref (identity);
92 _dispose (GObject *object)
94 GSignondDaemon *self = GSIGNOND_DAEMON(object);
97 g_object_unref (self->priv->ui);
98 self->priv->ui = NULL;
101 if (self->priv->plugin_proxy_factory) {
102 g_object_unref (self->priv->plugin_proxy_factory);
103 self->priv->plugin_proxy_factory = NULL;
106 if (self->priv->identities) {
107 g_hash_table_unref (self->priv->identities);
108 self->priv->identities = NULL;
111 if (self->priv->db) {
113 if (!gsignond_db_credentials_database_close_secret_storage (
115 WARN("gsignond_db_credentials_database_close_secret_storage() failed");
117 g_object_unref (self->priv->db);
118 self->priv->db = NULL;
121 if (self->priv->extension) {
122 if (gsignond_storage_manager_filesystem_is_mounted (
123 self->priv->storage_manager)) {
124 if (!gsignond_storage_manager_unmount_filesystem (
125 self->priv->storage_manager)) {
126 WARN("gsignond_storage_manager_unmount_filesystem() failed");
130 self->priv->storage_manager = NULL;
131 self->priv->secret_storage = NULL;
132 self->priv->acm = NULL;
133 g_object_unref (self->priv->extension);
134 self->priv->extension = NULL;
137 if (self->priv->extension_module) {
138 g_module_close (self->priv->extension_module);
139 self->priv->extension_module = NULL;
142 if (self->priv->config) {
143 g_object_unref (self->priv->config);
144 self->priv->config = NULL;
147 G_OBJECT_CLASS (gsignond_daemon_parent_class)->dispose (object);
151 _finalize (GObject *object)
153 G_OBJECT_CLASS (gsignond_daemon_parent_class)->finalize (object);
157 _init_extension (GSignondDaemon *self)
159 DBG ("Initializing extension '%s' %d.%d.%d.%d",
160 gsignond_extension_get_name (self->priv->extension),
161 (gsignond_extension_get_version (self->priv->extension) >> 24),
162 (gsignond_extension_get_version (self->priv->extension) >> 16) & 0xff,
163 (gsignond_extension_get_version (self->priv->extension) >> 8) & 0xff,
164 gsignond_extension_get_version (self->priv->extension) & 0xff);
166 self->priv->storage_manager =
167 gsignond_extension_get_storage_manager (self->priv->extension,
169 self->priv->secret_storage =
170 gsignond_extension_get_secret_storage (self->priv->extension,
173 gsignond_extension_get_access_control_manager (self->priv->extension,
176 g_return_val_if_fail (self->priv->storage_manager &&
177 self->priv->secret_storage &&
185 _on_extension_dispose (gpointer data, GObject *object)
187 if (data) *(GSignondExtension **)data = NULL;
190 static GSignondExtension * _default_extension_init ()
192 static GSignondExtension *default_extension = NULL;
194 if (!default_extension) {
196 g_object_new (GSIGNOND_TYPE_EXTENSION, NULL);
198 g_object_weak_ref (G_OBJECT (default_extension),
199 _on_extension_dispose,
203 return default_extension;
208 _init_extensions (GSignondDaemon *self)
212 const gchar *ext_path = GSIGNOND_EXTENSIONS_DIR;
213 const gchar *ext_name;
217 GSignondExtension* (*ext_init) (void);
220 const gchar *env_val = g_getenv ("SSO_EXTENSIONS_DIR");
224 ext_name = gsignond_config_get_string (self->priv->config,
225 GSIGNOND_CONFIG_GENERAL_EXTENSION);
226 if (ext_name && !ext_path) return FALSE;
228 if (ext_name && g_strcmp0 (ext_name, "default") != 0) {
229 mod_name = g_strdup_printf ("extension-%s", ext_name);
230 mod_filename = g_module_build_path (ext_path, mod_name);
232 if (!mod_filename) return FALSE;
233 DBG ("Loading extension '%s'", mod_filename);
234 self->priv->extension_module =
235 g_module_open (mod_filename, G_MODULE_BIND_LOCAL);
236 g_free (mod_filename);
237 if (!self->priv->extension_module) {
238 DBG("failed to load module : %s", g_module_error());
241 initf_name = g_strdup_printf ("%s_extension_init", ext_name);
242 symfound = g_module_symbol (self->priv->extension_module,
244 (gpointer *) &ext_init);
247 g_module_close (self->priv->extension_module);
248 self->priv->extension_module = NULL;
252 ext_init = _default_extension_init;
254 self->priv->extension = ext_init ();
255 g_return_val_if_fail (self->priv->extension &&
256 GSIGNOND_IS_EXTENSION (self->priv->extension),
259 res = _init_extension (self);
265 _init_storage (GSignondDaemon *self)
267 const gchar *storage_location;
269 DBG("Initializing storage");
271 if (!gsignond_storage_manager_storage_is_initialized (
272 self->priv->storage_manager)) {
273 if (!gsignond_storage_manager_initialize_storage (
274 self->priv->storage_manager))
278 storage_location = gsignond_storage_manager_mount_filesystem (
279 self->priv->storage_manager);
280 if (storage_location == NULL)
282 gsignond_config_set_string (self->priv->config,
283 GSIGNOND_CONFIG_GENERAL_SECURE_DIR, storage_location);
285 return (storage_location != NULL);
289 _open_database (GSignondDaemon *self)
291 DBG("Open databases");
293 self->priv->db = gsignond_db_credentials_database_new (self->priv->config,
294 self->priv->secret_storage);
298 return gsignond_db_credentials_database_open_secret_storage (
303 _clear_identity (gpointer idp, gpointer identityp, gpointer user_data)
307 return gsignond_identity_clear (GSIGNOND_IDENTITY (identityp));
311 gsignond_daemon_init (GSignondDaemon *self)
313 self->priv = GSIGNOND_DAEMON_PRIV(self);
315 self->priv->config = gsignond_config_new ();
316 self->priv->identities = g_hash_table_new_full (
317 g_direct_hash, g_direct_equal, NULL, NULL);
318 self->priv->plugin_proxy_factory = gsignond_plugin_proxy_factory_new(
321 if (!_init_extensions (self))
322 ERR("gsignond_daemon_init_extensions() failed");
324 if (!_init_storage (self))
325 ERR("gsignond_daemon_init_storage() failed");
326 if (!_open_database (self))
327 ERR("gisgnond_daemon_open_database() failed");
329 self->priv->ui = gsignond_signonui_proxy_new ();
333 gsignond_daemon_class_init (GSignondDaemonClass *klass)
335 GObjectClass* object_class = G_OBJECT_CLASS (klass);
337 g_type_class_add_private (object_class, sizeof (GSignondDaemonPrivate));
339 object_class->constructor = _constructor;
340 object_class->dispose = _dispose;
341 object_class->finalize = _finalize;
345 _compare_identity_by_pointer (gpointer key, gpointer value, gpointer dead_object)
347 return value == dead_object;
351 _on_identity_disposed (gpointer data, GObject *object)
353 GSignondDaemon *daemon = GSIGNOND_DAEMON (data);
355 DBG ("daemon %p identity %p disposed", daemon, object);
356 g_hash_table_foreach_remove (daemon->priv->identities,
357 _compare_identity_by_pointer, object);
361 gsignond_daemon_store_identity (GSignondDaemon *daemon, GSignondIdentity *identity)
363 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), 0);
364 g_return_val_if_fail (identity && GSIGNOND_IS_IDENTITY(identity), 0);
366 GSignondIdentityInfo *info = NULL;
368 gboolean was_new_identity = FALSE;
370 info = gsignond_identity_get_identity_info(identity);
373 was_new_identity = gsignond_identity_info_get_is_identity_new (info);
375 id = gsignond_db_credentials_database_update_identity (daemon->priv->db, info);
377 if (was_new_identity && id) {
378 g_hash_table_insert (daemon->priv->identities, GUINT_TO_POINTER(id), identity);
379 g_object_weak_ref (G_OBJECT (identity), _on_identity_disposed, daemon);
386 gsignond_daemon_remove_identity (GSignondDaemon *daemon, guint32 id)
388 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
390 return gsignond_db_credentials_database_remove_identity(daemon->priv->db, id);
394 gsignond_daemon_add_identity_reference (GSignondDaemon *daemon, guint32 identity_id, const GSignondSecurityContext *owner, const gchar *reference)
396 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), 0);
398 return gsignond_db_credentials_database_insert_reference (daemon->priv->db, identity_id, owner, reference);
402 gsignond_daemon_remove_identity_reference (GSignondDaemon *daemon, guint32 identity_id, const GSignondSecurityContext *owner, const gchar *reference)
404 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
406 return gsignond_db_credentials_database_remove_reference (daemon->priv->db, identity_id, owner, reference);
410 gsignond_daemon_store_identity_data (GSignondDaemon *daemon, guint32 identity_id, const gchar *method, GSignondDictionary *data)
412 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
414 return gsignond_db_credentials_database_update_data (daemon->priv->db, identity_id, method, data);
418 gsignond_daemon_clear_identity_data (GSignondDaemon *daemon, guint32 identity_id)
420 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
422 return gsignond_db_credentials_database_remove_data (daemon->priv->db, identity_id, NULL);
426 gsignond_daemon_load_identity_data (GSignondDaemon *daemon, guint32 identity_id, const gchar *method)
428 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), NULL);
429 g_return_val_if_fail (identity_id, NULL);
430 g_return_val_if_fail (method, NULL);
432 return gsignond_db_credentials_database_load_data (daemon->priv->db, identity_id, method);
436 gsignond_daemon_register_new_identity (GSignondDaemon *daemon,
437 const GSignondSecurityContext *ctx,
440 if (!daemon || !GSIGNOND_IS_DAEMON (daemon) || !ctx) {
441 WARN ("assertion failed (daemon && GSIGNOND_IS_DAEMON (daemon)) failed");
442 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
446 GSignondIdentityInfo *info = gsignond_identity_info_new ();
447 GSignondIdentity *identity = NULL;
448 GSignondSecurityContext *owner = NULL;
449 GSignondSecurityContextList *acl = NULL;
451 owner = gsignond_security_context_copy (ctx);
453 gsignond_identity_info_set_owner (info, owner);
455 acl = (GSignondSecurityContextList *)g_list_append (NULL, owner);
456 gsignond_identity_info_set_access_control_list (info, acl);
457 gsignond_security_context_free (owner);
460 DBG("register_new_identity: cache size : %d", g_hash_table_size(daemon->priv->identities));
461 identity = gsignond_identity_new (daemon, info);
462 if (identity == NULL) {
463 gsignond_identity_info_unref (info);
464 ERR("Unable to register new identity");
465 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "Internal server error");
468 DBG(" --- registered new identity : %p", identity);
473 gsignond_daemon_get_identity (GSignondDaemon *daemon,
475 const GSignondSecurityContext *ctx,
478 if (!daemon || !GSIGNOND_IS_DAEMON (daemon)) {
479 WARN ("assertion (daemon && GSIGNOND_IS_DAEMON (daemon)) failed");
480 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
484 WARN ("client provided invalid identity id");
485 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_ERR, "Invalid identity id");
489 GSignondIdentity *identity = NULL;
490 GSignondIdentityInfo *identity_info = NULL;
492 #define VALIDATE_IDENTITY_X_ACCESS(info, ctx, ret) \
494 GSignondAccessControlManager *acm = daemon->priv->acm; \
495 GSignondSecurityContextList *acl = gsignond_identity_info_get_access_control_list (info); \
496 GSignondSecurityContext *owner = gsignond_identity_info_get_owner (info); \
497 gboolean valid = gsignond_access_control_manager_peer_is_allowed_to_use_identity (acm, ctx, owner, acl); \
498 gsignond_security_context_free (owner); \
499 gsignond_security_context_list_free (acl); \
501 WARN ("identity access check failed"); \
502 gsignond_identity_info_unref (info); \
504 *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_PERMISSION_DENIED, "Can not read identity"); \
509 DBG("Get identity for id '%d'\n cache size : %d", id, g_hash_table_size(daemon->priv->identities));
510 identity = GSIGNOND_IDENTITY(g_hash_table_lookup (daemon->priv->identities, GUINT_TO_POINTER(id)));
512 identity_info = gsignond_identity_get_identity_info (identity);
513 gsignond_identity_info_ref (identity_info);
514 VALIDATE_IDENTITY_X_ACCESS (identity_info, ctx, NULL);
515 DBG ("using cased Identity '%p' for id %d", identity, id);
516 gsignond_identity_info_unref (identity_info);
518 return GSIGNOND_IDENTITY (g_object_ref (identity));
521 /* identity not found in cache, so try to load form db */
522 identity_info = gsignond_db_credentials_database_load_identity (
523 daemon->priv->db, id, TRUE);
524 if (!identity_info) {
526 const GError *err = gsignond_db_credentials_database_get_last_error (daemon->priv->db);
527 *error = err ? g_error_copy (err) : gsignond_get_gerror_for_id (
528 GSIGNOND_ERROR_IDENTITY_NOT_FOUND, "identity not found with id '%d'", id);
533 VALIDATE_IDENTITY_X_ACCESS (identity_info, ctx, NULL);
535 identity = gsignond_identity_new (daemon, identity_info);
537 gsignond_identity_info_unref (identity_info);
538 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "Internal server error");
542 g_hash_table_insert (daemon->priv->identities, GUINT_TO_POINTER(id), identity);
543 g_object_weak_ref (G_OBJECT (identity), _on_identity_disposed, daemon);
545 DBG("created new identity '%p' for id '%d'", identity, id);
549 #undef VALIDATE_IDENTITY_READ_ACCESS
553 gsignond_daemon_query_methods (GSignondDaemon *daemon, GError **error)
555 if (!daemon || !GSIGNOND_IS_DAEMON (daemon)) {
556 WARN ("assertion (daemon && GSIGNOND_IS_DAEMON(daemon)) failed");
557 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
561 return gsignond_plugin_proxy_factory_get_plugin_types (
562 daemon->priv->plugin_proxy_factory);
566 gsignond_daemon_query_mechanisms (GSignondDaemon *daemon, const gchar *method, GError **error)
568 if (!daemon || !GSIGNOND_IS_DAEMON (daemon)) {
569 WARN ("assertion (daemon && GSIGNOND_IS_DAEMON(daemon)) failed");
570 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
574 const gchar **mechanisms = gsignond_plugin_proxy_factory_get_plugin_mechanisms (
575 daemon->priv->plugin_proxy_factory, method);
577 if (!mechanisms || mechanisms[0] == NULL) {
578 DBG("no mechanisms found for method '%s'", method);
579 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_METHOD_NOT_KNOWN, "method '%s' not found", method);
586 _check_keychain_access (GSignondDaemon *self,
587 const GSignondSecurityContext *ctx,
590 GSignondAccessControlManager *acm = self->priv->acm;
591 GSignondSecurityContext *keychain =
592 gsignond_access_control_manager_security_context_of_keychain (acm);
593 gboolean has_access =
594 (gsignond_security_context_compare (keychain, ctx) == 0);
595 DBG ("keychain access compare [%s:%s] vs [%s:%s] = %d",
596 gsignond_security_context_get_system_context (keychain),
597 gsignond_security_context_get_application_context (keychain),
598 gsignond_security_context_get_system_context (ctx),
599 gsignond_security_context_get_application_context (ctx),
601 gsignond_security_context_free (keychain);
603 WARN ("keychain access check failed");
605 *error = gsignond_get_gerror_for_id (
606 GSIGNOND_ERROR_PERMISSION_DENIED,
607 "Can not access keychain functionality");
613 GSignondIdentityInfoList *
614 gsignond_daemon_query_identities (GSignondDaemon *self,
616 const GSignondSecurityContext *ctx,
619 if (!self || !GSIGNOND_IS_DAEMON (self)) {
620 WARN ("assertion (self && GSIGNOND_IS_DAEMON(self)) failed");
621 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN,
626 GSignondIdentityInfoList *identities = NULL;
627 GSignondDictionary *filter_map =
628 gsignond_dictionary_new_from_variant (filter);
630 if (!_check_keychain_access (self, ctx, NULL)) {
631 /* Other than 'keychain' app, can only get identities owned by it. */
632 gsignond_dictionary_set (filter_map, "Owner",
633 gsignond_security_context_to_variant (ctx));
636 identities = gsignond_db_credentials_database_load_identities (
637 self->priv->db, filter_map);
639 gsignond_dictionary_unref (filter_map);
642 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN,
650 gsignond_daemon_clear (GSignondDaemon *self,
651 const GSignondSecurityContext *ctx,
654 if (!self || !GSIGNOND_IS_DAEMON (self)) {
655 WARN ("assertion (self && GSIGNOND_IS_DAEMON(self)) failed");
656 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
660 if (!_check_keychain_access (self, ctx, error))
663 gboolean retval = TRUE;
664 GSignondDaemonPrivate *priv = self->priv;
666 DBG ("destroy all identities");
667 g_hash_table_foreach_remove (priv->identities, _clear_identity, self);
668 if (g_hash_table_size (priv->identities) > 0) {
669 WARN ("g_hash_table_foreach_remove(identities) failed for some items");
672 DBG ("perform internal clear");
673 if (!gsignond_db_credentials_database_clear (priv->db)) {
674 WARN ("gsignond_db_credentials_database_clear() failed");
678 DBG ("close databases");
679 if (!gsignond_db_credentials_database_close_secret_storage (priv->db)) {
680 WARN ("gsignond_db_credentials_database_close_secret_storage() failed");
683 g_object_unref (priv->db);
687 if (!gsignond_storage_manager_delete_storage (priv->storage_manager)) {
688 WARN ("gsignond_storage_manager_delete_storage() failed");
692 DBG ("re-create storage");
693 if (!_init_storage (self)) {
694 WARN ("_init_storage() failed");
698 if (!_open_database (self)) {
699 WARN ("_open_database() failed");
707 * gsignond_daemon_new:
709 * Returns: (transfer full): newly created object of type #GSignondDaemon
712 gsignond_daemon_new ()
714 return GSIGNOND_DAEMON(g_object_new (GSIGNOND_TYPE_DAEMON, NULL));
718 gsignond_daemon_get_timeout (GSignondDaemon *self)
720 return gsignond_config_get_integer (self->priv->config,
721 GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT);
725 gsignond_daemon_get_identity_timeout (GSignondDaemon *self)
727 return gsignond_config_get_integer (self->priv->config,
728 GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT);
732 gsignond_daemon_get_auth_session_timeout (GSignondDaemon *self)
734 return gsignond_config_get_integer (self->priv->config,
735 GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT);
738 GSignondAccessControlManager *
739 gsignond_daemon_get_access_control_manager (GSignondDaemon *self)
741 g_assert (self != NULL);
742 g_assert (self->priv != NULL);
744 return self->priv->acm;
747 GSignondPluginProxyFactory *
748 gsignond_daemon_get_plugin_proxy_factory (GSignondDaemon *self)
750 g_assert (self != NULL);
751 g_assert (self->priv != NULL);
753 return self->priv->plugin_proxy_factory;
757 gsignond_daemon_get_config (GSignondDaemon *self)
759 g_assert (self != NULL);
760 g_assert (self->priv != NULL);
762 return self->priv->config;
766 gsignond_daemon_show_dialog (GSignondDaemon *self,
768 GSignondSignonuiData *ui_data,
769 GSignondSignonuiProxyQueryDialogCb handler,
770 GSignondSignonuiProxyRefreshCb refresh_handler,
773 g_return_val_if_fail (self && GSIGNOND_IS_DAEMON(self), FALSE);
775 return gsignond_signonui_proxy_query_dialog (self->priv->ui, caller, ui_data, handler, refresh_handler, userdata);
779 gsignond_daemon_refresh_dialog (GSignondDaemon *self,
781 GSignondSignonuiData *ui_data,
782 GSignondSignonuiProxyRefreshDialogCb handler,
785 g_return_val_if_fail (self && GSIGNOND_IS_DAEMON(self), FALSE);
787 return gsignond_signonui_proxy_refresh_dialog (self->priv->ui, caller, ui_data, handler, userdata);
791 gsignond_daemon_cancel_dialog (GSignondDaemon *self,
793 GSignondSignonuiProxyCancelRequestCb handler,
796 g_return_val_if_fail (self && GSIGNOND_IS_DAEMON(self), FALSE);
798 return gsignond_signonui_proxy_cancel_request (self->priv->ui, caller, handler, userdata);
801 GSignondAccessControlManager *
802 gsignond_get_access_control_manager ()
804 return gsignond_daemon_get_access_control_manager(GSIGNOND_DAEMON(self));
807 GSignondPluginProxyFactory *
808 gsignond_get_plugin_proxy_factory ()
810 return gsignond_daemon_get_plugin_proxy_factory(GSIGNOND_DAEMON(self));
814 gsignond_get_config ()
816 return gsignond_daemon_get_config(GSIGNOND_DAEMON(self));