Add report spam in message request state.

This commit is contained in:
Cody Henthorne
2021-05-17 09:43:37 -04:00
committed by Alex Hart
parent c47dcd5720
commit ef5b68eb35
31 changed files with 393 additions and 145 deletions

View File

@@ -641,6 +641,10 @@ public class SignalServiceAccountManager {
return this.pushServiceSocket.getCurrencyConversions();
}
public void reportSpam(String e164, String serverGuid) throws IOException {
this.pushServiceSocket.reportSpam(e164, serverGuid);
}
/**
* @return The avatar URL path, if one was written.
*/

View File

@@ -6,7 +6,6 @@
package org.whispersystems.signalservice.api;
import org.signal.zkgroup.VerificationFailedException;
import org.signal.zkgroup.profiles.ClientZkProfileOperations;
import org.signal.zkgroup.profiles.ProfileKey;
import org.whispersystems.libsignal.InvalidMessageException;
@@ -23,8 +22,6 @@ import org.whispersystems.signalservice.api.profiles.ProfileAndCredential;
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException;
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
import org.whispersystems.signalservice.api.util.CredentialsProvider;
import org.whispersystems.signalservice.api.util.SleepTimer;
import org.whispersystems.signalservice.api.util.UuidUtil;
@@ -300,8 +297,11 @@ public class SignalServiceMessageReceiver {
callback.onMessage(envelope);
results.add(envelope);
if (envelope.hasUuid()) socket.acknowledgeMessage(envelope.getUuid());
else socket.acknowledgeMessage(entity.getSourceE164(), entity.getTimestamp());
if (envelope.hasServerGuid()) {
socket.acknowledgeMessage(envelope.getServerGuid());
} else {
socket.acknowledgeMessage(entity.getSourceE164(), entity.getTimestamp());
}
}
return results;

View File

