challenger

OAuth 2.0-based authentication service that validates user can receive messages at a certain address
Log | Files | Refs | Submodules | README | LICENSE

commit fd16b09121eada689a3e78639a505d5367e89561
parent d8eecc7b0329b7b05df5967b30ed4e525cacdc48
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat,  6 May 2023 21:20:01 +0200

return HTML errors in human-facing endpoints

Diffstat:
Msrc/challenger/challenger-httpd_challenge.c | 130++++++++++++++++++++++++++++----------------------------------------------------
Msrc/challenger/challenger-httpd_login.c | 54++++++++++++------------------------------------------
Msrc/challenger/challenger-httpd_solve.c | 158++++++++++++++++++-------------------------------------------------------------
3 files changed, 93 insertions(+), 249 deletions(-)

diff --git a/src/challenger/challenger-httpd_challenge.c b/src/challenger/challenger-httpd_challenge.c @@ -234,11 +234,12 @@ send_tan (struct ChallengeContext *bc) { MHD_RESULT mres; - // FIXME: generate HTML error instead... - mres = TALER_MHD_reply_with_error (bc->hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, - "pipe"); + GNUNET_break (0); + mres = TALER_TEMPLATING_reply_error (bc->hc->connection, + "internal-error", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, + "pipe"); bc->status = (MHD_YES == mres) ? GNUNET_NO : GNUNET_SYSERR; @@ -256,12 +257,13 @@ send_tan (struct ChallengeContext *bc) { MHD_RESULT mres; + GNUNET_break (0); GNUNET_DISK_pipe_close (p); - // FIXME: generate HTML error instead... - mres = TALER_MHD_reply_with_error (bc->hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, - "exec"); + mres = TALER_TEMPLATING_reply_error (bc->hc->connection, + "internal-error", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, + "exec"); bc->status = (MHD_YES == mres) ? GNUNET_NO : GNUNET_SYSERR; @@ -292,11 +294,12 @@ send_tan (struct ChallengeContext *bc) { MHD_RESULT mres; - // FIXME: generate HTML error instead... - mres = TALER_MHD_reply_with_error (bc->hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, - "write"); + GNUNET_break (0); + mres = TALER_TEMPLATING_reply_error (bc->hc->connection, + "internal-error", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, + "write"); bc->status = (MHD_YES == mres) ? GNUNET_NO : GNUNET_SYSERR; @@ -398,11 +401,11 @@ CH_handler_challenge (struct CH_HandlerContext *hc, sizeof (bc->nonce))) { GNUNET_break_op (0); - // FIXME: generate HTML error instead... - return TALER_MHD_reply_with_error (hc->connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_GENERIC_PARAMETER_MISSING, - hc->path); + return TALER_TEMPLATING_reply_error (hc->connection, + "invalid-request", + MHD_HTTP_NOT_FOUND, + TALER_EC_GENERIC_PARAMETER_MISSING, + hc->path); } TALER_MHD_check_content_length (hc->connection, 1024); @@ -423,11 +426,11 @@ CH_handler_challenge (struct CH_HandlerContext *hc, "%u/%d", (unsigned int) bc->exit_code, bc->pst); - // FIXME: generate HTML error instead... - return TALER_MHD_reply_with_error (hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, - es); + return TALER_TEMPLATING_reply_error (hc->connection, + "internal-error", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, + es); } /* handle upload */ if (0 != *upload_data_size) @@ -460,75 +463,32 @@ CH_handler_challenge (struct CH_HandlerContext *hc, switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - GNUNET_break (0); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - "internal-server-error.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + GNUNET_break (0); + return TALER_TEMPLATING_reply_error (hc->connection, + "internal-error", + MHD_HTTP_NOT_FOUND, + TALER_EC_GENERIC_DB_STORE_FAILED, + "set-address-and-pin"); case GNUNET_DB_STATUS_SOFT_ERROR: GNUNET_break (0); return GNUNET_NO; case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_NOT_FOUND, - "validation-unknown.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + return TALER_TEMPLATING_reply_error (hc->connection, + "validation-unknown", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_GENERIC_VALIDATION_UNKNOWN, + NULL); case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: break; } bc->db_finished = true; if (0 == bc->pin_attempts_left) { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_TOO_MANY_REQUESTS, - "attempts-exhausted.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; + return TALER_TEMPLATING_reply_error (hc->connection, + "attempts-exhausted", + MHD_HTTP_TOO_MANY_REQUESTS, + TALER_EC_CHALLENGER_TOO_MANY_ATTEMPTS, + NULL); } if (bc->retransmit) @@ -566,7 +526,7 @@ CH_handler_challenge (struct CH_HandlerContext *hc, ); ret = TALER_TEMPLATING_reply (hc->connection, MHD_HTTP_OK, - "enter-tan-form.must", + "enter-tan-form", NULL, NULL, args); diff --git a/src/challenger/challenger-httpd_login.c b/src/challenger/challenger-httpd_login.c @@ -143,51 +143,21 @@ CH_handler_login (struct CH_HandlerContext *hc, switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - GNUNET_break (0); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - "internal-server-error.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + GNUNET_break (0); + return TALER_TEMPLATING_reply_error (hc->connection, + "internal-error", + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_STORE_FAILED, + "login_start"); case GNUNET_DB_STATUS_SOFT_ERROR: GNUNET_break (0); return GNUNET_NO; case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_NOT_FOUND, - "validation-unknown.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + return TALER_TEMPLATING_reply_error (hc->connection, + "validation-unknown", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_GENERIC_VALIDATION_UNKNOWN, + NULL); case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: break; } @@ -208,7 +178,7 @@ CH_handler_login (struct CH_HandlerContext *hc, ret = TALER_TEMPLATING_reply ( hc->connection, MHD_HTTP_OK, - "enter-address-form.must", + "enter-address-form", NULL, NULL, args); diff --git a/src/challenger/challenger-httpd_solve.c b/src/challenger/challenger-httpd_solve.c @@ -152,10 +152,11 @@ CH_handler_solve (struct CH_HandlerContext *hc, sizeof (bc->nonce))) { GNUNET_break_op (0); - return TALER_MHD_reply_with_error (hc->connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_GENERIC_PARAMETER_MISSING, - hc->path); + return TALER_TEMPLATING_reply_error (hc->connection, + "invalid-request", + MHD_HTTP_BAD_REQUEST, + TALER_EC_CHALLENGER_HELPER_EXEC_FAILED, + hc->path); } TALER_MHD_check_content_length (hc->connection, 1024); @@ -185,25 +186,12 @@ CH_handler_solve (struct CH_HandlerContext *hc, &pin, &dummy)) { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); GNUNET_break_op (0); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_BAD_REQUEST, - "pin-must-be-number.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; + return TALER_TEMPLATING_reply_error (hc->connection, + "invalid-request", + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_PARAMETER_MALFORMED, + "pin"); } qs = CH_db->validate_solve_pin (CH_db->cls, @@ -213,74 +201,30 @@ CH_handler_solve (struct CH_HandlerContext *hc, switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - GNUNET_break (0); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - "internal-server-error.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + return TALER_TEMPLATING_reply_error (hc->connection, + "internal-error", + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_FETCH_FAILED, + "validate_solve_pin"); case GNUNET_DB_STATUS_SOFT_ERROR: GNUNET_break (0); return GNUNET_NO; case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_NOT_FOUND, - "validation-unknown.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + return TALER_TEMPLATING_reply_error (hc->connection, + "validation-unknown", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_GENERIC_VALIDATION_UNKNOWN, + NULL); case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: break; } if (! solved) { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_FORBIDDEN, - "invalid-pin.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; + return TALER_TEMPLATING_reply_error (hc->connection, + "invalid-pin", + MHD_HTTP_FORBIDDEN, + TALER_EC_CHALLENGER_INVALID_PIN, + NULL); } } @@ -306,51 +250,21 @@ CH_handler_solve (struct CH_HandlerContext *hc, switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - GNUNET_break (0); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - "internal-server-error.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + GNUNET_break (0); + return TALER_TEMPLATING_reply_error (hc->connection, + "internal-server-error", + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_FETCH_FAILED, + "validation_get"); case GNUNET_DB_STATUS_SOFT_ERROR: GNUNET_break (0); return GNUNET_NO; case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: - { - enum GNUNET_GenericReturnValue ret; - json_t *root = json_object (); - - GNUNET_assert (NULL != root); - ret = TALER_TEMPLATING_reply (hc->connection, - MHD_HTTP_NOT_FOUND, - "validation-unknown.must", - NULL, - NULL, - root); - json_decref (root); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return MHD_NO; - } - GNUNET_break (GNUNET_OK == ret); - return MHD_YES; - } + return TALER_TEMPLATING_reply_error (hc->connection, + "validation-unknown", + MHD_HTTP_NOT_FOUND, + TALER_EC_CHALLENGER_GENERIC_VALIDATION_UNKNOWN, + NULL); case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: break; }