[evolution-data-server/gnome-3-22] Bug 779161 - [Google Auth] Asks for re-sign when cannot reach server to refresh token



commit e389e4f926b839bc982702ee686c3d84cd5ff540
Author: Milan Crha <mcrha redhat com>
Date:   Tue Feb 28 18:20:01 2017 +0100

    Bug 779161 - [Google Auth] Asks for re-sign when cannot reach server to refresh token

 .../e-source-credentials-provider-impl-google.c    |    2 +-
 .../e-credentials-prompter-impl-google.c           |   21 ++++++++++++++++++-
 2 files changed, 20 insertions(+), 3 deletions(-)
---
diff --git a/libedataserver/e-source-credentials-provider-impl-google.c 
b/libedataserver/e-source-credentials-provider-impl-google.c
index e333cfa..3ae767e 100644
--- a/libedataserver/e-source-credentials-provider-impl-google.c
+++ b/libedataserver/e-source-credentials-provider-impl-google.c
@@ -673,7 +673,7 @@ e_source_credentials_google_util_decode_from_secret (const gchar *secret,
        g_return_val_if_fail (key1_name != NULL, FALSE);
        g_return_val_if_fail (out_value1 != NULL, FALSE);
 
-       if (!secret)
+       if (!secret || !*secret)
                return FALSE;
 
        parser = json_parser_new ();
diff --git a/libedataserverui/e-credentials-prompter-impl-google.c 
b/libedataserverui/e-credentials-prompter-impl-google.c
index 2e8fe3b..9c70183 100644
--- a/libedataserverui/e-credentials-prompter-impl-google.c
+++ b/libedataserverui/e-credentials-prompter-impl-google.c
@@ -58,6 +58,7 @@ struct _ECredentialsPrompterImplGooglePrivate {
        ESource *cred_source;
        gchar *error_text;
        ENamedParameters *credentials;
+       gboolean refresh_failed_with_transport_error;
 
        GtkDialog *dialog;
 #ifdef ENABLE_GOOGLE_AUTH
@@ -852,15 +853,19 @@ e_credentials_prompter_impl_google_manage_dialog_idle_cb (gpointer user_data)
 
        g_mutex_lock (&prompter_google->priv->property_lock);
        if (g_source_get_id (g_main_current_source ()) == prompter_google->priv->show_dialog_idle_id) {
-               gboolean success;
+               gboolean success, refresh_failed_with_transport_error;
 
                prompter_google->priv->show_dialog_idle_id = 0;
+               refresh_failed_with_transport_error = 
prompter_google->priv->refresh_failed_with_transport_error;
+
                g_mutex_unlock (&prompter_google->priv->property_lock);
 
                g_warn_if_fail (prompter_google->priv->dialog == NULL);
 
                if (e_named_parameters_exists (prompter_google->priv->credentials, 
E_SOURCE_CREDENTIAL_PASSWORD))
                        success = TRUE;
+               else if (refresh_failed_with_transport_error)
+                       success = FALSE;
                else
                        success = e_credentials_prompter_impl_google_show_dialog (prompter_google);
 
@@ -923,12 +928,20 @@ cpi_google_check_existing_token_thread (gpointer user_data)
 
        cancellable = td->cancellable;
 
+       prompter_google = g_weak_ref_get (td->prompter_google);
+       if (!prompter_google)
+               goto exit;
+
        if (g_cancellable_is_cancelled (cancellable))
                goto exit;
 
        if (!e_source_credentials_google_util_decode_from_secret (td->secret, E_GOOGLE_SECRET_REFRESH_TOKEN, 
&refresh_token, NULL))
                goto exit;
 
+       g_mutex_lock (&prompter_google->priv->property_lock);
+       prompter_google->priv->refresh_failed_with_transport_error = FALSE;
+       g_mutex_unlock (&prompter_google->priv->property_lock);
+
        if (refresh_token) {
                gchar *post_data, *response_json = NULL;
                guint soup_status;
@@ -954,6 +967,10 @@ cpi_google_check_existing_token_thread (gpointer user_data)
 
                        g_free (access_token);
                        g_free (expires_in);
+               } else if (SOUP_STATUS_IS_TRANSPORT_ERROR (soup_status)) {
+                       g_mutex_lock (&prompter_google->priv->property_lock);
+                       prompter_google->priv->refresh_failed_with_transport_error = TRUE;
+                       g_mutex_unlock (&prompter_google->priv->property_lock);
                }
 
                g_free (response_json);
@@ -961,7 +978,6 @@ cpi_google_check_existing_token_thread (gpointer user_data)
        }
 
  exit:
-       prompter_google = g_weak_ref_get (td->prompter_google);
        if (prompter_google && !g_cancellable_is_cancelled (cancellable)) {
                g_mutex_lock (&prompter_google->priv->property_lock);
                prompter_google->priv->show_dialog_idle_id = g_idle_add (
@@ -1052,6 +1068,7 @@ e_credentials_prompter_impl_google_process_prompt (ECredentialsPrompterImpl *pro
        } else {
 #endif /* ENABLE_GOOGLE_AUTH */
                g_mutex_lock (&prompter_google->priv->property_lock);
+               prompter_google->priv->refresh_failed_with_transport_error = FALSE;
                prompter_google->priv->show_dialog_idle_id = g_idle_add (
                        e_credentials_prompter_impl_google_manage_dialog_idle_cb,
                        prompter_google);


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