mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-25 12:17:22 +00:00
Add ability to reject group invite by PNI.
This commit is contained in:
@@ -21,6 +21,7 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations
|
||||
import org.whispersystems.signalservice.api.push.DistributionId
|
||||
import org.whispersystems.signalservice.api.push.ServiceId
|
||||
import java.util.Optional
|
||||
import java.util.UUID
|
||||
|
||||
fun DecryptedGroupChange.Builder.setNewDescription(description: String) {
|
||||
newDescription = DecryptedString.newBuilder().setValue(description).build()
|
||||
@@ -107,6 +108,7 @@ class GroupStateTestData(private val masterKey: GroupMasterKey, private val grou
|
||||
var requestedRevision: Int = 0
|
||||
|
||||
fun localState(
|
||||
active: Boolean = true,
|
||||
revision: Int = 0,
|
||||
title: String = "",
|
||||
avatar: String = "",
|
||||
@@ -116,10 +118,11 @@ class GroupStateTestData(private val masterKey: GroupMasterKey, private val grou
|
||||
pendingMembers: List<DecryptedPendingMember> = emptyList(),
|
||||
requestingMembers: List<DecryptedRequestingMember> = emptyList(),
|
||||
inviteLinkPassword: ByteArray = ByteArray(0),
|
||||
disappearingMessageTimer: DecryptedTimer = DecryptedTimer.getDefaultInstance()
|
||||
disappearingMessageTimer: DecryptedTimer = DecryptedTimer.getDefaultInstance(),
|
||||
serviceId: String = ServiceId.from(UUID.randomUUID()).toString()
|
||||
) {
|
||||
localState = decryptedGroup(revision, title, avatar, description, accessControl, members, pendingMembers, requestingMembers, inviteLinkPassword, disappearingMessageTimer)
|
||||
groupRecord = groupRecord(masterKey, localState!!)
|
||||
groupRecord = groupRecord(masterKey, localState!!, active = active, serviceId = serviceId)
|
||||
}
|
||||
|
||||
fun serverState(
|
||||
@@ -170,7 +173,8 @@ fun groupRecord(
|
||||
active: Boolean = true,
|
||||
avatarDigest: ByteArray = ByteArray(0),
|
||||
mms: Boolean = false,
|
||||
distributionId: DistributionId? = null
|
||||
distributionId: DistributionId? = null,
|
||||
serviceId: String = ServiceId.from(UUID.randomUUID()).toString()
|
||||
): Optional<GroupDatabase.GroupRecord> {
|
||||
return Optional.of(
|
||||
GroupDatabase.GroupRecord(
|
||||
@@ -189,7 +193,8 @@ fun groupRecord(
|
||||
masterKey.serialize(),
|
||||
decryptedGroup.revision,
|
||||
decryptedGroup.toByteArray(),
|
||||
distributionId
|
||||
distributionId,
|
||||
serviceId
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -24,8 +24,11 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroup;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedMember;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
|
||||
import org.thoughtcrime.securesms.keyvalue.ServiceIds;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.whispersystems.signalservice.api.push.ACI;
|
||||
import org.whispersystems.signalservice.api.push.PNI;
|
||||
import org.whispersystems.signalservice.api.push.ServiceId;
|
||||
import org.whispersystems.signalservice.api.util.UuidUtil;
|
||||
|
||||
@@ -44,9 +47,9 @@ import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.signal.core.util.StringUtil.isolateBidi;
|
||||
import static org.thoughtcrime.securesms.groups.v2.ChangeBuilder.changeBy;
|
||||
import static org.thoughtcrime.securesms.groups.v2.ChangeBuilder.changeByUnknown;
|
||||
import static org.signal.core.util.StringUtil.isolateBidi;
|
||||
import static java.util.Collections.emptyList;
|
||||
import static java.util.Collections.singletonList;
|
||||
|
||||
@@ -83,7 +86,7 @@ public final class GroupsV2UpdateMessageProducerTest {
|
||||
Recipient aliceRecipient = recipientWithName(aliceId, "Alice");
|
||||
Recipient bobRecipient = recipientWithName(bobId, "Bob");
|
||||
|
||||
producer = new GroupsV2UpdateMessageProducer(ApplicationProvider.getApplicationContext(), you, null);
|
||||
producer = new GroupsV2UpdateMessageProducer(ApplicationProvider.getApplicationContext(), new ServiceIds(ACI.from(you), PNI.from(UUID.randomUUID())), null);
|
||||
|
||||
recipientIdMockedStatic.when(() -> RecipientId.from(ServiceId.from(alice), null)).thenReturn(aliceId);
|
||||
recipientIdMockedStatic.when(() -> RecipientId.from(ServiceId.from(bob), null)).thenReturn(bobId);
|
||||
|
||||
@@ -39,6 +39,7 @@ import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations
|
||||
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Api
|
||||
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations
|
||||
import org.whispersystems.signalservice.api.push.ACI
|
||||
import org.whispersystems.signalservice.api.push.PNI
|
||||
import org.whispersystems.signalservice.api.push.ServiceId
|
||||
import java.util.UUID
|
||||
|
||||
@@ -53,6 +54,7 @@ class GroupManagerV2Test_edit {
|
||||
val groupId: GroupId.V2 = GroupId.v2(masterKey)
|
||||
|
||||
val selfAci: ACI = ACI.from(UUID.randomUUID())
|
||||
val selfPni: PNI = PNI.from(UUID.randomUUID())
|
||||
val otherSid: ServiceId = ServiceId.from(UUID.randomUUID())
|
||||
val selfAndOthers: List<DecryptedMember> = listOf(member(selfAci), member(otherSid))
|
||||
val others: List<DecryptedMember> = listOf(member(otherSid))
|
||||
@@ -102,6 +104,7 @@ class GroupManagerV2Test_edit {
|
||||
groupsV2Authorization,
|
||||
groupsV2StateProcessor,
|
||||
selfAci,
|
||||
selfPni,
|
||||
groupCandidateHelper,
|
||||
sendGroupUpdateHelper
|
||||
)
|
||||
@@ -114,7 +117,7 @@ class GroupManagerV2Test_edit {
|
||||
Mockito.doReturn(data.groupRecord).`when`(groupDatabase).getGroup(groupId)
|
||||
Mockito.doReturn(data.groupRecord.get()).`when`(groupDatabase).requireGroup(groupId)
|
||||
|
||||
Mockito.doReturn(GroupManagerV2.RecipientAndThread(Recipient.UNKNOWN, 1)).`when`(sendGroupUpdateHelper).sendGroupUpdate(Mockito.eq(masterKey), Mockito.any(), Mockito.any())
|
||||
Mockito.doReturn(GroupManagerV2.RecipientAndThread(Recipient.UNKNOWN, 1)).`when`(sendGroupUpdateHelper).sendGroupUpdate(Mockito.eq(masterKey), Mockito.any(), Mockito.any(), Mockito.anyBoolean())
|
||||
|
||||
Mockito.doReturn(data.groupChange!!).`when`(groupsV2API).patchGroup(Mockito.any(), Mockito.any(), Mockito.any())
|
||||
}
|
||||
@@ -136,7 +139,8 @@ class GroupManagerV2Test_edit {
|
||||
members = listOf(
|
||||
member(selfAci, role = Member.Role.ADMINISTRATOR),
|
||||
member(otherSid)
|
||||
)
|
||||
),
|
||||
serviceId = selfAci.toString()
|
||||
)
|
||||
groupChange(6) {
|
||||
source(selfAci)
|
||||
|
||||
@@ -51,11 +51,11 @@ import java.util.UUID
|
||||
class GroupsV2StateProcessorTest {
|
||||
|
||||
companion object {
|
||||
val masterKey = GroupMasterKey(fromStringCondensed("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"))
|
||||
val selfAci: ACI = ACI.from(UUID.randomUUID())
|
||||
val otherSid: ServiceId = ServiceId.from(UUID.randomUUID())
|
||||
val selfAndOthers: List<DecryptedMember> = listOf(member(selfAci), member(otherSid))
|
||||
val others: List<DecryptedMember> = listOf(member(otherSid))
|
||||
private val masterKey = GroupMasterKey(fromStringCondensed("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"))
|
||||
private val selfAci: ACI = ACI.from(UUID.randomUUID())
|
||||
private val otherSid: ServiceId = ServiceId.from(UUID.randomUUID())
|
||||
private val selfAndOthers: List<DecryptedMember> = listOf(member(selfAci), member(otherSid))
|
||||
private val others: List<DecryptedMember> = listOf(member(otherSid))
|
||||
}
|
||||
|
||||
private lateinit var groupDatabase: GroupDatabase
|
||||
@@ -89,8 +89,7 @@ class GroupsV2StateProcessorTest {
|
||||
}
|
||||
|
||||
private fun given(init: GroupStateTestData.() -> Unit) {
|
||||
val data = GroupStateTestData(masterKey)
|
||||
data.init()
|
||||
val data = givenData(init)
|
||||
|
||||
doReturn(data.groupRecord).`when`(groupDatabase).getGroup(any(GroupId.V2::class.java))
|
||||
doReturn(!data.groupRecord.isPresent).`when`(groupDatabase).isUnknownGroup(any())
|
||||
@@ -109,6 +108,12 @@ class GroupsV2StateProcessorTest {
|
||||
}
|
||||
}
|
||||
|
||||
private fun givenData(init: GroupStateTestData.() -> Unit): GroupStateTestData {
|
||||
val data = GroupStateTestData(masterKey)
|
||||
data.init()
|
||||
return data
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `when local revision matches server revision, then return consistent or ahead`() {
|
||||
given {
|
||||
|
||||
Reference in New Issue
Block a user