Handle absent change during invite.

master
Alan Evans 2020-05-21 17:04:57 -03:00 committed by Greyson Parrelli
parent 4712833853
commit 297a7d0ef8
4 changed files with 32 additions and 12 deletions

View File

@ -9,9 +9,11 @@ import androidx.annotation.WorkerThread;
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
import org.signal.zkgroup.VerificationFailedException;
import org.signal.zkgroup.groups.GroupMasterKey;
import org.signal.zkgroup.groups.GroupSecretParams;
import org.signal.zkgroup.util.UUIDUtil;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.MmsDatabase;
@ -279,7 +281,10 @@ public final class GroupsV2StateProcessor {
final ProfileKeySet profileKeys = new ProfileKeySet();
for (GroupLogEntry entry : globalGroupState.getHistory()) {
profileKeys.addKeysFromGroupState(entry.getGroup(), DecryptedGroupUtil.editorUuid(entry.getChange()));
Optional<UUID> editor = DecryptedGroupUtil.editorUuid(entry.getChange());
if (editor.isPresent()) {
profileKeys.addKeysFromGroupState(entry.getGroup(), editor.get());
}
}
Collection<RecipientId> updated = recipientDatabase.persistProfileKeySet(profileKeys);
@ -335,8 +340,14 @@ public final class GroupsV2StateProcessor {
}
private void storeMessage(@NonNull DecryptedGroupV2Context decryptedGroupV2Context, long timestamp) {
UUID editor = DecryptedGroupUtil.editorUuid(decryptedGroupV2Context.getChange());
boolean outgoing = Recipient.self().getUuid().get().equals(editor);
Optional<UUID> editor = getEditor(decryptedGroupV2Context);
if (!editor.isPresent() || UuidUtil.UNKNOWN_UUID.equals(editor.get())) {
Log.w(TAG, "Cannot determine editor of change, can't insert message");
return;
}
boolean outgoing = Recipient.self().requireUuid().equals(editor.get());
if (outgoing) {
try {
@ -353,12 +364,26 @@ public final class GroupsV2StateProcessor {
}
} else {
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
RecipientId sender = Recipient.externalPush(context, editor, null).getId();
RecipientId sender = RecipientId.from(editor.get(), null);
IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, "", Optional.of(groupId), 0, false);
IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context);
smsDatabase.insertMessageInbox(groupMessage);
}
}
private Optional<UUID> getEditor(@NonNull DecryptedGroupV2Context decryptedGroupV2Context) {
DecryptedGroupChange change = decryptedGroupV2Context.getChange();
Optional<UUID> changeEditor = DecryptedGroupUtil.editorUuid(change);
if (changeEditor.isPresent()) {
return changeEditor;
} else {
Optional<DecryptedPendingMember> pendingByUuid = DecryptedGroupUtil.findPendingByUuid(decryptedGroupV2Context.getGroupState().getPendingMembersList(), Recipient.self().requireUuid());
if (pendingByUuid.isPresent()) {
return Optional.fromNullable(UuidUtil.fromByteStringOrNull(pendingByUuid.get().getAddedByUuid()));
}
}
return Optional.absent();
}
}
}

View File

@ -88,8 +88,8 @@ public final class DecryptedGroupUtil {
/**
* The UUID of the member that made the change.
*/
public static UUID editorUuid(DecryptedGroupChange change) {
return change != null ? UuidUtil.fromByteStringOrUnknown(change.getEditor()) : UuidUtil.UNKNOWN_UUID;
public static Optional<UUID> editorUuid(DecryptedGroupChange change) {
return Optional.fromNullable(change != null ? UuidUtil.fromByteStringOrNull(change.getEditor()) : null);
}
public static Optional<DecryptedMember> findMemberByUuid(Collection<DecryptedMember> members, UUID uuid) {

View File

@ -63,11 +63,6 @@ public final class UuidUtil {
return parseOrNull(bytes.toByteArray());
}
public static UUID fromByteStringOrUnknown(ByteString bytes) {
UUID uuid = parseOrNull(bytes.toByteArray());
return uuid != null ? uuid : UNKNOWN_UUID;
}
private static UUID parseOrNull(byte[] byteArray) {
return byteArray != null && byteArray.length == 16 ? parseOrThrow(byteArray) : null;
}

View File

@ -34,7 +34,7 @@ public final class DecryptedGroupUtilTest {
.setEditor(editor)
.build();
UUID parsed = DecryptedGroupUtil.editorUuid(groupChange);
UUID parsed = DecryptedGroupUtil.editorUuid(groupChange).get();
assertEquals(uuid, parsed);
}