Improve call message validations.

This commit is contained in:
Greyson Parrelli
2026-07-24 11:44:38 -04:00
committed by Michelle Tang
parent 072185ec36
commit 9804c6cf5e
2 changed files with 47 additions and 1 deletions
@@ -11,6 +11,7 @@ import org.signal.libsignal.zkgroup.groups.GroupMasterKey
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation
import org.whispersystems.signalservice.internal.push.AttachmentPointer
import org.whispersystems.signalservice.internal.push.BodyRange
import org.whispersystems.signalservice.internal.push.CallMessage
import org.whispersystems.signalservice.internal.push.Content
import org.whispersystems.signalservice.internal.push.DataMessage
import org.whispersystems.signalservice.internal.push.EditMessage
@@ -61,7 +62,7 @@ object EnvelopeContentValidator {
envelope.story == true && !content.meetsStoryFlagCriteria() -> Result.Invalid("Envelope was flagged as a story, but it did not have any story-related content!")
content.dataMessage != null -> validateDataMessage(envelope, content.dataMessage)
content.syncMessage != null -> validateSyncMessage(envelope, content.syncMessage, localAci)
content.callMessage != null -> Result.Valid
content.callMessage != null -> validateCallMessage(content.callMessage)
content.nullMessage != null -> Result.Valid
content.receiptMessage != null -> validateReceiptMessage(content.receiptMessage)
content.typingMessage != null -> validateTypingMessage(envelope, content.typingMessage)
@@ -207,6 +208,14 @@ object EnvelopeContentValidator {
return this.options.size < MIN_POLL_OPTIONS || this.options.any { option -> option.length > MAX_POLL_CHARACTER_LENGTH }
}
private fun validateCallMessage(callMessage: CallMessage): Result {
if (callMessage.hangup != null && callMessage.hangup.type == null) {
return Result.Invalid("[CallMessage] Missing type on CallMessage.hangup!")
}
return Result.Valid
}
private fun validateSyncMessage(envelope: Envelope, syncMessage: SyncMessage, localAci: ACI): Result {
// Source serviceId was already determined to be a valid serviceId in general
val sourceServiceId = ServiceId.parseOrThrow(envelope.sourceServiceId, envelope.sourceServiceIdBinary)
@@ -12,6 +12,7 @@ import org.signal.libsignal.protocol.message.CiphertextMessage
import org.signal.libsignal.protocol.message.DecryptionErrorMessage
import org.whispersystems.signalservice.internal.push.AttachmentPointer
import org.whispersystems.signalservice.internal.push.BodyRange
import org.whispersystems.signalservice.internal.push.CallMessage
import org.whispersystems.signalservice.internal.push.Content
import org.whispersystems.signalservice.internal.push.DataMessage
import org.whispersystems.signalservice.internal.push.EditMessage
@@ -1102,4 +1103,40 @@ class EnvelopeContentValidatorTest {
val result = EnvelopeContentValidator.validate(envelope, content, SELF_ACI, CiphertextMessage.WHISPER_TYPE)
assert(result is EnvelopeContentValidator.Result.Valid)
}
@Test
fun `validate - ensure call message hangup without a type is marked invalid`() {
val content = Content(
callMessage = CallMessage(
hangup = CallMessage.Hangup(id = 1)
)
)
val result = EnvelopeContentValidator.validate(Envelope(), content, SELF_ACI, CiphertextMessage.WHISPER_TYPE)
assert(result is EnvelopeContentValidator.Result.Invalid)
}
@Test
fun `validate - ensure call message hangup with a type is marked valid`() {
val content = Content(
callMessage = CallMessage(
hangup = CallMessage.Hangup(id = 1, type = CallMessage.Hangup.Type.HANGUP_NORMAL)
)
)
val result = EnvelopeContentValidator.validate(Envelope(), content, SELF_ACI, CiphertextMessage.WHISPER_TYPE)
assert(result is EnvelopeContentValidator.Result.Valid)
}
@Test
fun `validate - ensure call message without a hangup is marked valid`() {
val content = Content(
callMessage = CallMessage(
busy = CallMessage.Busy(id = 1)
)
)
val result = EnvelopeContentValidator.validate(Envelope(), content, SELF_ACI, CiphertextMessage.WHISPER_TYPE)
assert(result is EnvelopeContentValidator.Result.Valid)
}
}