From c76ed196f2bfe4077e15d69dd06857d60b409e0d Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 31 Dec 2021 11:47:06 +0100 Subject: show exact timeout frequency issue (#7054) --- src/anastasis/anastasis-gtk_action.c | 53 ++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 8 deletions(-) (limited to 'src/anastasis/anastasis-gtk_action.c') diff --git a/src/anastasis/anastasis-gtk_action.c b/src/anastasis/anastasis-gtk_action.c index 8ad386f..df6edb0 100644 --- a/src/anastasis/anastasis-gtk_action.c +++ b/src/anastasis/anastasis-gtk_action.c @@ -1671,10 +1671,12 @@ find_challenge_by_uuid (const char *uuid) * Translate the @a state into a localized, human-readable * string. * + * @param f full json state about the state * @param state a challenge state, as a string */ -static const char * -translate_state (const char *state) +static char * +translate_state (const json_t *f, + const char *state) { struct { @@ -1698,8 +1700,6 @@ translate_state (const char *state) { .in = "truth-unknown", .out = _ ("fatal: challenge unknown to provider; " "maybe you can solve another policy?") }, - { .in = "rate-limit-exceeded", - .out = _ ("wait, tries exceeded at this time") }, { .in = "authentication-timeout", .out = _ ("awaiting completion of authentication process") }, { .in = "external-instructions", @@ -1708,17 +1708,52 @@ translate_state (const char *state) .out = NULL } }; + if (0 == strcmp (state, + "rate-limit-exceeded")) + { + uint32_t request_limit; + struct GNUNET_TIME_Relative rf; + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_uint32 ("request_limit", + &request_limit), + GNUNET_JSON_spec_relative_time ("request_frequency", + &rf), + GNUNET_JSON_spec_end () + }; + char *reply; + + if (GNUNET_OK != + GNUNET_JSON_parse (f, + spec, + NULL, NULL)) + { + GNUNET_break (0); + json_dumpf (f, + stderr, + JSON_INDENT (2)); + return GNUNET_strdup ( + _ ("wait, tries exceeded at this time")); + + } + GNUNET_asprintf (&reply, + _ ("exceeded limit of %u attempts in %s"), + (unsigned int) request_limit, + GNUNET_TIME_relative2s (rf, + true)); + return reply; + } + for (unsigned int i = 0; NULL != state_map[i].in; i++) { if (0 != strcmp (state_map[i].in, state)) continue; - return state_map[i].out; + return GNUNET_strdup (state_map[i].out); } GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Could not localize unexpected state `%s'\n", state); - return state; + return GNUNET_strdup (state); } @@ -1826,15 +1861,17 @@ show_challenge_feedback (const char *uuid, } else { - const char *hint; + char *hint; GtkLabel *l; - hint = translate_state (state); + hint = translate_state (f, + state); l = GTK_LABEL (gtk_builder_get_object (builder, "hint_label")); gtk_label_set_text (l, hint); gtk_widget_show (GTK_WIDGET (l)); + GNUNET_free (hint); } if (0 == strcmp (state, "details")) -- cgit v1.2.3