[evolution-data-server] Add ESource::UnsetLastCredentialsRequiredArguments method



commit d6e2499755d9c81bf80422ea02ed0eeaf9d523b4
Author: Milan Crha <mcrha redhat com>
Date:   Wed May 6 13:57:05 2015 +0200

    Add ESource::UnsetLastCredentialsRequiredArguments method
    
    This is used to unset any failed cached credentials responses, thus
    when the backend is closed, which means it is not interested in the
    credentials anymore, the clients won't ask for them.

 addressbook/libedata-book/e-data-book.c           |   22 ++++
 calendar/libedata-cal/e-data-cal.c                |   22 ++++
 configure.ac                                      |    2 +-
 libebackend/e-backend.c                           |   19 +++
 libebackend/e-server-side-source.c                |   29 +++++
 libedataserver/e-source.c                         |  130 +++++++++++++++++++++
 libedataserver/e-source.h                         |   13 ++
 private/org.gnome.evolution.dataserver.Source.xml |   13 ++-
 8 files changed, 248 insertions(+), 2 deletions(-)
---
diff --git a/addressbook/libedata-book/e-data-book.c b/addressbook/libedata-book/e-data-book.c
index 96a52fb..f4c35fe 100644
--- a/addressbook/libedata-book/e-data-book.c
+++ b/addressbook/libedata-book/e-data-book.c
@@ -1331,12 +1331,30 @@ data_book_handle_get_cursor_cb (EDBusAddressBook *dbus_interface,
        return TRUE;
 }
 
