Merge 6a12e3d0af30e18dc232e3c9218aa2e80c6a4454 into f1fa2eba1db105579ca73e7b54fe0edd7abca49a

This commit is contained in:
Brian Exelbierd 2026-01-24 15:26:37 +01:00 committed by GitHub
commit fe2ef88ff1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 75 additions and 16 deletions

View File

@ -17,6 +17,11 @@ Requires libsignal-client version 0.86.12.
- Start multi account mode even if some accounts have authorization failures - Start multi account mode even if some accounts have authorization failures
### Added
- Add --ignore-avatars flag to prevent downloading avatars
- Add --ignore-stickers flag to prevent downloading sticker packs
## [0.13.22] - 2025-11-14 ## [0.13.22] - 2025-11-14
Requires libsignal-client version 0.86.1. Requires libsignal-client version 0.86.1.

View File

@ -1,3 +1,3 @@
package org.asamk.signal.manager.api; package org.asamk.signal.manager.api;
public record ReceiveConfig(boolean ignoreAttachments, boolean ignoreStories, boolean sendReadReceipts) {} public record ReceiveConfig(boolean ignoreAttachments, boolean ignoreStories, boolean ignoreAvatars, boolean ignoreStickers, boolean sendReadReceipts) {}

View File

@ -108,6 +108,9 @@ public class GroupHelper {
} }
public void downloadGroupAvatar(GroupIdV1 groupId, SignalServiceAttachment avatar) { public void downloadGroupAvatar(GroupIdV1 groupId, SignalServiceAttachment avatar) {
if (context.getReceiveHelper().getReceiveConfig().ignoreAvatars()) {
return;
}
try { try {
context.getAvatarStore() context.getAvatarStore()
.storeGroupAvatar(groupId, .storeGroupAvatar(groupId,
@ -505,7 +508,7 @@ public class GroupHelper {
} }
storeProfileKeysFromMembers(decryptedGroup); storeProfileKeysFromMembers(decryptedGroup);
final var avatar = decryptedGroup.avatar; final var avatar = decryptedGroup.avatar;
if (!avatar.isEmpty()) { if (!avatar.isEmpty() && !context.getReceiveHelper().getReceiveConfig().ignoreAvatars()) {
downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar); downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar);
} }
groupInfoV2.setGroup(decryptedGroup); groupInfoV2.setGroup(decryptedGroup);

View File

@ -369,7 +369,7 @@ public final class IncomingMessageHandler {
false, false,
senderDeviceAddress, senderDeviceAddress,
destination, destination,
receiveConfig.ignoreAttachments())); receiveConfig));
} }
if (content.getStoryMessage().isPresent()) { if (content.getStoryMessage().isPresent()) {
@ -382,7 +382,7 @@ public final class IncomingMessageHandler {
actions.addAll(handleSyncMessage(envelope, actions.addAll(handleSyncMessage(envelope,
syncMessage, syncMessage,
senderDeviceAddress, senderDeviceAddress,
receiveConfig.ignoreAttachments())); receiveConfig));
} }
return actions; return actions;
@ -475,7 +475,7 @@ public final class IncomingMessageHandler {
final SignalServiceEnvelope envelope, final SignalServiceEnvelope envelope,
final SignalServiceSyncMessage syncMessage, final SignalServiceSyncMessage syncMessage,
final DeviceAddress sender, final DeviceAddress sender,
final boolean ignoreAttachments final ReceiveConfig receiveConfig
) { ) {
var actions = new ArrayList<HandleAction>(); var actions = new ArrayList<HandleAction>();
account.setMultiDevice(true); account.setMultiDevice(true);
@ -491,12 +491,12 @@ public final class IncomingMessageHandler {
: new DeviceAddress(account.getRecipientResolver().resolveRecipient(destination), : new DeviceAddress(account.getRecipientResolver().resolveRecipient(destination),
destination.getServiceId(), destination.getServiceId(),
0), 0),
ignoreAttachments)); receiveConfig));
} }
if (message.getStoryMessage().isPresent()) { if (message.getStoryMessage().isPresent()) {
actions.addAll(handleSignalServiceStoryMessage(message.getStoryMessage().get(), actions.addAll(handleSignalServiceStoryMessage(message.getStoryMessage().get(),
sender.recipientId(), sender.recipientId(),
ignoreAttachments)); receiveConfig.ignoreAttachments()));
} }
} }
if (syncMessage.getRequest().isPresent() && account.isPrimaryDevice()) { if (syncMessage.getRequest().isPresent() && account.isPrimaryDevice()) {
@ -576,7 +576,7 @@ public final class IncomingMessageHandler {
final var sticker = context.getStickerHelper() final var sticker = context.getStickerHelper()
.addOrUpdateStickerPack(stickerPackId, stickerPackKey, installed); .addOrUpdateStickerPack(stickerPackId, stickerPackKey, installed);
if (sticker != null && installed) { if (sticker != null && installed && !receiveConfig.ignoreStickers()) {
context.getJobExecutor().enqueueJob(new RetrieveStickerPackJob(stickerPackId, sticker.packKey())); context.getJobExecutor().enqueueJob(new RetrieveStickerPackJob(stickerPackId, sticker.packKey()));
} }
} }
@ -738,7 +738,7 @@ public final class IncomingMessageHandler {
boolean isSync, boolean isSync,
DeviceAddress source, DeviceAddress source,
DeviceAddress destination, DeviceAddress destination,
boolean ignoreAttachments ReceiveConfig receiveConfig
) { ) {
var actions = new ArrayList<HandleAction>(); var actions = new ArrayList<HandleAction>();
if (message.getGroupContext().isPresent()) { if (message.getGroupContext().isPresent()) {
@ -830,7 +830,7 @@ public final class IncomingMessageHandler {
message.getExpireTimerVersion()); message.getExpireTimerVersion());
} }
} }
if (!ignoreAttachments) { if (!receiveConfig.ignoreAttachments()) {
if (message.getAttachments().isPresent()) { if (message.getAttachments().isPresent()) {
for (var attachment : message.getAttachments().get()) { for (var attachment : message.getAttachments().get()) {
context.getAttachmentHelper().downloadAttachment(attachment); context.getAttachmentHelper().downloadAttachment(attachment);
@ -878,7 +878,9 @@ public final class IncomingMessageHandler {
sticker = new StickerPack(stickerPackId, messageSticker.getPackKey()); sticker = new StickerPack(stickerPackId, messageSticker.getPackKey());
account.getStickerStore().addStickerPack(sticker); account.getStickerStore().addStickerPack(sticker);
} }
context.getJobExecutor().enqueueJob(new RetrieveStickerPackJob(stickerPackId, messageSticker.getPackKey())); if (!receiveConfig.ignoreStickers()) {
context.getJobExecutor().enqueueJob(new RetrieveStickerPackJob(stickerPackId, messageSticker.getPackKey()));
}
} }
return actions; return actions;
} }

View File

@ -278,7 +278,9 @@ public final class ProfileHelper {
final SignalServiceProfile encryptedProfile final SignalServiceProfile encryptedProfile
) { ) {
final var avatarPath = encryptedProfile.getAvatar(); final var avatarPath = encryptedProfile.getAvatar();
downloadProfileAvatar(recipientId, avatarPath, profileKey); if (!context.getReceiveHelper().getReceiveConfig().ignoreAvatars()) {
downloadProfileAvatar(recipientId, avatarPath, profileKey);
}
return ProfileUtils.decryptProfile(profileKey, encryptedProfile); return ProfileUtils.decryptProfile(profileKey, encryptedProfile);
} }
@ -288,6 +290,9 @@ public final class ProfileHelper {
final String avatarPath, final String avatarPath,
final ProfileKey profileKey final ProfileKey profileKey
) { ) {
if (context.getReceiveHelper().getReceiveConfig().ignoreAvatars()) {
return;
}
var profile = account.getProfileStore().getProfile(recipientId); var profile = account.getProfileStore().getProfile(recipientId);
if (profile == null || !Objects.equals(avatarPath, profile.getAvatarUrlPath())) { if (profile == null || !Objects.equals(avatarPath, profile.getAvatarUrlPath())) {
logger.trace("Downloading profile avatar for {}", recipientId); logger.trace("Downloading profile avatar for {}", recipientId);

View File

@ -40,7 +40,7 @@ public class ReceiveHelper {
private final SignalDependencies dependencies; private final SignalDependencies dependencies;
private final Context context; private final Context context;
private ReceiveConfig receiveConfig = new ReceiveConfig(false, false, false); private ReceiveConfig receiveConfig = new ReceiveConfig(false, false, false, false, false);
private boolean hasCaughtUpWithOldMessages = false; private boolean hasCaughtUpWithOldMessages = false;
private boolean isWaitingForMessage = false; private boolean isWaitingForMessage = false;
private boolean shouldStop = false; private boolean shouldStop = false;
@ -58,6 +58,10 @@ public class ReceiveHelper {
dependencies.setAllowStories(!receiveConfig.ignoreStories()); dependencies.setAllowStories(!receiveConfig.ignoreStories());
} }
public ReceiveConfig getReceiveConfig() {
return receiveConfig;
}
public void setAuthenticationFailureListener(final Callable authenticationFailureListener) { public void setAuthenticationFailureListener(final Callable authenticationFailureListener) {
this.authenticationFailureListener = authenticationFailureListener; this.authenticationFailureListener = authenticationFailureListener;
} }

View File

@ -380,7 +380,7 @@ public class SyncHelper {
} }
account.getContactStore().storeContact(recipientId, builder.build()); account.getContactStore().storeContact(recipientId, builder.build());
if (c.getAvatar().isPresent()) { if (c.getAvatar().isPresent() && !context.getReceiveHelper().getReceiveConfig().ignoreAvatars()) {
storeContactAvatar(c.getAvatar().get(), address); storeContactAvatar(c.getAvatar().get(), address);
} }
} }

