diff options
| author | Milan Crha <mcrha@redhat.com> | 2014-05-13 01:47:16 +0800 |
|---|---|---|
| committer | Milan Crha <mcrha@redhat.com> | 2014-05-13 01:47:16 +0800 |
| commit | d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9 (patch) | |
| tree | bdc2d2362021b2da8b8b0eaab55ca28af61122ca /e-util | |
| parent | 4508696844c20530bdf7fe6150c432eb16a9c77b (diff) | |
| download | gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.gz gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.bz2 gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.lz gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.xz gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.tar.zst gsoc2013-evolution-d46ad6d3cd44c3c9b730566cbd7719c2961a9bc9.zip | |
Bug #678843 - May re-prompt password on account re-enable
Diffstat (limited to 'e-util')
| -rw-r--r-- | e-util/e-client-cache.c | 20 | ||||
| -rw-r--r-- | e-util/e-client-selector.c | 94 | ||||
| -rw-r--r-- | e-util/e-client-selector.h | 2 | ||||
| -rw-r--r-- | e-util/e-misc-utils.c | 66 | ||||
| -rw-r--r-- | e-util/e-misc-utils.h | 14 |
5 files changed, 184 insertions, 12 deletions
diff --git a/e-util/e-client-cache.c b/e-util/e-client-cache.c index 215c470a88..19bfa8efd6 100644 --- a/e-util/e-client-cache.c +++ b/e-util/e-client-cache.c @@ -656,6 +656,21 @@ client_cache_cal_connect_cb (GObject *source_object, } static void +client_cache_source_allow_auth_prompt_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GError *local_error = NULL; + + e_source_allow_auth_prompt_finish (E_SOURCE (source_object), result, &local_error); + + if (local_error) { + g_debug ("%s: Failed with: %s", G_STRFUNC, local_error->message); + g_clear_error (&local_error); + } +} + +static void client_cache_source_removed_cb (ESourceRegistry *registry, ESource *source, GWeakRef *weak_ref) @@ -680,6 +695,11 @@ client_cache_source_disabled_cb (ESourceRegistry *registry, client_cache = g_weak_ref_get (weak_ref); if (client_cache != NULL) { + /* There is not much interest in the result, it just + makes sure a password prompt will be shown the next + time it is needed. */ + e_source_allow_auth_prompt (source, NULL, client_cache_source_allow_auth_prompt_done_cb, NULL); + client_ht_remove (client_cache, source); g_object_unref (client_cache); } diff --git a/e-util/e-client-selector.c b/e-util/e-client-selector.c index 74e875cb5f..01ff2d432d 100644 --- a/e-util/e-client-selector.c +++ b/e-util/e-client-selector.c @@ -515,6 +515,7 @@ e_client_selector_ref_client_cache (EClientSelector *selector) * e_client_selector_get_client_sync: * @selector: an #ESourceSelector * @source: an #ESource + * @call_allow_auth_prompt: whether call allow-auth-prompt on the source first * @cancellable: optional #GCancellable object, or %NULL * @error: return location for a #GError, or %NULL * @@ -539,6 +540,7 @@ e_client_selector_ref_client_cache (EClientSelector *selector) EClient * e_client_selector_get_client_sync (EClientSelector *selector, ESource *source, + gboolean call_allow_auth_prompt, GCancellable *cancellable, GError **error) { @@ -552,7 +554,7 @@ e_client_selector_get_client_sync (EClientSelector *selector, closure = e_async_closure_new (); e_client_selector_get_client ( - selector, source, cancellable, + selector, source, call_allow_auth_prompt, cancellable, e_async_closure_callback, closure); result = e_async_closure_wait (closure); @@ -600,10 +602,64 @@ client_selector_get_client_done_cb (GObject *source_object, g_object_unref (simple); } +typedef struct _AllowAuthPromptData +{ + EClientSelector *selector; + GSimpleAsyncResult *simple; + GCancellable *cancellable; +} AllowAuthPromptData; + +static void +client_selector_allow_auth_prompt_done_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + AllowAuthPromptData *data; + ESource *source; + GError *local_error = NULL; + + g_return_if_fail (E_IS_SOURCE (source_object)); + g_return_if_fail (user_data != NULL); + + data = user_data; + source = E_SOURCE (source_object); + + e_source_allow_auth_prompt_finish (source, result, &local_error); + + if (local_error) { + g_simple_async_result_take_error (data->simple, local_error); + g_simple_async_result_complete (data->simple); + + g_clear_error (&local_error); + } else { + EClientCache *client_cache; + const gchar *extension_name; + + extension_name = e_source_selector_get_extension_name ( + E_SOURCE_SELECTOR (data->selector)); + + client_cache = e_client_selector_ref_client_cache (data->selector); + + e_client_cache_get_client ( + client_cache, source, + extension_name, data->cancellable, + client_selector_get_client_done_cb, + g_object_ref (data->simple)); + + g_object_unref (client_cache); + } + + g_clear_object (&data->selector); + g_clear_object (&data->simple); + g_clear_object (&data->cancellable); + g_free (data); +} + /** * e_client_selector_get_client: * @selector: an #ESourceSelector * @source: an #ESource + * @call_allow_auth_prompt: whether call allow-auth-prompt on the source first * @cancellable: optional #GCancellable object, or %NULL * @callback: a #GAsyncReadyCallback to call when the request is satisfied * @user_data: data to pass to the callback function @@ -627,13 +683,12 @@ client_selector_get_client_done_cb (GObject *source_object, void e_client_selector_get_client (EClientSelector *selector, ESource *source, + gboolean call_allow_auth_prompt, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - EClientCache *client_cache; GSimpleAsyncResult *simple; - const gchar *extension_name; g_return_if_fail (E_IS_CLIENT_SELECTOR (selector)); g_return_if_fail (E_IS_SOURCE (source)); @@ -644,18 +699,33 @@ e_client_selector_get_client (EClientSelector *selector, g_simple_async_result_set_check_cancellable (simple, cancellable); - extension_name = e_source_selector_get_extension_name ( - E_SOURCE_SELECTOR (selector)); + if (call_allow_auth_prompt) { + AllowAuthPromptData *data; - client_cache = e_client_selector_ref_client_cache (selector); + data = g_new0 (AllowAuthPromptData, 1); + data->selector = g_object_ref (selector); + data->simple = g_object_ref (simple); + data->cancellable = cancellable ? g_object_ref (cancellable) : NULL; - e_client_cache_get_client ( - client_cache, source, - extension_name, cancellable, - client_selector_get_client_done_cb, - g_object_ref (simple)); + e_source_allow_auth_prompt (source, cancellable, + client_selector_allow_auth_prompt_done_cb, data); + } else { + EClientCache *client_cache; + const gchar *extension_name; - g_object_unref (client_cache); + extension_name = e_source_selector_get_extension_name ( + E_SOURCE_SELECTOR (selector)); + + client_cache = e_client_selector_ref_client_cache (selector); + + e_client_cache_get_client ( + client_cache, source, + extension_name, cancellable, + client_selector_get_client_done_cb, + g_object_ref (simple)); + + g_object_unref (client_cache); + } g_object_unref (simple); } diff --git a/e-util/e-client-selector.h b/e-util/e-client-selector.h index baf1753acc..c8d3e7108e 100644 --- a/e-util/e-client-selector.h +++ b/e-util/e-client-selector.h @@ -67,10 +67,12 @@ EClientCache * e_client_selector_ref_client_cache EClient * e_client_selector_get_client_sync (EClientSelector *selector, ESource *source, + gboolean call_allow_auth_prompt, GCancellable *cancellable, GError **error); void e_client_selector_get_client (EClientSelector *selector, ESource *source, + gboolean call_allow_auth_prompt, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); diff --git a/e-util/e-misc-utils.c b/e-util/e-misc-utils.c index 0f935d49af..3a52292af4 100644 --- a/e-util/e-misc-utils.c +++ b/e-util/e-misc-utils.c @@ -1964,6 +1964,72 @@ e_util_dup_searchable_categories (void) return g_list_reverse (res); } +gboolean +e_util_allow_auth_prompt_and_refresh_client_sync (EClient *client, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (E_IS_CLIENT (client), FALSE); + + if (!e_source_allow_auth_prompt_sync (e_client_get_source (client), cancellable, error)) + return FALSE; + + return e_client_refresh_sync (client, cancellable, error); +} + +static void +util_allow_auth_prompt_and_refresh_client_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + gboolean success; + GError *local_error = NULL; + + success = e_util_allow_auth_prompt_and_refresh_client_sync ( + E_CLIENT (source_object), + cancellable, &local_error); + + if (local_error != NULL) { + g_task_return_error (task, local_error); + } else { + g_task_return_boolean (task, success); + } +} + +void +e_util_allow_auth_prompt_and_refresh_client (EClient *client, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + g_return_if_fail (E_IS_CLIENT (client)); + + task = g_task_new (client, cancellable, callback, user_data); + g_task_set_source_tag (task, e_util_allow_auth_prompt_and_refresh_client); + + g_task_run_in_thread (task, util_allow_auth_prompt_and_refresh_client_thread); + + g_object_unref (task); +} + +gboolean +e_util_allow_auth_prompt_and_refresh_client_finish (EClient *client, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (E_IS_CLIENT (client), FALSE); + g_return_val_if_fail (g_task_is_valid (result, client), FALSE); + + g_return_val_if_fail ( + g_async_result_is_tagged ( + result, e_util_allow_auth_prompt_and_refresh_client), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + /** * e_binding_transform_color_to_string: * @binding: a #GBinding diff --git a/e-util/e-misc-utils.h b/e-util/e-misc-utils.h index f5b6c29bcd..33d8978a31 100644 --- a/e-util/e-misc-utils.h +++ b/e-util/e-misc-utils.h @@ -162,6 +162,20 @@ GSList * e_util_get_category_filter_options (void); GList * e_util_dup_searchable_categories (void); +gboolean e_util_allow_auth_prompt_and_refresh_client_sync + (EClient *client, + GCancellable *cancellable, + GError **error); +void e_util_allow_auth_prompt_and_refresh_client + (EClient *client, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean e_util_allow_auth_prompt_and_refresh_client_finish + (EClient *client, + GAsyncResult *result, + GError **error); + /* Useful GBinding transform functions */ gboolean e_binding_transform_color_to_string (GBinding *binding, |
