diff --git a/contrib/gana b/contrib/gana index 3a0709c68..f603a7959 160000 --- a/contrib/gana +++ b/contrib/gana @@ -1 +1 @@ -Subproject commit 3a0709c68490ba3c5612cdb1da36ee298097ebce +Subproject commit f603a795963748040e41693daceae343b3a972ed diff --git a/src/exchange/Makefile.am b/src/exchange/Makefile.am index b2365eecb..29596c381 100644 --- a/src/exchange/Makefile.am +++ b/src/exchange/Makefile.am @@ -155,6 +155,7 @@ taler_exchange_httpd_SOURCES = \ taler-exchange-httpd_mhd.c taler-exchange-httpd_mhd.h \ taler-exchange-httpd_purses_create.c taler-exchange-httpd_purses_create.h \ taler-exchange-httpd_purses_deposit.c taler-exchange-httpd_purses_deposit.h \ + taler-exchange-httpd_purses_delete.c taler-exchange-httpd_purses_delete.h \ taler-exchange-httpd_purses_get.c taler-exchange-httpd_purses_get.h \ taler-exchange-httpd_purses_merge.c taler-exchange-httpd_purses_merge.h \ taler-exchange-httpd_recoup.c taler-exchange-httpd_recoup.h \ diff --git a/src/exchange/taler-exchange-httpd.c b/src/exchange/taler-exchange-httpd.c index 691e1ef7d..4b64dfd54 100644 --- a/src/exchange/taler-exchange-httpd.c +++ b/src/exchange/taler-exchange-httpd.c @@ -50,6 +50,7 @@ #include "taler-exchange-httpd_purses_create.h" #include "taler-exchange-httpd_purses_deposit.h" #include "taler-exchange-httpd_purses_get.h" +#include "taler-exchange-httpd_purses_delete.h" #include "taler-exchange-httpd_purses_merge.h" #include "taler-exchange-httpd_recoup.h" #include "taler-exchange-httpd_recoup-refresh.h" diff --git a/src/exchange/taler-exchange-httpd_purses_delete.c b/src/exchange/taler-exchange-httpd_purses_delete.c new file mode 100644 index 000000000..34ab11b51 --- /dev/null +++ b/src/exchange/taler-exchange-httpd_purses_delete.c @@ -0,0 +1,129 @@ +/* + This file is part of TALER + Copyright (C) 2022 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU Affero General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with + TALER; see the file COPYING. If not, see +*/ +/** + * @file taler-exchange-httpd_purses_delete.c + * @brief Handle DELETE /purses/$PID requests; parses the request and + * verifies the signature before handing deletion to the database. + * @author Christian Grothoff + */ +#include "platform.h" +#include +#include +#include +#include +#include "taler_json_lib.h" +#include "taler_mhd_lib.h" +#include "taler-exchange-httpd_common_deposit.h" +#include "taler-exchange-httpd_purses_delete.h" +#include "taler-exchange-httpd_responses.h" +#include "taler_exchangedb_lib.h" +#include "taler-exchange-httpd_keys.h" + + +MHD_RESULT +TEH_handler_purses_delete ( + struct MHD_Connection *connection, + const struct TALER_PurseContractPublicKeyP *purse_pub) +{ + struct TALER_PurseContractSignatureP purse_sig; + bool found; + bool decided; + + { + const char *sig; + + sig = MHD_lookup_connection_value (connection, + MHD_HEADER_KIND, + "Taler-Purse-Signature"); + if ( (NULL == sig) || + (GNUNET_OK != + GNUNET_STRINGS_string_to_data (sig, + strlen (sig), + &purse_sig, + sizeof (purse_sig))) ) + { + GNUNET_break_op (0); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_BAD_REQUEST, + (NULL == sig) + ? TALER_EC_GENERIC_PARAMETER_MISSING + : TALER_EC_GENERIC_PARAMETER_MALFORMED, + "Taler-Purse-Signature"); + } + } + + if (GNUNET_OK != + TALER_wallet_purse_delete_verify (purse_pub, + &purse_sig)) + { + TALER_LOG_WARNING ("Invalid signature on /purses/$PID/delete request\n"); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_FORBIDDEN, + TALER_EC_EXCHANGE_PURSE_DELETE_SIGNATURE_INVALID, + NULL); + } + if (GNUNET_SYSERR == + TEH_plugin->preflight (TEH_plugin->cls)) + { + GNUNET_break (0); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_START_FAILED, + "preflight failure"); + } + + { + enum GNUNET_DB_QueryStatus qs; + + qs = TEH_plugin->do_purse_delete (TEH_plugin->cls, + purse_pub, + &purse_sig, + &decided, + &found); + if (qs <= 0) + { + TALER_LOG_WARNING ( + "Failed to store delete purse information in database\n"); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_STORE_FAILED, + "purse delete"); + } + } + if (! found) + { + return TALER_MHD_reply_with_ec ( + connection, + TALER_EC_EXCHANGE_GENERIC_PURSE_UNKNOWN, + NULL); + } + if (decided) + { + return TALER_MHD_reply_with_ec ( + connection, + TALER_EC_EXCHANGE_PURSE_DELETE_ALREADY_DECIDED, + NULL); + } + /* success */ + return TALER_MHD_reply_static (connection, + MHD_HTTP_NO_CONTENT, + NULL, + NULL, + 0); +} + + +/* end of taler-exchange-httpd_purses_delete.c */ diff --git a/src/exchange/taler-exchange-httpd_purses_delete.h b/src/exchange/taler-exchange-httpd_purses_delete.h new file mode 100644 index 000000000..15da21639 --- /dev/null +++ b/src/exchange/taler-exchange-httpd_purses_delete.h @@ -0,0 +1,42 @@ +/* + This file is part of TALER + Copyright (C) 2022 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU Affero General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with + TALER; see the file COPYING. If not, see +*/ +/** + * @file taler-exchange-httpd_purses_delete.h + * @brief Handle DELETE /purses/$PID requests + * @author Christian Grothoff + */ +#ifndef TALER_EXCHANGE_HTTPD_PURSES_DELETE_H +#define TALER_EXCHANGE_HTTPD_PURSES_DELETE_H + +#include +#include +#include "taler-exchange-httpd.h" + + +/** + * Handle a DELETE "/purses/$PURSE_PUB" request. + * + * @param connection the MHD connection to handle + * @param purse_pub public key of the purse + * @return MHD result code + */ +MHD_RESULT +TEH_handler_purses_delete ( + struct MHD_Connection *connection, + const struct TALER_PurseContractPublicKeyP *purse_pub); + + +#endif diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 5dcad4f71..5a55b5c93 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -5950,7 +5950,7 @@ struct TALER_EXCHANGEDB_Plugin void *cls, const struct TALER_PurseContractPublicKeyP *purse_pub, const struct TALER_PurseContractSignatureP *purse_sig, - bool *dediced, + bool *decided, bool *found);