Handle absent change during invite.
parent
4712833853
commit
297a7d0ef8
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue