From 06fca9bd1ff85b91d71826ab3d2bff2d2ff8debe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 25 Jul 2024 17:35:53 +0100 Subject: [PATCH] reject tickets with more than a single payment --- .../websocket/connection_handler/authenticated.rs | 9 +++++++++ nym-api/nym-api-requests/src/ecash/models.rs | 5 +++++ nym-api/src/ecash/api_routes/spending.rs | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index 1f6a85cfa8..46f71b0e17 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -102,6 +102,11 @@ pub enum RequestHandlingError { #[error(transparent)] EcashFailure(EcashTicketError), + + #[error( + "the received payment contained more than a single ticket. that's currently not supported" + )] + MultipleTickets, } impl RequestHandlingError { @@ -413,6 +418,10 @@ where // check if the credential hasn't been spent before let serial_number = credential.data.encoded_serial_number(); + if credential.data.payment.spend_value != 1 { + return Err(RequestHandlingError::MultipleTickets); + } + self.check_credential_spending_date(credential.data.spend_date, spend_date.ecash_date())?; self.check_bloomfilter(&serial_number).await?; self.check_local_db_for_double_spending(&serial_number) diff --git a/nym-api/nym-api-requests/src/ecash/models.rs b/nym-api/nym-api-requests/src/ecash/models.rs index 395073afaa..ea5a0bf8af 100644 --- a/nym-api/nym-api-requests/src/ecash/models.rs +++ b/nym-api/nym-api-requests/src/ecash/models.rs @@ -96,6 +96,11 @@ pub enum EcashTicketVerificationRejection { #[error("failed to verify the provided ticket")] InvalidTicket, + + #[error( + "the received payment contained more than a single ticket. that's currently not supported" + )] + MultipleTickets, } // All strings are base58 encoded representations of structs diff --git a/nym-api/src/ecash/api_routes/spending.rs b/nym-api/src/ecash/api_routes/spending.rs index d6bb91ea21..63cd4fc5a1 100644 --- a/nym-api/src/ecash/api_routes/spending.rs +++ b/nym-api/src/ecash/api_routes/spending.rs @@ -37,6 +37,12 @@ pub async fn verify_ticket( ) -> crate::ecash::error::Result> { let credential_data = &verify_ticket_body.credential; let gateway_cosmos_addr = &verify_ticket_body.gateway_cosmos_addr; + + // easy check: is there only a single payment attached? + if credential_data.payment.spend_value != 1 { + return reject_ticket(EcashTicketVerificationRejection::MultipleTickets); + } + let sn = &credential_data.encoded_serial_number(); let spend_date = credential_data.spend_date; let epoch_id = credential_data.epoch_id;