Convert all group code to be based on ServiceIds.

This commit is contained in:
Greyson Parrelli
2023-08-03 15:28:17 -04:00
committed by Alex Hart
parent d247e2c111
commit c5d9346370
50 changed files with 836 additions and 792 deletions

View File

@@ -103,7 +103,7 @@ final class DecryptedGroupChangeActionsBuilderChangeSetModifier implements Chang
result.removeNewRequestingMembers(i);
DecryptedMember build = DecryptedMember.newBuilder()
.setUuid(addMemberAction.getUuid())
.setAciBytes(addMemberAction.getAciBytes())
.setProfileKey(addMemberAction.getProfileKey())
.setRole(Member.Role.DEFAULT).build();

View File

@@ -0,0 +1,33 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.signalservice.api.groupsv2
import org.signal.storageservice.protos.groups.local.DecryptedMember
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember
import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember
import org.whispersystems.signalservice.api.push.ServiceId
import org.whispersystems.signalservice.api.push.ServiceId.ACI
import java.util.Optional
fun Collection<DecryptedMember>.toAciListWithUnknowns(): List<ACI> {
return DecryptedGroupUtil.toAciListWithUnknowns(this)
}
fun Collection<DecryptedMember>.toAciList(): List<ACI> {
return DecryptedGroupUtil.toAciList(this)
}
fun Collection<DecryptedMember>.findMemberByAci(aci: ACI): Optional<DecryptedMember> {
return DecryptedGroupUtil.findMemberByAci(this, aci)
}
fun Collection<DecryptedRequestingMember>.findRequestingByAci(aci: ACI): Optional<DecryptedRequestingMember> {
return DecryptedGroupUtil.findRequestingByAci(this, aci)
}
fun Collection<DecryptedPendingMember>.findPendingByServiceId(serviceId: ServiceId): Optional<DecryptedPendingMember> {
return DecryptedGroupUtil.findPendingByServiceId(this, serviceId)
}

View File