+static void
+data_book_source_unset_last_credentials_required_arguments_cb (GObject *source_object,
+                                                              GAsyncResult *result,
+                                                              gpointer user_data)
+{
+       GError *local_error = NULL;
+
+       g_return_if_fail (E_IS_SOURCE (source_object));
+
+       e_source_unset_last_credentials_required_arguments_finish (E_SOURCE (source_object), result, 
&local_error);
+
+       if (local_error)
+               g_debug ("%s: Call failed: %s", G_STRFUNC, local_error->message);
+
+       g_clear_error (&local_error);
+}
+
 static gboolean
 data_book_handle_close_cb (EDBusAddressBook *dbus_interface,
                            GDBusMethodInvocation *invocation,
                            EDataBook *data_book)
 {
        EBookBackend *backend;
+       ESource *source;
        const gchar *sender;
 
        /* G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED should be set on
@@ -1347,6 +1365,10 @@ data_book_handle_close_cb (EDBusAddressBook *dbus_interface,
        backend = e_data_book_ref_backend (data_book);
        g_return_val_if_fail (backend != NULL, FALSE);
 
+       source = e_backend_get_source (E_BACKEND (backend));
+       e_source_unset_last_credentials_required_arguments (source, NULL,
+               data_book_source_unset_last_credentials_required_arguments_cb, NULL);
+
        sender = g_dbus_method_invocation_get_sender (invocation);
        g_signal_emit_by_name (backend, "closed", sender);
 
diff --git a/calendar/libedata-cal/e-data-cal.c b/calendar/libedata-cal/e-data-cal.c
index b549fcc..ec9e51e 100644
--- a/calendar/libedata-cal/e-data-cal.c
+++ b/calendar/libedata-cal/e-data-cal.c
@@ -1553,12 +1553,30 @@ data_cal_handle_add_timezone_cb (EDBusCalendar *dbus_interface,
        return TRUE;
 }
 
+static void
+data_cal_source_unset_last_credentials_required_arguments_cb (GObject *source_object,
+                                                             GAsyncResult *result,
+                                                             gpointer user_data)
+{
+       GError *local_error = NULL;
+
+       g_return_if_fail (E_IS_SOURCE (source_object));
+
+       e_source_unset_last_credentials_required_arguments_finish (E_SOURCE (source_object), result, 
&local_error);
+
+       if (local_error)
+               g_debug ("%s: Call failed: %s", G_STRFUNC, local_error->message);
+
+       g_clear_error (&local_error);
+}
+
 static gboolean
 data_cal_handle_close_cb (EDBusCalendar *dbus_interface,
                           GDBusMethodInvocation *invocation,
                           EDataCal *data_cal)
 {
        ECalBackend *backend;
+       ESource *source;
        const gchar *sender;
 
        /* G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED should be set on
@@ -1569,6 +1587,10 @@ data_cal_handle_close_cb (EDBusCalendar *dbus_interface,
        backend = e_data_cal_ref_backend (data_cal);
        g_return_val_if_fail (backend != NULL, FALSE);
 
+       source = e_backend_get_source (E_BACKEND (backend));
+       e_source_unset_last_credentials_required_arguments (source, NULL,
+               data_cal_source_unset_last_credentials_required_arguments_cb, NULL);
+
        sender = g_dbus_method_invocation_get_sender (invocation);
        g_signal_emit_by_name (backend, "closed", sender);
 
diff --git a/configure.ac b/configure.ac
index 2ebd5f6..d1267be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,7 +75,7 @@ dnl D-Bus versioning
 dnl ******************************
 ADDRESS_BOOK_DBUS_SERVICE_NAME="org.gnome.evolution.dataserver.AddressBook9"
 CALENDAR_DBUS_SERVICE_NAME="org.gnome.evolution.dataserver.Calendar7"
-SOURCES_DBUS_SERVICE_NAME="org.gnome.evolution.dataserver.Sources4"
+SOURCES_DBUS_SERVICE_NAME="org.gnome.evolution.dataserver.Sources5"
 USER_PROMPTER_DBUS_SERVICE_NAME="org.gnome.evolution.dataserver.UserPrompter0"
 
 AC_DEFINE_UNQUOTED(
diff --git a/libebackend/e-backend.c b/libebackend/e-backend.c
index bdd682f..9593f27 100644
--- a/libebackend/e-backend.c
+++ b/libebackend/e-backend.c
@@ -388,6 +388,23 @@ backend_source_authenticate_cb (ESource *source,
 }
 
 static void
+backend_source_unset_last_credentials_required_arguments_cb (GObject *source_object,
+                                                            GAsyncResult *result,
+                                                            gpointer user_data)
+{
+       GError *local_error = NULL;
+
+       g_return_if_fail (E_IS_SOURCE (source_object));
+
+       e_source_unset_last_credentials_required_arguments_finish (E_SOURCE (source_object), result, 
&local_error);
+
+       if (local_error)
+               g_debug ("%s: Call failed: %s", G_STRFUNC, local_error->message);
+
+       g_clear_error (&local_error);
+}
+
+static void
 backend_set_source (EBackend *backend,
                     ESource *source)
 {
@@ -497,6 +514,8 @@ backend_dispose (GObject *object)
        if (priv->source) {
                g_signal_handlers_disconnect_by_func (priv->source, backend_source_authenticate_cb, object);
                e_source_set_connection_status (priv->source, E_SOURCE_CONNECTION_STATUS_DISCONNECTED);
+               e_source_unset_last_credentials_required_arguments (priv->source, NULL,
+                       backend_source_unset_last_credentials_required_arguments_cb, NULL);
        }
 
        g_mutex_lock (&priv->authenticate_cancellable_lock);
diff --git a/libebackend/e-server-side-source.c b/libebackend/e-server-side-source.c
index c47e82c..ffa0bc9 100644
--- a/libebackend/e-server-side-source.c
+++ b/libebackend/e-server-side-source.c
@@ -504,6 +504,32 @@ server_side_source_get_last_credentials_required_arguments_cb (EDBusSource *dbus
 }
 
 static gboolean
+server_side_source_unset_last_credentials_required_arguments_cb (EDBusSource *dbus_interface,
+                                                                GDBusMethodInvocation *invocation,
+                                                                EServerSideSource *source)
+{
+       g_mutex_lock (&source->priv->last_values_lock);
+
+       g_free (source->priv->last_reason);
+       g_free (source->priv->last_certificate_pem);
+       g_free (source->priv->last_certificate_errors);
+       g_free (source->priv->last_dbus_error_name);
+       g_free (source->priv->last_dbus_error_message);
+
+       source->priv->last_reason = NULL;
+       source->priv->last_certificate_pem = NULL;
+       source->priv->last_certificate_errors = NULL;
+       source->priv->last_dbus_error_name = NULL;
+       source->priv->last_dbus_error_message = NULL;
+
+       e_dbus_source_complete_unset_last_credentials_required_arguments (dbus_interface, invocation);
+
+       g_mutex_unlock (&source->priv->last_values_lock);
+
+       return TRUE;
+}
+
+static gboolean
 server_side_source_remove_cb (EDBusSourceRemovable *dbus_interface,
                               GDBusMethodInvocation *invocation,
                               EServerSideSource *source)
@@ -1493,6 +1519,9 @@ server_side_source_initable_init (GInitable *initable,
        g_signal_connect (
                dbus_source, "handle-get-last-credentials-required-arguments",
                G_CALLBACK (server_side_source_get_last_credentials_required_arguments_cb), source);
+       g_signal_connect (
+               dbus_source, "handle-unset-last-credentials-required-arguments",
+               G_CALLBACK (server_side_source_unset_last_credentials_required_arguments_cb), source);
 
        g_object_unref (dbus_source);
 
diff --git a/libedataserver/e-source.c b/libedataserver/e-source.c
index 4ddbe7c..2b82297 100644
--- a/libedataserver/e-source.c
+++ b/libedataserver/e-source.c
@@ -5364,3 +5364,133 @@ e_source_get_last_credentials_required_arguments_finish (ESource *source,
 
        return TRUE;
 }
+
+/**
+ * e_source_unset_last_credentials_required_arguments_sync:
+ * @source: an #ESource
+ * @cancellable: (allow none): optional #GCancellable object, or %NULL
+ * @error: (allow none): return location for a #GError, or %NULL
+ *
+ * Unsets the last used arguments of the 'credentials-required' signal emission.
+ *
+ * If an error occurs, the function sets @error and returns %FALSE.
+ *
+ * Returns: %TRUE on success, %FALSE on error
+ *
+ * Since: 3.18
+ **/
+gboolean
+e_source_unset_last_credentials_required_arguments_sync (ESource *source,
+                                                        GCancellable *cancellable,
+                                                        GError **error)
+{
+       GDBusObject *dbus_object;
+       EDBusSource *dbus_source = NULL;
+       gboolean success;
+       GError *local_error = NULL;
+
+       g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
+
+       dbus_object = e_source_ref_dbus_object (source);
+       if (dbus_object != NULL) {
+               dbus_source = e_dbus_object_get_source (E_DBUS_OBJECT (dbus_object));
+               g_object_unref (dbus_object);
+       }
+
+       if (!dbus_source)
+               return FALSE;
+
+       success = e_dbus_source_call_unset_last_credentials_required_arguments_sync (dbus_source, 
cancellable, error);
+
+       g_object_unref (dbus_source);
+
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return success;
+}
+
+static void
+source_unset_last_credentials_required_arguments_thread (GTask *task,
+                                                        gpointer source_object,
+                                                        gpointer task_data,
+                                                        GCancellable *cancellable)
+{
+       GError *local_error = NULL;
+
+       e_source_unset_last_credentials_required_arguments_sync (
+               E_SOURCE (source_object), cancellable, &local_error);
+
+       if (local_error != NULL) {
+               g_task_return_error (task, local_error);
+       } else {
+               g_task_return_boolean (task, TRUE);
+       }
+}
+
+/**
+ * e_source_unset_last_credentials_required_arguments:
+ * @source: an #ESource
+ * @cancellable: (allow none): optional #GCancellable object, or %NULL
+ * @callback: a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: data to pass to the callback function
+ *
+ * Asynchronously calls the UnsetLastCredentialsRequiredArguments method
+ * on the server side, to unset the last values used for the 'credentials-required'
+ * signal.
+ *
+ * When the operation is finished, @callback will be called. You can then
+ * call e_source_unset_last_credentials_required_arguments_finish() to get
+ * the result of the operation.
+ *
+ * Since: 3.18
+ **/
+void
+e_source_unset_last_credentials_required_arguments (ESource *source,
+                                                   GCancellable *cancellable,
+                                                   GAsyncReadyCallback callback,
+                                                   gpointer user_data)
+{
+       GTask *task;
+
+       g_return_if_fail (E_IS_SOURCE (source));
+
+       task = g_task_new (source, cancellable, callback, user_data);
+       g_task_set_source_tag (task, e_source_unset_last_credentials_required_arguments);
+
+       g_task_run_in_thread (task, source_unset_last_credentials_required_arguments_thread);
+
+       g_object_unref (task);
+}
+
+/**
+ * e_source_unset_last_credentials_required_arguments_finish:
+ * @source: an #ESource
+ * @result: a #GAsyncResult
+ * @error: (allow none): return location for a #GError, or %NULL
+ *
+ * Finishes the operation started with e_source_unset_last_credentials_required_arguments().
+ *
+ * If an error occurs, the function sets @error and returns %FALSE.
+ *
+ * Returns: %TRUE on success, %FALSE on error
+ *
+ * Since: 3.18
+ **/
+gboolean
+e_source_unset_last_credentials_required_arguments_finish (ESource *source,
+                                                          GAsyncResult *result,
+                                                          GError **error)
+{
+       g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
+       g_return_val_if_fail (g_task_is_valid (result, source), FALSE);
+
+       g_return_val_if_fail (
+               g_async_result_is_tagged (
+               result, e_source_unset_last_credentials_required_arguments), FALSE);
+
+       return g_task_propagate_boolean (G_TASK (result), error);
+}
diff --git a/libedataserver/e-source.h b/libedataserver/e-source.h
index 81a70c8..8c645b5 100644
--- a/libedataserver/e-source.h
+++ b/libedataserver/e-source.h
@@ -416,6 +416,19 @@ gboolean   e_source_get_last_credentials_required_arguments_finish
                                                 GTlsCertificateFlags *out_certificate_errors,
                                                 GError **out_op_error,
                                                 GError **error);
