Require that incoming messages have content
This commit is contained in:
parent
50f681ffe8
commit
1346fcb59e
|
@ -314,7 +314,7 @@ public class MessageController {
|
||||||
int totalContentLength = 0;
|
int totalContentLength = 0;
|
||||||
|
|
||||||
for (final IncomingMessage message : messages.messages()) {
|
for (final IncomingMessage message : messages.messages()) {
|
||||||
final int contentLength = message.content() != null ? message.content().length : 0;
|
final int contentLength = message.content().length;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
MessageSender.validateContentLength(contentLength, false, isSyncMessage, isStory, userAgent);
|
MessageSender.validateContentLength(contentLength, false, isSyncMessage, isStory, userAgent);
|
||||||
|
|
|
@ -10,6 +10,8 @@ import com.webauthn4j.converter.jackson.deserializer.json.ByteArrayBase64Deseria
|
||||||
import io.micrometer.core.instrument.Metrics;
|
import io.micrometer.core.instrument.Metrics;
|
||||||
import jakarta.validation.constraints.AssertTrue;
|
import jakarta.validation.constraints.AssertTrue;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import jakarta.validation.constraints.Size;
|
||||||
import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier;
|
import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier;
|
||||||
import org.whispersystems.textsecuregcm.identity.ServiceIdentifier;
|
import org.whispersystems.textsecuregcm.identity.ServiceIdentifier;
|
||||||
import org.whispersystems.textsecuregcm.metrics.MetricsUtil;
|
import org.whispersystems.textsecuregcm.metrics.MetricsUtil;
|
||||||
|
@ -22,6 +24,10 @@ public record IncomingMessage(int type,
|
||||||
int destinationRegistrationId,
|
int destinationRegistrationId,
|
||||||
|
|
||||||
@JsonDeserialize(using = ByteArrayBase64Deserializer.class)
|
@JsonDeserialize(using = ByteArrayBase64Deserializer.class)
|
||||||
|
@NotNull
|
||||||
|
// Note that max size is validated elsewhere in the interest of controlling responses and
|
||||||
|
// reporting additional metrics.
|
||||||
|
@Size(min = 1)
|
||||||
byte[] content) {
|
byte[] content) {
|
||||||
|
|
||||||
private static final String REJECT_INVALID_ENVELOPE_TYPE_COUNTER_NAME =
|
private static final String REJECT_INVALID_ENVELOPE_TYPE_COUNTER_NAME =
|
||||||
|
@ -57,9 +63,7 @@ public record IncomingMessage(int type,
|
||||||
envelopeBuilder.setReportSpamToken(ByteString.copyFrom(reportSpamToken));
|
envelopeBuilder.setReportSpamToken(ByteString.copyFrom(reportSpamToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content() != null && content().length > 0) {
|
|
||||||
envelopeBuilder.setContent(ByteString.copyFrom(content()));
|
envelopeBuilder.setContent(ByteString.copyFrom(content()));
|
||||||
}
|
|
||||||
|
|
||||||
return envelopeBuilder.build();
|
return envelopeBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,8 @@
|
||||||
package org.whispersystems.textsecuregcm.storage;
|
package org.whispersystems.textsecuregcm.storage;
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
@ -117,13 +115,12 @@ public class ChangeNumberManager {
|
||||||
final long serverTimestamp = System.currentTimeMillis();
|
final long serverTimestamp = System.currentTimeMillis();
|
||||||
|
|
||||||
messageSender.sendMessages(account, deviceMessages.stream()
|
messageSender.sendMessages(account, deviceMessages.stream()
|
||||||
.filter(message -> getMessageContent(message).isPresent())
|
|
||||||
.collect(Collectors.toMap(IncomingMessage::destinationDeviceId, message -> Envelope.newBuilder()
|
.collect(Collectors.toMap(IncomingMessage::destinationDeviceId, message -> Envelope.newBuilder()
|
||||||
.setType(Envelope.Type.forNumber(message.type()))
|
.setType(Envelope.Type.forNumber(message.type()))
|
||||||
.setClientTimestamp(serverTimestamp)
|
.setClientTimestamp(serverTimestamp)
|
||||||
.setServerTimestamp(serverTimestamp)
|
.setServerTimestamp(serverTimestamp)
|
||||||
.setDestinationServiceId(new AciServiceIdentifier(account.getUuid()).toServiceIdentifierString())
|
.setDestinationServiceId(new AciServiceIdentifier(account.getUuid()).toServiceIdentifierString())
|
||||||
.setContent(ByteString.copyFrom(getMessageContent(message).orElseThrow()))
|
.setContent(ByteString.copyFrom(message.content()))
|
||||||
.setSourceServiceId(new AciServiceIdentifier(account.getUuid()).toServiceIdentifierString())
|
.setSourceServiceId(new AciServiceIdentifier(account.getUuid()).toServiceIdentifierString())
|
||||||
.setSourceDevice(Device.PRIMARY_ID)
|
.setSourceDevice(Device.PRIMARY_ID)
|
||||||
.setUpdatedPni(account.getPhoneNumberIdentifier().toString())
|
.setUpdatedPni(account.getPhoneNumberIdentifier().toString())
|
||||||
|
@ -135,13 +132,4 @@ public class ChangeNumberManager {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Optional<byte[]> getMessageContent(final IncomingMessage message) {
|
|
||||||
if (message.content() == null || message.content().length == 0) {
|
|
||||||
logger.warn("Message has no content");
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Optional.of(message.content());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue