[gnome-online-accounts/gnome-3-20] kerberos: Implement GoaProvider:remove_account for signing out
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-online-accounts/gnome-3-20] kerberos: Implement GoaProvider:remove_account for signing out
- Date: Thu, 14 Jul 2016 16:52:47 +0000 (UTC)
commit 0cc70fb006c01fa541a9d40b14c9c0488eaebc66
Author: Debarshi Ray <debarshir gnome org>
Date: Fri May 20 18:51:06 2016 +0200
kerberos: Implement GoaProvider:remove_account for signing out
... instead of listening to GoaClient::account-removed.
GoaClient::account-removed is emitted every time the goa-daemon
process dies, which could be due to a crash or restart or something
else. We only want to sign out the identity when the user has
explicitly asked for it to be removed. We don't want to sign them out
merely because goa-daemon died.
https://bugzilla.gnome.org/show_bug.cgi?id=766733
src/goabackend/goakerberosprovider.c | 72 ++++++++++++++++++++++++++++++++++
src/goaidentity/goaidentityservice.c | 43 --------------------
2 files changed, 72 insertions(+), 43 deletions(-)
---
diff --git a/src/goabackend/goakerberosprovider.c b/src/goabackend/goakerberosprovider.c
index 87314bc..7c7698a 100644
--- a/src/goabackend/goakerberosprovider.c
+++ b/src/goabackend/goakerberosprovider.c
@@ -1441,6 +1441,76 @@ out:
return credentials_ensured;
}
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+remove_account_in_thread_func (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ GError *error;
+ GoaAccount *account = NULL;
+ GoaObject *object = GOA_OBJECT (task_data);
+ const gchar *identifier;
+
+ ensure_identity_manager ();
+
+ account = goa_object_get_account (object);
+ identifier = goa_account_get_identity (account);
+
+ g_debug ("Kerberos account %s removed and should now be signed out", identifier);
+
+ error = NULL;
+ if (!goa_identity_service_manager_call_sign_out_sync (identity_manager, identifier, cancellable, &error))
+ {
+ g_task_return_error (task, error);
+ goto out;
+ }
+
+ g_task_return_boolean (task, TRUE);
+
+ out:
+ g_clear_object (&account);
+}
+
+static void
+remove_account (GoaProvider *provider,
+ GoaObject *object,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GoaKerberosProvider *self = GOA_KERBEROS_PROVIDER (provider);
+ GTask *task;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, remove_account);
+
+ g_task_set_task_data (task, g_object_ref (object), g_object_unref);
+ g_task_run_in_thread (task, remove_account_in_thread_func);
+
+ g_object_unref (task);
+}
+
+static gboolean
+remove_account_finish (GoaProvider *provider,
+ GAsyncResult *res,
+ GError **error)
+{
+ GoaKerberosProvider *self = GOA_KERBEROS_PROVIDER (provider);
+ GTask *task;
+
+ g_return_val_if_fail (g_task_is_valid (res, self), FALSE);
+ task = G_TASK (res);
+
+ g_warn_if_fail (g_task_get_source_tag (task) == remove_account);
+
+ return g_task_propagate_boolean (task, error);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
static GoaIdentityServiceIdentity *
get_identity_from_object_manager (GoaKerberosProvider *self,
const char *identifier)
@@ -1685,4 +1755,6 @@ goa_kerberos_provider_class_init (GoaKerberosProviderClass *kerberos_class)
provider_class->add_account = add_account;
provider_class->refresh_account = refresh_account;
provider_class->ensure_credentials_sync = ensure_credentials_sync;
+ provider_class->remove_account = remove_account;
+ provider_class->remove_account_finish = remove_account_finish;
}
diff --git a/src/goaidentity/goaidentityservice.c b/src/goaidentity/goaidentityservice.c
index 0c551ca..a4a3a7c 100644
--- a/src/goaidentity/goaidentityservice.c
+++ b/src/goaidentity/goaidentityservice.c
@@ -1532,44 +1532,6 @@ on_account_interface_removed (GDBusObjectManager *manager,
}
static void
-on_account_removed (GoaClient *client,
- GoaObject *object,
- GoaIdentityService *self)
-{
- GSimpleAsyncResult *result;
- GoaAccount *account;
- const char *provider_type;
- const char *account_identity;
-
- account = goa_object_peek_account (object);
-
- if (account == NULL)
- return;
-
- provider_type = goa_account_get_provider_type (account);
-
- if (g_strcmp0 (provider_type, "kerberos") != 0)
- return;
-
- account_identity = goa_account_get_identity (account);
-
- g_debug ("Kerberos account %s removed and should now be signed out", account_identity);
-
- result = g_simple_async_result_new (G_OBJECT (self),
- (GAsyncReadyCallback)
- on_sign_out_for_account_change_done,
- NULL,
- on_account_removed);
-
- goa_identity_manager_get_identity (self->priv->identity_manager,
- account_identity,
- NULL,
- (GAsyncReadyCallback)
- on_got_identity_for_sign_out,
- result);
-}
-
-static void
on_identities_listed (GoaIdentityManager *manager,
GAsyncResult *result,
GoaIdentityService *self)
@@ -1602,11 +1564,6 @@ on_identities_listed (GoaIdentityManager *manager,
G_CALLBACK (on_identity_expired),
self);
- g_signal_connect (G_OBJECT (self->priv->client),
- "account-removed",
- G_CALLBACK (on_account_removed),
- self);
-
identities = goa_identity_manager_list_identities_finish (manager, result, &error);
if (identities == NULL)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]