diff --git a/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java b/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java index 4f9fd2b4..aece5a14 100644 --- a/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java +++ b/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java @@ -31,6 +31,7 @@ import java.util.regex.Pattern; import okio.ByteString; import static org.asamk.signal.manager.util.Utils.firstNonEmpty; +import static org.asamk.signal.manager.util.Utils.firstNonNull; import static org.asamk.signal.manager.util.Utils.nullIfEmpty; public class ContactRecordProcessor extends DefaultStorageRecordProcessor { @@ -129,27 +130,32 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor 0 ? local.identityKey : ByteString.EMPTY; } - if ((!local.aci.isEmpty() || local.aciBinary.size() > 0) + final var localAci = ACI.parseOrNull(local.aci, local.aciBinary); + final var localPni = PNI.parseOrNull(local.pni, local.pniBinary); + final var remoteAci = ACI.parseOrNull(remote.aci, remote.aciBinary); + final var remotePni = PNI.parseOrNull(remote.pni, remote.pniBinary); + + if (localAci != null && local.identityKey.size() > 0 && remote.identityKey.size() > 0 && !local.identityKey.equals(remote.identityKey)) { logger.debug("The local and remote identity keys do not match for {}. Enqueueing a profile fetch.", - local.aci); + localAci); final var address = getRecipientAddress(local); jobExecutor.enqueueJob(new DownloadProfileJob(address)); } - String pni; + PNI pni; String e164; if (account.isPrimaryDevice()) { final var e164sMatchButPnisDont = !local.e164.isEmpty() && local.e164.equals(remote.e164) - && !local.pni.isEmpty() - && !remote.pni.isEmpty() - && !local.pni.equals(remote.pni); + && localPni != null + && remotePni != null + && !localPni.equals(remotePni); - final var pnisMatchButE164sDont = !local.pni.isEmpty() - && local.pni.equals(remote.pni) + final var pnisMatchButE164sDont = localPni != null + && localPni.equals(remotePni) && !local.e164.isEmpty() && !remote.e164.isEmpty() && !local.e164.equals(remote.e164); @@ -161,14 +167,14 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor 0) { + mergedBuilder.aciBinary(localAci == null ? remote.aciBinary : localAci.toByteString()); + } + } + if (remote.pni.isEmpty() && remote.pniBinary.size() == 0) { + mergedBuilder.pni(pni == null ? "" : pni.toStringWithoutPrefix()) + .pniBinary(pni == null ? ByteString.EMPTY : pni.toByteStringWithoutPrefix()); + } else { + if (!remote.pni.isEmpty()) { + mergedBuilder.pni(pni == null ? "" : pni.toStringWithoutPrefix()); + } + if (remote.pniBinary.size() > 0) { + mergedBuilder.pniBinary(pni == null ? ByteString.EMPTY : pni.toByteStringWithoutPrefix()); + } + } final var merged = mergedBuilder.build(); final var matchesRemote = doProtosMatch(merged, remote); diff --git a/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncModels.java b/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncModels.java index 8392e35d..5bb22c84 100644 --- a/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncModels.java +++ b/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncModels.java @@ -33,7 +33,7 @@ import static org.signal.core.util.StringExtensionsKt.emptyIfNull; public final class StorageSyncModels { - private final static boolean useBinaryId = false; + private final static boolean useBinaryId = true; private final static boolean useStringId = true; private StorageSyncModels() { diff --git a/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncValidations.java b/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncValidations.java index 9ef98733..45de2d25 100644 --- a/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncValidations.java +++ b/lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncValidations.java @@ -186,8 +186,8 @@ public final class StorageSyncValidations { if (insert.getProto().contact != null) { final var contact = insert.getProto().contact; - final var aci = ACI.parseOrNull(contact.aci); - final var pni = PNI.parseOrNull(contact.pni); + final var aci = ACI.parseOrNull(contact.aci, contact.aciBinary); + final var pni = PNI.parseOrNull(contact.pni, contact.pniBinary); final var number = contact.e164.isEmpty() ? null : contact.e164; final var username = contact.username.isEmpty() ? null : contact.username; final var address = new RecipientAddress(aci, pni, number, username);