donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit 6f115b9c5e08c8192fb15e66b10c644a8a18b3f2
parent fc07b2f9d447ed3d1c0e6bcc902b1bd2b7f0ff3d
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date:   Tue,  7 May 2024 12:22:17 +0200

[donau] add csr route (to be changed)

Diffstat:
Msrc/donau/donau-httpd.c | 13+++++++++----
Asrc/donau/donau-httpd_csr.c | 166+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/donau/donau-httpd_csr.h | 43+++++++++++++++++++++++++++++++++++++++++++
3 files changed, 218 insertions(+), 4 deletions(-)

diff --git a/src/donau/donau-httpd.c b/src/donau/donau-httpd.c @@ -494,16 +494,21 @@ handle_mhd_request (void *cls, .url = "charities", .method = MHD_HTTP_METHOD_DELETE, .handler.delete = &DH_handler_charity_delete, - .nargs = 1, - .nargs_is_upper_bound = true + .nargs = 1 }, + // /* POST get csr values*/ + // { + // .url = "csr-issue", + // .method = MHD_HTTP_METHOD_POST, + // .handler.post = &DH_handler_csr_issue, + // .nargs = 0 + // }, /* POST batch issue receipts */ { .url = "batch-issue", .method = MHD_HTTP_METHOD_POST, .handler.post = &DH_handler_issue_receipts_post, - .nargs = 1, - .nargs_is_upper_bound = true + .nargs = 1 }, /* POST submitted receipts */ { diff --git a/src/donau/donau-httpd_csr.c b/src/donau/donau-httpd_csr.c @@ -0,0 +1,166 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 <http://www.gnu.org/licenses/> +*/ +/** + * @file donau-httpd_csr.c + * @brief Handle /csr requests + * @author Lucien Heuzeveldt + * @author Gian Demarmles + * @author Christian Grothoff + */ +#include <taler/platform.h> +#include <gnunet/gnunet_util_lib.h> +#include <jansson.h> +#include <microhttpd.h> +#include <pthread.h> +#include <taler/taler_json_lib.h> +#include <taler/taler_mhd_lib.h> +#include <taler/taler_signatures.h> +#include "donaudb_plugin.h" +#include "donau-httpd_csr.h" + + +/** + * Maximum number of csr records we return per request. + */ +#define MAX_RECORDS 1024 + + +MHD_RESULT +DH_handler_csr_issue (struct DH_RequestContext *rc, + const json_t *root, + const char *const args[]) +{ + struct GNUNET_CRYPTO_CsSessionNonce nonce; + struct TALER_DenominationHashP denom_pub_hash; + struct GNUNET_CRYPTO_BlindingInputValues ewv = { + .cipher = GNUNET_CRYPTO_BSA_CS + }; + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_fixed_auto ("nonce", + &nonce), + GNUNET_JSON_spec_fixed_auto ("denom_pub_hash", + &denom_pub_hash), + GNUNET_JSON_spec_end () + }; + struct TEH_DenominationKey *dk; + + (void) args; + { + enum GNUNET_GenericReturnValue res; + + res = TALER_MHD_parse_json_data (rc->connection, + root, + spec); + if (GNUNET_OK != res) + return (GNUNET_SYSERR == res) ? MHD_NO : MHD_YES; + } + + { + struct TEH_KeyStateHandle *ksh; + + ksh = TEH_keys_get_state (); + if (NULL == ksh) + { + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_EXCHANGE_GENERIC_KEYS_MISSING, + NULL); + } + dk = TEH_keys_denomination_by_hash_from_state (ksh, + &denom_pub_hash, + NULL, + NULL); + if (NULL == dk) + { + return TEH_RESPONSE_reply_unknown_denom_pub_hash ( + rc->connection, + &denom_pub_hash); + } + if (GNUNET_TIME_absolute_is_past (dk->meta.expire_withdraw.abs_time)) + { + /* This denomination is past the expiration time for withdraws/refreshes*/ + return TEH_RESPONSE_reply_expired_denom_pub_hash ( + rc->connection, + &denom_pub_hash, + TALER_EC_EXCHANGE_GENERIC_DENOMINATION_EXPIRED, + "csr-withdraw"); + } + if (GNUNET_TIME_absolute_is_future (dk->meta.start.abs_time)) + { + /* This denomination is not yet valid, no need to check + for idempotency! */ + return TEH_RESPONSE_reply_expired_denom_pub_hash ( + rc->connection, + &denom_pub_hash, + TALER_EC_EXCHANGE_GENERIC_DENOMINATION_VALIDITY_IN_FUTURE, + "csr-withdraw"); + } + if (dk->recoup_possible) + { + /* This denomination has been revoked */ + return TEH_RESPONSE_reply_expired_denom_pub_hash ( + rc->connection, + &denom_pub_hash, + TALER_EC_EXCHANGE_GENERIC_DENOMINATION_REVOKED, + "csr-withdraw"); + } + if (GNUNET_CRYPTO_BSA_CS != + dk->denom_pub.bsign_pub_key->cipher) + { + /* denomination is valid but not for CS */ + return TEH_RESPONSE_reply_invalid_denom_cipher_for_operation ( + rc->connection, + &denom_pub_hash); + } + } + + /* derive r_pub */ + { + enum TALER_ErrorCode ec; + const struct TEH_CsDeriveData cdd = { + .h_denom_pub = &denom_pub_hash, + .nonce = &nonce + }; + + ec = TEH_keys_denomination_cs_r_pub (&cdd, + false, + &ewv.details.cs_values); + if (TALER_EC_NONE != ec) + { + GNUNET_break (0); + return TALER_MHD_reply_with_ec (rc->connection, + ec, + NULL); + } + } + { + struct TALER_ExchangeWithdrawValues exw = { + .blinding_inputs = &ewv + }; + + return TALER_MHD_REPLY_JSON_PACK ( + rc->connection, + MHD_HTTP_OK, + TALER_JSON_pack_exchange_withdraw_values ("ewv", + &exw)); + } +} + + +/* end of donau-httpd_csr.c */ diff --git a/src/donau/donau-httpd_csr.h b/src/donau/donau-httpd_csr.h @@ -0,0 +1,43 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 <http://www.gnu.org/licenses/> +*/ +/** + * @file donau-httpd_csr.h + * @brief Handle /csr-* requests + * @author Lucien Heuzeveldt + * @author Gian Demarmles + */ +#ifndef DONAU_HTTPD_CSR_H +#define DONAU_HTTPD_CSR_H + +#include <microhttpd.h> +#include "donau-httpd.h" +#include "donaudb_plugin.h" + + +/** + * Handle a "/csr-issue" request. + * + * @param rc request context + * @param root uploaded JSON data + * @param args empty array + * @return MHD result code + */ +MHD_RESULT +DH_handler_csr_issue (struct DH_RequestContext *rc, + const json_t *root, + const char *const args[]); + +#endif