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 - 2013 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 guint32 ext_ver = gsignond_extension_get_version (self->priv->extension);
161 DBG ("Initializing extension '%s' %d.%d.%d.%d",
162 gsignond_extension_get_name (self->priv->extension),
164 (ext_ver >> 16) & 0xff,
165 (ext_ver >> 8) & 0xff,
168 self->priv->storage_manager =
169 gsignond_extension_get_storage_manager (self->priv->extension,
171 self->priv->secret_storage =
172 gsignond_extension_get_secret_storage (self->priv->extension,
175 gsignond_extension_get_access_control_manager (self->priv->extension,
178 g_return_val_if_fail (self->priv->storage_manager &&
179 self->priv->secret_storage &&
187 _on_extension_dispose (gpointer data, GObject *object)
189 if (data) *(GSignondExtension **)data = NULL;
192 static GSignondExtension * _default_extension_init ()
194 static GSignondExtension *default_extension = NULL;
196 if (!default_extension) {
198 g_object_new (GSIGNOND_TYPE_EXTENSION, NULL);
200 g_object_weak_ref (G_OBJECT (default_extension),
201 _on_extension_dispose,
205 return default_extension;
210 _init_extensions (GSignondDaemon *self)
214 const gchar *ext_path = GSIGNOND_EXTENSIONS_DIR;
215 const gchar *ext_name;
219 GSignondExtension* (*ext_init) (void);
222 const gchar *env_val = g_getenv ("SSO_EXTENSIONS_DIR");
226 ext_name = gsignond_config_get_string (self->priv->config,
227 GSIGNOND_CONFIG_GENERAL_EXTENSION);
228 if (ext_name && !ext_path) return FALSE;
230 if (ext_name && g_strcmp0 (ext_name, "default") != 0) {
231 mod_name = g_strdup_printf ("extension-%s", ext_name);
232 mod_filename = g_module_build_path (ext_path, mod_name);
234 if (!mod_filename) return FALSE;
235 DBG ("Loading extension '%s'", mod_filename);
236 self->priv->extension_module =
237 g_module_open (mod_filename, G_MODULE_BIND_LOCAL);
238 g_free (mod_filename);
239 if (!self->priv->extension_module) {
240 DBG("failed to load module : %s", g_module_error());
243 initf_name = g_strdup_printf ("%s_extension_init", ext_name);
244 symfound = g_module_symbol (self->priv->extension_module,
246 (gpointer *) &ext_init);
249 g_module_close (self->priv->extension_module);
250 self->priv->extension_module = NULL;
254 ext_init = _default_extension_init;
256 self->priv->extension = ext_init ();
257 g_return_val_if_fail (self->priv->extension &&
258 GSIGNOND_IS_EXTENSION (self->priv->extension),
261 res = _init_extension (self);
267 _init_storage (GSignondDaemon *self)
269 const gchar *storage_location;
271 DBG("Initializing storage");
273 if (!gsignond_storage_manager_storage_is_initialized (
274 self->priv->storage_manager)) {
275 if (!gsignond_storage_manager_initialize_storage (
276 self->priv->storage_manager))
280 storage_location = gsignond_storage_manager_mount_filesystem (
281 self->priv->storage_manager);
282 if (storage_location == NULL)
284 gsignond_config_set_string (self->priv->config,
285 GSIGNOND_CONFIG_GENERAL_SECURE_DIR, storage_location);
287 return (storage_location != NULL);
291 _open_database (GSignondDaemon *self)
293 DBG("Open databases");
295 self->priv->db = gsignond_db_credentials_database_new (self->priv->config,
296 self->priv->secret_storage);
300 return gsignond_db_credentials_database_open_secret_storage (
305 _clear_identity (gpointer idp, gpointer identityp, gpointer user_data)
309 return gsignond_identity_clear (GSIGNOND_IDENTITY (identityp));
313 gsignond_daemon_init (GSignondDaemon *self)
315 self->priv = GSIGNOND_DAEMON_PRIV(self);
317 self->priv->config = gsignond_config_new ();
318 self->priv->identities = g_hash_table_new_full (
319 g_direct_hash, g_direct_equal, NULL, NULL);
320 self->priv->plugin_proxy_factory = gsignond_plugin_proxy_factory_new(
323 if (!_init_extensions (self))
324 ERR("gsignond_daemon_init_extensions() failed");
326 if (!_init_storage (self))
327 ERR("gsignond_daemon_init_storage() failed");
328 if (!_open_database (self))
329 ERR("gisgnond_daemon_open_database() failed");
331 self->priv->ui = gsignond_signonui_proxy_new ();
335 gsignond_daemon_class_init (GSignondDaemonClass *klass)
337 GObjectClass* object_class = G_OBJECT_CLASS (klass);
339 g_type_class_add_private (object_class, sizeof (GSignondDaemonPrivate));
341 object_class->constructor = _constructor;
342 object_class->dispose = _dispose;
343 object_class->finalize = _finalize;
347 _compare_identity_by_pointer (gpointer key, gpointer value, gpointer dead_object)
349 return value == dead_object;
353 _on_identity_disposed (gpointer data, GObject *object)
355 GSignondDaemon *daemon = GSIGNOND_DAEMON (data);
357 DBG ("daemon %p identity %p disposed", daemon, object);
358 g_hash_table_foreach_remove (daemon->priv->identities,
359 _compare_identity_by_pointer, object);
363 gsignond_daemon_store_identity (GSignondDaemon *daemon, GSignondIdentity *identity)
365 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), 0);
366 g_return_val_if_fail (identity && GSIGNOND_IS_IDENTITY(identity), 0);
368 GSignondIdentityInfo *info = NULL;
370 gboolean was_new_identity = FALSE;
372 info = gsignond_identity_get_identity_info(identity);
375 was_new_identity = gsignond_identity_info_get_is_identity_new (info);
377 id = gsignond_db_credentials_database_update_identity (daemon->priv->db, info);
379 if (was_new_identity && id) {
380 g_hash_table_insert (daemon->priv->identities, GUINT_TO_POINTER(id), identity);
381 g_object_weak_ref (G_OBJECT (identity), _on_identity_disposed, daemon);
388 gsignond_daemon_remove_identity (GSignondDaemon *daemon, guint32 id)
390 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
392 return gsignond_db_credentials_database_remove_identity(daemon->priv->db, id);
396 gsignond_daemon_add_identity_reference (GSignondDaemon *daemon, guint32 identity_id, const GSignondSecurityContext *owner, const gchar *reference)
398 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), 0);
400 return gsignond_db_credentials_database_insert_reference (daemon->priv->db, identity_id, owner, reference);
404 gsignond_daemon_remove_identity_reference (GSignondDaemon *daemon, guint32 identity_id, const GSignondSecurityContext *owner, const gchar *reference)
406 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
408 return gsignond_db_credentials_database_remove_reference (daemon->priv->db, identity_id, owner, reference);
412 gsignond_daemon_store_identity_data (GSignondDaemon *daemon, guint32 identity_id, const gchar *method, GSignondDictionary *data)
414 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
416 return gsignond_db_credentials_database_update_data (daemon->priv->db, identity_id, method, data);
420 gsignond_daemon_clear_identity_data (GSignondDaemon *daemon, guint32 identity_id)
422 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
424 return gsignond_db_credentials_database_remove_data (daemon->priv->db, identity_id, NULL);
428 gsignond_daemon_load_identity_data (GSignondDaemon *daemon, guint32 identity_id, const gchar *method)
430 g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), NULL);
431 g_return_val_if_fail (identity_id, NULL);
432 g_return_val_if_fail (method, NULL);
434 return gsignond_db_credentials_database_load_data (daemon->priv->db, identity_id, method);
438 gsignond_daemon_register_new_identity (GSignondDaemon *daemon,
439 const GSignondSecurityContext *ctx,
442 if (!daemon || !GSIGNOND_IS_DAEMON (daemon) || !ctx) {
443 WARN ("assertion failed (daemon && GSIGNOND_IS_DAEMON (daemon)) failed");
444 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
448 GSignondIdentityInfo *info = gsignond_identity_info_new ();
449 GSignondIdentity *identity = NULL;
450 GSignondSecurityContext *owner = NULL;
451 GSignondSecurityContextList *acl = NULL;
453 owner = gsignond_security_context_copy (ctx);
455 gsignond_identity_info_set_owner (info, owner);
457 acl = (GSignondSecurityContextList *)g_list_append (NULL, owner);
458 gsignond_identity_info_set_access_control_list (info, acl);
459 gsignond_security_context_free (owner);
462 DBG("register_new_identity: cache size : %d", g_hash_table_size(daemon->priv->identities));
463 identity = gsignond_identity_new (daemon, info);
464 if (identity == NULL) {
465 gsignond_identity_info_unref (info);
466 ERR("Unable to register new identity");
467 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "Internal server error");
470 DBG(" --- registered new identity : %p", identity);
475 gsignond_daemon_get_identity (GSignondDaemon *daemon,
477 const GSignondSecurityContext *ctx,
480 if (!daemon || !GSIGNOND_IS_DAEMON (daemon)) {
481 WARN ("assertion (daemon && GSIGNOND_IS_DAEMON (daemon)) failed");
482 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
486 WARN ("client provided invalid identity id");
487 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_ERR, "Invalid identity id");
491 GSignondIdentity *identity = NULL;
492 GSignondIdentityInfo *identity_info = NULL;
494 #define VALIDATE_IDENTITY_READ_ACCESS(info, ctx, ret) \
496 GSignondAccessControlManager *acm = daemon->priv->acm; \
497 GSignondSecurityContextList *acl = gsignond_identity_info_get_access_control_list (info); \
498 GSignondSecurityContext *owner = gsignond_identity_info_get_owner (info); \
499 gboolean valid = gsignond_access_control_manager_peer_is_allowed_to_use_identity (acm, ctx, owner, acl); \
500 gsignond_security_context_free (owner); \
501 gsignond_security_context_list_free (acl); \
503 WARN ("identity access check failed"); \
504 gsignond_identity_info_unref (info); \
506 *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_PERMISSION_DENIED, "Can not read identity"); \
511 DBG("Get identity for id '%d'\n cache size : %d", id, g_hash_table_size(daemon->priv->identities));
512 identity = GSIGNOND_IDENTITY(g_hash_table_lookup (daemon->priv->identities, GUINT_TO_POINTER(id)));
514 identity_info = gsignond_identity_get_identity_info (identity);
515 gsignond_identity_info_ref (identity_info);
516 VALIDATE_IDENTITY_READ_ACCESS (identity_info, ctx, NULL);
517 DBG ("using cased Identity '%p' for id %d", identity, id);
518 gsignond_identity_info_unref (identity_info);
520 return GSIGNOND_IDENTITY (g_object_ref (identity));
523 /* identity not found in cache, so try to load form db */
524 identity_info = gsignond_db_credentials_database_load_identity (
525 daemon->priv->db, id, TRUE);
526 if (!identity_info) {
528 const GError *err = gsignond_db_credentials_database_get_last_error (daemon->priv->db);
529 *error = err ? g_error_copy (err) : gsignond_get_gerror_for_id (
530 GSIGNOND_ERROR_IDENTITY_NOT_FOUND, "identity not found with id '%d'", id);
535 VALIDATE_IDENTITY_READ_ACCESS (identity_info, ctx, NULL);
537 identity = gsignond_identity_new (daemon, identity_info);
539 gsignond_identity_info_unref (identity_info);
540 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "Internal server error");
544 g_hash_table_insert (daemon->priv->identities, GUINT_TO_POINTER(id), identity);
545 g_object_weak_ref (G_OBJECT (identity), _on_identity_disposed, daemon);
547 DBG("created new identity '%p' for id '%d'", identity, id);
551 #undef VALIDATE_IDENTITY_READ_ACCESS
555 gsignond_daemon_query_methods (GSignondDaemon *daemon, GError **error)
557 if (!daemon || !GSIGNOND_IS_DAEMON (daemon)) {
558 WARN ("assertion (daemon && GSIGNOND_IS_DAEMON(daemon)) failed");
559 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
563 return gsignond_plugin_proxy_factory_get_plugin_types (
564 daemon->priv->plugin_proxy_factory);
568 gsignond_daemon_query_mechanisms (GSignondDaemon *daemon, const gchar *method, GError **error)
570 if (!daemon || !GSIGNOND_IS_DAEMON (daemon)) {
571 WARN ("assertion (daemon && GSIGNOND_IS_DAEMON(daemon)) failed");
572 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
576 const gchar **mechanisms = gsignond_plugin_proxy_factory_get_plugin_mechanisms (
577 daemon->priv->plugin_proxy_factory, method);
579 if (!mechanisms || mechanisms[0] == NULL) {
580 DBG("no mechanisms found for method '%s'", method);
581 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_METHOD_NOT_KNOWN, "method '%s' not found", method);
588 _check_keychain_access (GSignondDaemon *self,
589 const GSignondSecurityContext *ctx,
592 GSignondAccessControlManager *acm = self->priv->acm;
593 GSignondSecurityContext *keychain =
594 gsignond_access_control_manager_security_context_of_keychain (acm);
595 gboolean has_access =
596 (gsignond_security_context_compare (keychain, ctx) == 0);
597 DBG ("keychain access compare [%s:%s] vs [%s:%s] = %d",
598 gsignond_security_context_get_system_context (keychain),
599 gsignond_security_context_get_application_context (keychain),
600 gsignond_security_context_get_system_context (ctx),
601 gsignond_security_context_get_application_context (ctx),
603 gsignond_security_context_free (keychain);
605 WARN ("keychain access check failed");
607 *error = gsignond_get_gerror_for_id (
608 GSIGNOND_ERROR_PERMISSION_DENIED,
609 "Can not access keychain functionality");
615 GSignondIdentityInfoList *
616 gsignond_daemon_query_identities (GSignondDaemon *self,
618 const GSignondSecurityContext *ctx,
621 if (!self || !GSIGNOND_IS_DAEMON (self)) {
622 WARN ("assertion (self && GSIGNOND_IS_DAEMON(self)) failed");
623 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN,
628 GSignondIdentityInfoList *identities = NULL;
629 GSignondDictionary *filter_map =
630 gsignond_dictionary_new_from_variant (filter);
632 if (!_check_keychain_access (self, ctx, NULL)) {
633 /* Other than 'keychain' app, can only get identities owned by it. */
634 gsignond_dictionary_set (filter_map, "Owner",
635 gsignond_security_context_to_variant (ctx));
638 identities = gsignond_db_credentials_database_load_identities (
639 self->priv->db, filter_map);
641 gsignond_dictionary_unref (filter_map);
644 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN,
652 gsignond_daemon_clear (GSignondDaemon *self,
653 const GSignondSecurityContext *ctx,
656 if (!self || !GSIGNOND_IS_DAEMON (self)) {
657 WARN ("assertion (self && GSIGNOND_IS_DAEMON(self)) failed");
658 if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
662 if (!_check_keychain_access (self, ctx, error))
665 gboolean retval = TRUE;
666 GSignondDaemonPrivate *priv = self->priv;
668 DBG ("destroy all identities");
669 g_hash_table_foreach_remove (priv->identities, _clear_identity, self);
670 if (g_hash_table_size (priv->identities) > 0) {
671 WARN ("g_hash_table_foreach_remove(identities) failed for some items");
674 DBG ("perform internal clear");
675 if (!gsignond_db_credentials_database_clear (priv->db)) {
676 WARN ("gsignond_db_credentials_database_clear() failed");
680 DBG ("close databases");
681 if (!gsignond_db_credentials_database_close_secret_storage (priv->db)) {
682 WARN ("gsignond_db_credentials_database_close_secret_storage() failed");
685 g_object_unref (priv->db);
689 if (!gsignond_storage_manager_delete_storage (priv->storage_manager)) {
690 WARN ("gsignond_storage_manager_delete_storage() failed");
694 DBG ("re-create storage");
695 if (!_init_storage (self)) {
696 WARN ("_init_storage() failed");
700 if (!_open_database (self)) {
701 WARN ("_open_database() failed");
709 * gsignond_daemon_new:
711 * Returns: (transfer full): newly created object of type #GSignondDaemon
714 gsignond_daemon_new ()
716 return GSIGNOND_DAEMON(g_object_new (GSIGNOND_TYPE_DAEMON, NULL));
720 gsignond_daemon_get_timeout (GSignondDaemon *self)
722 return gsignond_config_get_integer (self->priv->config,
723 GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT);
727 gsignond_daemon_get_identity_timeout (GSignondDaemon *self)
729 return gsignond_config_get_integer (self->priv->config,
730 GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT);
734 gsignond_daemon_get_auth_session_timeout (GSignondDaemon *self)
736 return gsignond_config_get_integer (self->priv->config,
737 GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT);
740 GSignondAccessControlManager *
741 gsignond_daemon_get_access_control_manager (GSignondDaemon *self)
743 g_assert (self != NULL);
744 g_assert (self->priv != NULL);
746 return self->priv->acm;
749 GSignondPluginProxyFactory *
750 gsignond_daemon_get_plugin_proxy_factory (GSignondDaemon *self)
752 g_assert (self != NULL);
753 g_assert (self->priv != NULL);
755 return self->priv->plugin_proxy_factory;
759 gsignond_daemon_get_config (GSignondDaemon *self)
761 g_assert (self != NULL);
762 g_assert (self->priv != NULL);
764 return self->priv->config;
768 gsignond_daemon_show_dialog (GSignondDaemon *self,
770 GSignondSignonuiData *ui_data,
771 GSignondSignonuiProxyQueryDialogCb handler,
772 GSignondSignonuiProxyRefreshCb refresh_handler,
775 g_return_val_if_fail (self && GSIGNOND_IS_DAEMON(self), FALSE);
777 return gsignond_signonui_proxy_query_dialog (self->priv->ui, caller, ui_data, handler, refresh_handler, userdata);
781 gsignond_daemon_refresh_dialog (GSignondDaemon *self,
783 GSignondSignonuiData *ui_data,
784 GSignondSignonuiProxyRefreshDialogCb handler,
787 g_return_val_if_fail (self && GSIGNOND_IS_DAEMON(self), FALSE);
789 return gsignond_signonui_proxy_refresh_dialog (self->priv->ui, caller, ui_data, handler, userdata);
793 gsignond_daemon_cancel_dialog (GSignondDaemon *self,
795 GSignondSignonuiProxyCancelRequestCb handler,
798 g_return_val_if_fail (self && GSIGNOND_IS_DAEMON(self), FALSE);
800 return gsignond_signonui_proxy_cancel_request (self->priv->ui, caller, handler, userdata);
803 GSignondAccessControlManager *
804 gsignond_get_access_control_manager ()
806 return gsignond_daemon_get_access_control_manager(GSIGNOND_DAEMON(self));
809 GSignondPluginProxyFactory *
810 gsignond_get_plugin_proxy_factory ()
812 return gsignond_daemon_get_plugin_proxy_factory(GSIGNOND_DAEMON(self));
816 gsignond_get_config ()
818 return gsignond_daemon_get_config(GSIGNOND_DAEMON(self));