View File

@ -587,6 +587,12 @@ Don’t download attachments of received messages.
*--ignore-stories*:: *--ignore-stories*::
Don’t receive story messages from the server. Don’t receive story messages from the server.
*--ignore-avatars*::
Don't download avatars of received messages.
*--ignore-stickers*::
Don't download sticker packs of received messages.
*--send-read-receipts*:: *--send-read-receipts*::
Send read receipts for all incoming data messages (in addition to the default delivery receipts) Send read receipts for all incoming data messages (in addition to the default delivery receipts)
@ -950,6 +956,12 @@ Don’t download attachments of received messages.
*--ignore-stories*:: *--ignore-stories*::
Don’t receive story messages from the server. Don’t receive story messages from the server.
*--ignore-avatars*::
Don't download avatars of received messages.
*--ignore-stickers*::
Don't download sticker packs of received messages.
*--send-read-receipts*:: *--send-read-receipts*::
Send read receipts for all incoming data messages (in addition to the default delivery receipts) Send read receipts for all incoming data messages (in addition to the default delivery receipts)
@ -971,6 +983,12 @@ Don’t download attachments of received messages.
*--ignore-stories*:: *--ignore-stories*::
Don’t receive story messages from the server. Don’t receive story messages from the server.
*--ignore-avatars*::
Don't download avatars of received messages.
*--ignore-stickers*::
Don't download sticker packs of received messages.
*--send-read-receipts*:: *--send-read-receipts*::
Send read receipts for all incoming data messages (in addition to the default delivery receipts) Send read receipts for all incoming data messages (in addition to the default delivery receipts)

