Sync keys with linked devices.

This commit is contained in:
Cody Henthorne 2023-10-11 16:34:35 -04:00
parent 6a6b80cce2
commit 1f9320200a
7 changed files with 62 additions and 5 deletions

View file

@ -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());

View file

@ -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));
}

View file

@ -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;
}

View file

@ -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<SyncKeysMigrationJob> {
override fun create(parameters: Parameters, serializedData: ByteArray?): SyncKeysMigrationJob {
return SyncKeysMigrationJob(parameters)
}
}
}

View file

@ -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!");
}

View file

@ -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<StorageKey> storageService;
private final Optional<MasterKey> master;
public KeysMessage(Optional<StorageKey> storageService) {
public KeysMessage(Optional<StorageKey> storageService, Optional<MasterKey> master) {
this.storageService = storageService;
this.master = master;
}
public Optional<StorageKey> getStorageService() {
return storageService;
}
public Optional<MasterKey> getMaster() {
return master;
}
}

View file

@ -542,7 +542,9 @@ message SyncMessage {
}
message Keys {
// @deprecated
optional bytes storageService = 1;
optional bytes master = 2;
}
message MessageRequestResponse {