From 483ff7abe0134c94a97d4603477138948d6a53fa Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 8 Sep 2024 08:32:36 +0200 Subject: [PATCH] fix rare issue with CSI triggering pep notification dedup --- .../crypto/axolotl/AxolotlService.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java index ceb7ab48e82a51677488d48269b47248a67155fa..938dc794119539f7ff25dc6d6e23b25cc72bb2ee 100644 --- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java +++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java @@ -12,6 +12,7 @@ import androidx.annotation.Nullable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; @@ -314,7 +315,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { if (me) { deviceIds.remove(getOwnDeviceId()); } - Set expiredDevices = new HashSet<>(axolotlStore.getSubDeviceSessions(jid.asBareJid().toString())); + final Set expiredDevices = new HashSet<>(axolotlStore.getSubDeviceSessions(jid.asBareJid().toString())); expiredDevices.removeAll(deviceIds); for (Integer deviceId : expiredDevices) { SignalProtocolAddress address = new SignalProtocolAddress(jid.asBareJid().toString(), deviceId); @@ -325,8 +326,8 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { } } } - Set newDevices = new HashSet<>(deviceIds); - for (Integer deviceId : newDevices) { + final Set newDevices = ImmutableSet.copyOf(deviceIds); + for (final Integer deviceId : newDevices) { SignalProtocolAddress address = new SignalProtocolAddress(jid.asBareJid().toString(), deviceId); XmppAxolotlSession session = sessions.get(address); if (session != null && session.getFingerprint() != null) { @@ -341,7 +342,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { needsPublishing |= deviceIds.removeAll(getExpiredDevices()); } needsPublishing |= this.changeAccessMode.get(); - for (Integer deviceId : deviceIds) { + for (final Integer deviceId : deviceIds) { SignalProtocolAddress ownDeviceAddress = new SignalProtocolAddress(jid.asBareJid().toString(), deviceId); if (sessions.get(ownDeviceAddress) == null) { FetchStatus status = fetchStatusMap.get(ownDeviceAddress); @@ -352,6 +353,9 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { } } if (needsPublishing) { + // do not run next device list update notification through de-duplication (might get + // skipped by CSI) + this.lastDeviceListNotificationHash = 0; publishOwnDeviceId(deviceIds); } } @@ -426,8 +430,8 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { return devices; } - private void publishOwnDeviceId(Set deviceIds) { - Set deviceIdsCopy = new HashSet<>(deviceIds); + private void publishOwnDeviceId(final Set deviceIds) { + final Set deviceIdsCopy = new HashSet<>(deviceIds); Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "publishing own device ids"); if (deviceIdsCopy.isEmpty()) { if (numPublishTriesOnEmptyPep >= publishTriesThreshold) {