Skip to content

Commit 32cfbe5

Browse files
committed
Validate mediation related messages in MuSig trade service
1 parent d9e0991 commit 32cfbe5

13 files changed

Lines changed: 611 additions & 197 deletions

File tree

support/src/main/java/bisq/support/arbitration/mu_sig/MuSigArbitrationRequest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import bisq.contract.mu_sig.MuSigContract;
2525
import bisq.network.identity.NetworkId;
2626
import bisq.network.p2p.message.ExternalNetworkMessage;
27+
import bisq.network.p2p.message.SenderPublicKeyProvidingPayload;
2728
import bisq.network.p2p.services.confidential.ack.AckRequestingMessage;
2829
import bisq.network.p2p.services.data.storage.MetaData;
2930
import bisq.network.p2p.services.data.storage.mailbox.MailboxMessage;
@@ -36,10 +37,9 @@
3637
import lombok.ToString;
3738
import lombok.extern.slf4j.Slf4j;
3839

39-
import java.util.Arrays;
40+
import java.security.PublicKey;
4041
import java.util.Collections;
4142
import java.util.List;
42-
import java.util.Objects;
4343
import java.util.stream.Collectors;
4444

4545
import static bisq.network.p2p.services.data.storage.MetaData.HIGH_PRIORITY;
@@ -50,7 +50,8 @@
5050
@Getter
5151
@ToString
5252
@EqualsAndHashCode
53-
public final class MuSigArbitrationRequest implements MailboxMessage, ExternalNetworkMessage, AckRequestingMessage {
53+
public final class MuSigArbitrationRequest implements
54+
MailboxMessage, ExternalNetworkMessage, AckRequestingMessage, SenderPublicKeyProvidingPayload {
5455
public static String createMessageId(String tradeId) {
5556
return MuSigArbitrationRequest.class.getSimpleName() + "." + tradeId;
5657
}
@@ -165,6 +166,11 @@ public double getCostFactor() {
165166
return getCostFactor(0.25, 0.5);
166167
}
167168

169+
@Override
170+
public PublicKey getSenderPublicKey() {
171+
return requester.getPublicKey();
172+
}
173+
168174
private List<MuSigOpenTradeMessage> maybePrune(List<MuSigOpenTradeMessage> chatMessages) {
169175
StringBuilder sb = new StringBuilder();
170176
List<MuSigOpenTradeMessage> result = chatMessages.stream()

support/src/main/java/bisq/support/arbitration/mu_sig/MuSigArbitrationStateChangeMessage.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@
2222
import bisq.common.util.OptionalUtils;
2323
import bisq.common.validation.NetworkDataValidation;
2424
import bisq.network.p2p.message.ExternalNetworkMessage;
25+
import bisq.network.p2p.message.SenderPublicKeyProvidingPayload;
2526
import bisq.network.p2p.services.data.storage.MetaData;
2627
import bisq.network.p2p.services.data.storage.mailbox.MailboxMessage;
2728
import bisq.support.arbitration.ArbitrationCaseState;
29+
import bisq.user.profile.UserProfile;
2830
import com.google.protobuf.ByteString;
2931
import com.google.protobuf.InvalidProtocolBufferException;
3032
import lombok.Getter;
3133
import lombok.ToString;
3234
import lombok.extern.slf4j.Slf4j;
3335

36+
import java.security.PublicKey;
3437
import java.util.Arrays;
3538
import java.util.Objects;
3639
import java.util.Optional;
@@ -41,21 +44,24 @@
4144
@Slf4j
4245
@Getter
4346
@ToString
44-
public final class MuSigArbitrationStateChangeMessage implements MailboxMessage, ExternalNetworkMessage {
47+
public final class MuSigArbitrationStateChangeMessage implements MailboxMessage, ExternalNetworkMessage, SenderPublicKeyProvidingPayload {
4548
private transient final MetaData metaData = new MetaData(TTL_10_DAYS, HIGH_PRIORITY, getClass().getSimpleName());
4649
private final String id;
4750
private final String tradeId;
51+
private final UserProfile senderUserProfile;
4852
private final ArbitrationCaseState arbitrationCaseState;
4953
private final Optional<MuSigArbitrationResult> muSigArbitrationResult;
5054
private final Optional<byte[]> arbitrationResultSignature;
5155

5256
public MuSigArbitrationStateChangeMessage(String id,
5357
String tradeId,
58+
UserProfile senderUserProfile,
5459
ArbitrationCaseState arbitrationCaseState,
5560
Optional<MuSigArbitrationResult> muSigArbitrationResult,
5661
Optional<byte[]> arbitrationResultSignature) {
5762
this.id = id;
5863
this.tradeId = tradeId;
64+
this.senderUserProfile = senderUserProfile;
5965
this.arbitrationCaseState = arbitrationCaseState;
6066
this.muSigArbitrationResult = muSigArbitrationResult;
6167
this.arbitrationResultSignature = arbitrationResultSignature.map(byte[]::clone);
@@ -74,6 +80,7 @@ public bisq.support.protobuf.MuSigArbitrationStateChangeMessage.Builder getValue
7480
bisq.support.protobuf.MuSigArbitrationStateChangeMessage.Builder builder = bisq.support.protobuf.MuSigArbitrationStateChangeMessage.newBuilder()
7581
.setId(id)
7682
.setTradeId(tradeId)
83+
.setSenderUserProfile(senderUserProfile.toProto(serializeForHash))
7784
.setArbitrationCaseState(arbitrationCaseState.toProtoEnum());
7885
muSigArbitrationResult.ifPresent(result -> builder.setMuSigArbitrationResult(result.toProto(serializeForHash)));
7986
arbitrationResultSignature.ifPresent(signature -> builder.setArbitrationResultSignature(ByteString.copyFrom(signature)));
@@ -84,6 +91,7 @@ public static MuSigArbitrationStateChangeMessage fromProto(bisq.support.protobuf
8491
return new MuSigArbitrationStateChangeMessage(
8592
proto.getId(),
8693
proto.getTradeId(),
94+
UserProfile.fromProto(proto.getSenderUserProfile()),
8795
ArbitrationCaseState.fromProto(proto.getArbitrationCaseState()),
8896
proto.hasMuSigArbitrationResult()
8997
? Optional.of(MuSigArbitrationResult.fromProto(proto.getMuSigArbitrationResult()))
@@ -110,6 +118,11 @@ public double getCostFactor() {
110118
return getCostFactor(0.1, 0.2);
111119
}
112120

121+
@Override
122+
public PublicKey getSenderPublicKey() {
123+
return senderUserProfile.getPublicKey();
124+
}
125+
113126
public Optional<byte[]> getArbitrationResultSignature() {
114127
return arbitrationResultSignature.map(byte[]::clone);
115128
}
@@ -121,14 +134,15 @@ public boolean equals(Object o) {
121134
}
122135
return Objects.equals(id, that.id) &&
123136
Objects.equals(tradeId, that.tradeId) &&
137+
Objects.equals(senderUserProfile, that.senderUserProfile) &&
124138
arbitrationCaseState == that.arbitrationCaseState &&
125139
Objects.equals(muSigArbitrationResult, that.muSigArbitrationResult) &&
126140
OptionalUtils.optionalByteArrayEquals(arbitrationResultSignature, that.arbitrationResultSignature);
127141
}
128142

129143
@Override
130144
public int hashCode() {
131-
int result = Objects.hash(id, tradeId, arbitrationCaseState, muSigArbitrationResult);
145+
int result = Objects.hash(id, tradeId, senderUserProfile, arbitrationCaseState, muSigArbitrationResult);
132146
result = 31 * result + arbitrationResultSignature.map(Arrays::hashCode).orElse(0);
133147
return result;
134148
}

support/src/main/java/bisq/support/mediation/mu_sig/MuSigMediationResultAcceptanceMessage.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@
4343
public final class MuSigMediationResultAcceptanceMessage implements MailboxMessage, ExternalNetworkMessage, SenderPublicKeyProvidingPayload {
4444
private transient final MetaData metaData = new MetaData(TTL_10_DAYS, HIGH_PRIORITY, getClass().getSimpleName());
4545
private final String tradeId;
46-
private final boolean mediationResultAccepted;
4746
private final UserProfile senderUserProfile;
47+
private final boolean mediationResultAccepted;
4848

49-
public MuSigMediationResultAcceptanceMessage(String tradeId, boolean mediationResultAccepted, UserProfile senderUserProfile) {
49+
public MuSigMediationResultAcceptanceMessage(String tradeId, UserProfile senderUserProfile, boolean mediationResultAccepted) {
5050
this.tradeId = tradeId;
51-
this.mediationResultAccepted = mediationResultAccepted;
5251
this.senderUserProfile = senderUserProfile;
52+
this.mediationResultAccepted = mediationResultAccepted;
5353

5454
verify();
5555
}
@@ -63,15 +63,15 @@ public void verify() {
6363
public bisq.support.protobuf.MuSigMediationResultAcceptanceMessage.Builder getValueBuilder(boolean serializeForHash) {
6464
return bisq.support.protobuf.MuSigMediationResultAcceptanceMessage.newBuilder()
6565
.setTradeId(tradeId)
66-
.setMediationResultAccepted(mediationResultAccepted)
67-
.setSenderUserProfile(senderUserProfile.toProto(serializeForHash));
66+
.setSenderUserProfile(senderUserProfile.toProto(serializeForHash))
67+
.setMediationResultAccepted(mediationResultAccepted);
6868
}
6969

7070
public static MuSigMediationResultAcceptanceMessage fromProto(bisq.support.protobuf.MuSigMediationResultAcceptanceMessage proto) {
7171
return new MuSigMediationResultAcceptanceMessage(
7272
proto.getTradeId(),
73-
proto.getMediationResultAccepted(),
74-
UserProfile.fromProto(proto.getSenderUserProfile())
73+
UserProfile.fromProto(proto.getSenderUserProfile()),
74+
proto.getMediationResultAccepted()
7575
);
7676
}
7777

support/src/main/java/bisq/support/mediation/mu_sig/MuSigMediationStateChangeMessage.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@
2222
import bisq.common.util.OptionalUtils;
2323
import bisq.common.validation.NetworkDataValidation;
2424
import bisq.network.p2p.message.ExternalNetworkMessage;
25+
import bisq.network.p2p.message.SenderPublicKeyProvidingPayload;
2526
import bisq.network.p2p.services.data.storage.MetaData;
2627
import bisq.network.p2p.services.data.storage.mailbox.MailboxMessage;
2728
import bisq.support.mediation.MediationCaseState;
29+
import bisq.user.profile.UserProfile;
2830
import com.google.protobuf.ByteString;
2931
import com.google.protobuf.InvalidProtocolBufferException;
3032
import lombok.Getter;
3133
import lombok.ToString;
3234
import lombok.extern.slf4j.Slf4j;
3335

36+
import java.security.PublicKey;
3437
import java.util.Arrays;
3538
import java.util.Objects;
3639
import java.util.Optional;
@@ -41,21 +44,24 @@
4144
@Slf4j
4245
@Getter
4346
@ToString
44-
public final class MuSigMediationStateChangeMessage implements MailboxMessage, ExternalNetworkMessage {
47+
public final class MuSigMediationStateChangeMessage implements MailboxMessage, ExternalNetworkMessage, SenderPublicKeyProvidingPayload {
4548
private transient final MetaData metaData = new MetaData(TTL_10_DAYS, HIGH_PRIORITY, getClass().getSimpleName());
4649
private final String id;
4750
private final String tradeId;
51+
private final UserProfile senderUserProfile;
4852
private final MediationCaseState mediationCaseState;
4953
private final Optional<MuSigMediationResult> muSigMediationResult;
5054
private final Optional<byte[]> mediationResultSignature;
5155

5256
public MuSigMediationStateChangeMessage(String id,
5357
String tradeId,
58+
UserProfile senderUserProfile,
5459
MediationCaseState mediationCaseState,
5560
Optional<MuSigMediationResult> muSigMediationResult,
5661
Optional<byte[]> mediationResultSignature) {
5762
this.id = id;
5863
this.tradeId = tradeId;
64+
this.senderUserProfile = senderUserProfile;
5965
this.mediationCaseState = mediationCaseState;
6066
this.muSigMediationResult = muSigMediationResult;
6167
this.mediationResultSignature = mediationResultSignature.map(byte[]::clone);
@@ -74,6 +80,7 @@ public bisq.support.protobuf.MuSigMediationStateChangeMessage.Builder getValueBu
7480
bisq.support.protobuf.MuSigMediationStateChangeMessage.Builder builder = bisq.support.protobuf.MuSigMediationStateChangeMessage.newBuilder()
7581
.setId(id)
7682
.setTradeId(tradeId)
83+
.setSenderUserProfile(senderUserProfile.toProto(serializeForHash))
7784
.setMediationCaseState(mediationCaseState.toProtoEnum());
7885
muSigMediationResult.ifPresent(result -> builder.setMuSigMediationResult(result.toProto(serializeForHash)));
7986
mediationResultSignature.ifPresent(signature -> builder.setMediationResultSignature(ByteString.copyFrom(signature)));
@@ -84,6 +91,7 @@ public static MuSigMediationStateChangeMessage fromProto(bisq.support.protobuf.M
8491
return new MuSigMediationStateChangeMessage(
8592
proto.getId(),
8693
proto.getTradeId(),
94+
UserProfile.fromProto(proto.getSenderUserProfile()),
8795
MediationCaseState.fromProto(proto.getMediationCaseState()),
8896
proto.hasMuSigMediationResult()
8997
? Optional.of(MuSigMediationResult.fromProto(proto.getMuSigMediationResult()))
@@ -110,6 +118,11 @@ public double getCostFactor() {
110118
return getCostFactor(0.1, 0.2);
111119
}
112120

121+
@Override
122+
public PublicKey getSenderPublicKey() {
123+
return senderUserProfile.getPublicKey();
124+
}
125+
113126
public Optional<byte[]> getMediationResultSignature() {
114127
return mediationResultSignature.map(byte[]::clone);
115128
}
@@ -121,14 +134,15 @@ public boolean equals(Object o) {
121134
}
122135
return Objects.equals(id, that.id) &&
123136
Objects.equals(tradeId, that.tradeId) &&
137+
Objects.equals(senderUserProfile, that.senderUserProfile) &&
124138
mediationCaseState == that.mediationCaseState &&
125139
Objects.equals(muSigMediationResult, that.muSigMediationResult) &&
126140
OptionalUtils.optionalByteArrayEquals(mediationResultSignature, that.mediationResultSignature);
127141
}
128142

129143
@Override
130144
public int hashCode() {
131-
int result = Objects.hash(id, tradeId, mediationCaseState, muSigMediationResult);
145+
int result = Objects.hash(id, tradeId, senderUserProfile, mediationCaseState, muSigMediationResult);
132146
result = 31 * result + mediationResultSignature.map(Arrays::hashCode).orElse(0);
133147
return result;
134148
}

0 commit comments

Comments
 (0)