Only write binary ids in staging.

This commit is contained in:
Michelle Tang
2025-11-06 10:35:48 -05:00
parent 27e6ecb2a0
commit 4c00337b1a
10 changed files with 101 additions and 47 deletions

View File

@@ -175,7 +175,8 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider {
SignalExecutors.newCachedBoundedExecutor("signal-messages", ThreadUtil.PRIORITY_IMPORTANT_BACKGROUND_THREAD, 1, 16, 30),
RemoteConfig.maxEnvelopeSizeBytes(),
RemoteConfig::useMessageSendRestFallback,
RemoteConfig.useBinaryId());
RemoteConfig.useBinaryId(),
BuildConfig.USE_STRING_ID);
}
@Override

View File

@@ -13,6 +13,7 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.conversation.colors.ChatColorsMapper;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.database.RecipientTable;
@@ -145,7 +146,7 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
Uri updateUri = null;
try {
DeviceContactsOutputStream out = new DeviceContactsOutputStream(writeDetails.outputStream, RemoteConfig.useBinaryId());
DeviceContactsOutputStream out = new DeviceContactsOutputStream(writeDetails.outputStream, RemoteConfig.useBinaryId(), BuildConfig.USE_STRING_ID);
Recipient recipient = Recipient.resolved(recipientId);
if (recipient.getRegistered() == RecipientTable.RegisteredState.NOT_REGISTERED) {
@@ -210,7 +211,7 @@ public class MultiDeviceContactUpdateJob extends BaseJob {
Uri updateUri = null;
try {
DeviceContactsOutputStream out = new DeviceContactsOutputStream(writeDetails.outputStream, RemoteConfig.useBinaryId());
DeviceContactsOutputStream out = new DeviceContactsOutputStream(writeDetails.outputStream, RemoteConfig.useBinaryId(), BuildConfig.USE_STRING_ID);
List<Recipient> recipients = SignalDatabase.recipients().getRecipientsForMultiDeviceSync();
Map<RecipientId, Integer> inboxPositions = SignalDatabase.threads().getInboxPositions();
Set<RecipientId> archived = SignalDatabase.threads().getArchivedRecipients();

View File

@@ -7,10 +7,12 @@ package org.thoughtcrime.securesms.jobs
import androidx.annotation.VisibleForTesting
import androidx.annotation.WorkerThread
import okio.ByteString
import okio.ByteString.Companion.toByteString
import org.signal.core.util.Base64
import org.signal.core.util.logging.Log
import org.signal.core.util.orNull
import org.thoughtcrime.securesms.BuildConfig
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.ThreadTable
@@ -374,8 +376,16 @@ class MultiDeviceDeleteSyncJob private constructor(
private fun Recipient.toDeleteSyncConversationId(): ConversationIdentifier? {
return when {
isGroup -> ConversationIdentifier(threadGroupId = requireGroupId().decodedId.toByteString())
hasAci -> ConversationIdentifier(threadServiceId = requireAci().toString())
hasPni -> ConversationIdentifier(threadServiceId = requirePni().toString())
hasAci -> if (BuildConfig.USE_STRING_ID) {
ConversationIdentifier(threadServiceId = requireAci().toString())
} else {
ConversationIdentifier(threadServiceIdBinary = requireAci().toByteString())
}
hasPni -> if (BuildConfig.USE_STRING_ID) {
ConversationIdentifier(threadServiceId = requirePni().toString())
} else {
ConversationIdentifier(threadServiceIdBinary = requirePni().toByteString())
}
hasE164 -> ConversationIdentifier(threadE164 = requireE164())
else -> null
}
@@ -383,7 +393,12 @@ class MultiDeviceDeleteSyncJob private constructor(
private fun DeleteSyncJobData.AddressableMessage.toDeleteSyncMessage(): AddressableMessage? {
val author: Recipient = Recipient.resolved(RecipientId.from(authorRecipientId))
val authorServiceId: String? = author.aci.orNull()?.toString() ?: author.pni.orNull()?.toString()
val authorServiceId = if (BuildConfig.USE_STRING_ID) {
author.aci.orNull()?.toString() ?: author.pni.orNull()?.toString()
} else {
author.aci.orNull()?.toByteString() ?: author.pni.orNull()?.toByteString()
}
val authorE164: String? = if (authorServiceId == null) {
author.e164.orNull()
} else {
@@ -394,11 +409,19 @@ class MultiDeviceDeleteSyncJob private constructor(
Log.w(TAG, "Unable to send sync message without serviceId or e164 recipient: ${author.id}")
null
} else {
AddressableMessage(
authorServiceId = authorServiceId,
authorE164 = authorE164,
sentTimestamp = sentTimestamp
)
if (BuildConfig.USE_STRING_ID) {
AddressableMessage(
authorServiceId = authorServiceId as String?,
authorE164 = authorE164,
sentTimestamp = sentTimestamp
)
} else {
AddressableMessage(
authorServiceIdBinary = authorServiceId as ByteString?,
authorE164 = authorE164,
sentTimestamp = sentTimestamp
)
}
}
}

View File

@@ -6,6 +6,7 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.jobmanager.Job;
@@ -72,7 +73,7 @@ public class MultiDeviceProfileKeyUpdateJob extends BaseJob {
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DeviceContactsOutputStream out = new DeviceContactsOutputStream(baos, RemoteConfig.useBinaryId());
DeviceContactsOutputStream out = new DeviceContactsOutputStream(baos, RemoteConfig.useBinaryId(), BuildConfig.USE_STRING_ID);
out.write(new DeviceContact(Optional.ofNullable(SignalStore.account().getAci()),
Optional.ofNullable(SignalStore.account().getE164()),

View File

@@ -7,6 +7,7 @@ import org.signal.core.util.isNullOrEmpty
import org.signal.core.util.logging.Log
import org.signal.libsignal.zkgroup.InvalidInputException
import org.signal.libsignal.zkgroup.groups.GroupMasterKey
import org.thoughtcrime.securesms.BuildConfig
import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFolderRecord
import org.thoughtcrime.securesms.components.settings.app.usernamelinks.UsernameQrCodeColorScheme
import org.thoughtcrime.securesms.conversation.colors.AvatarColor
@@ -133,7 +134,7 @@ object StorageSyncModels {
RecipientType.INDIVIDUAL -> {
AccountRecord.PinnedConversation(
contact = AccountRecord.PinnedConversation.Contact(
serviceId = settings.serviceId?.toString() ?: "",
serviceId = settings.serviceId?.toString().takeIf { BuildConfig.USE_STRING_ID } ?: "",
e164 = settings.e164 ?: "",
serviceIdBinary = settings.serviceId?.toByteString().takeIf { RemoteConfig.useBinaryId } ?: ByteString.EMPTY
)
@@ -188,9 +189,9 @@ object StorageSyncModels {
}
return SignalContactRecord.newBuilder(recipient.syncExtras.storageProto).apply {
aci = recipient.aci?.toString() ?: ""
aci = recipient.aci?.toString().takeIf { BuildConfig.USE_STRING_ID } ?: ""
e164 = recipient.e164 ?: ""
pni = recipient.pni?.toStringWithoutPrefix() ?: ""
pni = recipient.pni?.toStringWithoutPrefix().takeIf { BuildConfig.USE_STRING_ID } ?: ""
profileKey = recipient.profileKey?.toByteString() ?: ByteString.EMPTY
givenName = recipient.signalProfileName.givenName
familyName = recipient.signalProfileName.familyName
@@ -294,10 +295,14 @@ object StorageSyncModels {
return SignalStoryDistributionListRecord.newBuilder(recipient.syncExtras.storageProto).apply {
identifier = UuidUtil.toByteArray(record.distributionId.asUuid()).toByteString()
name = record.name
recipientServiceIds = record.getMembersToSync()
.map { Recipient.resolved(it) }
.filter { it.hasServiceId }
.map { it.requireServiceId().toString() }
recipientServiceIds = if (BuildConfig.USE_STRING_ID) {
record.getMembersToSync()
.map { Recipient.resolved(it) }
.filter { it.hasServiceId }
.map { it.requireServiceId().toString() }
} else {
emptyList()
}
recipientServiceIdsBinary = if (RemoteConfig.useBinaryId) {
record.getMembersToSync()
.map { Recipient.resolved(it) }
@@ -507,7 +512,7 @@ object StorageSyncModels {
RecipientType.INDIVIDUAL -> {
RemoteRecipient(
contact = RemoteRecipient.Contact(
serviceId = recipient.serviceId?.toString() ?: "",
serviceId = recipient.serviceId?.toString().takeIf { BuildConfig.USE_STRING_ID } ?: "",
e164 = recipient.e164 ?: "",
serviceIdBinary = recipient.serviceId?.toByteString().takeIf { RemoteConfig.useBinaryId } ?: ByteString.EMPTY
)

View File

@@ -1186,7 +1186,7 @@ object RemoteConfig {
@get:JvmName("useBinaryId")
val useBinaryId: Boolean by remoteBoolean(
key = "android.useBinaryServiceId",
defaultValue = false,
defaultValue = Environment.IS_STAGING,
hotSwappable = false
)