+gboolean       e_source_unset_last_credentials_required_arguments_sync
+                                               (ESource *source,
+                                                GCancellable *cancellable,
+                                                GError **error);
+void           e_source_unset_last_credentials_required_arguments
+                                               (ESource *source,
+                                                GCancellable *cancellable,
+                                                GAsyncReadyCallback callback,
+                                                gpointer user_data);
+gboolean       e_source_unset_last_credentials_required_arguments_finish
+                                               (ESource *source,
+                                                GAsyncResult *result,
+                                                GError **error);
 
 G_END_DECLS
 
diff --git a/private/org.gnome.evolution.dataserver.Source.xml 
b/private/org.gnome.evolution.dataserver.Source.xml
index fba2fa5..b1db680 100644
--- a/private/org.gnome.evolution.dataserver.Source.xml
+++ b/private/org.gnome.evolution.dataserver.Source.xml
@@ -79,7 +79,8 @@
       @since: 3.16
 
       Returns the last arguments used to the call of CredentialsRequired().
-      The values are automatically unset with the Authenticate() call.
+      The values are automatically unset with the Authenticate() call or
+      with an explicit call to UnsetLastCredentialsRequiredArguments().
   -->
   <method name="GetLastCredentialsRequiredArguments">
     <arg name="reason" direction="out" type="s"/>
@@ -90,6 +91,16 @@
   </method>
 
   <!--
+      UnsetLastCredentialsRequiredArguments:
+      @since: 3.18
+
+      Unsets the last arguments used to the call of CredentialsRequired().
+      The values are automatically unset with the Authenticate() call too.
+  -->
+  <method name="UnsetLastCredentialsRequiredArguments">
+  </method>
+
+  <!--
       Authenticate:
       @credentials: provided credentials, in a GKeyFile format
       @since: 3.16


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]