Add support for admin delete.

This commit is contained in:
Michelle Tang
2026-02-20 14:44:34 -05:00
committed by Cody Henthorne
parent 1968438ebb
commit 071fbfd916
45 changed files with 648 additions and 132 deletions

View File

@@ -1305,6 +1305,14 @@ public class SignalServiceMessageSender {
.build());
}
if (message.getAdminDelete().isPresent()) {
SignalServiceDataMessage.AdminDelete adminDelete = message.getAdminDelete().get();
builder.adminDelete(new DataMessage.AdminDelete.Builder()
.targetAuthorAciBinary(adminDelete.getTargetAuthor().toByteString())
.targetSentTimestamp(adminDelete.getTargetSentTimestamp())
.build());
}
builder.timestamp(message.getTimestamp());
return builder;

View File

@@ -165,6 +165,10 @@ object EnvelopeContentValidator {
return Result.Invalid("[DataMessage] Invalid unpin message!")
}
if (dataMessage.adminDelete != null && (dataMessage.adminDelete.targetAuthorAciBinary.isNullOrInvalidAci() || dataMessage.adminDelete.targetSentTimestamp == null)) {
return Result.Invalid("[DataMessage] Invalid admin delete message!")
}
return Result.Valid
}

View File

@@ -55,7 +55,8 @@ class SignalServiceDataMessage private constructor(
val pollVote: Optional<PollVote>,
val pollTerminate: Optional<PollTerminate>,
val pinnedMessage: Optional<PinnedMessage>,
val unpinnedMessage: Optional<UnpinnedMessage>
val unpinnedMessage: Optional<UnpinnedMessage>,
val adminDelete: Optional<AdminDelete>
) {
val isActivatePaymentsRequest: Boolean = payment.map { it.isActivationRequest }.orElse(false)
val isPaymentsActivated: Boolean = payment.map { it.isActivation }.orElse(false)
@@ -112,6 +113,7 @@ class SignalServiceDataMessage private constructor(
private var pollTerminate: PollTerminate? = null
private var pinnedMessage: PinnedMessage? = null
private var unpinnedMessage: UnpinnedMessage? = null
private var adminDelete: AdminDelete? = null
fun withTimestamp(timestamp: Long): Builder {
this.timestamp = timestamp
@@ -260,6 +262,11 @@ class SignalServiceDataMessage private constructor(
return this
}
fun withAdminDelete(adminDelete: AdminDelete?): Builder {
this.adminDelete = adminDelete
return this
}
fun build(): SignalServiceDataMessage {
if (timestamp == 0L) {
timestamp = System.currentTimeMillis()
@@ -293,7 +300,8 @@ class SignalServiceDataMessage private constructor(
pollVote = pollVote.asOptional(),
pollTerminate = pollTerminate.asOptional(),
pinnedMessage = pinnedMessage.asOptional(),
unpinnedMessage = unpinnedMessage.asOptional()
unpinnedMessage = unpinnedMessage.asOptional(),
adminDelete = adminDelete.asOptional()
)
}
}
@@ -342,6 +350,7 @@ class SignalServiceDataMessage private constructor(
data class PollTerminate(val targetSentTimestamp: Long)
data class PinnedMessage(val targetAuthor: ServiceId, val targetSentTimestamp: Long, val pinDurationInSeconds: Int?, val forever: Boolean?)
data class UnpinnedMessage(val targetAuthor: ServiceId, val targetSentTimestamp: Long)
data class AdminDelete(val targetAuthor: ServiceId, val targetSentTimestamp: Long)
companion object {
@JvmStatic

View File

@@ -349,6 +349,11 @@ message DataMessage {
optional uint64 targetSentTimestamp = 2;
}
message AdminDelete {
optional bytes targetAuthorAciBinary = 1; // 16-byte UUID
optional uint64 targetSentTimestamp = 2;
}
optional string body = 1;
repeated AttachmentPointer attachments = 2;
reserved /*groupV1*/ 3;
@@ -376,7 +381,8 @@ message DataMessage {
optional PollVote pollVote = 26;
optional PinMessage pinMessage = 27;
optional UnpinMessage unpinMessage = 28;
// NEXT ID: 29
optional AdminDelete adminDelete = 29;
// NEXT ID: 30
}
message NullMessage {