Parse binary aci/pni in storage records

This commit is contained in:
AsamK 2025-12-10 18:07:25 +01:00
parent 5fafa24974
commit c5e4b250b8
3 changed files with 24 additions and 7 deletions

View File

@ -143,6 +143,10 @@
"name":"org.signal.libsignal.net.ChatServiceException",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
},
{
"name":"org.signal.libsignal.net.ChatServiceInactiveException",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
},
{
"name":"org.signal.libsignal.net.DeviceDeregisteredException",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
@ -155,6 +159,10 @@
"name":"org.signal.libsignal.net.RetryLaterException",
"methods":[{"name":"<init>","parameterTypes":["long"] }]
},
{
"name":"org.signal.libsignal.net.TransportFailureException",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
},
{
"name":"org.signal.libsignal.net.internal.BridgeChatListener"
},

View File

@ -63,8 +63,8 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor<Signal
@Override
protected boolean isInvalid(SignalContactRecord remoteRecord) {
final var remote = remoteRecord.getProto();
final var aci = ACI.parseOrNull(remote.aci);
final var pni = PNI.parseOrNull(remote.pni);
final var aci = ACI.parseOrNull(remote.aci, remote.aciBinary);
final var pni = PNI.parseOrNull(remote.pni, remote.pniBinary);
final var e164 = nullIfEmpty(remote.e164);
boolean hasAci = aci != null && aci.isValid();
boolean hasPni = pni != null && pni.isValid();
@ -129,7 +129,7 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor<Signal
identityKey = local.identityKey.size() > 0 ? local.identityKey : ByteString.EMPTY;
}
if (!local.aci.isEmpty()
if ((!local.aci.isEmpty() || local.aciBinary.size() > 0)
&& local.identityKey.size() > 0
&& remote.identityKey.size() > 0
&& !local.identityKey.equals(remote.identityKey)) {
@ -327,8 +327,8 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor<Signal
}
private static RecipientAddress getRecipientAddress(final ContactRecord contactRecord) {
return new RecipientAddress(ACI.parseOrNull(contactRecord.aci),
PNI.parseOrNull(contactRecord.pni),
return new RecipientAddress(ACI.parseOrNull(contactRecord.aci, contactRecord.aciBinary),
PNI.parseOrNull(contactRecord.pni, contactRecord.pniBinary),
nullIfEmpty(contactRecord.e164),
nullIfEmpty(contactRecord.username));
}

View File

@ -33,6 +33,9 @@ import static org.signal.core.util.StringExtensionsKt.emptyIfNull;
public final class StorageSyncModels {
private final static boolean useBinaryId = false;
private final static boolean useStringId = true;
private StorageSyncModels() {
}
@ -90,13 +93,19 @@ public final class StorageSyncModels {
public static ContactRecord localToRemoteRecord(Recipient recipient, IdentityInfo identity) {
final var address = recipient.getAddress();
final var builder = SignalContactRecord.Companion.newBuilder(recipient.getStorageRecord())
.aci(address.aci().map(ACI::toString).orElse(""))
.e164(address.number().orElse(""))
.pni(address.pni().map(PNI::toStringWithoutPrefix).orElse(""))
.username(address.username().orElse(""))
.profileKey(recipient.getProfileKey() == null
? ByteString.EMPTY
: ByteString.of(recipient.getProfileKey().serialize()));
if (useBinaryId) {
builder.aciBinary(address.aci().map(ACI::toByteString).orElse(ByteString.EMPTY))
.pniBinary(address.pni().map(PNI::toByteString).orElse(ByteString.EMPTY));
}
if (useStringId) {
builder.aci(address.aci().map(ACI::toString).orElse(""))
.pni(address.pni().map(PNI::toStringWithoutPrefix).orElse(""));
}
if (recipient.getProfile() != null) {
builder.givenName(emptyIfNull(recipient.getProfile().getGivenName()))
.familyName(emptyIfNull(recipient.getProfile().getFamilyName()));