From e64c8007c01b1d7c43b5670875d9151536a9fa94 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Mon, 28 Sep 2020 16:54:10 -0300 Subject: [PATCH] Detect GV2 capability in non-gcm Android devices --- .../textsecuregcm/storage/Device.java | 14 ++-- .../textsecuregcm/storage/DeviceTest.java | 70 ++++++++++++------- 2 files changed, 50 insertions(+), 34 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java index 2b0be43cd..f826852f4 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java @@ -255,13 +255,13 @@ public class Device { final boolean groupsV2Supported; if (this.capabilities != null) { - if (this.getGcmId() != null) { - groupsV2Supported = this.capabilities.isGv2() || this.capabilities.isGv2_2() || this.capabilities.isGv2_3(); - } else if (this.apnId != null || this.voipApnId != null) { - groupsV2Supported = this.capabilities.isGv2_2() || this.capabilities.isGv2_3(); - } else { - groupsV2Supported = this.capabilities.isGv2_3(); - } + boolean ios = this.apnId != null || this.voipApnId != null; + boolean android = isMaster() && !ios; + + if (android) groupsV2Supported = this.capabilities.isGv2() || this.capabilities.isGv2_2() || this.capabilities.isGv2_3(); + else if (ios) groupsV2Supported = this.capabilities.isGv2_2() || this.capabilities.isGv2_3(); + else groupsV2Supported = this.capabilities.isGv2_3(); + } else { groupsV2Supported = false; } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java index db22e240f..94f178af5 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java @@ -12,40 +12,56 @@ public class DeviceTest { @Test @Parameters(method = "argumentsForTestIsGroupsV2Supported") - public void testIsGroupsV2Supported(final String gcmId, final String apnId, final boolean gv2Capability, final boolean gv2_2Capability, final boolean gv2_3Capability, final boolean expectGv2Supported) { + public void testIsGroupsV2Supported(final boolean master, final String apnId, final boolean gv2Capability, final boolean gv2_2Capability, final boolean gv2_3Capability, final boolean expectGv2Supported) { final Device.DeviceCapabilities capabilities = new Device.DeviceCapabilities(gv2Capability, gv2_2Capability, gv2_3Capability, false, false); - final Device device = new Device(1, "test", "auth-token", "salt", "signaling-key", gcmId, apnId, null, false, 1, null, 0, 0, "user-agent", 0, capabilities); + final Device device = new Device(master ? 1 : 2, "test", "auth-token", "salt", "signaling-key", null, apnId, null, false, 1, null, 0, 0, "user-agent", 0, capabilities); assertEquals(expectGv2Supported, device.isGroupsV2Supported()); } private static Object argumentsForTestIsGroupsV2Supported() { return new Object[] { - // gcmId apnId gv2 gv2-2 gv2-3 capable - new Object[] { "gcm-id", null, false, false, false, false }, - new Object[] { "gcm-id", null, true, false, false, true }, - new Object[] { "gcm-id", null, false, true, false, true }, - new Object[] { "gcm-id", null, true, true, false, true }, - new Object[] { "gcm-id", null, false, false, true, true }, - new Object[] { "gcm-id", null, true, false, true, true }, - new Object[] { "gcm-id", null, false, true, true, true }, - new Object[] { "gcm-id", null, true, true, true, true }, - new Object[] { null, "apn-id", false, false, false, false }, - new Object[] { null, "apn-id", true, false, false, false }, - new Object[] { null, "apn-id", false, true, false, true }, - new Object[] { null, "apn-id", true, true, false, true }, - new Object[] { null, "apn-id", false, false, true, true }, - new Object[] { null, "apn-id", true, false, true, true }, - new Object[] { null, "apn-id", false, true, true, true }, - new Object[] { null, "apn-id", true, true, true, true }, - new Object[] { null, null, false, false, false, false }, - new Object[] { null, null, true, false, false, false }, - new Object[] { null, null, false, true, false, false }, - new Object[] { null, null, true, true, false, false }, - new Object[] { null, null, false, false, true, true }, - new Object[] { null, null, true, false, true, true }, - new Object[] { null, null, false, true, true, true }, - new Object[] { null, null, true, true, true, true } + // master apnId gv2 gv2-2 gv2-3 capable + + // Android master + new Object[] { true, null, false, false, false, false }, + new Object[] { true, null, true, false, false, true }, + new Object[] { true, null, false, true, false, true }, + new Object[] { true, null, true, true, false, true }, + new Object[] { true, null, false, false, true, true }, + new Object[] { true, null, true, false, true, true }, + new Object[] { true, null, false, true, true, true }, + new Object[] { true, null, true, true, true, true }, + + // iOs master + new Object[] { true, "apn-id", false, false, false, false }, + new Object[] { true, "apn-id", true, false, false, false }, + new Object[] { true, "apn-id", false, true, false, true }, + new Object[] { true, "apn-id", true, true, false, true }, + new Object[] { true, "apn-id", false, false, true, true }, + new Object[] { true, "apn-id", true, false, true, true }, + new Object[] { true, "apn-id", false, true, true, true }, + new Object[] { true, "apn-id", true, true, true, true }, + + // iOs linked + new Object[] { false, "apn-id", false, false, false, false }, + new Object[] { false, "apn-id", true, false, false, false }, + new Object[] { false, "apn-id", false, true, false, true }, + new Object[] { false, "apn-id", true, true, false, true }, + new Object[] { false, "apn-id", false, false, true, true }, + new Object[] { false, "apn-id", true, false, true, true }, + new Object[] { false, "apn-id", false, true, true, true }, + new Object[] { false, "apn-id", true, true, true, true }, + + // desktop linked + new Object[] { false, null, false, false, false, false }, + new Object[] { false, null, true, false, false, false }, + new Object[] { false, null, false, true, false, false }, + new Object[] { false, null, true, true, false, false }, + new Object[] { false, null, false, false, true, true }, + new Object[] { false, null, true, false, true, true }, + new Object[] { false, null, false, true, true, true }, + new Object[] { false, null, true, true, true, true } }; } }