},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedBannedMember",
- "fields":[{"name":"serviceIdBinary_"}, {"name":"timestamp_"}]
+ "fields":[{"name":"serviceIdBinary_"}, {"name":"serviceIdBytes_"}, {"name":"timestamp_"}]
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedGroup",
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedMember",
- "fields":[{"name":"joinedAtRevision_"}, {"name":"pni_"}, {"name":"profileKey_"}, {"name":"role_"}, {"name":"uuid_"}]
+ "fields":[{"name":"aciBytes_"}, {"name":"joinedAtRevision_"}, {"name":"pniBytes_"}, {"name":"pni_"}, {"name":"profileKey_"}, {"name":"role_"}, {"name":"uuid_"}]
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedModifyMemberRole",
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMember",
- "fields":[{"name":"addedByUuid_"}, {"name":"role_"}, {"name":"serviceIdBinary_"}, {"name":"timestamp_"}, {"name":"uuidCipherText_"}]
+ "fields":[{"name":"addedByAci_"}, {"name":"addedByUuid_"}, {"name":"role_"}, {"name":"serviceIdBinary_"}, {"name":"serviceIdBytes_"}, {"name":"serviceIdCipherText_"}, {"name":"timestamp_"}, {"name":"uuidCipherText_"}]
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval",
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedRequestingMember",
- "fields":[{"name":"profileKey_"}, {"name":"timestamp_"}, {"name":"uuid_"}]
+ "fields":[{"name":"aciBytes_"}, {"name":"profileKey_"}, {"name":"timestamp_"}, {"name":"uuid_"}]
},
{
"name":"org.signal.storageservice.protos.groups.local.DecryptedString",
}
int findRevisionWeWereAdded(DecryptedGroup partialDecryptedGroup) {
- ByteString bytes = getSelfAci().toByteString();
+ ByteString aciBytes = getSelfAci().toByteString();
+ ByteString pniBytes = getSelfPni().toByteString();
for (DecryptedMember decryptedMember : partialDecryptedGroup.getMembersList()) {
- if (decryptedMember.getUuid().equals(bytes)) {
+ if (decryptedMember.getAciBytes().equals(aciBytes) || decryptedMember.getPniBytes().equals(pniBytes)) {
return decryptedMember.getJoinedAtRevision();
}
}
change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey));
}
- change.setSourceUuid(getSelfAci().toByteString());
+ change.setSourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change);
}
final var aci = getSelfAci();
final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci);
- change.setSourceUuid(getSelfAci().toByteString());
+ change.setSourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change);
}
.map(ServiceId::getRawUuid)
.toList();
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
- return commitChange(groupInfoV2,
- groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci.getRawUuid(), adminUuids));
+ return commitChange(groupInfoV2, groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci, adminUuids));
}
Pair<DecryptedGroup, GroupChange> removeMembers(
final var memberUuids = members.stream()
.map(context.getRecipientHelper()::resolveSignalServiceAddress)
.map(SignalServiceAddress::getServiceId)
- .map(ServiceId::getRawUuid)
+ .filter(m -> m instanceof ACI)
+ .map(m -> (ACI) m)
.collect(Collectors.toSet());
return ejectMembers(groupInfoV2, memberUuids);
}
final var memberUuids = members.stream()
.map(context.getRecipientHelper()::resolveSignalServiceAddress)
.map(SignalServiceAddress::getServiceId)
- .map(ServiceId::getRawUuid)
.collect(Collectors.toSet());
return refuseJoinRequest(groupInfoV2, memberUuids);
}
) throws IOException {
GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
- final var uuids = block.stream()
- .map(member -> context.getRecipientHelper()
- .resolveSignalServiceAddress(member)
- .getServiceId()
- .getRawUuid())
+ final var serviceIds = block.stream()
+ .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId())
.collect(Collectors.toSet());
- final var change = groupOperations.createBanUuidsChange(uuids,
+ final var change = groupOperations.createBanServiceIdsChange(serviceIds,
false,
groupInfoV2.getGroup().getBannedMembersList());
- change.setSourceUuid(getSelfAci().toByteString());
+ change.setSourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change);
}
final var change = groupOperations.createUnbanServiceIdsChange(serviceIds);
- change.setSourceUuid(getSelfAci().toByteString());
+ change.setSourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change);
}
Pair<DecryptedGroup, GroupChange> updateSelfProfileKey(GroupInfoV2 groupInfoV2) throws IOException {
Optional<DecryptedMember> selfInGroup = groupInfoV2.getGroup() == null
? Optional.empty()
- : DecryptedGroupUtil.findMemberByUuid(groupInfoV2.getGroup().getMembersList(),
- getSelfAci().getRawUuid());
+ : DecryptedGroupUtil.findMemberByAci(groupInfoV2.getGroup().getMembersList(), getSelfAci());
if (selfInGroup.isEmpty()) {
logger.trace("Not updating group, self not in group " + groupInfoV2.getGroupId().toBase64());
return null;
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
final var change = groupOperations.createUpdateProfileKeyCredentialChange(profileKeyCredential);
- change.setSourceUuid(getSelfAci().toByteString());
+ change.setSourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change);
}
? groupOperations.createGroupJoinRequest(profileKeyCredential)
: groupOperations.createGroupJoinDirect(profileKeyCredential);
- change.setSourceUuid(context.getRecipientHelper()
+ change.setSourceServiceId(context.getRecipientHelper()
.resolveSignalServiceAddress(selfRecipientId)
.getServiceId()
.toByteString());
final var change = groupOperations.createAcceptInviteChange(profileKeyCredential);
final var aci = context.getRecipientHelper().resolveSignalServiceAddress(selfRecipientId).getServiceId();
- change.setSourceUuid(aci.toByteString());
+ change.setSourceServiceId(aci.toByteString());
return commitChange(groupInfoV2, change);
}
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
final var uuidCipherTexts = pendingMembers.stream().map(member -> {
try {
- return new UuidCiphertext(member.getUuidCipherText().toByteArray());
+ return new UuidCiphertext(member.getServiceIdCipherText().toByteArray());
} catch (InvalidInputException e) {
throw new AssertionError(e);
}
}
private Pair<DecryptedGroup, GroupChange> refuseJoinRequest(
- GroupInfoV2 groupInfoV2, Set<UUID> uuids
+ GroupInfoV2 groupInfoV2, Set<ServiceId> serviceIds
) throws IOException {
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
- return commitChange(groupInfoV2, groupOperations.createRefuseGroupJoinRequest(uuids, false, List.of()));
+ return commitChange(groupInfoV2, groupOperations.createRefuseGroupJoinRequest(serviceIds, false, List.of()));
}
private Pair<DecryptedGroup, GroupChange> ejectMembers(
- GroupInfoV2 groupInfoV2, Set<UUID> uuids
+ GroupInfoV2 groupInfoV2, Set<ACI> members
) throws IOException {
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
- return commitChange(groupInfoV2, groupOperations.createRemoveMembersChange(uuids, false, List.of()));
+ return commitChange(groupInfoV2, groupOperations.createRemoveMembersChange(members, false, List.of()));
}
private Pair<DecryptedGroup, GroupChange> commitChange(
}
Pair<ServiceId, ProfileKey> getAuthoritativeProfileKeyFromChange(final DecryptedGroupChange change) {
- UUID editor = UuidUtil.fromByteStringOrNull(change.getEditor());
+ UUID editor = UuidUtil.fromByteStringOrNull(change.getEditorServiceIdBytes());
final var editorProfileKeyBytes = Stream.concat(Stream.of(change.getNewMembersList().stream(),
change.getPromotePendingMembersList().stream(),
change.getModifiedProfileKeysList().stream())
.flatMap(Function.identity())
- .filter(m -> UuidUtil.fromByteString(m.getUuid()).equals(editor))
+ .filter(m -> UuidUtil.fromByteString(m.getAciBytes()).equals(editor))
.map(DecryptedMember::getProfileKey),
change.getNewRequestingMembersList()
.stream()
- .filter(m -> UuidUtil.fromByteString(m.getUuid()).equals(editor))
+ .filter(m -> UuidUtil.fromByteString(m.getAciBytes()).equals(editor))
.map(DecryptedRequestingMember::getProfileKey)).findFirst();
if (editorProfileKeyBytes.isEmpty()) {
import org.asamk.signal.manager.api.GroupIdV2;
import org.asamk.signal.manager.api.GroupInviteLinkUrl;
import org.asamk.signal.manager.api.GroupPermission;
+import org.asamk.signal.manager.storage.recipients.RecipientAddress;
import org.asamk.signal.manager.storage.recipients.RecipientId;
import org.asamk.signal.manager.storage.recipients.RecipientResolver;
import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
}
return group.getMembersList()
.stream()
- .map(m -> ServiceId.parseOrThrow(m.getUuid()))
+ .map(m -> ServiceId.parseOrThrow(m.getAciBytes()))
.map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet());
}
}
return group.getBannedMembersList()
.stream()
- .map(m -> ServiceId.parseOrThrow(m.getServiceIdBinary()))
+ .map(m -> ServiceId.parseOrThrow(m.getServiceIdBytes()))
.map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet());
}
}
return group.getPendingMembersList()
.stream()
- .map(m -> ServiceId.parseOrThrow(m.getServiceIdBinary()))
+ .map(m -> ServiceId.parseOrThrow(m.getServiceIdBytes()))
.map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet());
}
}
return group.getRequestingMembersList()
.stream()
- .map(m -> ServiceId.parseOrThrow(m.getUuid()))
+ .map(m -> ServiceId.parseOrThrow(m.getAciBytes()))
.map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet());
}
return group.getMembersList()
.stream()
.filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
- .map(m -> ServiceId.parseOrThrow(m.getUuid()))
+ .map(m -> new RecipientAddress(ServiceId.ACI.parseOrNull(m.getAciBytes()),
+ ServiceId.PNI.parseOrNull(m.getPniBytes()),
+ null))
.map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet());
}