Skip to content

Commit 3a3f23c

Browse files
committed
validate state on payment sent & received acks
1 parent 70a0322 commit 3a3f23c

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

core/src/main/java/haveno/core/trade/Trade.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,6 +2322,14 @@ public boolean isDisputeClosed() {
23222322
return getDisputeState().isClosed();
23232323
}
23242324

2325+
public boolean isPaymentMarkedSent() {
2326+
return getState().getPhase().ordinal() >= Phase.PAYMENT_SENT.ordinal();
2327+
}
2328+
2329+
public boolean isPaymentMarkedReceived() {
2330+
return getState().getPhase().ordinal() >= Phase.PAYMENT_RECEIVED.ordinal();
2331+
}
2332+
23252333
public boolean isPaymentReceived() {
23262334
return getState().getPhase().ordinal() >= Phase.PAYMENT_RECEIVED.ordinal() && getState() != State.SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG;
23272335
}

core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,10 @@ private void onAckMessageAux(AckMessage ackMessage, NodeAddress sender) {
817817

818818
// handle ack message for PaymentSentMessage, which automatically re-sends if not ACKed in a certain time
819819
if (ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName())) {
820+
if (!trade.isPaymentMarkedSent()) {
821+
log.warn("Received AckMessage for PaymentSentMessage but trade is in unexpected state, ignoring. Sender={}, trade={} {}, state={}, success={}, error={}, messageUid={}", sender, trade.getClass().getSimpleName(), trade.getId(), trade.getState(), ackMessage.isSuccess(), ackMessage.getErrorMessage(), ackMessage.getSourceUid());
822+
return;
823+
}
820824
if (peer == trade.getSeller()) {
821825
trade.getSeller().setPaymentSentAckMessage(ackMessage);
822826
if (ackMessage.isSuccess()) trade.setStateIfValidTransitionTo(Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG);
@@ -826,7 +830,7 @@ private void onAckMessageAux(AckMessage ackMessage, NodeAddress sender) {
826830
trade.getArbitrator().setPaymentSentAckMessage(ackMessage);
827831
processModel.getTradeManager().requestPersistence();
828832
} else {
829-
log.warn("Received AckMessage from unexpected peer for {}, sender={}, trade={} {}, messageUid={}, success={}, errorMsg={}", ackMessage.getSourceMsgClassName(), sender, trade.getClass().getSimpleName(), trade.getId(), ackMessage.getSourceUid(), ackMessage.isSuccess(), ackMessage.getErrorMessage());
833+
log.warn("Received AckMessage from unexpected peer. Sender={}, trade={} {}, state={}, success={}, error={}, messageUid={}", sender, trade.getClass().getSimpleName(), trade.getId(), trade.getState(), ackMessage.isSuccess(), ackMessage.getErrorMessage(), ackMessage.getSourceUid());
830834
return;
831835
}
832836
}
@@ -835,6 +839,12 @@ private void onAckMessageAux(AckMessage ackMessage, NodeAddress sender) {
835839
// TODO: trade state can be reset twice if both peers nack before published payout is detected
836840
// TODO: do not reset state if payment received message is acknowledged because payout is likely broadcast?
837841
if (ackMessage.getSourceMsgClassName().equals(PaymentReceivedMessage.class.getSimpleName())) {
842+
843+
// validate state
844+
if (!trade.isPaymentMarkedReceived()) {
845+
log.warn("Received AckMessage for PaymentReceivedMessage but trade is in unexpected state, ignoring. Sender={}, trade={} {}, state={}, success={}, error={}, messageUid={}", sender, trade.getClass().getSimpleName(), trade.getId(), trade.getState(), ackMessage.isSuccess(), ackMessage.getErrorMessage(), ackMessage.getSourceUid());
846+
return;
847+
}
838848

839849
// ack message from buyer
840850
if (peer == trade.getBuyer()) {
@@ -891,7 +901,7 @@ else if (peer == trade.getArbitrator()) {
891901
}
892902
}
893903
} else {
894-
log.warn("Received AckMessage from unexpected peer for {}, sender={}, trade={} {}, messageUid={}, success={}, errorMsg={}", ackMessage.getSourceMsgClassName(), sender, trade.getClass().getSimpleName(), trade.getId(), ackMessage.getSourceUid(), ackMessage.isSuccess(), ackMessage.getErrorMessage());
904+
log.warn("Received AckMessage from unexpected peer. Sender={}, trade={} {}, state={}, success={}, error={}, messageUid={}", sender, trade.getClass().getSimpleName(), trade.getId(), trade.getState(), ackMessage.isSuccess(), ackMessage.getErrorMessage(), ackMessage.getSourceUid());
895905
return;
896906
}
897907

0 commit comments

Comments
 (0)