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 libgsignon-glib
6 * Copyright (C) 2009-2010 Nokia Corporation.
7 * Copyright (C) 2012 Canonical Ltd.
8 * Copyright (C) 2012-2013 Intel Corporation.
10 * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
11 * Contact: Jussi Laako <jussi.laako@linux.intel.com>
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public License
15 * version 2.1 as published by the Free Software Foundation.
17 * This library is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this library; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
29 * SECTION:signon-auth-session
30 * @title: SignonAuthSession
31 * @short_description: the authentication session object
33 * The #SignonAuthSession object is responsible for handling the client
34 * authentication. #SignonAuthSession objects should be created from existing
35 * identities (via signon_identity_create_session() or by passing a non-NULL identity
36 * to signon_auth_session_new()).
39 #include "signon-internals.h"
40 #include "signon-auth-session.h"
41 #include "signon-dbus-queue.h"
42 #include "signon-errors.h"
43 #include "signon-marshal.h"
44 #include "signon-utils.h"
45 #include "signon-identity.h"
46 #include "sso-auth-service.h"
47 #include "sso-auth-session-gen.h"
50 G_DEFINE_TYPE (SignonAuthSession, signon_auth_session, G_TYPE_OBJECT);
66 static guint auth_session_signals[LAST_SIGNAL] = { 0 };
67 static const gchar auth_session_process_pending_message[] =
68 "The request is added to queue.";
69 static const gchar data_key_process[] = "signon-process";
71 struct _SignonAuthSessionPrivate
73 SsoAuthSession *proxy;
74 SignonIdentity *identity;
75 GCancellable *cancellable;
83 gboolean dispose_has_run;
85 guint signal_state_changed;
86 guint signal_unregistered;
89 typedef struct _AuthSessionQueryAvailableMechanismsData
91 gchar **wanted_mechanisms;
93 } AuthSessionQueryAvailableMechanismsData;
95 typedef struct _AuthSessionProcessData
97 GVariant *session_data;
99 GCancellable *cancellable;
100 } AuthSessionProcessData;
102 typedef struct _AuthSessionQueryAvailableMechanismsCbData
104 SignonAuthSession *self;
105 SignonAuthSessionQueryAvailableMechanismsCb cb;
107 } AuthSessionQueryAvailableMechanismsCbData;
109 typedef struct _AuthSessionProcessCbData
111 SignonAuthSessionProcessCb cb;
113 } AuthSessionProcessCbData;
115 #define SIGNON_AUTH_SESSION_PRIV(obj) (SIGNON_AUTH_SESSION(obj)->priv)
116 #define SIGNON_AUTH_SESSION_GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), SIGNON_TYPE_AUTH_SESSION, SignonAuthSessionPrivate))
119 static void auth_session_state_changed_cb (GDBusProxy *proxy, gint state, gchar *message, gpointer user_data);
120 static void auth_session_remote_object_destroyed_cb (GDBusProxy *proxy, gpointer user_data);
122 static gboolean auth_session_priv_init (SignonAuthSession *self, const gchar *method_name, GError **err);
124 static void auth_session_query_available_mechanisms_ready_cb (gpointer object, const GError *error, gpointer user_data);
125 static void auth_session_cancel_ready_cb (gpointer object, const GError *error, gpointer user_data);
127 static void auth_session_check_remote_object(SignonAuthSession *self);
130 auth_session_process_data_free (AuthSessionProcessData *process_data)
132 g_free (process_data->mechanism);
133 g_variant_unref (process_data->session_data);
134 g_slice_free (AuthSessionProcessData, process_data);
138 auth_session_process_reply (GObject *object, GAsyncResult *res,
141 SignonAuthSession *self;
142 SsoAuthSession *proxy = SSO_AUTH_SESSION (object);
143 GSimpleAsyncResult *res_process = (GSimpleAsyncResult *)userdata;
145 GError *error = NULL;
147 g_return_if_fail (res_process != NULL);
148 DEBUG ("%s %d", G_STRFUNC, __LINE__);
150 sso_auth_session_call_process_finish (proxy, &reply, res, &error);
152 self = SIGNON_AUTH_SESSION (g_async_result_get_source_object (
153 (GAsyncResult *)res_process));
154 self->priv->busy = FALSE;
156 if (G_LIKELY (error == NULL))
158 g_simple_async_result_set_op_res_gpointer (res_process, reply,
164 g_simple_async_result_take_error (res_process, error);
167 /* We use the idle variant in order to avoid the following critical
169 * g_main_context_pop_thread_default: assertion `g_queue_peek_head (stack) == context' failed
171 g_simple_async_result_complete_in_idle (res_process);
172 g_object_unref (res_process);
173 g_object_unref (self);
177 auth_session_process_ready_cb (gpointer object, const GError *error, gpointer user_data)
179 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
180 SignonAuthSessionPrivate *priv;
181 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
182 AuthSessionProcessData *process_data;
184 g_return_if_fail (self != NULL);
189 DEBUG ("AuthSessionError: %s", error->message);
190 g_simple_async_result_set_from_error (res, error);
191 g_simple_async_result_complete (res);
192 g_object_unref (res);
199 priv->canceled = FALSE;
200 g_simple_async_result_set_error (res,
201 signon_error_quark (),
202 SIGNON_ERROR_SESSION_CANCELED,
203 "Authentication session was canceled");
204 g_simple_async_result_complete (res);
205 g_object_unref (res);
209 DEBUG ("%s %d", G_STRFUNC, __LINE__);
211 process_data = g_object_get_data ((GObject *)res, data_key_process);
212 g_return_if_fail (process_data != NULL);
214 sso_auth_session_call_process (priv->proxy,
215 process_data->session_data,
216 process_data->mechanism,
217 process_data->cancellable,
218 auth_session_process_reply,
223 process_async_cb_wrapper (GObject *object, GAsyncResult *res,
226 AuthSessionProcessCbData *cb_data = user_data;
227 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
229 GHashTable *reply = NULL;
230 GError *error = NULL;
233 DEBUG ("%s %d", G_STRFUNC, __LINE__);
235 v_reply = signon_auth_session_process_finish (self, res, &error);
237 cancelled = error != NULL &&
238 error->domain == G_IO_ERROR &&
239 error->code == G_IO_ERROR_CANCELLED;
241 /* Do not invoke the callback if the operation was cancelled */
242 if (cb_data->cb != NULL && !cancelled)
245 reply = signon_hash_table_from_variant (v_reply);
247 cb_data->cb (self, reply, error, cb_data->user_data);
249 g_variant_unref (v_reply);
251 g_slice_free (AuthSessionProcessCbData, cb_data);
252 g_clear_error (&error);
256 auth_session_object_quark ()
258 static GQuark quark = 0;
261 quark = g_quark_from_static_string ("auth_session_object_quark");
267 signon_auth_session_set_property (GObject *object,
272 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
277 self->priv->identity = g_value_dup_object (value);
280 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
285 signon_auth_session_get_property (GObject *object,
290 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
295 g_value_set_object (value, self->priv->identity);
298 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
303 signon_auth_session_init (SignonAuthSession *self)
305 self->priv = SIGNON_AUTH_SESSION_GET_PRIV (self);
306 self->priv->cancellable = g_cancellable_new ();
310 signon_auth_session_dispose (GObject *object)
312 g_return_if_fail (SIGNON_IS_AUTH_SESSION (object));
313 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
314 SignonAuthSessionPrivate *priv = self->priv;
315 g_return_if_fail (priv != NULL);
317 if (priv->dispose_has_run)
320 if (priv->cancellable)
322 g_cancellable_cancel (priv->cancellable);
323 g_object_unref (priv->cancellable);
324 priv->cancellable = NULL;
329 g_signal_handler_disconnect (priv->proxy, priv->signal_state_changed);
330 g_signal_handler_disconnect (priv->proxy, priv->signal_unregistered);
331 g_object_unref (priv->proxy);
336 G_OBJECT_CLASS (signon_auth_session_parent_class)->dispose (object);
338 priv->dispose_has_run = TRUE;
342 signon_auth_session_finalize (GObject *object)
344 g_return_if_fail (SIGNON_IS_AUTH_SESSION(object));
346 SignonAuthSession *self = SIGNON_AUTH_SESSION(object);
347 SignonAuthSessionPrivate *priv = self->priv;
348 g_return_if_fail (priv != NULL);
350 g_free (priv->method_name);
351 g_object_unref (priv->identity);
353 G_OBJECT_CLASS (signon_auth_session_parent_class)->finalize (object);
357 signon_auth_session_class_init (SignonAuthSessionClass *klass)
359 GObjectClass *object_class = G_OBJECT_CLASS (klass);
362 object_class->set_property = signon_auth_session_set_property;
363 object_class->get_property = signon_auth_session_get_property;
365 pspec = g_param_spec_object ("identity",
367 "Identity Object construct parameter",
368 SIGNON_TYPE_IDENTITY,
369 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
370 g_object_class_install_property (object_class,
374 g_type_class_add_private (object_class, sizeof (SignonAuthSessionPrivate));
377 * SignonAuthSession::state-changed:
378 * @auth_session: the #SignonAuthSession
379 * @state: the current state of the #SignonAuthSession
380 * @message: the message associated with the state change
382 * Emitted when the state of the #SignonAuthSession changes. The state change
383 * is initiated by #GSignondPlugin via #GSignondPlugin::state-changed signal.
385 /* FIXME: @state should be registered as a GLib type (or use one from
386 * libgsignond-common)
388 auth_session_signals[STATE_CHANGED] =
389 g_signal_new ("state-changed",
390 G_TYPE_FROM_CLASS (klass),
391 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
395 _signon_marshal_VOID__INT_STRING,
400 object_class->dispose = signon_auth_session_dispose;
401 object_class->finalize = signon_auth_session_finalize;
405 * signon_auth_session_new:
406 * @id: the id of the #SignonIdentity to be used. Can be 0, if this session is
407 * not bound to any stored identity.
408 * @method_name: the name of the authentication method to be used.
409 * @err: a pointer to a location which will contain the error, in case this
412 * Creates a new #SignonAuthSession, which can be used to authenticate using
413 * the specified method.
415 * Returns: a new #SignonAuthSession.
418 signon_auth_session_new (gint id,
419 const gchar *method_name,
422 DEBUG ("%s %d", G_STRFUNC, __LINE__);
424 SignonIdentity *identity = (id == 0) ?
425 signon_identity_new () : signon_identity_new_from_db (id);
427 SignonAuthSession *self = SIGNON_AUTH_SESSION(g_object_new (
428 SIGNON_TYPE_AUTH_SESSION,
429 "identity", identity,
431 g_return_val_if_fail (self != NULL, NULL);
432 /* This will not destroy the identity, as long as it's used by the
433 * SignonAuthSession. */
434 g_object_unref (identity);
436 if (!auth_session_priv_init(self, method_name, err))
439 g_warning ("%s returned error: %s", G_STRFUNC, (*err)->message);
441 g_object_unref (self);
449 * signon_auth_session_new_for_identity:
450 * @identity: #SignonIdentity parent object.
451 * @method_name: the name of the authentication method to be used.
452 * @err: a pointer to a location which will contain the error, in case this
455 * Creates a new #SignonAuthSession, which can be used to authenticate using
456 * the specified method.
458 * Returns: a new #SignonAuthSession.
461 signon_auth_session_new_for_identity (SignonIdentity *identity,
462 const gchar *method_name,
465 g_return_val_if_fail (SIGNON_IS_IDENTITY (identity), NULL);
467 DEBUG ("%s %d", G_STRFUNC, __LINE__);
469 SignonAuthSession *self = SIGNON_AUTH_SESSION(g_object_new (
470 SIGNON_TYPE_AUTH_SESSION,
471 "identity", identity,
473 g_return_val_if_fail (self != NULL, NULL);
475 if (!auth_session_priv_init(self, method_name, err))
478 g_warning ("%s returned error: %s", G_STRFUNC, (*err)->message);
480 g_object_unref (self);
488 * signon_auth_session_get_method:
489 * @self: the #SignonAuthSession.
491 * Get the current authentication method.
493 * Returns: the authentication method being used, or %NULL on failure.
496 signon_auth_session_get_method (SignonAuthSession *self)
498 g_return_val_if_fail (SIGNON_IS_AUTH_SESSION (self), NULL);
499 SignonAuthSessionPrivate *priv = self->priv;
501 g_return_val_if_fail (priv != NULL, NULL);
503 return priv->method_name;
507 * SignonAuthSessionQueryAvailableMechanismsCb:
508 * @self: the #SignonAuthSession.
509 * @mechanisms: (transfer full) (type GStrv): list of available mechanisms.
510 * @error: a #GError if an error occurred, %NULL otherwise.
511 * @user_data: the user data that was passed when installing this callback.
513 * Callback to be passed to signon_auth_session_query_available_mechanisms().
517 * signon_auth_session_query_available_mechanisms:
518 * @self: the #SignonAuthSession.
519 * @wanted_mechanisms: a %NULL-terminated list of mechanisms supported by the client.
520 * @cb: (scope async): a callback which will be called with the result.
521 * @user_data: user data to be passed to the callback.
523 * Queries the mechanisms available for this authentication session. The result
524 * will be the intersection between @wanted_mechanisms and the mechanisms
525 * supported by the authentication plugin (and allowed by the #SignonIdentity that this
526 * session belongs to).
529 signon_auth_session_query_available_mechanisms (SignonAuthSession *self,
530 const gchar **wanted_mechanisms,
531 SignonAuthSessionQueryAvailableMechanismsCb cb,
534 g_return_if_fail (SIGNON_IS_AUTH_SESSION (self));
535 SignonAuthSessionPrivate* priv = self->priv;
537 g_return_if_fail (priv != NULL);
539 AuthSessionQueryAvailableMechanismsCbData *cb_data = g_slice_new0 (AuthSessionQueryAvailableMechanismsCbData);
540 cb_data->self = self;
542 cb_data->user_data = user_data;
544 AuthSessionQueryAvailableMechanismsData *operation_data = g_slice_new0 (AuthSessionQueryAvailableMechanismsData);
545 operation_data->wanted_mechanisms = g_strdupv ((gchar **)wanted_mechanisms);
546 operation_data->cb_data = cb_data;
548 auth_session_check_remote_object(self);
549 _signon_object_call_when_ready (self,
550 auth_session_object_quark(),
551 auth_session_query_available_mechanisms_ready_cb,
556 * SignonAuthSessionProcessCb:
557 * @self: the #SignonAuthSession.
558 * @session_data: (transfer full) (element-type utf8 GValue): a dictionary with
560 * @error: a #GError if an error occurred, %NULL otherwise.
561 * @user_data: the user data that was passed when installing this callback.
563 * This callback is invoked when the authentication plugin delivers the result
564 * of the signon_auth_session_process() operation.
568 * signon_auth_session_process:
569 * @self: the #SignonAuthSession.
570 * @session_data: (transfer none) (element-type utf8 GValue): a dictionary of parameters.
571 * @mechanism: the authentication mechanism to be used.
572 * @cb: (scope async): a callback which will be called with the result.
573 * @user_data: user data to be passed to the callback.
575 * Performs one step of the authentication process. If the #SignonIdentity that
576 * this session belongs to contains a username and a password, they will be also
577 * passed to the authentication plugin, otherwise they should be set directly in
579 * @session_data should be used to add additional authentication parameters to the
580 * session, or to override the parameters otherwise taken from the identity.
582 * Deprecated: 1.8: Use signon_auth_session_process_async() instead.
585 signon_auth_session_process (SignonAuthSession *self,
586 const GHashTable *session_data,
587 const gchar* mechanism,
588 SignonAuthSessionProcessCb cb,
591 GVariant *v_session_data;
593 g_return_if_fail (SIGNON_IS_AUTH_SESSION (self));
594 DEBUG ("%s %d", G_STRFUNC, __LINE__);
596 AuthSessionProcessCbData *cb_data = g_slice_new0 (AuthSessionProcessCbData);
598 cb_data->user_data = user_data;
600 v_session_data = signon_hash_table_to_variant (session_data);
602 signon_auth_session_process_async (self, v_session_data, mechanism, NULL,
603 process_async_cb_wrapper, cb_data);
607 * signon_auth_session_process_async:
608 * @self: the #SignonAuthSession.
609 * @session_data: (transfer full): a dictionary of parameters.
610 * @mechanism: the authentication mechanism to be used.
611 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
612 * @callback: (scope async): a callback which will be called when the
613 * authentication reply is available.
614 * @user_data: user data to be passed to the callback.
616 * Performs one step of the authentication process.
617 * @session_data should be used to add additional authentication parameters to the
620 * What specific parameters should be used can be found from authentication plugins'
621 * documentation (look for parameters that are expected in gsignond_plugin_request_initial()
622 * for the first step, and parameters that are expected in gsignond_plugin_request() for
623 * the subsequent steps). See, for example, #GSignondPasswordPlugin and #GSignondDigestPlugin.
625 * If the #SignonIdentity that this session belongs to contains a username and a password,
626 * the daemon will pass them to the authentication plugin, otherwise they should be set directly in
627 * @session_data. The daemon also passes a list of identity's allowed realms to the plugin,
628 * and they cannot be overriden.
633 signon_auth_session_process_async (SignonAuthSession *self,
634 GVariant *session_data,
635 const gchar *mechanism,
636 GCancellable *cancellable,
637 GAsyncReadyCallback callback,
640 SignonAuthSessionPrivate *priv;
641 AuthSessionProcessData *process_data;
642 GSimpleAsyncResult *res;
644 g_return_if_fail (SIGNON_IS_AUTH_SESSION (self));
647 g_return_if_fail (session_data != NULL);
649 res = g_simple_async_result_new ((GObject *)self, callback, user_data,
650 signon_auth_session_process_async);
651 g_simple_async_result_set_check_cancellable (res, cancellable);
653 process_data = g_slice_new0 (AuthSessionProcessData);
654 process_data->session_data = g_variant_ref_sink (session_data);
655 process_data->mechanism = g_strdup (mechanism);
656 process_data->cancellable = cancellable;
657 g_object_set_data_full ((GObject *)res, data_key_process, process_data,
658 (GDestroyNotify)auth_session_process_data_free);
662 auth_session_check_remote_object(self);
663 _signon_object_call_when_ready (self,
664 auth_session_object_quark(),
665 auth_session_process_ready_cb,
670 * signon_auth_session_process_finish:
671 * @self: the #SignonAuthSession.
672 * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to
673 * signon_auth_session_process_async().
674 * @error: return location for error, or %NULL.
676 * Collect the result of the signon_auth_session_process_async() operation.
678 * Returns: a #GVariant of type %G_VARIANT_TYPE_VARDICT containing the
679 * authentication reply. As with signon_auth_session_process_async(), specific
680 * parameters contained in the #GVariant can be found from plugins' documentation:
681 * #GSignondPlugin::response-final for the final response, and #GSignondPlugin::response
682 * for the intermediate responses. See, for example, #GSignondPasswordPlugin
683 * and #GSignondDigestPlugin.
688 signon_auth_session_process_finish (SignonAuthSession *self, GAsyncResult *res,
691 GSimpleAsyncResult *async_result;
694 g_return_val_if_fail (SIGNON_IS_AUTH_SESSION (self), NULL);
696 async_result = (GSimpleAsyncResult *)res;
697 if (g_simple_async_result_propagate_error (async_result, error))
700 reply = g_simple_async_result_get_op_res_gpointer (async_result);
701 return g_variant_ref (reply);
705 * signon_auth_session_cancel:
706 * @self: the #SignonAuthSession.
708 * Cancel the authentication session.
711 signon_auth_session_cancel (SignonAuthSession *self)
713 g_return_if_fail (SIGNON_IS_AUTH_SESSION (self));
714 SignonAuthSessionPrivate *priv = self->priv;
716 g_return_if_fail (priv != NULL);
718 auth_session_check_remote_object(self);
723 priv->canceled = TRUE;
724 _signon_object_call_when_ready (self,
725 auth_session_object_quark(),
726 auth_session_cancel_ready_cb,
731 auth_session_state_changed_cb (GDBusProxy *proxy,
736 g_return_if_fail (SIGNON_IS_AUTH_SESSION (user_data));
737 SignonAuthSession *self = SIGNON_AUTH_SESSION (user_data);
739 g_signal_emit ((GObject *)self,
740 auth_session_signals[STATE_CHANGED],
746 static void auth_session_remote_object_destroyed_cb (GDBusProxy *proxy,
749 g_return_if_fail (SIGNON_IS_AUTH_SESSION (user_data));
750 SignonAuthSession *self = SIGNON_AUTH_SESSION (user_data);
751 SignonAuthSessionPrivate *priv = self->priv;
752 g_return_if_fail (priv != NULL);
753 DEBUG ("remote object unregistered");
757 g_object_unref (priv->proxy);
762 * as remote object is destroyed only
763 * when the session core is destroyed,
764 * so there should not be any processes
768 priv->canceled = FALSE;
769 _signon_object_not_ready(self);
773 auth_session_priv_init (SignonAuthSession *self,
774 const gchar *method_name, GError **err)
776 g_return_val_if_fail (SIGNON_IS_AUTH_SESSION (self), FALSE);
777 SignonAuthSessionPrivate *priv = SIGNON_AUTH_SESSION_PRIV (self);
778 g_return_val_if_fail (priv, FALSE);
780 priv->method_name = g_strdup (method_name);
782 priv->registering = FALSE;
784 priv->canceled = FALSE;
789 auth_session_query_mechanisms_reply (GObject *object, GAsyncResult *res,
792 SsoAuthSession *proxy = SSO_AUTH_SESSION (object);
793 gchar **mechanisms = NULL;
794 GError *error = NULL;
795 AuthSessionQueryAvailableMechanismsCbData *cb_data =
796 (AuthSessionQueryAvailableMechanismsCbData *)userdata;
797 g_return_if_fail (cb_data != NULL);
799 sso_auth_session_call_query_available_mechanisms_finish (proxy,
803 if (SIGNON_IS_NOT_CANCELLED (error))
805 (cb_data->cb) (cb_data->self, mechanisms, error, cb_data->user_data);
808 g_clear_error (&error);
809 g_slice_free (AuthSessionQueryAvailableMechanismsCbData, cb_data);
813 auth_session_query_available_mechanisms_ready_cb (gpointer object, const GError *error,
816 g_return_if_fail (SIGNON_IS_AUTH_SESSION (object));
817 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
818 SignonAuthSessionPrivate *priv = self->priv;
819 g_return_if_fail (priv != NULL);
821 AuthSessionQueryAvailableMechanismsData *operation_data =
822 (AuthSessionQueryAvailableMechanismsData *)user_data;
823 g_return_if_fail (operation_data != NULL);
825 AuthSessionQueryAvailableMechanismsCbData *cb_data = operation_data->cb_data;
826 g_return_if_fail (cb_data != NULL);
831 (self, NULL, error, cb_data->user_data);
833 g_slice_free (AuthSessionQueryAvailableMechanismsCbData, cb_data);
837 g_return_if_fail (priv->proxy != NULL);
838 sso_auth_session_call_query_available_mechanisms (
840 (const char **)operation_data->wanted_mechanisms,
842 auth_session_query_mechanisms_reply,
846 auth_session_signals[STATE_CHANGED],
848 SIGNON_AUTH_SESSION_STATE_PROCESS_PENDING,
849 auth_session_process_pending_message);
852 g_strfreev (operation_data->wanted_mechanisms);
853 g_slice_free (AuthSessionQueryAvailableMechanismsData, operation_data);
857 auth_session_cancel_ready_cb (gpointer object, const GError *error, gpointer user_data)
859 g_return_if_fail (SIGNON_IS_AUTH_SESSION (object));
860 g_return_if_fail (user_data == NULL);
862 SignonAuthSession *self = SIGNON_AUTH_SESSION (object);
863 SignonAuthSessionPrivate *priv = self->priv;
864 g_return_if_fail (priv != NULL);
868 //TODO: in general this function does not return any values,
869 // that is why I think it should not emit anything for this particular case
870 DEBUG("error during initialization");
872 else if (priv->proxy && priv->busy)
873 sso_auth_session_call_cancel_sync (priv->proxy,
878 priv->canceled = FALSE;
882 signon_auth_session_complete (SignonAuthSession *self,
884 GDBusConnection *connection,
885 const gchar *bus_name,
886 const gchar *object_path)
888 SignonAuthSessionPrivate *priv = self->priv;
889 g_return_if_fail (priv != NULL);
891 DEBUG ("%s %d", G_STRFUNC, __LINE__);
893 priv->registering = FALSE;
894 if (!g_strcmp0(object_path, "") || error)
897 DEBUG ("Error message is %s", error->message);
899 error = g_error_new (signon_error_quark(),
900 SIGNON_ERROR_RUNTIME,
901 "Cannot create remote AuthSession object");
905 GError *proxy_error = NULL;
908 sso_auth_session_proxy_new_sync (connection,
909 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
914 if (G_UNLIKELY (proxy_error != NULL))
916 g_warning ("Failed to initialize AuthSession proxy: %s",
917 proxy_error->message);
918 g_clear_error (&proxy_error);
921 g_dbus_proxy_set_default_timeout ((GDBusProxy *)priv->proxy,
924 priv->signal_state_changed =
925 g_signal_connect (priv->proxy,
927 G_CALLBACK (auth_session_state_changed_cb),
930 priv->signal_unregistered =
931 g_signal_connect (priv->proxy,
933 G_CALLBACK (auth_session_remote_object_destroyed_cb),
937 DEBUG ("Object path received: %s", object_path);
938 _signon_object_ready (self, auth_session_object_quark (), error);
942 auth_session_check_remote_object(SignonAuthSession *self)
944 g_return_if_fail (self != NULL);
945 SignonAuthSessionPrivate *priv = self->priv;
946 g_return_if_fail (priv != NULL);
948 if (priv->proxy != NULL)
951 g_return_if_fail (priv->identity != NULL);
953 if (!priv->registering)
955 DEBUG ("%s %d", G_STRFUNC, __LINE__);
957 priv->registering = TRUE;
958 signon_identity_get_auth_session (priv->identity,
961 signon_auth_session_complete);