diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index 21a34641f9..8d9ed910ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -79,6 +79,7 @@ import org.thoughtcrime.securesms.migrations.StoryReadStateMigrationJob; import org.thoughtcrime.securesms.migrations.StoryViewedReceiptsStateMigrationJob; import org.thoughtcrime.securesms.migrations.Svr2MirrorMigrationJob; import org.thoughtcrime.securesms.migrations.SyncDistributionListsMigrationJob; +import org.thoughtcrime.securesms.migrations.SyncKeysMigrationJob; import org.thoughtcrime.securesms.migrations.TrimByLengthSettingsMigrationJob; import org.thoughtcrime.securesms.migrations.UpdateSmsJobsMigrationJob; import org.thoughtcrime.securesms.migrations.UserNotificationMigrationJob; @@ -264,6 +265,7 @@ public final class JobManagerFactories { put(StoryViewedReceiptsStateMigrationJob.KEY, new StoryViewedReceiptsStateMigrationJob.Factory()); put(Svr2MirrorMigrationJob.KEY, new Svr2MirrorMigrationJob.Factory()); put(SyncDistributionListsMigrationJob.KEY, new SyncDistributionListsMigrationJob.Factory()); + put(SyncKeysMigrationJob.KEY, new SyncKeysMigrationJob.Factory()); put(TrimByLengthSettingsMigrationJob.KEY, new TrimByLengthSettingsMigrationJob.Factory()); put(UpdateSmsJobsMigrationJob.KEY, new UpdateSmsJobsMigrationJob.Factory()); put(UserNotificationMigrationJob.KEY, new UserNotificationMigrationJob.Factory()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java index 0d05c4def8..f7acf6d1d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java @@ -73,7 +73,7 @@ public class MultiDeviceKeysUpdateJob extends BaseJob { SignalServiceMessageSender messageSender = ApplicationDependencies.getSignalServiceMessageSender(); StorageKey storageServiceKey = SignalStore.storageService().getOrCreateStorageKey(); - messageSender.sendSyncMessage(SignalServiceSyncMessage.forKeys(new KeysMessage(Optional.ofNullable(storageServiceKey))), + messageSender.sendSyncMessage(SignalServiceSyncMessage.forKeys(new KeysMessage(Optional.ofNullable(storageServiceKey), Optional.of(SignalStore.svr().getOrCreateMasterKey()))), UnidentifiedAccessUtil.getAccessForSync(context)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java index 7484a16774..e995338322 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java @@ -139,9 +139,10 @@ public class ApplicationMigrations { static final int COPY_USERNAME_TO_SIGNAL_STORE = 95; static final int RECHECK_PAYMENTS = 96; static final int THREAD_COUNT_DB_MIGRATION = 97; + static final int SYNC_KEYS_MIGRATION = 98; } - public static final int CURRENT_VERSION = 97; + public static final int CURRENT_VERSION = 98; /** * This *must* be called after the {@link JobManager} has been instantiated, but *before* the call @@ -632,6 +633,10 @@ public class ApplicationMigrations { jobs.put(Version.THREAD_COUNT_DB_MIGRATION, new DatabaseMigrationJob()); } + if (lastSeenVersion < Version.SYNC_KEYS_MIGRATION) { + jobs.put(Version.SYNC_KEYS_MIGRATION, new SyncKeysMigrationJob()); + } + return jobs; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/SyncKeysMigrationJob.kt b/app/src/main/java/org/thoughtcrime/securesms/migrations/SyncKeysMigrationJob.kt new file mode 100644 index 0000000000..dd26dc4573 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/SyncKeysMigrationJob.kt @@ -0,0 +1,36 @@ +package org.thoughtcrime.securesms.migrations + +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies +import org.thoughtcrime.securesms.jobmanager.Job +import org.thoughtcrime.securesms.jobs.MultiDeviceKeysUpdateJob +import org.thoughtcrime.securesms.util.TextSecurePreferences + +/** + * Migration to sync keys with linked devices. + */ +internal class SyncKeysMigrationJob( + parameters: Parameters = Parameters.Builder().build() +) : MigrationJob(parameters) { + + companion object { + const val KEY = "SyncKeysMigrationJob" + } + + override fun getFactoryKey(): String = KEY + + override fun isUiBlocking(): Boolean = false + + override fun performMigration() { + if (TextSecurePreferences.isMultiDevice(context)) { + ApplicationDependencies.getJobManager().add(MultiDeviceKeysUpdateJob()) + } + } + + override fun shouldRetry(e: Exception): Boolean = false + + class Factory : Job.Factory { + override fun create(parameters: Parameters, serializedData: ByteArray?): SyncKeysMigrationJob { + return SyncKeysMigrationJob(parameters) + } + } +} diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index e3b2310694..6e0df4b0aa 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -1672,7 +1672,13 @@ public class SignalServiceMessageSender { if (keysMessage.getStorageService().isPresent()) { builder.storageService(ByteString.of(keysMessage.getStorageService().get().serialize())); - } else { + } + + if (keysMessage.getMaster().isPresent()) { + builder.master(ByteString.of(keysMessage.getMaster().get().serialize())); + } + + if (builder.storageService == null && builder.master == null) { Log.w(TAG, "Invalid keys message!"); } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/KeysMessage.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/KeysMessage.java index c54f5424ce..d9e9d72751 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/KeysMessage.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/KeysMessage.java @@ -1,7 +1,7 @@ package org.whispersystems.signalservice.api.messages.multidevice; - +import org.whispersystems.signalservice.api.kbs.MasterKey; import org.whispersystems.signalservice.api.storage.StorageKey; import java.util.Optional; @@ -9,12 +9,18 @@ import java.util.Optional; public class KeysMessage { private final Optional storageService; + private final Optional master; - public KeysMessage(Optional storageService) { + public KeysMessage(Optional storageService, Optional master) { this.storageService = storageService; + this.master = master; } public Optional getStorageService() { return storageService; } + + public Optional getMaster() { + return master; + } } diff --git a/libsignal-service/src/main/protowire/SignalService.proto b/libsignal-service/src/main/protowire/SignalService.proto index a0545df9ed..20348e355a 100644 --- a/libsignal-service/src/main/protowire/SignalService.proto +++ b/libsignal-service/src/main/protowire/SignalService.proto @@ -542,7 +542,9 @@ message SyncMessage { } message Keys { + // @deprecated optional bytes storageService = 1; + optional bytes master = 2; } message MessageRequestResponse {