mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 21:15:48 +00:00
Improve GV2 state change processing speed.
This commit is contained in:
committed by
Greyson Parrelli
parent
5080567ca9
commit
6f788ee3df
@@ -20,7 +20,6 @@ import org.signal.zkgroup.auth.AuthCredentialResponse;
|
||||
import org.signal.zkgroup.auth.ClientZkAuthOperations;
|
||||
import org.signal.zkgroup.groups.ClientZkGroupCipher;
|
||||
import org.signal.zkgroup.groups.GroupSecretParams;
|
||||
import org.whispersystems.libsignal.logging.Log;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
import org.whispersystems.signalservice.api.push.ACI;
|
||||
import org.whispersystems.signalservice.internal.push.PushServiceSocket;
|
||||
@@ -30,7 +29,6 @@ import java.io.IOException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class GroupsV2Api {
|
||||
@@ -85,6 +83,16 @@ public class GroupsV2Api {
|
||||
socket.putNewGroupsV2Group(group, authorization);
|
||||
}
|
||||
|
||||
public PartialDecryptedGroup getPartialDecryptedGroup(GroupSecretParams groupSecretParams,
|
||||
GroupsV2AuthorizationString authorization)
|
||||
throws IOException, InvalidGroupStateException, VerificationFailedException
|
||||
{
|
||||
Group group = socket.getGroupsV2Group(authorization);
|
||||
|
||||
return groupsOperations.forGroup(groupSecretParams)
|
||||
.partialDecryptGroup(group);
|
||||
}
|
||||
|
||||
public DecryptedGroup getGroup(GroupSecretParams groupSecretParams,
|
||||
GroupsV2AuthorizationString authorization)
|
||||
throws IOException, InvalidGroupStateException, VerificationFailedException
|
||||
|
||||
@@ -369,6 +369,38 @@ public final class GroupsV2Operations {
|
||||
.setMember(member);
|
||||
}
|
||||
|
||||
public PartialDecryptedGroup partialDecryptGroup(Group group)
|
||||
throws VerificationFailedException, InvalidGroupStateException
|
||||
{
|
||||
List<Member> membersList = group.getMembersList();
|
||||
List<PendingMember> pendingMembersList = group.getPendingMembersList();
|
||||
List<DecryptedMember> decryptedMembers = new ArrayList<>(membersList.size());
|
||||
List<DecryptedPendingMember> decryptedPendingMembers = new ArrayList<>(pendingMembersList.size());
|
||||
|
||||
for (Member member : membersList) {
|
||||
UUID memberUuid = decryptUuid(member.getUserId());
|
||||
decryptedMembers.add(DecryptedMember.newBuilder()
|
||||
.setUuid(UuidUtil.toByteString(memberUuid))
|
||||
.setJoinedAtRevision(member.getJoinedAtRevision())
|
||||
.build());
|
||||
}
|
||||
|
||||
for (PendingMember member : pendingMembersList) {
|
||||
UUID pendingMemberUuid = decryptUuidOrUnknown(member.getMember().getUserId());
|
||||
decryptedMembers.add(DecryptedMember.newBuilder()
|
||||
.setUuid(UuidUtil.toByteString(pendingMemberUuid))
|
||||
.build());
|
||||
}
|
||||
|
||||
DecryptedGroup decryptedGroup = DecryptedGroup.newBuilder()
|
||||
.setRevision(group.getRevision())
|
||||
.addAllMembers(decryptedMembers)
|
||||
.addAllPendingMembers(decryptedPendingMembers)
|
||||
.build();
|
||||
|
||||
return new PartialDecryptedGroup(group, decryptedGroup, GroupsV2Operations.this, groupSecretParams);
|
||||
}
|
||||
|
||||
public DecryptedGroup decryptGroup(Group group)
|
||||
throws VerificationFailedException, InvalidGroupStateException
|
||||
{
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
package org.whispersystems.signalservice.api.groupsv2;
|
||||
|
||||
import org.signal.storageservice.protos.groups.Group;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedMember;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
|
||||
import org.signal.zkgroup.VerificationFailedException;
|
||||
import org.signal.zkgroup.groups.GroupSecretParams;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Decrypting an entire group can be expensive for large groups. Since not every
|
||||
* operation requires all data to be decrypted, this class can be populated with only
|
||||
* the minimalist about of information need to perform an operation. Currently, only
|
||||
* updating from the server utilizes it.
|
||||
*/
|
||||
public class PartialDecryptedGroup {
|
||||
private final Group group;
|
||||
private final DecryptedGroup decryptedGroup;
|
||||
private final GroupsV2Operations groupsOperations;
|
||||
private final GroupSecretParams groupSecretParams;
|
||||
|
||||
public PartialDecryptedGroup(Group group,
|
||||
DecryptedGroup decryptedGroup,
|
||||
GroupsV2Operations groupsOperations,
|
||||
GroupSecretParams groupSecretParams)
|
||||
{
|
||||
this.group = group;
|
||||
this.decryptedGroup = decryptedGroup;
|
||||
this.groupsOperations = groupsOperations;
|
||||
this.groupSecretParams = groupSecretParams;
|
||||
}
|
||||
|
||||
public int getRevision() {
|
||||
return decryptedGroup.getRevision();
|
||||
}
|
||||
|
||||
public List<DecryptedMember> getMembersList() {
|
||||
return decryptedGroup.getMembersList();
|
||||
}
|
||||
|
||||
public List<DecryptedPendingMember> getPendingMembersList() {
|
||||
return decryptedGroup.getPendingMembersList();
|
||||
}
|
||||
|
||||
public DecryptedGroup getFullyDecryptedGroup()
|
||||
throws IOException
|
||||
{
|
||||
try {
|
||||
return groupsOperations.forGroup(groupSecretParams)
|
||||
.decryptGroup(group);
|
||||
} catch (VerificationFailedException | InvalidGroupStateException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user