@@ -16,8 +16,8 @@ import org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemov
import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember;
import org.signal.storageservice.protos.groups.local.EnabledState;
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.push.ServiceIds;
import org.whispersystems.signalservice.api.util.UuidUtil;
import java.util.ArrayList;
import java.util.Collection;
@@ -27,60 +27,58 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import javax.annotation.Nullable;
public final class DecryptedGroupUtil {
private static final String TAG = DecryptedGroupUtil.class.getSimpleName();
public static ArrayList<UUID> toUuidList(Collection<DecryptedMember> membersList) {
ArrayList<UUID> uuidList = new ArrayList<>(membersList.size());
public static ArrayList<ACI> toAciListWithUnknowns(Collection<DecryptedMember> membersList) {
ArrayList<ACI> serviceIdList = new ArrayList<>(membersList.size());
for (DecryptedMember member : membersList) {
uuidList.add(toUuid(member));
serviceIdList.add(ACI.parseOrUnknown(member.getAciBytes()));
}
return uuidList;
return serviceIdList;
}
public static ArrayList<ServiceId> membersToServiceIdList(Collection<DecryptedMember> membersList) {
ArrayList<ServiceId> serviceIdList = new ArrayList<>(membersList.size());
/** Converts the list of members to ACI's, filtering out unknown ACI's. */
public static ArrayList<ACI> toAciList(Collection<DecryptedMember> membersList) {
ArrayList<ACI> serviceIdList = new ArrayList<>(membersList.size());
for (DecryptedMember member : membersList) {
ServiceId serviceId = ServiceId.parseOrNull(member.getUuid());
ACI aci = ACI.parseOrNull(member.getAciBytes());
if (serviceId != null) {
serviceIdList.add(serviceId);
if (aci != null) {
serviceIdList.add(aci);
}
}
return serviceIdList;
}
public static Set<ByteString> membersToUuidByteStringSet(Collection<DecryptedMember> membersList) {
Set<ByteString> uuidList = new HashSet<>(membersList.size());
public static Set<ByteString> membersToAciByteStringSet(Collection<DecryptedMember> membersList) {
Set<ByteString> aciList = new HashSet<>(membersList.size());
for (DecryptedMember member : membersList) {
uuidList.add(member.getUuid());
aciList.add(member.getAciBytes());
}
return uuidList;
return aciList;
}
/**
* Can return non-decryptable member UUIDs as unknown ACIs.
* Can return non-decryptable member ACIs as unknown ACIs.
*/
public static ArrayList<ServiceId> pendingToServiceIdList(Collection<DecryptedPendingMember> membersList) {
ArrayList<ServiceId> serviceIdList = new ArrayList<>(membersList.size());
for (DecryptedPendingMember member : membersList) {
ServiceId serviceId = ServiceId.parseOrNull(member.getServiceIdBinary());
ServiceId serviceId = ServiceId.parseOrNull(member.getServiceIdBytes());
if (serviceId != null) {
serviceIdList.add(serviceId);
} else {
serviceIdList.add(ServiceId.ACI.UNKNOWN);
serviceIdList.add(ACI.UNKNOWN);
}
}
@@ -88,7 +86,7 @@ public final class DecryptedGroupUtil {
}
/**
* Will not return any non-decryptable member UUIDs.
* Will not return any non-decryptable member ACIs.
*/
public static ArrayList<ServiceId> removedMembersServiceIdList(DecryptedGroupChange groupChange) {
List<ByteString> deletedMembers = groupChange.getDeleteMembersList();
@@ -106,14 +104,14 @@ public final class DecryptedGroupUtil {
}
/**
* Will not return any non-decryptable member UUIDs.
* Will not return any non-decryptable member ACIs.
*/
public static ArrayList<ServiceId> removedPendingMembersServiceIdList(DecryptedGroupChange groupChange) {
List<DecryptedPendingMemberRemoval> deletedPendingMembers = groupChange.getDeletePendingMembersList();
ArrayList<ServiceId> serviceIdList = new ArrayList<>(deletedPendingMembers.size());
for (DecryptedPendingMemberRemoval member : deletedPendingMembers) {
ServiceId serviceId = ServiceId.parseOrNull(member.getServiceIdBinary());
ServiceId serviceId = ServiceId.parseOrNull(member.getServiceIdBytes());
if(serviceId != null) {
serviceIdList.add(serviceId);
@@ -124,7 +122,7 @@ public final class DecryptedGroupUtil {
}
/**
* Will not return any non-decryptable member UUIDs.
* Will not return any non-decryptable member ACIs.
*/
public static ArrayList<ServiceId> removedRequestingMembersServiceIdList(DecryptedGroupChange groupChange) {
List<ByteString> deleteRequestingMembers = groupChange.getDeleteRequestingMembersList();
@@ -145,7 +143,7 @@ public final class DecryptedGroupUtil {
Set<ServiceId> serviceIdSet = new HashSet<>(membersList.size());
for (DecryptedBannedMember member : membersList) {
ServiceId serviceId = ServiceId.parseOrNull(member.getServiceIdBinary());
ServiceId serviceId = ServiceId.parseOrNull(member.getServiceIdBytes());
if (serviceId != null) {
serviceIdSet.add(serviceId);
}
@@ -154,26 +152,18 @@ public final class DecryptedGroupUtil {
return serviceIdSet;
}
public static UUID toUuid(DecryptedMember member) {
return toUuid(member.getUuid());
}
private static UUID toUuid(ByteString memberUuid) {
return UuidUtil.fromByteStringOrUnknown(memberUuid);
}
/**
* The UUID of the member that made the change.
* The ACI of the member that made the change.
*/
public static Optional<UUID> editorUuid(DecryptedGroupChange change) {
return Optional.ofNullable(change != null ? UuidUtil.fromByteStringOrNull(change.getEditor()) : null);
public static Optional<ServiceId> editorServiceId(DecryptedGroupChange change) {
return Optional.ofNullable(change != null ? ServiceId.parseOrNull(change.getEditorServiceIdBytes()) : null);
}
public static Optional<DecryptedMember> findMemberByUuid(Collection<DecryptedMember> members, UUID uuid) {
ByteString uuidBytes = UuidUtil.toByteString(uuid);
public static Optional<DecryptedMember> findMemberByAci(Collection<DecryptedMember> members, ACI aci) {
ByteString aciBytes = aci.toByteString();
for (DecryptedMember member : members) {
if (uuidBytes.equals(member.getUuid())) {
if (aciBytes.equals(member.getAciBytes())) {
return Optional.of(member);
}
}
@@ -185,7 +175,7 @@ public final class DecryptedGroupUtil {
ByteString serviceIdBinary = serviceId.toByteString();
for (DecryptedPendingMember member : members) {
if (serviceIdBinary.equals(member.getServiceIdBinary())) {
if (serviceIdBinary.equals(member.getServiceIdBytes())) {
return Optional.of(member);
}
}
@@ -195,7 +185,7 @@ public final class DecryptedGroupUtil {
public static Optional<DecryptedPendingMember> findPendingByServiceIds(Collection<DecryptedPendingMember> members, ServiceIds serviceIds) {
for (DecryptedPendingMember member : members) {
if (serviceIds.matches(member.getServiceIdBinary())) {
if (serviceIds.matches(member.getServiceIdBytes())) {
return Optional.of(member);
}
}
@@ -203,10 +193,10 @@ public final class DecryptedGroupUtil {
return Optional.empty();
}
private static int findPendingIndexByUuidCipherText(List<DecryptedPendingMember> members, ByteString cipherText) {
private static int findPendingIndexByServiceIdCipherText(List<DecryptedPendingMember> members, ByteString cipherText) {
for (int i = 0; i < members.size(); i++) {
DecryptedPendingMember member = members.get(i);
if (cipherText.equals(member.getUuidCipherText())) {
if (cipherText.equals(member.getServiceIdCipherText())) {
return i;
}
}
@@ -217,7 +207,7 @@ public final class DecryptedGroupUtil {
private static int findPendingIndexByServiceId(List<DecryptedPendingMember> members, ByteString serviceIdBinary) {
for (int i = 0; i < members.size(); i++) {
DecryptedPendingMember member = members.get(i);
if (serviceIdBinary.equals(member.getServiceIdBinary())) {
if (serviceIdBinary.equals(member.getServiceIdBytes())) {
return i;
}
}
@@ -225,11 +215,11 @@ public final class DecryptedGroupUtil {
return -1;
}
public static Optional<DecryptedRequestingMember> findRequestingByUuid(Collection<DecryptedRequestingMember> members, UUID uuid) {
ByteString uuidBytes = UuidUtil.toByteString(uuid);
public static Optional<DecryptedRequestingMember> findRequestingByAci(Collection<DecryptedRequestingMember> members, ACI aci) {
ByteString aciBytes = aci.toByteString();
for (DecryptedRequestingMember member : members) {
if (uuidBytes.equals(member.getUuid())) {
if (aciBytes.equals(member.getAciBytes())) {
return Optional.of(member);
}
}
@@ -239,7 +229,7 @@ public final class DecryptedGroupUtil {
public static Optional<DecryptedRequestingMember> findRequestingByServiceIds(Collection<DecryptedRequestingMember> members, ServiceIds serviceIds) {
for (DecryptedRequestingMember member : members) {
if (serviceIds.matches(member.getUuid())) {
if (serviceIds.matches(member.getAciBytes())) {
return Optional.of(member);
}
}
@@ -252,25 +242,25 @@ public final class DecryptedGroupUtil {
findRequestingByServiceIds(group.getRequestingMembersList(), serviceIds).isPresent();
}
public static boolean isRequesting(DecryptedGroup group, UUID uuid) {
return findRequestingByUuid(group.getRequestingMembersList(), uuid).isPresent();
public static boolean isRequesting(DecryptedGroup group, ACI aci) {
return findRequestingByAci(group.getRequestingMembersList(), aci).isPresent();
}
/**
* Removes the uuid from the full members of a group.
* Removes the aci from the full members of a group.
* <p>
* Generally not expected to have to do this, just in the case of leaving a group where you cannot
* get the new group state as you are not in the group any longer.
*/
public static DecryptedGroup removeMember(DecryptedGroup group, UUID uuid, int revision) {
public static DecryptedGroup removeMember(DecryptedGroup group, ACI aci, int revision) {
DecryptedGroup.Builder builder = DecryptedGroup.newBuilder(group);
ByteString uuidString = UuidUtil.toByteString(uuid);
ByteString aciByteString = aci.toByteString();
boolean removed = false;
ArrayList<DecryptedMember> decryptedMembers = new ArrayList<>(builder.getMembersList());
Iterator<DecryptedMember> membersList = decryptedMembers.iterator();
while (membersList.hasNext()) {
if (uuidString.equals(membersList.next().getUuid())) {
if (aciByteString.equals(membersList.next().getAciBytes())) {
membersList.remove();
removed = true;
}
@@ -355,11 +345,11 @@ public final class DecryptedGroupUtil {
LinkedHashMap<ByteString, DecryptedMember> members = new LinkedHashMap<>();
for (DecryptedMember member : builder.getMembersList()) {
members.put(member.getUuid(), member);
members.put(member.getAciBytes(), member);
}
for (DecryptedMember member : newMembersList) {
members.put(member.getUuid(), member);
members.put(member.getAciBytes(), member);
}
builder.clearMembers();
@@ -370,7 +360,7 @@ public final class DecryptedGroupUtil {
protected static void applyDeleteMemberActions(DecryptedGroup.Builder builder, List<ByteString> deleteMembersList) {
for (ByteString removedMember : deleteMembersList) {
int index = indexOfUuid(builder.getMembersList(), removedMember);
int index = indexOfAci(builder.getMembersList(), removedMember);
if (index == -1) {
Log.w(TAG, "Deleted member on change not found in group");
@@ -383,7 +373,7 @@ public final class DecryptedGroupUtil {
private static void applyModifyMemberRoleActions(DecryptedGroup.Builder builder, List<DecryptedModifyMemberRole> modifyMemberRolesList) throws NotAbleToApplyGroupV2ChangeException {
for (DecryptedModifyMemberRole modifyMemberRole : modifyMemberRolesList) {
int index = indexOfUuid(builder.getMembersList(), modifyMemberRole.getUuid());
int index = indexOfAci(builder.getMembersList(), modifyMemberRole.getAciBytes());
if (index == -1) {
throw new NotAbleToApplyGroupV2ChangeException();
@@ -400,7 +390,7 @@ public final class DecryptedGroupUtil {
private static void applyModifyMemberProfileKeyActions(DecryptedGroup.Builder builder, List<DecryptedMember> modifiedProfileKeysList) throws NotAbleToApplyGroupV2ChangeException {
for (DecryptedMember modifyProfileKey : modifiedProfileKeysList) {
int index = indexOfUuid(builder.getMembersList(), modifyProfileKey.getUuid());
int index = indexOfAci(builder.getMembersList(), modifyProfileKey.getAciBytes());
if (index == -1) {
throw new NotAbleToApplyGroupV2ChangeException();
@@ -411,15 +401,15 @@ public final class DecryptedGroupUtil {
}
private static void applyAddPendingMemberActions(DecryptedGroup.Builder builder, List<DecryptedPendingMember> newPendingMembersList) throws NotAbleToApplyGroupV2ChangeException {
Set<ByteString> fullMemberSet = getMemberUuidSet(builder.getMembersList());
Set<ByteString> fullMemberSet = getMemberAciSet(builder.getMembersList());
Set<ByteString> pendingMemberCipherTexts = getPendingMemberCipherTextSet(builder.getPendingMembersList());
for (DecryptedPendingMember pendingMember : newPendingMembersList) {
if (fullMemberSet.contains(pendingMember.getServiceIdBinary())) {
if (fullMemberSet.contains(pendingMember.getServiceIdBytes())) {
throw new NotAbleToApplyGroupV2ChangeException();
}
if (!pendingMemberCipherTexts.contains(pendingMember.getUuidCipherText())) {
if (!pendingMemberCipherTexts.contains(pendingMember.getServiceIdCipherText())) {
builder.addPendingMembers(pendingMember);
}
}
@@ -427,7 +417,7 @@ public final class DecryptedGroupUtil {
protected static void applyDeletePendingMemberActions(DecryptedGroup.Builder builder, List<DecryptedPendingMemberRemoval> deletePendingMembersList) {
for (DecryptedPendingMemberRemoval removedMember : deletePendingMembersList) {
int index = findPendingIndexByUuidCipherText(builder.getPendingMembersList(), removedMember.getUuidCipherText());
int index = findPendingIndexByServiceIdCipherText(builder.getPendingMembersList(), removedMember.getServiceIdCipherText());
if (index == -1) {
Log.w(TAG, "Deleted pending member on change not found in group");
@@ -440,7 +430,7 @@ public final class DecryptedGroupUtil {
protected static void applyPromotePendingMemberActions(DecryptedGroup.Builder builder, List<DecryptedMember> promotePendingMembersList) throws NotAbleToApplyGroupV2ChangeException {
for (DecryptedMember newMember : promotePendingMembersList) {
int index = findPendingIndexByServiceId(builder.getPendingMembersList(), newMember.getUuid());
int index = findPendingIndexByServiceId(builder.getPendingMembersList(), newMember.getAciBytes());
if (index == -1) {
throw new NotAbleToApplyGroupV2ChangeException();
@@ -515,7 +505,7 @@ public final class DecryptedGroupUtil {
private static void applyDeleteRequestingMembers(DecryptedGroup.Builder builder, List<ByteString> deleteRequestingMembersList) {
for (ByteString removedMember : deleteRequestingMembersList) {
int index = indexOfUuidInRequestingList(builder.getRequestingMembersList(), removedMember);
int index = indexOfAciInRequestingList(builder.getRequestingMembersList(), removedMember);
if (index == -1) {
Log.w(TAG, "Deleted member on change not found in group");
@@ -528,7 +518,7 @@ public final class DecryptedGroupUtil {
private static void applyPromoteRequestingMemberActions(DecryptedGroup.Builder builder, List<DecryptedApproveMember> promoteRequestingMembers) throws NotAbleToApplyGroupV2ChangeException {
for (DecryptedApproveMember approvedMember : promoteRequestingMembers) {
int index = indexOfUuidInRequestingList(builder.getRequestingMembersList(), approvedMember.getUuid());
int index = indexOfAciInRequestingList(builder.getRequestingMembersList(), approvedMember.getAciBytes());
if (index == -1) {
Log.w(TAG, "Deleted member on change not found in group");
@@ -542,7 +532,7 @@ public final class DecryptedGroupUtil {
builder.removeRequestingMembers(index)
.addMembers(DecryptedMember.newBuilder()
.setUuid(approvedMember.getUuid())
.setAciBytes(approvedMember.getAciBytes())
.setProfileKey(requestingMember.getProfileKey())
.setRole(role));
}
@@ -558,7 +548,7 @@ public final class DecryptedGroupUtil {
Set<ByteString> bannedMemberServiceIdSet = getBannedMemberServiceIdSet(builder.getBannedMembersList());
for (DecryptedBannedMember member : newBannedMembersList) {
if (bannedMemberServiceIdSet.contains(member.getServiceIdBinary())) {
if (bannedMemberServiceIdSet.contains(member.getServiceIdBytes())) {
Log.w(TAG, "Banned member already in banned list");
} else {
builder.addBannedMembers(member);
@@ -568,7 +558,7 @@ public final class DecryptedGroupUtil {
private static void applyDeleteBannedMembersActions(DecryptedGroup.Builder builder, List<DecryptedBannedMember> deleteMembersList) {
for (DecryptedBannedMember removedMember : deleteMembersList) {
int index = indexOfServiceIdInBannedMemberList(builder.getBannedMembersList(), removedMember.getServiceIdBinary());
int index = indexOfServiceIdInBannedMemberList(builder.getBannedMembersList(), removedMember.getServiceIdBytes());
if (index == -1) {
Log.w(TAG, "Deleted banned member on change not found in banned list");
@@ -581,7 +571,7 @@ public final class DecryptedGroupUtil {
protected static void applyPromotePendingPniAciMemberActions(DecryptedGroup.Builder builder, List<DecryptedMember> promotePendingPniAciMembersList) throws NotAbleToApplyGroupV2ChangeException {
for (DecryptedMember newMember : promotePendingPniAciMembersList) {
int index = findPendingIndexByServiceId(builder.getPendingMembersList(), newMember.getPni());
int index = findPendingIndexByServiceId(builder.getPendingMembersList(), newMember.getPniBytes());
if (index == -1) {
throw new NotAbleToApplyGroupV2ChangeException();
@@ -598,21 +588,21 @@ public final class DecryptedGroupUtil {
.build();
}
private static Set<ByteString> getMemberUuidSet(List<DecryptedMember> membersList) {
Set<ByteString> memberUuids = new HashSet<>(membersList.size());
private static Set<ByteString> getMemberAciSet(List<DecryptedMember> membersList) {
Set<ByteString> memberAcis = new HashSet<>(membersList.size());
for (DecryptedMember members : membersList) {
memberUuids.add(members.getUuid());
memberAcis.add(members.getAciBytes());
}
return memberUuids;
return memberAcis;
}
private static Set<ByteString> getPendingMemberCipherTextSet(List<DecryptedPendingMember> pendingMemberList) {
Set<ByteString> pendingMemberCipherTexts = new HashSet<>(pendingMemberList.size());
for (DecryptedPendingMember pendingMember : pendingMemberList) {
pendingMemberCipherTexts.add(pendingMember.getUuidCipherText());
pendingMemberCipherTexts.add(pendingMember.getServiceIdCipherText());
}
return pendingMemberCipherTexts;
@@ -622,25 +612,25 @@ public final class DecryptedGroupUtil {
Set<ByteString> memberServiceIds = new HashSet<>(bannedMemberList.size());
for (DecryptedBannedMember member : bannedMemberList) {
memberServiceIds.add(member.getServiceIdBinary());
memberServiceIds.add(member.getServiceIdBytes());
}
return memberServiceIds;
}
private static void removePendingAndRequestingMembersNowInGroup(DecryptedGroup.Builder builder) {
Set<ByteString> allMembers = membersToUuidByteStringSet(builder.getMembersList());
Set<ByteString> allMembers = membersToAciByteStringSet(builder.getMembersList());
for (int i = builder.getPendingMembersCount() - 1; i >= 0; i--) {
DecryptedPendingMember pendingMember = builder.getPendingMembers(i);
if (allMembers.contains(pendingMember.getServiceIdBinary())) {
if (allMembers.contains(pendingMember.getServiceIdBytes())) {
builder.removePendingMembers(i);
}
}
for (int i = builder.getRequestingMembersCount() - 1; i >= 0; i--) {
DecryptedRequestingMember requestingMember = builder.getRequestingMembers(i);
if (allMembers.contains(requestingMember.getUuid())) {
if (allMembers.contains(requestingMember.getAciBytes())) {
builder.removeRequestingMembers(i);
}
}
@@ -652,23 +642,29 @@ public final class DecryptedGroupUtil {
}
}
private static int indexOfUuid(List<DecryptedMember> memberList, ByteString uuid) {
private static int indexOfAci(List<DecryptedMember> memberList, ByteString aci) {
for (int i = 0; i < memberList.size(); i++) {
if (uuid.equals(memberList.get(i).getUuid())) return i;
if (aci.equals(memberList.get(i).getAciBytes())) {
return i;
}
}
return -1;
}
private static int indexOfUuidInRequestingList(List<DecryptedRequestingMember> memberList, ByteString uuid) {
private static int indexOfAciInRequestingList(List<DecryptedRequestingMember> memberList, ByteString aci) {
for (int i = 0; i < memberList.size(); i++) {
if (uuid.equals(memberList.get(i).getUuid())) return i;
if (aci.equals(memberList.get(i).getAciBytes())) {
return i;
}
}
return -1;
}
private static int indexOfServiceIdInBannedMemberList(List<DecryptedBannedMember> memberList, ByteString serviceIdBinary) {
for (int i = 0; i < memberList.size(); i++) {
if (serviceIdBinary.equals(memberList.get(i).getServiceIdBinary())) return i;
if (serviceIdBinary.equals(memberList.get(i).getServiceIdBytes())) {
return i;
}
}
return -1;
}

View File

@@ -57,37 +57,37 @@ public final class GroupChangeReconstruct {
builder.setNewMemberAccess(toState.getAccessControl().getMembers());
}
Set<ByteString> fromStateMemberUuids = membersToSetOfUuids(fromState.getMembersList());
Set<ByteString> toStateMemberUuids = membersToSetOfUuids(toState.getMembersList());
Set<ByteString> fromStateMemberAcis = membersToSetOfAcis(fromState.getMembersList());
Set<ByteString> toStateMemberAcis = membersToSetOfAcis(toState.getMembersList());
Set<ByteString> pendingMembersListA = pendingMembersToSetOfServiceIds(fromState.getPendingMembersList());
Set<ByteString> pendingMembersListB = pendingMembersToSetOfServiceIds(toState.getPendingMembersList());
Set<ByteString> requestingMembersListA = requestingMembersToSetOfUuids(fromState.getRequestingMembersList());
Set<ByteString> requestingMembersListB = requestingMembersToSetOfUuids(toState.getRequestingMembersList());
Set<ByteString> requestingMembersListA = requestingMembersToSetOfAcis(fromState.getRequestingMembersList());
Set<ByteString> requestingMembersListB = requestingMembersToSetOfAcis(toState.getRequestingMembersList());
Set<ByteString> bannedMembersListA = bannedMembersToSetOfServiceIds(fromState.getBannedMembersList());
Set<ByteString> bannedMembersListB = bannedMembersToSetOfServiceIds(toState.getBannedMembersList());
Set<ByteString> removedPendingMemberServiceIds = subtract(pendingMembersListA, pendingMembersListB);
Set<ByteString> removedRequestingMemberUuids = subtract(requestingMembersListA, requestingMembersListB);
Set<ByteString> removedRequestingMemberAcis = subtract(requestingMembersListA, requestingMembersListB);
Set<ByteString> newPendingMemberServiceIds = subtract(pendingMembersListB, pendingMembersListA);
Set<ByteString> newRequestingMemberUuids = subtract(requestingMembersListB, requestingMembersListA);
Set<ByteString> removedMemberUuids = subtract(fromStateMemberUuids, toStateMemberUuids);
Set<ByteString> newMemberUuids = subtract(toStateMemberUuids, fromStateMemberUuids);
Set<ByteString> newRequestingMemberAcis = subtract(requestingMembersListB, requestingMembersListA);
Set<ByteString> removedMemberAcis = subtract(fromStateMemberAcis, toStateMemberAcis);
Set<ByteString> newMemberAcis = subtract(toStateMemberAcis, fromStateMemberAcis);
Set<ByteString> removedBannedMemberServiceIds = subtract(bannedMembersListA, bannedMembersListB);
Set<ByteString> newBannedMemberServiceIds = subtract(bannedMembersListB, bannedMembersListA);
Set<ByteString> addedByInvitationUuids = intersect(newMemberUuids, removedPendingMemberServiceIds);
Set<ByteString> addedByRequestApprovalUuids = intersect(newMemberUuids, removedRequestingMemberUuids);
Set<DecryptedMember> addedMembersByInvitation = intersectByUUID(toState.getMembersList(), addedByInvitationUuids);
Set<DecryptedMember> addedMembersByRequestApproval = intersectByUUID(toState.getMembersList(), addedByRequestApprovalUuids);
Set<DecryptedMember> addedMembers = intersectByUUID(toState.getMembersList(), subtract(newMemberUuids, addedByInvitationUuids, addedByRequestApprovalUuids));
Set<DecryptedPendingMember> uninvitedMembers = intersectPendingByServiceId(fromState.getPendingMembersList(), subtract(removedPendingMemberServiceIds, addedByInvitationUuids));
Set<DecryptedRequestingMember> rejectedRequestMembers = intersectRequestingByUUID(fromState.getRequestingMembersList(), subtract(removedRequestingMemberUuids, addedByRequestApprovalUuids));
Set<ByteString> addedByInvitationAcis = intersect(newMemberAcis, removedPendingMemberServiceIds);
Set<ByteString> addedByRequestApprovalAcis = intersect(newMemberAcis, removedRequestingMemberAcis);
Set<DecryptedMember> addedMembersByInvitation = intersectByAci(toState.getMembersList(), addedByInvitationAcis);
Set<DecryptedMember> addedMembersByRequestApproval = intersectByAci(toState.getMembersList(), addedByRequestApprovalAcis);
Set<DecryptedMember> addedMembers = intersectByAci(toState.getMembersList(), subtract(newMemberAcis, addedByInvitationAcis, addedByRequestApprovalAcis));
Set<DecryptedPendingMember> uninvitedMembers = intersectPendingByServiceId(fromState.getPendingMembersList(), subtract(removedPendingMemberServiceIds, addedByInvitationAcis));
Set<DecryptedRequestingMember> rejectedRequestMembers = intersectRequestingByAci(fromState.getRequestingMembersList(), subtract(removedRequestingMemberAcis, addedByRequestApprovalAcis));
for (DecryptedMember member : intersectByUUID(fromState.getMembersList(), removedMemberUuids)) {
builder.addDeleteMembers(member.getUuid());
for (DecryptedMember member : intersectByAci(fromState.getMembersList(), removedMemberAcis)) {
builder.addDeleteMembers(member.getAciBytes());
}
for (DecryptedMember member : addedMembers) {
@@ -100,24 +100,24 @@ public final class GroupChangeReconstruct {
for (DecryptedPendingMember uninvitedMember : uninvitedMembers) {
builder.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(uninvitedMember.getServiceIdBinary())
.setUuidCipherText(uninvitedMember.getUuidCipherText()));
.setServiceIdBytes(uninvitedMember.getServiceIdBytes())
.setServiceIdCipherText(uninvitedMember.getServiceIdCipherText()));
}
for (DecryptedPendingMember invitedMember : intersectPendingByServiceId(toState.getPendingMembersList(), newPendingMemberServiceIds)) {
builder.addNewPendingMembers(invitedMember);
}
Set<ByteString> consistentMemberUuids = intersect(fromStateMemberUuids, toStateMemberUuids);
Set<DecryptedMember> changedMembers = intersectByUUID(subtract(toState.getMembersList(), fromState.getMembersList()), consistentMemberUuids);
Map<ByteString, DecryptedMember> membersUuidMap = uuidMap(fromState.getMembersList());
Set<ByteString> consistentMemberAcis = intersect(fromStateMemberAcis, toStateMemberAcis);
Set<DecryptedMember> changedMembers = intersectByAci(subtract(toState.getMembersList(), fromState.getMembersList()), consistentMemberAcis);
Map<ByteString, DecryptedMember> membersAciMap = mapByAci(fromState.getMembersList());
Map<ByteString, DecryptedBannedMember> bannedMembersServiceIdMap = bannedServiceIdMap(toState.getBannedMembersList());
for (DecryptedMember newState : changedMembers) {
DecryptedMember oldState = membersUuidMap.get(newState.getUuid());
DecryptedMember oldState = membersAciMap.get(newState.getAciBytes());
if (oldState.getRole() != newState.getRole()) {
builder.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder()
.setUuid(newState.getUuid())
.setAciBytes(newState.getAciBytes())
.setRole(newState.getRole()));
}
@@ -130,17 +130,17 @@ public final class GroupChangeReconstruct {
builder.setNewInviteLinkAccess(toState.getAccessControl().getAddFromInviteLink());
}
for (DecryptedRequestingMember requestingMember : intersectRequestingByUUID(toState.getRequestingMembersList(), newRequestingMemberUuids)) {
for (DecryptedRequestingMember requestingMember : intersectRequestingByAci(toState.getRequestingMembersList(), newRequestingMemberAcis)) {
builder.addNewRequestingMembers(requestingMember);
}
for (DecryptedRequestingMember requestingMember : rejectedRequestMembers) {
builder.addDeleteRequestingMembers(requestingMember.getUuid());
builder.addDeleteRequestingMembers(requestingMember.getAciBytes());
}
for (DecryptedMember member : addedMembersByRequestApproval) {
builder.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder()
.setUuid(member.getUuid())
.setAciBytes(member.getAciBytes())
.setRole(member.getRole()));
}
@@ -149,11 +149,11 @@ public final class GroupChangeReconstruct {
}
for (ByteString serviceIdBinary : removedBannedMemberServiceIds) {
builder.addDeleteBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBinary(serviceIdBinary).build());
builder.addDeleteBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBytes(serviceIdBinary).build());
}
for (ByteString serviceIdBinary : newBannedMemberServiceIds) {
DecryptedBannedMember.Builder newBannedBuilder = DecryptedBannedMember.newBuilder().setServiceIdBinary(serviceIdBinary);
DecryptedBannedMember.Builder newBannedBuilder = DecryptedBannedMember.newBuilder().setServiceIdBytes(serviceIdBinary);
DecryptedBannedMember bannedMember = bannedMembersServiceIdMap.get(serviceIdBinary);
if (bannedMember != null) {
newBannedBuilder.setTimestamp(bannedMember.getTimestamp());
@@ -165,10 +165,10 @@ public final class GroupChangeReconstruct {
return builder.build();
}
private static Map<ByteString, DecryptedMember> uuidMap(List<DecryptedMember> membersList) {
private static Map<ByteString, DecryptedMember> mapByAci(List<DecryptedMember> membersList) {
Map<ByteString, DecryptedMember> map = new LinkedHashMap<>(membersList.size());
for (DecryptedMember member : membersList) {
map.put(member.getUuid(), member);
map.put(member.getAciBytes(), member);
}
return map;
}
@@ -176,15 +176,15 @@ public final class GroupChangeReconstruct {
private static Map<ByteString, DecryptedBannedMember> bannedServiceIdMap(List<DecryptedBannedMember> membersList) {
Map<ByteString, DecryptedBannedMember> map = new LinkedHashMap<>(membersList.size());
for (DecryptedBannedMember member : membersList) {
map.put(member.getServiceIdBinary(), member);
map.put(member.getServiceIdBytes(), member);
}
return map;
}
private static Set<DecryptedMember> intersectByUUID(Collection<DecryptedMember> members, Set<ByteString> uuids) {
private static Set<DecryptedMember> intersectByAci(Collection<DecryptedMember> members, Set<ByteString> acis) {
Set<DecryptedMember> result = new LinkedHashSet<>(members.size());
for (DecryptedMember member : members) {
if (uuids.contains(member.getUuid()))
if (acis.contains(member.getAciBytes()))
result.add(member);
}
return result;
@@ -193,16 +193,16 @@ public final class GroupChangeReconstruct {
private static Set<DecryptedPendingMember> intersectPendingByServiceId(Collection<DecryptedPendingMember> members, Set<ByteString> serviceIds) {
Set<DecryptedPendingMember> result = new LinkedHashSet<>(members.size());
for (DecryptedPendingMember member : members) {
if (serviceIds.contains(member.getServiceIdBinary()))
if (serviceIds.contains(member.getServiceIdBytes()))
result.add(member);
}
return result;
}
private static Set<DecryptedRequestingMember> intersectRequestingByUUID(Collection<DecryptedRequestingMember> members, Set<ByteString> uuids) {
private static Set<DecryptedRequestingMember> intersectRequestingByAci(Collection<DecryptedRequestingMember> members, Set<ByteString> acis) {
Set<DecryptedRequestingMember> result = new LinkedHashSet<>(members.size());
for (DecryptedRequestingMember member : members) {
if (uuids.contains(member.getUuid()))
if (acis.contains(member.getAciBytes()))
result.add(member);
}
return result;
@@ -211,31 +211,31 @@ public final class GroupChangeReconstruct {
private static Set<ByteString> pendingMembersToSetOfServiceIds(Collection<DecryptedPendingMember> pendingMembers) {
Set<ByteString> serviceIds = new LinkedHashSet<>(pendingMembers.size());
for (DecryptedPendingMember pendingMember : pendingMembers) {
serviceIds.add(pendingMember.getServiceIdBinary());
serviceIds.add(pendingMember.getServiceIdBytes());
}
return serviceIds;
}
private static Set<ByteString> requestingMembersToSetOfUuids(Collection<DecryptedRequestingMember> requestingMembers) {
Set<ByteString> uuids = new LinkedHashSet<>(requestingMembers.size());
private static Set<ByteString> requestingMembersToSetOfAcis(Collection<DecryptedRequestingMember> requestingMembers) {
Set<ByteString> acis = new LinkedHashSet<>(requestingMembers.size());
for (DecryptedRequestingMember requestingMember : requestingMembers) {
uuids.add(requestingMember.getUuid());
acis.add(requestingMember.getAciBytes());
}
return uuids;
return acis;
}
private static Set<ByteString> membersToSetOfUuids(Collection<DecryptedMember> members) {
Set<ByteString> uuids = new LinkedHashSet<>(members.size());
private static Set<ByteString> membersToSetOfAcis(Collection<DecryptedMember> members) {
Set<ByteString> acis = new LinkedHashSet<>(members.size());
for (DecryptedMember member : members) {
uuids.add(member.getUuid());
acis.add(member.getAciBytes());
}
return uuids;
return acis;
}
private static Set<ByteString> bannedMembersToSetOfServiceIds(Collection<DecryptedBannedMember> bannedMembers) {
Set<ByteString> serviceIds = new LinkedHashSet<>(bannedMembers.size());
for (DecryptedBannedMember bannedMember : bannedMembers) {
serviceIds.add(bannedMember.getServiceIdBinary());
serviceIds.add(bannedMember.getServiceIdBytes());
}
return serviceIds;
}

View File

@@ -113,19 +113,19 @@ public final class GroupChangeUtil {
HashMap<ByteString, DecryptedBannedMember> bannedMembersByServiceId = new HashMap<>(groupState.getBannedMembersCount());
for (DecryptedMember member : groupState.getMembersList()) {
fullMembersByUuid.put(member.getUuid(), member);
fullMembersByUuid.put(member.getAciBytes(), member);
}
for (DecryptedPendingMember member : groupState.getPendingMembersList()) {
pendingMembersByServiceId.put(member.getServiceIdBinary(), member);
pendingMembersByServiceId.put(member.getServiceIdBytes(), member);
}
for (DecryptedRequestingMember member : groupState.getRequestingMembersList()) {
requestingMembersByUuid.put(member.getUuid(), member);
requestingMembersByUuid.put(member.getAciBytes(), member);
}
for (DecryptedBannedMember member : groupState.getBannedMembersList()) {
bannedMembersByServiceId.put(member.getServiceIdBinary(), member);
bannedMembersByServiceId.put(member.getServiceIdBytes(), member);
}
resolveField3AddMembers (conflictingChange, changeSetModifier, fullMembersByUuid, pendingMembersByServiceId);
@@ -157,9 +157,9 @@ public final class GroupChangeUtil {
for (int i = newMembersList.size() - 1; i >= 0; i--) {
DecryptedMember member = newMembersList.get(i);
if (fullMembersByUuid.containsKey(member.getUuid())) {
if (fullMembersByUuid.containsKey(member.getAciBytes())) {
result.removeAddMembers(i);
} else if (pendingMembersByServiceId.containsKey(member.getUuid())) {
} else if (pendingMembersByServiceId.containsKey(member.getAciBytes()) || pendingMembersByServiceId.containsKey(member.getPniBytes())) {
result.moveAddToPromote(i);
}
}
@@ -182,7 +182,7 @@ public final class GroupChangeUtil {
for (int i = modifyRolesList.size() - 1; i >= 0; i--) {
DecryptedModifyMemberRole modifyRoleAction = modifyRolesList.get(i);
DecryptedMember memberInGroup = fullMembersByUuid.get(modifyRoleAction.getUuid());
DecryptedMember memberInGroup = fullMembersByUuid.get(modifyRoleAction.getAciBytes());
if (memberInGroup == null || memberInGroup.getRole() == modifyRoleAction.getRole()) {
result.removeModifyMemberRoles(i);
@@ -195,7 +195,7 @@ public final class GroupChangeUtil {
for (int i = modifyProfileKeysList.size() - 1; i >= 0; i--) {
DecryptedMember member = modifyProfileKeysList.get(i);
DecryptedMember memberInGroup = fullMembersByUuid.get(member.getUuid());
DecryptedMember memberInGroup = fullMembersByUuid.get(member.getAciBytes());
if (memberInGroup == null || member.getProfileKey().equals(memberInGroup.getProfileKey())) {
result.removeModifyMemberProfileKeys(i);
@@ -209,7 +209,7 @@ public final class GroupChangeUtil {
for (int i = newPendingMembersList.size() - 1; i >= 0; i--) {
DecryptedPendingMember member = newPendingMembersList.get(i);
if (fullMembersByUuid.containsKey(member.getServiceIdBinary()) || pendingMembersByServiceId.containsKey(member.getServiceIdBinary())) {
if (fullMembersByUuid.containsKey(member.getServiceIdBytes()) || pendingMembersByServiceId.containsKey(member.getServiceIdBytes())) {
result.removeAddPendingMembers(i);
}
}
@@ -221,7 +221,7 @@ public final class GroupChangeUtil {
for (int i = deletePendingMembersList.size() - 1; i >= 0; i--) {
DecryptedPendingMemberRemoval member = deletePendingMembersList.get(i);
if (!pendingMembersByServiceId.containsKey(member.getServiceIdBinary())) {
if (!pendingMembersByServiceId.containsKey(member.getServiceIdBytes())) {
result.removeDeletePendingMembers(i);
}
}
@@ -233,7 +233,7 @@ public final class GroupChangeUtil {
for (int i = promotePendingMembersList.size() - 1; i >= 0; i--) {
DecryptedMember member = promotePendingMembersList.get(i);
if (!pendingMembersByServiceId.containsKey(member.getUuid())) {
if (!pendingMembersByServiceId.containsKey(member.getAciBytes()) && !pendingMembersByServiceId.containsKey(member.getPniBytes())) {
result.removePromotePendingMembers(i);
}
}
@@ -281,9 +281,9 @@ public final class GroupChangeUtil {
for (int i = newMembersList.size() - 1; i >= 0; i--) {
DecryptedRequestingMember member = newMembersList.get(i);
if (fullMembersByUuid.containsKey(member.getUuid())) {
if (fullMembersByUuid.containsKey(member.getAciBytes())) {
result.removeAddRequestingMembers(i);
} else if (pendingMembersByServiceId.containsKey(member.getUuid())) {
} else if (pendingMembersByServiceId.containsKey(member.getAciBytes())) {
result.moveAddRequestingMembersToPromote(i);
}
}
@@ -313,7 +313,7 @@ public final class GroupChangeUtil {
for (int i = promoteRequestingMembersList.size() - 1; i >= 0; i--) {
DecryptedApproveMember member = promoteRequestingMembersList.get(i);
if (!requestingMembersByUuid.containsKey(member.getUuid())) {
if (!requestingMembersByUuid.containsKey(member.getAciBytes())) {
result.removePromoteRequestingMembers(i);
}
}
@@ -337,7 +337,7 @@ public final class GroupChangeUtil {
for (int i = newBannedMembersList.size() - 1; i >= 0; i--) {
DecryptedBannedMember member = newBannedMembersList.get(i);
if (bannedMembersByServiceId.containsKey(member.getServiceIdBinary())) {
if (bannedMembersByServiceId.containsKey(member.getServiceIdBytes())) {
result.removeAddBannedMembers(i);
}
}
@@ -349,19 +349,19 @@ public final class GroupChangeUtil {
for (int i = deleteBannedMembersList.size() - 1; i >= 0; i--) {
DecryptedBannedMember member = deleteBannedMembersList.get(i);
if (!bannedMembersByServiceId.containsKey(member.getServiceIdBinary())) {
if (!bannedMembersByServiceId.containsKey(member.getServiceIdBytes())) {
result.removeDeleteBannedMembers(i);
}
}
}
private static void resolveField24PromotePendingPniAciMembers(DecryptedGroupChange conflictingChange, ChangeSetModifier result, HashMap<ByteString, DecryptedMember> fullMembersByUuid) {
private static void resolveField24PromotePendingPniAciMembers(DecryptedGroupChange conflictingChange, ChangeSetModifier result, HashMap<ByteString, DecryptedMember> fullMembersByAci) {
List<DecryptedMember> promotePendingPniAciMembersList = conflictingChange.getPromotePendingPniAciMembersList();
for (int i = promotePendingPniAciMembersList.size() - 1; i >= 0; i--) {
DecryptedMember member = promotePendingPniAciMembersList.get(i);
if (fullMembersByUuid.containsKey(member.getUuid())) {
if (fullMembersByAci.containsKey(member.getAciBytes())) {
result.removePromotePendingPniAciMembers(i);
}
}

View File

@@ -215,14 +215,16 @@ public final class GroupsV2Operations {
return actions;
}
public GroupChange.Actions.Builder createRefuseGroupJoinRequest(Set<UUID> requestsToRemove, boolean alsoBan, List<DecryptedBannedMember> bannedMembers) {
GroupChange.Actions.Builder actions = alsoBan ? createBanUuidsChange(requestsToRemove, false, bannedMembers)
public GroupChange.Actions.Builder createRefuseGroupJoinRequest(Set<? extends ServiceId> requestsToRemove, boolean alsoBan, List<DecryptedBannedMember> bannedMembers) {
GroupChange.Actions.Builder actions = alsoBan ? createBanServiceIdsChange(requestsToRemove, false, bannedMembers)
: GroupChange.Actions.newBuilder();
for (UUID uuid : requestsToRemove) {
actions.addDeleteRequestingMembers(GroupChange.Actions.DeleteRequestingMemberAction
.newBuilder()
.setDeletedUserId(encryptServiceId(ACI.from(uuid))));
for (ServiceId serviceId : requestsToRemove) {
if (serviceId instanceof ACI) {
actions.addDeleteRequestingMembers(GroupChange.Actions.DeleteRequestingMemberAction
.newBuilder()
.setDeletedUserId(encryptServiceId(serviceId)));
}
}
return actions;
@@ -241,20 +243,20 @@ public final class GroupsV2Operations {
return actions;
}
public GroupChange.Actions.Builder createRemoveMembersChange(final Set<UUID> membersToRemove, boolean alsoBan, List<DecryptedBannedMember> bannedMembers) {
GroupChange.Actions.Builder actions = alsoBan ? createBanUuidsChange(membersToRemove, false, bannedMembers)
public GroupChange.Actions.Builder createRemoveMembersChange(final Set<ACI> membersToRemove, boolean alsoBan, List<DecryptedBannedMember> bannedMembers) {
GroupChange.Actions.Builder actions = alsoBan ? createBanServiceIdsChange(membersToRemove, false, bannedMembers)
: GroupChange.Actions.newBuilder();
for (UUID remove: membersToRemove) {
for (ACI remove: membersToRemove) {
actions.addDeleteMembers(GroupChange.Actions.DeleteMemberAction
.newBuilder()
.setDeletedUserId(encryptServiceId(ACI.from(remove))));
.setDeletedUserId(encryptServiceId(remove)));
}
return actions;
}
public GroupChange.Actions.Builder createLeaveAndPromoteMembersToAdmin(UUID self, List<UUID> membersToMakeAdmin) {
public GroupChange.Actions.Builder createLeaveAndPromoteMembersToAdmin(ACI self, List<UUID> membersToMakeAdmin) {
GroupChange.Actions.Builder actions = createRemoveMembersChange(Collections.singleton(self), false, Collections.emptyList());
for (UUID member : membersToMakeAdmin) {
@@ -363,16 +365,16 @@ public final class GroupsV2Operations {
}
/** Note that this can only ban ACIs. */
public GroupChange.Actions.Builder createBanUuidsChange(Set<UUID> banUuids, boolean rejectJoinRequest, List<DecryptedBannedMember> bannedMembersList) {
GroupChange.Actions.Builder builder = rejectJoinRequest ? createRefuseGroupJoinRequest(banUuids, false, Collections.emptyList())
public GroupChange.Actions.Builder createBanServiceIdsChange(Set<? extends ServiceId> banServiceIds, boolean rejectJoinRequest, List<DecryptedBannedMember> bannedMembersList) {
GroupChange.Actions.Builder builder = rejectJoinRequest ? createRefuseGroupJoinRequest(banServiceIds, false, Collections.emptyList())
: GroupChange.Actions.newBuilder();
int spacesToFree = bannedMembersList.size() + banUuids.size() - maxGroupSize;
int spacesToFree = bannedMembersList.size() + banServiceIds.size() - maxGroupSize;
if (spacesToFree > 0) {
List<ByteString> unban = bannedMembersList.stream()
.sorted(Comparator.comparingLong(DecryptedBannedMember::getTimestamp))
.limit(spacesToFree)
.map(DecryptedBannedMember::getServiceIdBinary)
.map(DecryptedBannedMember::getServiceIdBytes)
.collect(Collectors.toList());
for (ByteString serviceIdBinary : unban) {
@@ -380,8 +382,8 @@ public final class GroupsV2Operations {
}
}
for (UUID uuid : banUuids) {
builder.addAddBannedMembers(GroupChange.Actions.AddBannedMemberAction.newBuilder().setAdded(BannedMember.newBuilder().setUserId(encryptServiceId(ACI.from(uuid))).build()));
for (ServiceId banServiceId : banServiceIds) {
builder.addAddBannedMembers(GroupChange.Actions.AddBannedMemberAction.newBuilder().setAdded(BannedMember.newBuilder().setUserId(encryptServiceId(banServiceId)).build()));
}
return builder;
@@ -458,7 +460,7 @@ public final class GroupsV2Operations {
for (Member member : membersList) {
ACI memberAci = decryptAci(member.getUserId());
decryptedMembers.add(DecryptedMember.newBuilder()
.setUuid(memberAci.toByteString())
.setAciBytes(memberAci.toByteString())
.setJoinedAtRevision(member.getJoinedAtRevision())
.build());
}
@@ -466,7 +468,7 @@ public final class GroupsV2Operations {
for (PendingMember member : pendingMembersList) {
ServiceId pendingMemberServiceId = decryptServiceIdOrUnknown(member.getMember().getUserId());
decryptedPendingMembers.add(DecryptedPendingMember.newBuilder()
.setServiceIdBinary(pendingMemberServiceId.toByteString())
.setServiceIdBytes(pendingMemberServiceId.toByteString())
.build());
}
@@ -507,7 +509,7 @@ public final class GroupsV2Operations {
}
for (BannedMember member : group.getBannedMembersList()) {
decryptedBannedMembers.add(DecryptedBannedMember.newBuilder().setServiceIdBinary(decryptServiceIdToBinary(member.getUserId())).setTimestamp(member.getTimestamp()).build());
decryptedBannedMembers.add(DecryptedBannedMember.newBuilder().setServiceIdBytes(decryptServiceIdToBinary(member.getUserId())).setTimestamp(member.getTimestamp()).build());
}
return DecryptedGroup.newBuilder()
@@ -560,9 +562,9 @@ public final class GroupsV2Operations {
// Field 1
if (source != null) {
builder.setEditor(source.toByteString());
builder.setEditorServiceIdBytes(source.toByteString());
} else {
builder.setEditor(decryptServiceIdToBinary(actions.getSourceUuid()));
builder.setEditorServiceIdBytes(decryptServiceIdToBinary(actions.getSourceServiceId()));
}
// Field 2
@@ -579,14 +581,14 @@ public final class GroupsV2Operations {
// Field 4
for (GroupChange.Actions.DeleteMemberAction deleteMemberAction : actions.getDeleteMembersList()) {
builder.addDeleteMembers(decryptServiceIdToBinary(deleteMemberAction.getDeletedUserId()));
builder.addDeleteMembers(decryptAciToBinary(deleteMemberAction.getDeletedUserId()));
}
// Field 5
for (GroupChange.Actions.ModifyMemberRoleAction modifyMemberRoleAction : actions.getModifyMemberRolesList()) {
builder.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder()
.setRole(modifyMemberRoleAction.getRole())
.setUuid(decryptServiceIdToBinary(modifyMemberRoleAction.getUserId())));
.setAciBytes(decryptAciToBinary(modifyMemberRoleAction.getUserId())));
}
// Field 6
@@ -607,7 +609,7 @@ public final class GroupsV2Operations {
builder.addModifiedProfileKeys(DecryptedMember.newBuilder()
.setRole(Member.Role.UNKNOWN)
.setJoinedAtRevision(-1)
.setUuid(aci.toByteString())
.setAciBytes(aci.toByteString())
.setProfileKey(ByteString.copyFrom(profileKey.serialize())));
} catch (InvalidInputException e) {
throw new InvalidGroupStateException(e);
@@ -616,27 +618,27 @@ public final class GroupsV2Operations {
// Field 7
for (GroupChange.Actions.AddPendingMemberAction addPendingMemberAction : actions.getAddPendingMembersList()) {
PendingMember added = addPendingMemberAction.getAdded();
Member member = added.getMember();
ByteString uuidCipherText = member.getUserId();
ServiceId serviceId = decryptServiceIdOrUnknown(uuidCipherText);
PendingMember added = addPendingMemberAction.getAdded();
Member member = added.getMember();
ByteString serviceIdCipherText = member.getUserId();
ServiceId serviceId = decryptServiceIdOrUnknown(serviceIdCipherText);
builder.addNewPendingMembers(DecryptedPendingMember.newBuilder()
.setServiceIdBinary(serviceId.toByteString())
.setUuidCipherText(uuidCipherText)
.setServiceIdBytes(serviceId.toByteString())
.setServiceIdCipherText(serviceIdCipherText)
.setRole(member.getRole())
.setAddedByUuid(decryptServiceIdToBinary(added.getAddedByUserId()))
.setAddedByAci(decryptAciToBinary(added.getAddedByUserId()))
.setTimestamp(added.getTimestamp()));
}
// Field 8
for (GroupChange.Actions.DeletePendingMemberAction deletePendingMemberAction : actions.getDeletePendingMembersList()) {
ByteString uuidCipherText = deletePendingMemberAction.getDeletedUserId();
ServiceId serviceId = decryptServiceIdOrUnknown(uuidCipherText);
ByteString serviceIdCipherText = deletePendingMemberAction.getDeletedUserId();
ServiceId serviceId = decryptServiceIdOrUnknown(serviceIdCipherText);
builder.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(serviceId.toByteString())
.setUuidCipherText(uuidCipherText));
.setServiceIdBytes(serviceId.toByteString())
.setServiceIdCipherText(serviceIdCipherText));
}
// Field 9
@@ -657,7 +659,7 @@ public final class GroupsV2Operations {
builder.addPromotePendingMembers(DecryptedMember.newBuilder()
.setJoinedAtRevision(-1)
.setRole(Member.Role.DEFAULT)
.setUuid(aci.toByteString())
.setAciBytes(aci.toByteString())
.setProfileKey(ByteString.copyFrom(profileKey.serialize())));
} catch (InvalidInputException e) {
throw new InvalidGroupStateException(e);
@@ -707,7 +709,7 @@ public final class GroupsV2Operations {
// Field 18
for (GroupChange.Actions.PromoteRequestingMemberAction promote : actions.getPromoteRequestingMembersList()) {
builder.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder().setRole(promote.getRole()).setUuid(decryptServiceIdToBinary(promote.getUserId())));
builder.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder().setRole(promote.getRole()).setAciBytes(decryptAciToBinary(promote.getUserId())));
}
// Field 19
@@ -727,12 +729,12 @@ public final class GroupsV2Operations {
// Field 22
for (GroupChange.Actions.AddBannedMemberAction action : actions.getAddBannedMembersList()) {
builder.addNewBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBinary(decryptServiceIdToBinary(action.getAdded().getUserId())).setTimestamp(action.getAdded().getTimestamp()).build());
builder.addNewBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBytes(decryptServiceIdToBinary(action.getAdded().getUserId())).setTimestamp(action.getAdded().getTimestamp()).build());
}
// Field 23
for (GroupChange.Actions.DeleteBannedMemberAction action : actions.getDeleteBannedMembersList()) {
builder.addDeleteBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBinary(decryptServiceIdToBinary(action.getDeletedUserId())).build());
builder.addDeleteBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBytes(decryptServiceIdToBinary(action.getDeletedUserId())).build());
}
// Field 24
@@ -745,13 +747,13 @@ public final class GroupsV2Operations {
throw new InvalidGroupStateException();
}
builder.setEditor(aci.toByteString())
builder.setEditorServiceIdBytes(aci.toByteString())
.addPromotePendingPniAciMembers(DecryptedMember.newBuilder()
.setUuid(aci.toByteString())
.setAciBytes(aci.toByteString())
.setRole(Member.Role.DEFAULT)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setJoinedAtRevision(actions.getRevision())
.setPni(pni.toByteString()));
.setPniBytes(pni.toByteString()));
}
return builder.build();
@@ -776,7 +778,7 @@ public final class GroupsV2Operations {
ACI aci = decryptAci(member.getUserId());
return DecryptedMember.newBuilder()
.setUuid(aci.toByteString())
.setAciBytes(aci.toByteString())
.setJoinedAtRevision(member.getJoinedAtRevision())
.setProfileKey(decryptProfileKeyToByteString(member.getProfileKey(), aci))
.setRole(member.getRole());
@@ -787,12 +789,12 @@ public final class GroupsV2Operations {
if (!(serviceId instanceof ACI)) {
throw new InvalidGroupStateException();
}
ACI serviceIdAsAci = (ACI)serviceId;
ACI aci = (ACI) serviceId;
ProfileKey profileKey = clientZkGroupCipher.decryptProfileKey(profileKeyCredentialPresentation.getProfileKeyCiphertext(), serviceIdAsAci.getLibSignalAci());
ProfileKey profileKey = clientZkGroupCipher.decryptProfileKey(profileKeyCredentialPresentation.getProfileKeyCiphertext(), aci.getLibSignalAci());
return DecryptedMember.newBuilder()
.setUuid(serviceIdAsAci.toByteString())
.setAciBytes(aci.toByteString())
.setJoinedAtRevision(member.getJoinedAtRevision())
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setRole(member.getRole());
@@ -813,9 +815,9 @@ public final class GroupsV2Operations {
}
return DecryptedPendingMember.newBuilder()
.setServiceIdBinary(serviceId.toByteString())
.setUuidCipherText(userIdCipherText)
.setAddedByUuid(addedBy.toByteString())
.setServiceIdBytes(serviceId.toByteString())
.setServiceIdCipherText(userIdCipherText)
.setAddedByAci(addedBy.toByteString())
.setRole(role)
.setTimestamp(member.getTimestamp())
.build();
@@ -828,7 +830,7 @@ public final class GroupsV2Operations {
ACI aci = decryptAci(member.getUserId());
return DecryptedRequestingMember.newBuilder()
.setUuid(aci.toByteString())
.setAciBytes(aci.toByteString())
.setProfileKey(decryptProfileKeyToByteString(member.getProfileKey(), aci))
.setTimestamp(member.getTimestamp())
.build();
@@ -844,12 +846,12 @@ public final class GroupsV2Operations {
if (!(serviceId instanceof ACI)) {
throw new InvalidGroupStateException();
}
ACI serviceIdAsAci = (ACI)serviceId;
ACI aci = (ACI) serviceId;
ProfileKey profileKey = clientZkGroupCipher.decryptProfileKey(profileKeyCredentialPresentation.getProfileKeyCiphertext(), serviceIdAsAci.getLibSignalAci());
ProfileKey profileKey = clientZkGroupCipher.decryptProfileKey(profileKeyCredentialPresentation.getProfileKeyCiphertext(), aci.getLibSignalAci());
return DecryptedRequestingMember.newBuilder()
.setUuid(serviceIdAsAci.toByteString())
.setAciBytes(aci.toByteString())
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.build();
}
@@ -872,6 +874,10 @@ public final class GroupsV2Operations {
return decryptServiceId(userId).toByteString();
}
private ByteString decryptAciToBinary(ByteString userId) throws InvalidGroupStateException, VerificationFailedException {
return decryptAci(userId).toByteString();
}
// Visible for Testing
public ByteString encryptServiceId(ServiceId serviceId) {
return ByteString.copyFrom(clientZkGroupCipher.encrypt(serviceId.getLibSignalServiceId()).serialize());
@@ -888,7 +894,7 @@ public final class GroupsV2Operations {
private ACI decryptAci(ByteString userId) throws InvalidGroupStateException, VerificationFailedException {
ServiceId result = decryptServiceId(userId);
if (result instanceof ACI) {
return (ACI)result;
return (ACI) result;
}
throw new InvalidGroupStateException();
}
@@ -904,6 +910,19 @@ public final class GroupsV2Operations {
}
}
private ACI decryptAciOrUnknown(ByteString userId) {
try {
ServiceId result = ServiceId.fromLibSignal(clientZkGroupCipher.decrypt(new UuidCiphertext(userId.toByteArray())));
if (result instanceof ACI) {
return (ACI) result;
} else {
return ACI.UNKNOWN;
}
} catch (InvalidInputException | VerificationFailedException e) {
return ACI.UNKNOWN;
}
}
ByteString encryptTitle(String title) {
try {
GroupAttributeBlob blob = GroupAttributeBlob.newBuilder().setTitle(title).build();

View File

@@ -110,12 +110,18 @@ sealed class ServiceId(val libSignalServiceId: LibSignalServiceId) {
@JvmStatic
fun from(uuid: UUID): ACI = ACI(LibSignalAci(uuid))
@JvmStatic
fun fromLibSignal(aci: LibSignalAci): ACI = ACI(aci)
@JvmStatic
fun parseOrNull(raw: String?): ACI? = ServiceId.parseOrNull(raw).let { if (it is ACI) it else null }
@JvmStatic
fun parseOrNull(raw: ByteArray?): ACI? = ServiceId.parseOrNull(raw).let { if (it is ACI) it else null }
@JvmStatic
fun parseOrNull(bytes: ByteString): ACI? = parseOrNull(bytes.toByteArray())
@JvmStatic
@Throws(IllegalArgumentException::class)
fun parseOrThrow(raw: String?): ACI = parseOrNull(raw) ?: throw IllegalArgumentException("Invalid ACI!")

View File

@@ -37,11 +37,11 @@ public final class ServiceIds {
return Objects.requireNonNull(pni);
}
public boolean matches(UUID uuid) {
return uuid.equals(aci.getRawUuid()) || (pni != null && uuid.equals(pni.getRawUuid()));
public boolean matches(ServiceId serviceId) {
return serviceId.equals(aci) || (pni != null && serviceId.equals(pni));
}
public boolean matches(ByteString uuid) {
public boolean matches(ByteString serviceIdsBytes) {
if (aciByteString == null) {
aciByteString = aci.toByteString();
}
@@ -50,6 +50,6 @@ public final class ServiceIds {
pniByteString = pni.toByteString();
}
return uuid.equals(aciByteString) || uuid.equals(pniByteString);
return serviceIdsBytes.equals(aciByteString) || serviceIdsBytes.equals(pniByteString);
}
}

View File

@@ -13,45 +13,45 @@ import "Groups.proto";
// Decrypted version of Member
// Keep field numbers in step
message DecryptedMember {
bytes uuid = 1;
bytes aciBytes = 1;
Member.Role role = 2;
bytes profileKey = 3;
uint32 joinedAtRevision = 5;
bytes pni = 6;
bytes pniBytes = 6;
}
message DecryptedPendingMember {
bytes serviceIdBinary = 1;
Member.Role role = 2;
bytes addedByUuid = 3;
uint64 timestamp = 4;
bytes uuidCipherText = 5;
bytes serviceIdBytes = 1;
Member.Role role = 2;
bytes addedByAci = 3;
uint64 timestamp = 4;
bytes serviceIdCipherText = 5;
}
message DecryptedRequestingMember {
bytes uuid = 1;
bytes aciBytes = 1;
bytes profileKey = 2;
uint64 timestamp = 4;
}
message DecryptedBannedMember {
bytes serviceIdBinary = 1;
uint64 timestamp = 2;
bytes serviceIdBytes = 1;
uint64 timestamp = 2;
}
message DecryptedPendingMemberRemoval {
bytes serviceIdBinary = 1;
bytes uuidCipherText = 2;
bytes serviceIdBytes = 1;
bytes serviceIdCipherText = 2;
}
message DecryptedApproveMember {
bytes uuid = 1;
Member.Role role = 2;
bytes aciBytes = 1;
Member.Role role = 2;
}
message DecryptedModifyMemberRole {
bytes uuid = 1;
Member.Role role = 2;
bytes aciBytes = 1;
Member.Role role = 2;
}
// Decrypted version of message Group
@@ -74,7 +74,7 @@ message DecryptedGroup {
// Decrypted version of message GroupChange.Actions
// Keep field numbers in step
message DecryptedGroupChange {
bytes editor = 1;
bytes editorServiceIdBytes = 1;
uint32 revision = 2;
repeated DecryptedMember newMembers = 3;
repeated bytes deleteMembers = 4;

View File

@@ -182,7 +182,7 @@ message GroupChange {
bool announcementsOnly = 1;
}
bytes sourceUuid = 1;
bytes sourceServiceId = 1;
uint32 revision = 2;
repeated AddMemberAction addMembers = 3;
repeated DeleteMemberAction deleteMembers = 4;

View File

@@ -4,12 +4,10 @@ import com.google.protobuf.ByteString;
import org.junit.Test;
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.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval;
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.util.UuidUtil;
import org.whispersystems.signalservice.internal.util.Util;
import java.util.List;
@@ -19,54 +17,32 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static java.util.Arrays.asList;
public final class DecryptedGroupUtilTest {
@Test
public void can_extract_uuid_from_decrypted_member() {
UUID uuid = UUID.randomUUID();
DecryptedMember decryptedMember = DecryptedMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.build();
UUID parsed = DecryptedGroupUtil.toUuid(decryptedMember);
assertEquals(uuid, parsed);
}
@Test
public void can_extract_uuid_from_bad_decrypted_member() {
DecryptedMember decryptedMember = DecryptedMember.newBuilder()
.setUuid(ByteString.copyFrom(new byte[0]))
.build();
UUID parsed = DecryptedGroupUtil.toUuid(decryptedMember);
assertEquals(UuidUtil.UNKNOWN_UUID, parsed);
}
@Test
public void can_extract_editor_uuid_from_decrypted_group_change() {
UUID uuid = UUID.randomUUID();
ByteString editor = UuidUtil.toByteString(uuid);
ACI aci = ACI.from(UUID.randomUUID());
ByteString editor = aci.toByteString();
DecryptedGroupChange groupChange = DecryptedGroupChange.newBuilder()
.setEditor(editor)
.setEditorServiceIdBytes(editor)
.build();
UUID parsed = DecryptedGroupUtil.editorUuid(groupChange).get();
ServiceId parsed = DecryptedGroupUtil.editorServiceId(groupChange).get();
assertEquals(uuid, parsed);
assertEquals(aci, parsed);
}
@Test
public void can_extract_uuid_from_decrypted_pending_member() {
ACI aci = ACI.from(UUID.randomUUID());
DecryptedPendingMember decryptedMember = DecryptedPendingMember.newBuilder()
.setServiceIdBinary(aci.toByteString())
.setServiceIdBytes(aci.toByteString())
.build();
ServiceId parsed = ServiceId.parseOrNull(decryptedMember.getServiceIdBinary());
ServiceId parsed = ServiceId.parseOrNull(decryptedMember.getServiceIdBytes());
assertEquals(aci, parsed);
}
@@ -74,10 +50,10 @@ public final class DecryptedGroupUtilTest {
@Test
public void can_extract_uuid_from_bad_decrypted_pending_member() {
DecryptedPendingMember decryptedMember = DecryptedPendingMember.newBuilder()
.setServiceIdBinary(ByteString.copyFrom(Util.getSecretBytes(18)))
.setServiceIdBytes(ByteString.copyFrom(Util.getSecretBytes(18)))
.build();
ServiceId parsed = ServiceId.parseOrNull(decryptedMember.getServiceIdBinary());
ServiceId parsed = ServiceId.parseOrNull(decryptedMember.getServiceIdBytes());
assertNull(parsed);
}
@@ -87,13 +63,13 @@ public final class DecryptedGroupUtilTest {
ACI aci1 = ACI.from(UUID.randomUUID());
ACI aci2 = ACI.from(UUID.randomUUID());
DecryptedPendingMember decryptedMember1 = DecryptedPendingMember.newBuilder()
.setServiceIdBinary(aci1.toByteString())
.setServiceIdBytes(aci1.toByteString())
.build();
DecryptedPendingMember decryptedMember2 = DecryptedPendingMember.newBuilder()
.setServiceIdBinary(aci2.toByteString())
.setServiceIdBytes(aci2.toByteString())
.build();
DecryptedPendingMember decryptedMember3 = DecryptedPendingMember.newBuilder()
.setServiceIdBinary(ByteString.copyFrom(Util.getSecretBytes(18)))
.setServiceIdBytes(ByteString.copyFrom(Util.getSecretBytes(18)))
.build();
DecryptedGroupChange groupChange = DecryptedGroupChange.newBuilder()
@@ -112,13 +88,13 @@ public final class DecryptedGroupUtilTest {
ACI aci1 = ACI.from(UUID.randomUUID());
ACI aci2 = ACI.from(UUID.randomUUID());
DecryptedPendingMemberRemoval decryptedMember1 = DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(aci1.toByteString())
.setServiceIdBytes(aci1.toByteString())
.build();
DecryptedPendingMemberRemoval decryptedMember2 = DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(aci2.toByteString())
.setServiceIdBytes(aci2.toByteString())
.build();
DecryptedPendingMemberRemoval decryptedMember3 = DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(ByteString.copyFrom(Util.getSecretBytes(18)))
.setServiceIdBytes(ByteString.copyFrom(Util.getSecretBytes(18)))
.build();
DecryptedGroupChange groupChange = DecryptedGroupChange.newBuilder()

View File

@@ -146,7 +146,7 @@ public final class DecryptedGroupUtil_apply_Test {
.build(),
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addDeleteMembers(member1.getUuid())
.addDeleteMembers(member1.getAciBytes())
.build());
assertEquals(DecryptedGroup.newBuilder()
@@ -168,8 +168,8 @@ public final class DecryptedGroupUtil_apply_Test {
.build(),
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addDeleteMembers(member1.getUuid())
.addDeleteMembers(member2.getUuid())
.addDeleteMembers(member1.getAciBytes())
.addDeleteMembers(member2.getAciBytes())
.build());
assertEquals(DecryptedGroup.newBuilder()
@@ -189,7 +189,7 @@ public final class DecryptedGroupUtil_apply_Test {
.build(),
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addDeleteMembers(member2.getUuid())
.addDeleteMembers(member2.getAciBytes())
.build());
assertEquals(DecryptedGroup.newBuilder()
@@ -211,8 +211,8 @@ public final class DecryptedGroupUtil_apply_Test {
.build(),
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setUuid(member1.getUuid()).setRole(Member.Role.ADMINISTRATOR))
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setUuid(member2.getUuid()).setRole(Member.Role.DEFAULT))
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setAciBytes(member1.getAciBytes()).setRole(Member.Role.ADMINISTRATOR))
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setAciBytes(member2.getAciBytes()).setRole(Member.Role.DEFAULT))
.build());
assertEquals(DecryptedGroup.newBuilder()
@@ -236,7 +236,7 @@ public final class DecryptedGroupUtil_apply_Test {
.setRevision(14)
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder()
.setRole(Member.Role.ADMINISTRATOR)
.setUuid(member2.getUuid())
.setAciBytes(member2.getAciBytes())
.build())
.build());
}
@@ -252,7 +252,7 @@ public final class DecryptedGroupUtil_apply_Test {
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder()
.setUuid(member1.getUuid())
.setAciBytes(member1.getAciBytes())
.build())
.build());
}
@@ -321,7 +321,7 @@ public final class DecryptedGroupUtil_apply_Test {
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addModifiedProfileKeys(DecryptedMember.newBuilder(DecryptedMember.newBuilder()
.setUuid(UuidUtil.toByteString(adminUuid))
.setAciBytes(UuidUtil.toByteString(adminUuid))
.build())
.setProfileKey(ByteString.copyFrom(profileKey2b.serialize())))
.build());
@@ -411,7 +411,7 @@ public final class DecryptedGroupUtil_apply_Test {
DecryptedGroupChange.newBuilder()
.setRevision(11)
.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder()
.setUuidCipherText(ProtoTestUtils.encrypt(pendingUuid))
.setServiceIdCipherText(ProtoTestUtils.encrypt(pendingUuid))
.build())
.build());
@@ -434,7 +434,7 @@ public final class DecryptedGroupUtil_apply_Test {
DecryptedGroupChange.newBuilder()
.setRevision(11)
.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder()
.setUuidCipherText(ProtoTestUtils.encrypt(pendingUuid))
.setServiceIdCipherText(ProtoTestUtils.encrypt(pendingUuid))
.build())
.build());
@@ -785,7 +785,7 @@ public final class DecryptedGroupUtil_apply_Test {
.build(),
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addDeleteRequestingMembers(member1.getUuid())
.addDeleteRequestingMembers(member1.getAciBytes())
.build());
assertEquals(DecryptedGroup.newBuilder()
@@ -817,10 +817,10 @@ public final class DecryptedGroupUtil_apply_Test {
.setRevision(14)
.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder()
.setRole(Member.Role.DEFAULT)
.setUuid(member1.getUuid()))
.setAciBytes(member1.getAciBytes()))
.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder()
.setRole(Member.Role.ADMINISTRATOR)
.setUuid(member2.getUuid()))
.setAciBytes(member2.getAciBytes()))
.build());
assertEquals(DecryptedGroup.newBuilder()
@@ -844,7 +844,7 @@ public final class DecryptedGroupUtil_apply_Test {
DecryptedGroupChange.newBuilder()
.setRevision(14)
.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder()
.setUuid(member.getUuid()))
.setAciBytes(member.getAciBytes()))
.build());
}
@@ -949,7 +949,7 @@ public final class DecryptedGroupUtil_apply_Test {
DecryptedGroupChange.newBuilder()
.setRevision(11)
.addDeleteBannedMembers(DecryptedBannedMember.newBuilder()
.setServiceIdBinary(UuidUtil.toByteString(bannedUuid))
.setServiceIdBytes(UuidUtil.toByteString(bannedUuid))
.build())
.build());

View File

@@ -811,23 +811,23 @@ public final class GroupChangeUtil_resolveConflict_Test {
DecryptedMember member2 = pendingPniAciMember(UUID.randomUUID(), UUID.randomUUID(), randomProfileKey());
DecryptedGroup groupState = DecryptedGroup.newBuilder()
.addMembers(member(UuidUtil.fromByteString(member1.getUuid())))
.addMembers(member(UuidUtil.fromByteString(member1.getAciBytes())))
.build();
DecryptedGroupChange decryptedChange = DecryptedGroupChange.newBuilder()
.addPromotePendingPniAciMembers(pendingPniAciMember(member1.getUuid(), member1.getPni(), member1.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member2.getUuid(), member2.getPni(), member2.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member1.getAciBytes(), member1.getPniBytes(), member1.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member2.getAciBytes(), member2.getPniBytes(), member2.getProfileKey()))
.build();
GroupChange.Actions change = GroupChange.Actions.newBuilder()
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder().setPresentation(presentation(member1.getPni(), member1.getProfileKey())))
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder().setPresentation(presentation(member2.getPni(), member2.getProfileKey())))
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder().setPresentation(presentation(member1.getPniBytes(), member1.getProfileKey())))
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder().setPresentation(presentation(member2.getPniBytes(), member2.getProfileKey())))
.build();
GroupChange.Actions resolvedActions = GroupChangeUtil.resolveConflict(groupState, decryptedChange, change).build();
GroupChange.Actions expected = GroupChange.Actions.newBuilder()
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder().setPresentation(presentation(member2.getPni(), member2.getProfileKey())))
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder().setPresentation(presentation(member2.getPniBytes(), member2.getProfileKey())))
.build();
assertEquals(expected, resolvedActions);
}

View File

@@ -661,18 +661,18 @@ public final class GroupChangeUtil_resolveConflict_decryptedOnly_Test {
DecryptedMember member2 = pendingPniAciMember(UUID.randomUUID(), UUID.randomUUID(), randomProfileKey());
DecryptedGroup groupState = DecryptedGroup.newBuilder()
.addMembers(member(UuidUtil.fromByteString(member1.getUuid())))
.addMembers(member(UuidUtil.fromByteString(member1.getAciBytes())))
.build();
DecryptedGroupChange decryptedChange = DecryptedGroupChange.newBuilder()
.addPromotePendingPniAciMembers(pendingPniAciMember(member1.getUuid(), member1.getPni(), member1.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member2.getUuid(), member2.getPni(), member2.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member1.getAciBytes(), member1.getPniBytes(), member1.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member2.getAciBytes(), member2.getPniBytes(), member2.getProfileKey()))
.build();
DecryptedGroupChange resolvedChanges = GroupChangeUtil.resolveConflict(groupState, decryptedChange).build();
DecryptedGroupChange expected = DecryptedGroupChange.newBuilder()
.addPromotePendingPniAciMembers(pendingPniAciMember(member2.getUuid(), member2.getPni(), member2.getProfileKey()))
.addPromotePendingPniAciMembers(pendingPniAciMember(member2.getAciBytes(), member2.getPniBytes(), member2.getProfileKey()))
.build();
assertEquals(expected, resolvedChanges);

View File

@@ -14,7 +14,6 @@ import org.signal.storageservice.protos.groups.GroupChange.Actions.DeleteBannedM
import org.signal.storageservice.protos.groups.local.DecryptedBannedMember;
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.util.UuidUtil;
import org.whispersystems.signalservice.internal.util.Util;
import org.whispersystems.signalservice.testutil.LibSignalLibraryUtil;
@@ -47,36 +46,36 @@ public final class GroupsV2Operations_ban_Test {
@Test
public void addBanToEmptyList() {
UUID ban = UUID.randomUUID();
ACI ban = ACI.from(UUID.randomUUID());
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanUuidsChange(Collections.singleton(ban),
false,
Collections.emptyList());
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanServiceIdsChange(Collections.singleton(ban),
false,
Collections.emptyList());
assertThat(banUuidsChange.getAddBannedMembersCount(), is(1));
assertThat(banUuidsChange.getAddBannedMembers(0).getAdded().getUserId(), is(groupOperations.encryptServiceId(ACI.from(ban))));
assertThat(banUuidsChange.getAddBannedMembers(0).getAdded().getUserId(), is(groupOperations.encryptServiceId(ban)));
}
@Test
public void addBanToPartialFullList() {
UUID toBan = UUID.randomUUID();
ACI toBan = ACI.from(UUID.randomUUID());
List<DecryptedBannedMember> alreadyBanned = new ArrayList<>(5);
for (int i = 0; i < 5; i++) {
alreadyBanned.add(bannedMember(UUID.randomUUID()));
}
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanUuidsChange(Collections.singleton(toBan),
false,
alreadyBanned);
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanServiceIdsChange(Collections.singleton(toBan),
false,
alreadyBanned);
assertThat(banUuidsChange.getAddBannedMembersCount(), is(1));
assertThat(banUuidsChange.getAddBannedMembers(0).getAdded().getUserId(), is(groupOperations.encryptServiceId(ACI.from(toBan))));
assertThat(banUuidsChange.getAddBannedMembers(0).getAdded().getUserId(), is(groupOperations.encryptServiceId(toBan)));
}
@Test
public void addBanToFullList() {
UUID toBan = UUID.randomUUID();
ACI toBan = ACI.from(UUID.randomUUID());
List<DecryptedBannedMember> alreadyBanned = new ArrayList<>(10);
DecryptedBannedMember oldest = null;
@@ -90,23 +89,23 @@ public final class GroupsV2Operations_ban_Test {
Collections.shuffle(alreadyBanned);
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanUuidsChange(Collections.singleton(toBan),
false,
alreadyBanned);
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanServiceIdsChange(Collections.singleton(toBan),
false,
alreadyBanned);
assertThat(banUuidsChange.getDeleteBannedMembersCount(), is(1));
assertThat(banUuidsChange.getDeleteBannedMembers(0).getDeletedUserId(), is(groupOperations.encryptServiceId(ServiceId.parseOrThrow(oldest.getServiceIdBinary()))));
assertThat(banUuidsChange.getDeleteBannedMembers(0).getDeletedUserId(), is(groupOperations.encryptServiceId(ServiceId.parseOrThrow(oldest.getServiceIdBytes()))));
assertThat(banUuidsChange.getAddBannedMembersCount(), is(1));
assertThat(banUuidsChange.getAddBannedMembers(0).getAdded().getUserId(), is(groupOperations.encryptServiceId(ACI.from(toBan))));
assertThat(banUuidsChange.getAddBannedMembers(0).getAdded().getUserId(), is(groupOperations.encryptServiceId(toBan)));
}
@Test
public void addMultipleBanToFullList() {
List<UUID> toBan = new ArrayList<>();
toBan.add(UUID.randomUUID());
toBan.add(UUID.randomUUID());
List<ACI> toBan = new ArrayList<>();
toBan.add(ACI.from(UUID.randomUUID()));
toBan.add(ACI.from(UUID.randomUUID()));
List<DecryptedBannedMember> alreadyBanned = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
@@ -114,14 +113,14 @@ public final class GroupsV2Operations_ban_Test {
}
List<ByteString> oldest = new ArrayList<>(2);
oldest.add(groupOperations.encryptServiceId(ServiceId.parseOrThrow(alreadyBanned.get(0).getServiceIdBinary())));
oldest.add(groupOperations.encryptServiceId(ServiceId.parseOrThrow(alreadyBanned.get(1).getServiceIdBinary())));
oldest.add(groupOperations.encryptServiceId(ServiceId.parseOrThrow(alreadyBanned.get(0).getServiceIdBytes())));
oldest.add(groupOperations.encryptServiceId(ServiceId.parseOrThrow(alreadyBanned.get(1).getServiceIdBytes())));
Collections.shuffle(alreadyBanned);
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanUuidsChange(new HashSet<>(toBan),
false,
alreadyBanned);
GroupChange.Actions.Builder banUuidsChange = groupOperations.createBanServiceIdsChange(new HashSet<>(toBan),
false,
alreadyBanned);
assertThat(banUuidsChange.getDeleteBannedMembersCount(), is(2));
assertThat(banUuidsChange.getDeleteBannedMembersList()
@@ -137,7 +136,7 @@ public final class GroupsV2Operations_ban_Test {
.map(AddBannedMemberAction::getAdded)
.map(BannedMember::getUserId)
.collect(Collectors.toList()),
hasItems(groupOperations.encryptServiceId(ACI.from(toBan.get(0))),
groupOperations.encryptServiceId(ACI.from(toBan.get(1)))));
hasItems(groupOperations.encryptServiceId(toBan.get(0)),
groupOperations.encryptServiceId(toBan.get(1))));
}
}

View File

@@ -109,7 +109,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
.setRole(Member.Role.DEFAULT)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setJoinedAtRevision(10)
.setUuid(newMember.toByteString())));
.setAciBytes(newMember.toByteString())));
}
@Test
@@ -126,7 +126,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
.setRole(Member.Role.DEFAULT)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setJoinedAtRevision(10)
.setUuid(newMember.toByteString())));
.setAciBytes(newMember.toByteString())));
}
@Test
@@ -144,7 +144,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
.setRole(Member.Role.DEFAULT)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setJoinedAtRevision(10)
.setUuid(newMember.toByteString())));
.setAciBytes(newMember.toByteString())));
}
@Test(expected = InvalidGroupStateException.class)
@@ -161,13 +161,13 @@ public final class GroupsV2Operations_decrypt_change_Test {
@Test
public void can_decrypt_member_removals_field4() {
UUID oldMember = UUID.randomUUID();
ACI oldMember = ACI.from(UUID.randomUUID());
assertDecryption(groupOperations.createRemoveMembersChange(Collections.singleton(oldMember), false, Collections.emptyList())
.setRevision(10),
DecryptedGroupChange.newBuilder()
.setRevision(10)
.addDeleteMembers(UuidUtil.toByteString(oldMember)));
.addDeleteMembers(oldMember.toByteString()));
}
@Test(expected = InvalidGroupStateException.class)
@@ -188,7 +188,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
assertDecryption(groupOperations.createChangeMemberRole(member, Member.Role.ADMINISTRATOR),
DecryptedGroupChange.newBuilder()
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder()
.setUuid(member.toByteString())
.setAciBytes(member.toByteString())
.setRole(Member.Role.ADMINISTRATOR)));
}
@@ -199,7 +199,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
assertDecryption(groupOperations.createChangeMemberRole(member, Member.Role.DEFAULT),
DecryptedGroupChange.newBuilder()
.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder()
.setUuid(member.toByteString())
.setAciBytes(member.toByteString())
.setRole(Member.Role.DEFAULT)));
}
@@ -217,7 +217,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
.setRole(Member.Role.UNKNOWN)
.setJoinedAtRevision(-1)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setUuid(self.toByteString())));
.setAciBytes(self.toByteString())));
}
@Test
@@ -231,10 +231,10 @@ public final class GroupsV2Operations_decrypt_change_Test {
DecryptedGroupChange.newBuilder()
.setRevision(13)
.addNewPendingMembers(DecryptedPendingMember.newBuilder()
.setAddedByUuid(self.toByteString())
.setUuidCipherText(groupOperations.encryptServiceId(newMember))
.setAddedByAci(self.toByteString())
.setServiceIdCipherText(groupOperations.encryptServiceId(newMember))
.setRole(Member.Role.DEFAULT)
.setServiceIdBinary(newMember.toByteString())));
.setServiceIdBytes(newMember.toByteString())));
}
@Test
@@ -245,8 +245,8 @@ public final class GroupsV2Operations_decrypt_change_Test {
assertDecryption(groupOperations.createRemoveInvitationChange(Collections.singleton(uuidCiphertext)),
DecryptedGroupChange.newBuilder()
.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(oldMember.toByteString())
.setUuidCipherText(ByteString.copyFrom(uuidCiphertext.serialize()))));
.setServiceIdBytes(oldMember.toByteString())
.setServiceIdCipherText(ByteString.copyFrom(uuidCiphertext.serialize()))));
}
@Test
@@ -259,8 +259,8 @@ public final class GroupsV2Operations_decrypt_change_Test {
.setDeletedUserId(ByteString.copyFrom(uuidCiphertext))),
DecryptedGroupChange.newBuilder()
.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(UuidUtil.toByteString(UuidUtil.UNKNOWN_UUID))
.setUuidCipherText(ByteString.copyFrom(uuidCiphertext))));
.setServiceIdBytes(UuidUtil.toByteString(UuidUtil.UNKNOWN_UUID))
.setServiceIdCipherText(ByteString.copyFrom(uuidCiphertext))));
}
@Test
@@ -272,7 +272,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
assertDecryption(groupOperations.createAcceptInviteChange(groupCandidate.getExpiringProfileKeyCredential().get()),
DecryptedGroupChange.newBuilder()
.addPromotePendingMembers(DecryptedMember.newBuilder()
.setUuid(newMember.toByteString())
.setAciBytes(newMember.toByteString())
.setRole(Member.Role.DEFAULT)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setJoinedAtRevision(-1)));
@@ -339,20 +339,20 @@ public final class GroupsV2Operations_decrypt_change_Test {
DecryptedGroupChange.newBuilder()
.setRevision(10)
.addNewRequestingMembers(DecryptedRequestingMember.newBuilder()
.setUuid(newRequestingMember.toByteString())
.setAciBytes(newRequestingMember.toByteString())
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))));
}
@Test
public void can_decrypt_member_requests_refusals_field17() {
UUID newRequestingMember = UUID.randomUUID();
ACI newRequestingMember = ACI.from(UUID.randomUUID());
assertDecryption(groupOperations.createRefuseGroupJoinRequest(Collections.singleton(newRequestingMember), true, Collections.emptyList())
.setRevision(10),
DecryptedGroupChange.newBuilder()
.setRevision(10)
.addDeleteRequestingMembers(UuidUtil.toByteString(newRequestingMember))
.addNewBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBinary(UuidUtil.toByteString(newRequestingMember)).build()));
.addDeleteRequestingMembers(newRequestingMember.toByteString())
.addNewBannedMembers(DecryptedBannedMember.newBuilder().setServiceIdBytes(newRequestingMember.toByteString()).build()));
}
@Test
@@ -365,7 +365,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
.setRevision(15)
.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder()
.setRole(Member.Role.DEFAULT)
.setUuid(UuidUtil.toByteString(newRequestingMember))));
.setAciBytes(UuidUtil.toByteString(newRequestingMember))));
}
@Test
@@ -397,14 +397,14 @@ public final class GroupsV2Operations_decrypt_change_Test {
@Test
public void can_decrypt_member_bans_field22() {
UUID ban = UUID.randomUUID();
ACI ban = ACI.from(UUID.randomUUID());
assertDecryption(groupOperations.createBanUuidsChange(Collections.singleton(ban), false, Collections.emptyList())
assertDecryption(groupOperations.createBanServiceIdsChange(Collections.singleton(ban), false, Collections.emptyList())
.setRevision(13),
DecryptedGroupChange.newBuilder()
.setRevision(13)
.addNewBannedMembers(DecryptedBannedMember.newBuilder()
.setServiceIdBinary(UuidUtil.toByteString(ban))));
.setServiceIdBytes(ban.toByteString())));
}
@Test
@@ -416,7 +416,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
DecryptedGroupChange.newBuilder()
.setRevision(13)
.addDeleteBannedMembers(DecryptedBannedMember.newBuilder()
.setServiceIdBinary(ban.toByteString())));
.setServiceIdBytes(ban.toByteString())));
}
@Test
@@ -426,7 +426,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
ProfileKey profileKey = newProfileKey();
GroupChange.Actions.Builder builder = GroupChange.Actions.newBuilder()
.setSourceUuid(groupOperations.encryptServiceId(memberPni))
.setSourceServiceId(groupOperations.encryptServiceId(memberPni))
.setRevision(5)
.addPromotePendingPniAciMembers(GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction.newBuilder()
.setUserId(groupOperations.encryptServiceId(memberAci))
@@ -435,11 +435,11 @@ public final class GroupsV2Operations_decrypt_change_Test {
assertDecryptionWithEditorSet(builder,
DecryptedGroupChange.newBuilder()
.setEditor(memberAci.toByteString())
.setEditorServiceIdBytes(memberAci.toByteString())
.setRevision(5)
.addPromotePendingPniAciMembers(DecryptedMember.newBuilder()
.setUuid(memberAci.toByteString())
.setPni(memberPni.toByteString())
.setAciBytes(memberAci.toByteString())
.setPniBytes(memberPni.toByteString())
.setRole(Member.Role.DEFAULT)
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.setJoinedAtRevision(5)));
@@ -484,7 +484,7 @@ public final class GroupsV2Operations_decrypt_change_Test {
DecryptedGroupChange.Builder expectedDecrypted)
{
ACI editor = ACI.from(UUID.randomUUID());
assertDecryptionWithEditorSet(inputChange.setSourceUuid(groupOperations.encryptServiceId(editor)), expectedDecrypted.setEditor(editor.toByteString()));
assertDecryptionWithEditorSet(inputChange.setSourceServiceId(groupOperations.encryptServiceId(editor)), expectedDecrypted.setEditorServiceIdBytes(editor.toByteString()));
}
void assertDecryptionWithEditorSet(GroupChange.Actions.Builder inputChange,

View File

@@ -145,13 +145,13 @@ public final class GroupsV2Operations_decrypt_group_Test {
assertEquals(DecryptedGroup.newBuilder()
.addMembers(DecryptedMember.newBuilder()
.setJoinedAtRevision(4)
.setUuid(admin1.toByteString())
.setAciBytes(admin1.toByteString())
.setRole(Member.Role.ADMINISTRATOR)
.setProfileKey(ByteString.copyFrom(adminProfileKey.serialize())))
.addMembers(DecryptedMember.newBuilder()
.setJoinedAtRevision(7)
.setRole(Member.Role.DEFAULT)
.setUuid(member1.toByteString())
.setAciBytes(member1.toByteString())
.setProfileKey(ByteString.copyFrom(memberProfileKey.serialize())))
.build().getMembersList(),
decryptedGroup.getMembersList());
@@ -189,22 +189,22 @@ public final class GroupsV2Operations_decrypt_group_Test {
assertEquals(DecryptedGroup.newBuilder()
.addPendingMembers(DecryptedPendingMember.newBuilder()
.setServiceIdBinary(admin1.toByteString())
.setUuidCipherText(groupOperations.encryptServiceId(admin1))
.setServiceIdBytes(admin1.toByteString())
.setServiceIdCipherText(groupOperations.encryptServiceId(admin1))
.setTimestamp(100)
.setAddedByUuid(inviter1.toByteString())
.setAddedByAci(inviter1.toByteString())
.setRole(Member.Role.ADMINISTRATOR))
.addPendingMembers(DecryptedPendingMember.newBuilder()
.setServiceIdBinary(member1.toByteString())
.setUuidCipherText(groupOperations.encryptServiceId(member1))
.setServiceIdBytes(member1.toByteString())
.setServiceIdCipherText(groupOperations.encryptServiceId(member1))
.setTimestamp(200)
.setAddedByUuid(inviter1.toByteString())
.setAddedByAci(inviter1.toByteString())
.setRole(Member.Role.DEFAULT))
.addPendingMembers(DecryptedPendingMember.newBuilder()
.setServiceIdBinary(member2.toByteString())
.setUuidCipherText(groupOperations.encryptServiceId(member2))
.setServiceIdBytes(member2.toByteString())
.setServiceIdCipherText(groupOperations.encryptServiceId(member2))
.setTimestamp(1500)
.setAddedByUuid(inviter2.toByteString())
.setAddedByAci(inviter2.toByteString())
.setRole(Member.Role.DEFAULT))
.build().getPendingMembersList(),
decryptedGroup.getPendingMembersList());
@@ -232,11 +232,11 @@ public final class GroupsV2Operations_decrypt_group_Test {
assertEquals(DecryptedGroup.newBuilder()
.addRequestingMembers(DecryptedRequestingMember.newBuilder()
.setUuid(admin1.toByteString())
.setAciBytes(admin1.toByteString())
.setProfileKey(ByteString.copyFrom(adminProfileKey.serialize()))
.setTimestamp(5000))
.addRequestingMembers(DecryptedRequestingMember.newBuilder()
.setUuid(member1.toByteString())
.setAciBytes(member1.toByteString())
.setProfileKey(ByteString.copyFrom(memberProfileKey.serialize()))
.setTimestamp(15000))
.build().getRequestingMembersList(),
@@ -288,7 +288,7 @@ public final class GroupsV2Operations_decrypt_group_Test {
DecryptedGroup decryptedGroup = groupOperations.decryptGroup(group);
assertEquals(1, decryptedGroup.getBannedMembersCount());
assertEquals(DecryptedBannedMember.newBuilder().setServiceIdBinary(member1.toByteString()).build(), decryptedGroup.getBannedMembers(0));
assertEquals(DecryptedBannedMember.newBuilder().setServiceIdBytes(member1.toByteString()).build(), decryptedGroup.getBannedMembers(0));
}
private ByteString encryptProfileKey(ACI aci, ProfileKey profileKey) {

View File

@@ -65,14 +65,14 @@ final class ProtoTestUtils {
static DecryptedModifyMemberRole promoteAdmin(UUID member) {
return DecryptedModifyMemberRole.newBuilder()
.setUuid(UuidUtil.toByteString(member))
.setAciBytes(UuidUtil.toByteString(member))
.setRole(Member.Role.ADMINISTRATOR)
.build();
}
static DecryptedModifyMemberRole demoteAdmin(UUID member) {
return DecryptedModifyMemberRole.newBuilder()
.setUuid(UuidUtil.toByteString(member))
.setAciBytes(UuidUtil.toByteString(member))
.setRole(Member.Role.DEFAULT)
.build();
}
@@ -91,14 +91,14 @@ final class ProtoTestUtils {
static DecryptedMember member(UUID uuid) {
return DecryptedMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.setAciBytes(UuidUtil.toByteString(uuid))
.setRole(Member.Role.DEFAULT)
.build();
}
static DecryptedMember member(UUID uuid, ByteString profileKey, int joinedAtRevision) {
return DecryptedMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.setAciBytes(UuidUtil.toByteString(uuid))
.setRole(Member.Role.DEFAULT)
.setJoinedAtRevision(joinedAtRevision)
.setProfileKey(profileKey)
@@ -107,15 +107,15 @@ final class ProtoTestUtils {
static DecryptedPendingMemberRemoval pendingMemberRemoval(UUID uuid) {
return DecryptedPendingMemberRemoval.newBuilder()
.setServiceIdBinary(UuidUtil.toByteString(uuid))
.setUuidCipherText(encrypt(uuid))
.setServiceIdBytes(UuidUtil.toByteString(uuid))
.setServiceIdCipherText(encrypt(uuid))
.build();
}
static DecryptedPendingMember pendingMember(UUID uuid) {
return DecryptedPendingMember.newBuilder()
.setServiceIdBinary(UuidUtil.toByteString(uuid))
.setUuidCipherText(encrypt(uuid))
.setServiceIdBytes(UuidUtil.toByteString(uuid))
.setServiceIdCipherText(encrypt(uuid))
.setRole(Member.Role.DEFAULT)
.build();
}
@@ -126,14 +126,14 @@ final class ProtoTestUtils {
static DecryptedRequestingMember requestingMember(UUID uuid, ProfileKey profileKey) {
return DecryptedRequestingMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.setAciBytes(UuidUtil.toByteString(uuid))
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.build();
}
static DecryptedBannedMember bannedMember(UUID uuid) {
return DecryptedBannedMember.newBuilder()
.setServiceIdBinary(UuidUtil.toByteString(uuid))
.setServiceIdBytes(UuidUtil.toByteString(uuid))
.build();
}
@@ -147,7 +147,7 @@ final class ProtoTestUtils {
private static DecryptedApproveMember approve(UUID uuid, Member.Role role) {
return DecryptedApproveMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.setAciBytes(UuidUtil.toByteString(uuid))
.setRole(role)
.build();
}
@@ -158,16 +158,16 @@ final class ProtoTestUtils {
static DecryptedMember pendingPniAciMember(UUID uuid, UUID pni, ProfileKey profileKey) {
return DecryptedMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.setPni(UuidUtil.toByteString(pni))
.setAciBytes(UuidUtil.toByteString(uuid))
.setPniBytes(UuidUtil.toByteString(pni))
.setProfileKey(ByteString.copyFrom(profileKey.serialize()))
.build();
}
static DecryptedMember pendingPniAciMember(ByteString uuid, ByteString pni, ByteString profileKey) {
return DecryptedMember.newBuilder()
.setUuid(uuid)
.setPni(pni)
.setAciBytes(uuid)
.setPniBytes(pni)
.setProfileKey(profileKey)
.build();
}
@@ -178,7 +178,7 @@ final class ProtoTestUtils {
static DecryptedMember admin(UUID uuid) {
return DecryptedMember.newBuilder()
.setUuid(UuidUtil.toByteString(uuid))
.setAciBytes(UuidUtil.toByteString(uuid))
.setRole(Member.Role.ADMINISTRATOR)
.build();
}
@@ -191,14 +191,14 @@ final class ProtoTestUtils {
static DecryptedMember asAdmin(DecryptedMember member) {
return DecryptedMember.newBuilder()
.setUuid(member.getUuid())
.setAciBytes(member.getAciBytes())
.setRole(Member.Role.ADMINISTRATOR)
.build();
}
static DecryptedMember asMember(DecryptedMember member) {
return DecryptedMember.newBuilder()
.setUuid(member.getUuid())
.setAciBytes(member.getAciBytes())
.setRole(Member.Role.DEFAULT)
.build();
}