mirror of
https://github.com/oxen-io/session-android.git
synced 2025-06-09 04:08:33 +00:00
Handle absent change during invite.
This commit is contained in:
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.DecryptedGroup;
|
||||||
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
|
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.VerificationFailedException;
|
||||||
import org.signal.zkgroup.groups.GroupMasterKey;
|
import org.signal.zkgroup.groups.GroupMasterKey;
|
||||||
import org.signal.zkgroup.groups.GroupSecretParams;
|
import org.signal.zkgroup.groups.GroupSecretParams;
|
||||||
|
import org.signal.zkgroup.util.UUIDUtil;
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.GroupDatabase;
|
import org.thoughtcrime.securesms.database.GroupDatabase;
|
||||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||||
@ -279,7 +281,10 @@ public final class GroupsV2StateProcessor {
|
|||||||
final ProfileKeySet profileKeys = new ProfileKeySet();
|
final ProfileKeySet profileKeys = new ProfileKeySet();
|
||||||
|
|
||||||
for (GroupLogEntry entry : globalGroupState.getHistory()) {
|
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);
|
Collection<RecipientId> updated = recipientDatabase.persistProfileKeySet(profileKeys);
|
||||||
@ -335,8 +340,14 @@ public final class GroupsV2StateProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void storeMessage(@NonNull DecryptedGroupV2Context decryptedGroupV2Context, long timestamp) {
|
private void storeMessage(@NonNull DecryptedGroupV2Context decryptedGroupV2Context, long timestamp) {
|
||||||
UUID editor = DecryptedGroupUtil.editorUuid(decryptedGroupV2Context.getChange());
|
Optional<UUID> editor = getEditor(decryptedGroupV2Context);
|
||||||
boolean outgoing = Recipient.self().getUuid().get().equals(editor);
|
|
||||||
|
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) {
|
if (outgoing) {
|
||||||
try {
|
try {
|
||||||
@ -353,12 +364,26 @@ public final class GroupsV2StateProcessor {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
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);
|
IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, "", Optional.of(groupId), 0, false);
|
||||||
IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context);
|
IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context);
|
||||||
|
|
||||||
smsDatabase.insertMessageInbox(groupMessage);
|
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.
|
* The UUID of the member that made the change.
|
||||||
*/
|
*/
|
||||||
public static UUID editorUuid(DecryptedGroupChange change) {
|
public static Optional<UUID> editorUuid(DecryptedGroupChange change) {
|
||||||
return change != null ? UuidUtil.fromByteStringOrUnknown(change.getEditor()) : UuidUtil.UNKNOWN_UUID;
|
return Optional.fromNullable(change != null ? UuidUtil.fromByteStringOrNull(change.getEditor()) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Optional<DecryptedMember> findMemberByUuid(Collection<DecryptedMember> members, UUID uuid) {
|
public static Optional<DecryptedMember> findMemberByUuid(Collection<DecryptedMember> members, UUID uuid) {
|
||||||
|
@ -63,11 +63,6 @@ public final class UuidUtil {
|
|||||||
return parseOrNull(bytes.toByteArray());
|
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) {
|
private static UUID parseOrNull(byte[] byteArray) {
|
||||||
return byteArray != null && byteArray.length == 16 ? parseOrThrow(byteArray) : null;
|
return byteArray != null && byteArray.length == 16 ? parseOrThrow(byteArray) : null;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ public final class DecryptedGroupUtilTest {
|
|||||||
.setEditor(editor)
|
.setEditor(editor)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
UUID parsed = DecryptedGroupUtil.editorUuid(groupChange);
|
UUID parsed = DecryptedGroupUtil.editorUuid(groupChange).get();
|
||||||
|
|
||||||
assertEquals(uuid, parsed);
|
assertEquals(uuid, parsed);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user