Fix issue with PNIs in contact sync.

This commit is contained in:
Greyson Parrelli
2024-02-06 09:47:12 -05:00
parent 71850e1e35
commit 1b7616b4db
8 changed files with 61 additions and 24 deletions

View File

@@ -3458,7 +3458,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
fun getRecipientsForMultiDeviceSync(): List<Recipient> {
val subquery = "SELECT ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} FROM ${ThreadTable.TABLE_NAME}"
val selection = "$REGISTERED = ? AND $GROUP_ID IS NULL AND $ID != ? AND ($SYSTEM_CONTACT_URI NOT NULL OR $ID IN ($subquery))"
val selection = "$REGISTERED = ? AND $GROUP_ID IS NULL AND $ID != ? AND ($ACI_COLUMN NOT NULL OR $E164 NOT NULL) AND ($SYSTEM_CONTACT_URI NOT NULL OR $ID IN ($subquery))"
val args = arrayOf(RegisteredState.REGISTERED.id.toString(), Recipient.self().id.serialize())
val recipients: MutableList<Recipient> = ArrayList()

View File

@@ -76,7 +76,11 @@ class MultiDeviceContactSyncJob(parameters: Parameters, private val attachmentPo
var contact: DeviceContact? = deviceContacts.read()
while (contact != null) {
val recipient = Recipient.externalPush(SignalServiceAddress(contact.address.serviceId, contact.address.number.orElse(null)))
val recipient = if (contact.aci.isPresent) {
Recipient.externalPush(SignalServiceAddress(contact.aci.get(), contact.e164.orElse(null)))
} else {
Recipient.external(context, contact.e164.get())
}
if (recipient.isSelf) {
contact = deviceContacts.read()

View File

@@ -151,12 +151,18 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
return;
}
if (!recipient.hasE164() && !recipient.hasAci()) {
Log.w(TAG, recipientId + " has no valid identifier!");
return;
}
Optional<IdentityRecord> identityRecord = ApplicationDependencies.getProtocolStore().aci().identities().getIdentityRecord(recipient.getId());
Optional<VerifiedMessage> verifiedMessage = getVerifiedMessage(recipient, identityRecord);
Map<RecipientId, Integer> inboxPositions = SignalDatabase.threads().getInboxPositions();
Set<RecipientId> archived = SignalDatabase.threads().getArchivedRecipients();
out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, recipient),
out.write(new DeviceContact(recipient.getAci(),
recipient.getE164(),
Optional.ofNullable(recipient.isGroup() || recipient.isSystemContact() ? recipient.getDisplayName(context) : null),
getSystemAvatar(recipient.getContactUri()),
Optional.of(ChatColorsMapper.getMaterialColor(recipient.getChatColors()).serialize()),
@@ -222,7 +228,8 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
Optional<Integer> expireTimer = recipient.getExpiresInSeconds() > 0 ? Optional.of(recipient.getExpiresInSeconds()) : Optional.empty();
Optional<Integer> inboxPosition = Optional.ofNullable(inboxPositions.get(recipient.getId()));
out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, recipient),
out.write(new DeviceContact(recipient.getAci(),
recipient.getE164(),
name,
getSystemAvatar(recipient.getContactUri()),
Optional.of(ChatColorsMapper.getMaterialColor(recipient.getChatColors()).serialize()),
@@ -239,7 +246,8 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
byte[] profileKey = self.getProfileKey();
if (profileKey != null) {
out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, self),
out.write(new DeviceContact(Optional.of(SignalStore.account().getAci()),
Optional.of(SignalStore.account().getE164()),
Optional.empty(),
Optional.empty(),
Optional.of(ChatColorsMapper.getMaterialColor(self.getChatColors()).serialize()),

View File

@@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
@@ -76,7 +77,8 @@ public class MultiDeviceProfileKeyUpdateJob extends BaseJob {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DeviceContactsOutputStream out = new DeviceContactsOutputStream(baos);
out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, Recipient.self()),
out.write(new DeviceContact(Optional.ofNullable(SignalStore.account().getAci()),
Optional.ofNullable(SignalStore.account().getE164()),
Optional.empty(),
Optional.empty(),
Optional.empty(),