Support receiving admin delete messages

This commit is contained in:
AsamK 2026-02-28 11:07:28 +01:00
parent 54ff59737e
commit 6d22ceef24
7 changed files with 73 additions and 10 deletions

View File

@ -122,7 +122,8 @@ public record MessageEnvelope(
List<Preview> previews,
List<TextStyle> textStyles,
Optional<PinMessage> pinMessage,
Optional<UnpinMessage> unpinMessage
Optional<UnpinMessage> unpinMessage,
Optional<AdminDelete> adminDelete
) {
static Data from(
@ -173,8 +174,8 @@ public record MessageEnvelope(
.map(a -> a.stream().filter(r -> r.style != null).map(TextStyle::from).toList())
.orElse(List.of()),
dataMessage.getPinnedMessage().map(p -> PinMessage.from(p, recipientResolver, addressResolver)),
dataMessage.getUnpinnedMessage()
.map(p -> UnpinMessage.from(p, recipientResolver, addressResolver)));
dataMessage.getUnpinnedMessage().map(p -> UnpinMessage.from(p, recipientResolver, addressResolver)),
dataMessage.getAdminDelete().map(p -> AdminDelete.from(p, recipientResolver, addressResolver)));
}
public record GroupContext(GroupId groupId, boolean isGroupUpdate, int revision) {
@ -602,6 +603,18 @@ public record MessageEnvelope(
}
}
public record AdminDelete(RecipientAddress targetAuthor, long targetSentTimestamp) {
static AdminDelete from(
SignalServiceDataMessage.AdminDelete adminDelete,
RecipientResolver recipientResolver,
RecipientAddressResolver addressResolver
) {
return new AdminDelete(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
adminDelete.getTargetAuthor())).toApiRecipientAddress(), adminDelete.getTargetSentTimestamp());
}
}
}
public record Edit(long targetSentTimestamp, Data dataMessage) {

View File

@ -709,15 +709,21 @@ public final class IncomingMessageHandler {
}
}
var groupId = GroupUtils.getGroupId(groupContext);
var group = context.getGroupHelper().getGroup(groupId);
final var message = content.getDataMessage().orElse(null);
final var recipientId = account.getRecipientResolver().resolveRecipient(source);
final var groupId = GroupUtils.getGroupId(groupContext);
final var group = context.getGroupHelper().getGroup(groupId);
if (message != null && message.getAdminDelete().isPresent() && (group == null || !group.isAdmin(recipientId))) {
return true;
}
if (group == null) {
return false;
}
final var message = content.getDataMessage().orElse(null);
final var recipientId = account.getRecipientResolver().resolveRecipient(source);
if (!group.isMember(recipientId) && !(
group.isPendingMember(recipientId) && message != null && message.isGroupV2Update()
)) {

View File

@ -224,6 +224,11 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
final var unpinMessage = message.unpinMessage().get();
printUnpinMessage(writer.indentedWriter(), unpinMessage);
}
if (message.adminDelete().isPresent()) {
writer.println("Admin Delete:");
final var adminDelete = message.adminDelete().get();
printAdminDelete(writer.indentedWriter(), adminDelete);
}
}
private void printEditMessage(PlainTextWriter writer, MessageEnvelope.Edit message) {
@ -648,6 +653,11 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
writer.println("Target timestamp: {}", DateUtils.formatTimestamp(unpinMessage.targetSentTimestamp()));
}
private void printAdminDelete(final PlainTextWriter writer, final MessageEnvelope.Data.AdminDelete adminDelete) {
writer.println("Target author: {}", formatContact(adminDelete.targetAuthor()));
writer.println("Target timestamp: {}", DateUtils.formatTimestamp(adminDelete.targetSentTimestamp()));
}
private String formatContact(RecipientAddress address) {
final var number = address.getLegacyIdentifier();
final var name = m.getContactOrProfileName(RecipientIdentifier.Single.fromAddress(address));

View File

@ -979,6 +979,7 @@ public class DbusManagerImpl implements Manager {
List.of(),
List.of(),
Optional.empty(),
Optional.empty(),
Optional.empty())),
Optional.empty(),
Optional.empty(),
@ -1027,6 +1028,7 @@ public class DbusManagerImpl implements Manager {
List.of(),
List.of(),
Optional.empty(),
Optional.empty(),
Optional.empty()))),
Optional.empty(),
Optional.empty(),
@ -1107,6 +1109,7 @@ public class DbusManagerImpl implements Manager {
List.of(),
List.of(),
Optional.empty(),
Optional.empty(),
Optional.empty())),
Optional.empty(),
Optional.empty())),

View File

@ -0,0 +1,21 @@
package org.asamk.signal.json;
import org.asamk.signal.manager.api.MessageEnvelope;
import java.util.UUID;
public record JsonAdminDelete(
@Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp
) {
static JsonAdminDelete from(MessageEnvelope.Data.AdminDelete adminDelete) {
final var address = adminDelete.targetAuthor();
final var targetAuthor = address.getLegacyIdentifier();
final var targetAuthorNumber = address.number().orElse(null);
final var targetAuthorUuid = address.uuid().map(UUID::toString).orElse(null);
final var targetSentTimestamp = adminDelete.targetSentTimestamp();
return new JsonAdminDelete(targetAuthor, targetAuthorNumber, targetAuthorUuid, targetSentTimestamp);
}
}

View File

@ -29,7 +29,8 @@ record JsonDataMessage(
@JsonInclude(JsonInclude.Include.NON_NULL) JsonGroupInfo groupInfo,
@JsonInclude(JsonInclude.Include.NON_NULL) JsonStoryContext storyContext,
@JsonInclude(JsonInclude.Include.NON_NULL) JsonPinMessage pinMessage,
@JsonInclude(JsonInclude.Include.NON_NULL) JsonUnpinMessage unpinMessage
@JsonInclude(JsonInclude.Include.NON_NULL) JsonUnpinMessage unpinMessage,
@JsonInclude(JsonInclude.Include.NON_NULL) JsonAdminDelete adminDelete
) {
static JsonDataMessage from(MessageEnvelope.Data dataMessage, Manager m) {
@ -75,6 +76,7 @@ record JsonDataMessage(
.toList() : null;
final var pinMessage = dataMessage.pinMessage().map(JsonPinMessage::from).orElse(null);
final var unpinMessage = dataMessage.unpinMessage().map(JsonUnpinMessage::from).orElse(null);
final var adminDelete = dataMessage.adminDelete().map(JsonAdminDelete::from).orElse(null);
return new JsonDataMessage(timestamp,
message,
@ -97,6 +99,7 @@ record JsonDataMessage(
groupInfo,
storyContext,
pinMessage,
unpinMessage);
unpinMessage,
adminDelete);
}
}

View File

@ -2225,6 +2225,9 @@
{
"type": "org.asamk.signal.dbus.DbusSignalImpl$DbusSignalIdentityImpl"
},
{
"type": "org.asamk.signal.json.JsonAdminDelete"
},
{
"type": "org.asamk.signal.json.JsonAttachment",
"allDeclaredFields": true,
@ -5920,6 +5923,10 @@
"type": "org.signal.libsignal.protocol.state.internal.PreKeyStore",
"jniAccessible": true
},
{
"type": "org.signal.libsignal.protocol.state.internal.SignedPreKeyStore",
"jniAccessible": true
},
{
"type": "org.signal.libsignal.usernames.BadDiscriminatorCharacterException",
"jniAccessible": true,