@@ -180,14 +180,14 @@ public class SignalServiceCipher {
SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, sourceAddress));
paddedMessage = sessionCipher.decrypt(new PreKeySignalMessage(ciphertext));
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false);
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false, envelope.getServerGuid());
sessionVersion = sessionCipher.getSessionVersion();
} else if (envelope.isSignalMessage()) {
SignalProtocolAddress sourceAddress = getPreferredProtocolAddress(signalProtocolStore, envelope.getSourceAddress(), envelope.getSourceDevice());
SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, sourceAddress));
paddedMessage = sessionCipher.decrypt(new SignalMessage(ciphertext));
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false);
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false, envelope.getServerGuid());
sessionVersion = sessionCipher.getSessionVersion();
} else if (envelope.isUnidentifiedSender()) {
SignalSealedSessionCipher sealedSessionCipher = new SignalSealedSessionCipher(sessionLock, new SealedSessionCipher(signalProtocolStore, localAddress.getUuid().orNull(), localAddress.getNumber().orNull(), 1));
@@ -196,7 +196,7 @@ public class SignalServiceCipher {
SignalProtocolAddress protocolAddress = getPreferredProtocolAddress(signalProtocolStore, resultAddress, result.getDeviceId());
paddedMessage = result.getPaddedMessage();
metadata = new SignalServiceMetadata(resultAddress, result.getDeviceId(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), true);
metadata = new SignalServiceMetadata(resultAddress, result.getDeviceId(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), true, envelope.getServerGuid());
sessionVersion = sealedSessionCipher.getSessionVersion(protocolAddress);
} else {
throw new InvalidMetadataMessageException("Unknown type: " + envelope.getType());

View File

@@ -69,6 +69,7 @@ public final class SignalServiceContent {
private final long serverDeliveredTimestamp;
private final boolean needsReceipt;
private final SignalServiceContentProto serializedState;
private final String serverUuid;
private final Optional<SignalServiceDataMessage> message;
private final Optional<SignalServiceSyncMessage> synchronizeMessage;
@@ -83,6 +84,7 @@ public final class SignalServiceContent {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
boolean needsReceipt,
String serverUuid,
SignalServiceContentProto serializedState)
{
this.sender = sender;
@@ -91,6 +93,7 @@ public final class SignalServiceContent {
this.serverReceivedTimestamp = serverReceivedTimestamp;
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
this.needsReceipt = needsReceipt;
this.serverUuid = serverUuid;
this.serializedState = serializedState;
this.message = Optional.fromNullable(message);
@@ -107,6 +110,7 @@ public final class SignalServiceContent {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
boolean needsReceipt,
String serverUuid,
SignalServiceContentProto serializedState)
{
this.sender = sender;
@@ -115,6 +119,7 @@ public final class SignalServiceContent {
this.serverReceivedTimestamp = serverReceivedTimestamp;
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
this.needsReceipt = needsReceipt;
this.serverUuid = serverUuid;
this.serializedState = serializedState;
this.message = Optional.absent();
@@ -131,6 +136,7 @@ public final class SignalServiceContent {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
boolean needsReceipt,
String serverUuid,
SignalServiceContentProto serializedState)
{
this.sender = sender;
@@ -139,6 +145,7 @@ public final class SignalServiceContent {
this.serverReceivedTimestamp = serverReceivedTimestamp;
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
this.needsReceipt = needsReceipt;
this.serverUuid = serverUuid;
this.serializedState = serializedState;
this.message = Optional.absent();
@@ -155,6 +162,7 @@ public final class SignalServiceContent {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
boolean needsReceipt,
String serverUuid,
SignalServiceContentProto serializedState)
{
this.sender = sender;
@@ -163,6 +171,7 @@ public final class SignalServiceContent {
this.serverReceivedTimestamp = serverReceivedTimestamp;
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
this.needsReceipt = needsReceipt;
this.serverUuid = serverUuid;
this.serializedState = serializedState;
this.message = Optional.absent();
@@ -179,6 +188,7 @@ public final class SignalServiceContent {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
boolean needsReceipt,
String serverUuid,
SignalServiceContentProto serializedState)
{
this.sender = sender;
@@ -187,6 +197,7 @@ public final class SignalServiceContent {
this.serverReceivedTimestamp = serverReceivedTimestamp;
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
this.needsReceipt = needsReceipt;
this.serverUuid = serverUuid;
this.serializedState = serializedState;
this.message = Optional.absent();
@@ -240,6 +251,10 @@ public final class SignalServiceContent {
return needsReceipt;
}
public String getServerUuid() {
return serverUuid;
}
public byte[] serialize() {
return serializedState.toByteArray();
}
@@ -276,6 +291,7 @@ public final class SignalServiceContent {
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.isNeedsReceipt(),
metadata.getServerGuid(),
serviceContentProto);
} else if (serviceContentProto.getDataCase() == SignalServiceContentProto.DataCase.CONTENT) {
SignalServiceProtos.Content message = serviceContentProto.getContent();
@@ -288,6 +304,7 @@ public final class SignalServiceContent {
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.isNeedsReceipt(),
metadata.getServerGuid(),
serviceContentProto);
} else if (message.hasSyncMessage() && localAddress.matches(metadata.getSender())) {
return new SignalServiceContent(createSynchronizeMessage(metadata, message.getSyncMessage()),
@@ -297,6 +314,7 @@ public final class SignalServiceContent {
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.isNeedsReceipt(),
metadata.getServerGuid(),
serviceContentProto);
} else if (message.hasCallMessage()) {
return new SignalServiceContent(createCallMessage(message.getCallMessage()),
@@ -306,6 +324,7 @@ public final class SignalServiceContent {
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.isNeedsReceipt(),
metadata.getServerGuid(),
serviceContentProto);
} else if (message.hasReceiptMessage()) {
return new SignalServiceContent(createReceiptMessage(metadata, message.getReceiptMessage()),
@@ -315,6 +334,7 @@ public final class SignalServiceContent {
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.isNeedsReceipt(),
metadata.getServerGuid(),
serviceContentProto);
} else if (message.hasTypingMessage()) {
return new SignalServiceContent(createTypingMessage(metadata, message.getTypingMessage()),
@@ -324,6 +344,7 @@ public final class SignalServiceContent {
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
false,
metadata.getServerGuid(),
serviceContentProto);
}
}

View File

@@ -9,29 +9,14 @@ package org.whispersystems.signalservice.api.messages;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import org.whispersystems.libsignal.InvalidVersionException;
import org.whispersystems.libsignal.logging.Log;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.UuidUtil;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope;
import org.whispersystems.signalservice.internal.serialize.protos.SignalServiceEnvelopeProto;
import org.whispersystems.signalservice.internal.util.Hex;
import org.whispersystems.util.Base64;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.Mac;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* This class represents an encrypted Signal Service envelope.
@@ -129,11 +114,11 @@ public class SignalServiceEnvelope {
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
}
public String getUuid() {
public String getServerGuid() {
return envelope.getServerGuid();
}
public boolean hasUuid() {
public boolean hasServerGuid() {
return envelope.hasServerGuid();
}
@@ -285,8 +270,8 @@ public class SignalServiceEnvelope {
builder.setContent(ByteString.copyFrom(getContent()));
}
if (hasUuid()) {
builder.setServerGuid(getUuid());
if (hasServerGuid()) {
builder.setServerGuid(getServerGuid());
}
return builder.build().toByteArray();

View File

@@ -9,13 +9,15 @@ public final class SignalServiceMetadata {
private final long serverReceivedTimestamp;
private final long serverDeliveredTimestamp;
private final boolean needsReceipt;
private final String serverGuid;
public SignalServiceMetadata(SignalServiceAddress sender,
int senderDevice,
long timestamp,
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
boolean needsReceipt)
boolean needsReceipt,
String serverGuid)
{
this.sender = sender;
this.senderDevice = senderDevice;
@@ -23,6 +25,7 @@ public final class SignalServiceMetadata {
this.serverReceivedTimestamp = serverReceivedTimestamp;
this.serverDeliveredTimestamp = serverDeliveredTimestamp;
this.needsReceipt = needsReceipt;
this.serverGuid = serverGuid;
}
public SignalServiceAddress getSender() {
@@ -48,4 +51,8 @@ public final class SignalServiceMetadata {
public boolean isNeedsReceipt() {
return needsReceipt;
}
public String getServerGuid() {
return serverGuid;
}
}

View File

@@ -225,6 +225,8 @@ public class PushServiceSocket {
private static final String SUBMIT_RATE_LIMIT_CHALLENGE = "/v1/challenge";
private static final String REQUEST_RATE_LIMIT_PUSH_CHALLENGE = "/v1/challenge/push";
private static final String REPORT_SPAM = "/v1/messages/report/%s/%s";
private static final String SERVER_DELIVERED_TIMESTAMP_HEADER = "X-Signal-Timestamp";
private static final Map<String, String> NO_HEADERS = Collections.emptyMap();
@@ -1500,7 +1502,7 @@ public class PushServiceSocket {
throw new ServerRejectedException();
}
if (responseCode != 200 && responseCode != 204) {
if (responseCode != 200 && responseCode != 202 && responseCode != 204) {
throw new NonSuccessfulResponseCodeException(responseCode, "Bad response: " + responseCode + " " + responseMessage);
}
@@ -2188,6 +2190,12 @@ public class PushServiceSocket {
}
}
public void reportSpam(String e164, String serverGuid)
throws NonSuccessfulResponseCodeException, MalformedResponseException, PushNetworkException
{
makeServiceRequest(String.format(REPORT_SPAM, e164, serverGuid), "POST", "");
}
public static final class GroupHistory {
private final GroupChanges groupChanges;
private final Optional<ContentRange> contentRange;

View File

@@ -16,15 +16,17 @@ public final class SignalServiceMetadataProtobufSerializer {
.setTimestamp(metadata.getTimestamp())
.setServerReceivedTimestamp(metadata.getServerReceivedTimestamp())
.setServerDeliveredTimestamp(metadata.getServerDeliveredTimestamp())
.setServerGuid(metadata.getServerGuid())
.build();
}
public static SignalServiceMetadata fromProtobuf(MetadataProto metadata) {
return new SignalServiceMetadata(SignalServiceAddressProtobufSerializer.fromProtobuf(metadata.getAddress()),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.getNeedsReceipt());
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerReceivedTimestamp(),
metadata.getServerDeliveredTimestamp(),
metadata.getNeedsReceipt(),
metadata.getServerGuid());
}
}

View File

@@ -41,6 +41,7 @@ message MetadataProto {
optional int64 serverReceivedTimestamp = 5;
optional int64 serverDeliveredTimestamp = 6;
optional bool needsReceipt = 4;
optional string serverGuid = 7;
}
message AddressProto {