Signal-Android/app/src/main/java/org/thoughtcrime/securesms/groups/GroupProtoUtil.java

121 lines
4.8 KiB
Java
Raw Normal View History

2020-04-03 21:24:25 +02:00
package org.thoughtcrime.securesms.groups;
import android.content.Context;
import androidx.annotation.NonNull;
2020-05-02 00:13:23 +02:00
import androidx.annotation.Nullable;
2020-04-03 21:24:25 +02:00
import androidx.annotation.WorkerThread;
import com.google.protobuf.ByteString;
import org.signal.storageservice.protos.groups.GroupChange;
2020-05-02 00:13:23 +02:00
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.signal.storageservice.protos.groups.local.DecryptedMember;
2020-04-03 21:24:25 +02:00
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
2020-05-02 00:13:23 +02:00
import org.signal.zkgroup.groups.GroupMasterKey;
2020-04-03 21:24:25 +02:00
import org.signal.zkgroup.util.UUIDUtil;
2020-05-29 19:35:40 +02:00
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context;
2020-04-03 21:24:25 +02:00
import org.thoughtcrime.securesms.recipients.Recipient;
2020-06-05 17:33:41 +02:00
import org.thoughtcrime.securesms.recipients.RecipientId;
2020-04-03 21:24:25 +02:00
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
2020-05-29 19:35:40 +02:00
import org.whispersystems.signalservice.api.util.UuidUtil;
2020-05-02 00:13:23 +02:00
import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
2020-04-03 21:24:25 +02:00
2020-05-02 00:13:23 +02:00
import java.util.List;
2020-04-03 21:24:25 +02:00
import java.util.UUID;
public final class GroupProtoUtil {
private GroupProtoUtil() {
}
2020-05-29 19:35:40 +02:00
public static int findRevisionWeWereAdded(@NonNull DecryptedGroup group, @NonNull UUID uuid)
2020-05-02 00:13:23 +02:00
throws GroupNotAMemberException
{
ByteString bytes = UuidUtil.toByteString(uuid);
for (DecryptedMember decryptedMember : group.getMembersList()) {
if (decryptedMember.getUuid().equals(bytes)) {
2020-05-29 19:35:40 +02:00
return decryptedMember.getJoinedAtRevision();
2020-05-02 00:13:23 +02:00
}
}
for (DecryptedPendingMember decryptedMember : group.getPendingMembersList()) {
if (decryptedMember.getUuid().equals(bytes)) {
// Assume latest, we don't have any information about when pending members were invited
2020-05-29 19:35:40 +02:00
return group.getRevision();
2020-05-02 00:13:23 +02:00
}
}
throw new GroupNotAMemberException();
}
public static DecryptedGroupV2Context createDecryptedGroupV2Context(@NonNull GroupMasterKey masterKey,
@NonNull GroupMutation groupMutation,
@Nullable GroupChange signedServerChange)
2020-05-02 00:13:23 +02:00
{
DecryptedGroupChange plainGroupChange = groupMutation.getGroupChange();
DecryptedGroup decryptedGroup = groupMutation.getNewGroupState();
int revision = plainGroupChange != null ? plainGroupChange.getRevision() : decryptedGroup.getRevision();
SignalServiceProtos.GroupContextV2.Builder contextBuilder = SignalServiceProtos.GroupContextV2.newBuilder()
.setMasterKey(ByteString.copyFrom(masterKey.serialize()))
2020-05-29 19:35:40 +02:00
.setRevision(revision);
if (signedServerChange != null) {
contextBuilder.setGroupChange(signedServerChange.toByteString());
}
2020-05-02 00:13:23 +02:00
DecryptedGroupV2Context.Builder builder = DecryptedGroupV2Context.newBuilder()
.setContext(contextBuilder.build())
2020-05-02 00:13:23 +02:00
.setGroupState(decryptedGroup);
if (groupMutation.getPreviousGroupState() != null) {
builder.setPreviousGroupState(groupMutation.getPreviousGroupState());
}
2020-05-02 00:13:23 +02:00
if (plainGroupChange != null) {
builder.setChange(plainGroupChange);
}
return builder.build();
}
2020-04-03 21:24:25 +02:00
@WorkerThread
public static Recipient pendingMemberToRecipient(@NonNull Context context, @NonNull DecryptedPendingMember pendingMember) {
return uuidByteStringToRecipient(context, pendingMember.getUuid());
}
@WorkerThread
public static Recipient uuidByteStringToRecipient(@NonNull Context context, @NonNull ByteString uuidByteString) {
UUID uuid = UUIDUtil.deserialize(uuidByteString.toByteArray());
if (uuid.equals(GroupsV2Operations.UNKNOWN_UUID)) {
return Recipient.UNKNOWN;
}
return Recipient.externalPush(context, uuid, null, false);
2020-04-03 21:24:25 +02:00
}
2020-05-02 00:13:23 +02:00
2020-06-05 17:33:41 +02:00
@WorkerThread
public static @NonNull RecipientId uuidByteStringToRecipientId(@NonNull ByteString uuidByteString) {
UUID uuid = UUIDUtil.deserialize(uuidByteString.toByteArray());
if (uuid.equals(GroupsV2Operations.UNKNOWN_UUID)) {
return RecipientId.UNKNOWN;
}
return RecipientId.from(uuid, null);
}
2020-05-02 00:13:23 +02:00
public static boolean isMember(@NonNull UUID uuid, @NonNull List<DecryptedMember> membersList) {
ByteString uuidBytes = UuidUtil.toByteString(uuid);
for (DecryptedMember member : membersList) {
if (uuidBytes.equals(member.getUuid())) {
return true;
}
}
return false;
}
2020-04-03 21:24:25 +02:00
}