View File

@ -80,6 +80,12 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
subparser.addArgument("--ignore-stories") subparser.addArgument("--ignore-stories")
.help("Don’t receive story messages from the server.") .help("Don’t receive story messages from the server.")
.action(Arguments.storeTrue()); .action(Arguments.storeTrue());
subparser.addArgument("--ignore-avatars")
.help("Don't download avatars of received messages.")
.action(Arguments.storeTrue());
subparser.addArgument("--ignore-stickers")
.help("Don't download sticker packs of received messages.")
.action(Arguments.storeTrue());
subparser.addArgument("--send-read-receipts") subparser.addArgument("--send-read-receipts")
.help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)")
.action(Arguments.storeTrue()); .action(Arguments.storeTrue());

View File

@ -43,6 +43,12 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand
subparser.addArgument("--ignore-stories") subparser.addArgument("--ignore-stories")
.help("Don’t receive story messages from the server.") .help("Don’t receive story messages from the server.")
.action(Arguments.storeTrue()); .action(Arguments.storeTrue());
subparser.addArgument("--ignore-avatars")
.help("Don't download avatars of received messages.")
.action(Arguments.storeTrue());
subparser.addArgument("--ignore-stickers")
.help("Don't download sticker packs of received messages.")
.action(Arguments.storeTrue());
subparser.addArgument("--send-read-receipts") subparser.addArgument("--send-read-receipts")
.help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)")
.action(Arguments.storeTrue()); .action(Arguments.storeTrue());

View File

@ -54,6 +54,12 @@ public class ReceiveCommand implements LocalCommand, JsonRpcSingleCommand<Receiv
subparser.addArgument("--ignore-stories") subparser.addArgument("--ignore-stories")
.help("Don’t receive story messages from the server.") .help("Don’t receive story messages from the server.")
.action(Arguments.storeTrue()); .action(Arguments.storeTrue());
subparser.addArgument("--ignore-avatars")
.help("Don't download avatars of received messages.")
.action(Arguments.storeTrue());
subparser.addArgument("--ignore-stickers")
.help("Don't download sticker packs of received messages.")
.action(Arguments.storeTrue());
subparser.addArgument("--send-read-receipts") subparser.addArgument("--send-read-receipts")
.help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)")
.action(Arguments.storeTrue()); .action(Arguments.storeTrue());
@ -75,8 +81,10 @@ public class ReceiveCommand implements LocalCommand, JsonRpcSingleCommand<Receiv
final var maxMessagesRaw = ns.getInt("max-messages"); final var maxMessagesRaw = ns.getInt("max-messages");
final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments"));
final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories"));
final var ignoreAvatars = Boolean.TRUE.equals(ns.getBoolean("ignore-avatars"));
final var ignoreStickers = Boolean.TRUE.equals(ns.getBoolean("ignore-stickers"));
final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts"));
m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts)); m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, ignoreAvatars, ignoreStickers, sendReadReceipts));
try { try {
final var handler = switch (outputWriter) { final var handler = switch (outputWriter) {
case JsonWriter writer -> new JsonReceiveMessageHandler(m, writer); case JsonWriter writer -> new JsonReceiveMessageHandler(m, writer);

View File

@ -146,8 +146,10 @@ public class CommandUtil {
public static ReceiveConfig getReceiveConfig(final Namespace ns) { public static ReceiveConfig getReceiveConfig(final Namespace ns) {
final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments"));
final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories"));
final var ignoreAvatars = Boolean.TRUE.equals(ns.getBoolean("ignore-avatars"));
final var ignoreStickers = Boolean.TRUE.equals(ns.getBoolean("ignore-stickers"));
final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts"));
return new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts); return new ReceiveConfig(ignoreAttachments, ignoreStories, ignoreAvatars, ignoreStickers, sendReadReceipts);
} }
} }