From 8c7975d89a9c3552fbe8e546e5de97f237c32b21 Mon Sep 17 00:00:00 2001 From: Chris Eager <chris@signal.org> Date: Mon, 18 Sep 2023 16:39:37 -0500 Subject: [PATCH] =?UTF-8?q?Clear=20presence=20only=20if=20the=20connection?= =?UTF-8?q?=E2=80=99s=20displacement=20listener=20is=20still=20present?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textsecuregcm/push/ClientPresenceManager.java | 7 ++++--- .../textsecuregcm/push/ClientPresenceManagerTest.java | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java index 5015c8da6..fc7d455e1 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java @@ -235,11 +235,12 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter<String, Str public boolean clearPresence(final UUID accountUuid, final long deviceId, final DisplacedPresenceListener listener) { final String presenceKey = getPresenceKey(accountUuid, deviceId); - if (!displacementListenersByPresenceKey.remove(presenceKey, listener)) { + if (displacementListenersByPresenceKey.remove(presenceKey, listener)) { + return clearPresence(presenceKey); + } else { displacementListenerAlreadyRemovedCounter.increment(); + return false; } - return clearPresence(presenceKey); - } private boolean clearPresence(final String presenceKey) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java index 8ce5dfaa4..82e70b5cf 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java @@ -10,6 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.mock; import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; @@ -161,6 +162,8 @@ class ClientPresenceManagerTest { assertFalse(clientPresenceManager.isPresent(accountUuid, deviceId)); clientPresenceManager.setPresent(accountUuid, deviceId, NO_OP); + assertFalse(clientPresenceManager.clearPresence(accountUuid, deviceId, + ignored -> fail("this listener should never be called"))); assertTrue(clientPresenceManager.clearPresence(accountUuid, deviceId, NO_OP)); clientPresenceManager.setPresent(accountUuid, deviceId, NO_OP); -- GitLab