diff options
author | Christian Grothoff <christian@grothoff.org> | 2022-06-28 13:28:27 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2022-06-28 13:28:27 +0200 |
commit | 9af1ca5d04d7a997b71157494336a4b9763f0a2f (patch) | |
tree | ccd933bb5b16bcc9e9a3437146650594afeb1617 | |
parent | 390f2207ab409889065723908f634d5f43b8a976 (diff) | |
download | anastasis-gtk-9af1ca5d04d7a997b71157494336a4b9763f0a2f.tar.gz anastasis-gtk-9af1ca5d04d7a997b71157494336a4b9763f0a2f.tar.bz2 anastasis-gtk-9af1ca5d04d7a997b71157494336a4b9763f0a2f.zip |
fix #7226: keep polling for providers
-rw-r--r-- | src/anastasis/anastasis-gtk_action.c | 212 | ||||
-rw-r--r-- | src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c | 6 |
2 files changed, 129 insertions, 89 deletions
diff --git a/src/anastasis/anastasis-gtk_action.c b/src/anastasis/anastasis-gtk_action.c index 05a4a86..0056e27 100644 --- a/src/anastasis/anastasis-gtk_action.c +++ b/src/anastasis/anastasis-gtk_action.c @@ -701,6 +701,107 @@ activate_by_method (json_t *methods) } +/** + * Function called with the results of #ANASTASIS_redux_action on "poll_providers". + * + * @param cls NULL + * @param error_code Error code + * @param response new state as result or config information of a provider + */ +static void +long_poll_providers_action_cb (void *cls, + enum TALER_ErrorCode error_code, + json_t *response); + + +/** + * Schedules the specified action. + * + * @param cls NULL + */ +static void +long_poll_providers_task (void *cls) +{ + struct ANASTASIS_LongAction *la = &AG_lacs[ANASTASIS_LP_POLL_PROVIDERS]; + json_t *tspec; + + (void) cls; + la->task = NULL; + if (GNUNET_TIME_absolute_is_future (la->next_time)) + { + la->task = GNUNET_SCHEDULER_add_at (la->next_time, + &long_poll_providers_task, + NULL); + return; + } + la->next_time = GNUNET_TIME_relative_to_absolute (LP_TIMEOUT); + tspec = GNUNET_JSON_PACK ( + GNUNET_JSON_pack_time_rel ("timeout", + LP_TIMEOUT)); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Starting long polling task for provider configurations\n"); + la->ra = ANASTASIS_redux_action (AG_redux_state, + "poll_providers", + tspec, + &long_poll_providers_action_cb, + NULL); + json_decref (tspec); +} + + +/** + * Check if all providers we care about are ready, + * and if not try to long poll them. + * + * @return false if we have no providers at all + */ +static bool +sync_providers (void) +{ + struct ANASTASIS_LongAction *la = &AG_lacs[ANASTASIS_LP_POLL_PROVIDERS]; + json_t *ap; + const char *url; + json_t *obj; + bool ready = false; + bool poll = false; + + ap = json_object_get (AG_redux_state, + "authentication_providers"); + json_object_foreach (ap, url, obj) + { + struct ANASTASIS_CRYPTO_ProviderSaltP provider_salt; + enum GNUNET_GenericReturnValue ret; + + ret = ANASTASIS_reducer_lookup_salt (AG_redux_state, + url, + &provider_salt); + switch (ret) + { + case GNUNET_OK: + ready = true; + break; + case GNUNET_NO: + poll = true; + break; + case GNUNET_SYSERR: + GNUNET_break (0); + break; + } + } + if (poll) + { + la->next_time = GNUNET_TIME_UNIT_ZERO_ABS; + la->task = GNUNET_SCHEDULER_add_now (&long_poll_providers_task, + NULL); + } + return ready || poll; +} + + +/** + * Allow the user to configure authorization methods from + * the set of methods offered by known providers. + */ static void action_authentications_editing (void) { @@ -709,6 +810,7 @@ action_authentications_editing (void) AG_hide_all_frames (); AG_insensitive_children ("anastasis_gtk_auth_button_grid"); + (void) sync_providers (); aps = json_object_get (AG_redux_state, "authentication_providers"); { @@ -765,7 +867,7 @@ action_authentications_editing (void) activate_by_method (methods); break; default: - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Status of provider `%s' is %u/%u\n", provider_url, (unsigned int) ec, @@ -2007,54 +2109,6 @@ long_poll_sync_action_cb (void *cls, /** - * Function called with the results of #ANASTASIS_redux_action on "poll_providers". - * - * @param cls NULL - * @param error_code Error code - * @param response new state as result or config information of a provider - */ -static void -long_poll_providers_action_cb (void *cls, - enum TALER_ErrorCode error_code, - json_t *response); - - -/** - * Schedules the specified action. - * - * @param cls NULL - */ -static void -long_poll_providers_task (void *cls) -{ - struct ANASTASIS_LongAction *la = &AG_lacs[ANASTASIS_LP_POLL_PROVIDERS]; - json_t *tspec; - - (void) cls; - la->task = NULL; - if (GNUNET_TIME_absolute_is_future (la->next_time)) - { - la->task = GNUNET_SCHEDULER_add_at (la->next_time, - &long_poll_providers_task, - NULL); - return; - } - la->next_time = GNUNET_TIME_relative_to_absolute (LP_TIMEOUT); - tspec = GNUNET_JSON_PACK ( - GNUNET_JSON_pack_time_rel ("timeout", - LP_TIMEOUT)); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Starting long polling task for provider configurations\n"); - la->ra = ANASTASIS_redux_action (AG_redux_state, - "poll_providers", - tspec, - &long_poll_providers_action_cb, - NULL); - json_decref (tspec); -} - - -/** * Start policy discovery process. Triggers download(s) * of the various provider configurations and (once we * have any) starts the policy discovery process. @@ -2088,11 +2142,27 @@ long_poll_providers_action_cb (void *cls, NULL); return; } - GNUNET_assert (NULL != AG_pd); - /* Find out which provider is new, merge that one! */ ap = json_object_get (response, "authentication_providers"); GNUNET_assert (NULL != ap); + if (NULL == AG_pd) + { + json_t *ns; + + /* Simply merge the state */ + ap = json_object_get (response, + "authentication_providers"); + ns = json_incref (AG_redux_state); + json_object_set (ns, + "authentication_providers", + ap); + AG_action_cb (NULL, + TALER_EC_NONE, + ns); + json_decref (ns); + return; + } + /* Find out which provider is new, merge that one! */ json_object_foreach (ap, url, obj) { struct ANASTASIS_CRYPTO_ProviderSaltP provider_salt; @@ -2120,55 +2190,21 @@ long_poll_providers_action_cb (void *cls, static void begin_discovery (void) { - struct ANASTASIS_LongAction *la = &AG_lacs[ANASTASIS_LP_POLL_PROVIDERS]; GtkListStore *ls; - json_t *ap; - const char *url; - json_t *obj; - bool ready = false; - bool poll = false; + bool have_providers; ls = GTK_LIST_STORE (GCG_get_main_window_object ( "secret_selection_liststore")); GNUNET_assert (NULL != ls); if (NULL == AG_pd) gtk_list_store_clear (ls); - ap = json_object_get (AG_redux_state, - "authentication_providers"); - json_object_foreach (ap, url, obj) - { - struct ANASTASIS_CRYPTO_ProviderSaltP provider_salt; - enum GNUNET_GenericReturnValue ret; - - ret = ANASTASIS_reducer_lookup_salt (AG_redux_state, - url, - &provider_salt); - switch (ret) - { - case GNUNET_OK: - ready = true; - break; - case GNUNET_NO: - poll = true; - break; - case GNUNET_SYSERR: - GNUNET_break (0); - break; - } - } - if (poll) - { - la->next_time = GNUNET_TIME_UNIT_ZERO_ABS; - la->task = GNUNET_SCHEDULER_add_now (&long_poll_providers_task, - NULL); - } + have_providers = sync_providers (); if (NULL == AG_pd) AG_pd = ANASTASIS_policy_discovery_start (AG_redux_state, NULL, &expand_policy_list, ls); - if ( (! ready) && - (! poll) ) + if (! have_providers) { AG_error (_ ("No available providers! Try to add one!")); } diff --git a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c index 091b1fb..3e55413 100644 --- a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c +++ b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c @@ -326,7 +326,11 @@ url_add_button_clicked_cb (GtkButton *button, /** - * FIXME. + * The user changed the URL of a provider to be possibly added. + * Validate the syntax and if it is a valid URL, enable the button. + * + * @param entry the edited widget + * @param user_data the dialog builder */ void url_entry_changed_cb (GtkEntry *entry, |