diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java index 177cef625c..b8cc2be19b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java @@ -108,7 +108,7 @@ public class StorageForcePushJob extends BaseJob { inserts.add(accountRecord); allNewStorageIds.add(accountRecord.getId()); - SignalStorageManifest manifest = new SignalStorageManifest(newVersion, allNewStorageIds); + SignalStorageManifest manifest = new SignalStorageManifest(newVersion, SignalStore.account().getDeviceId(), allNewStorageIds); StorageSyncValidations.validateForcePush(manifest, inserts, Recipient.self().fresh()); try { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java index b019c9dce2..22a3e30d0f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java @@ -245,7 +245,7 @@ public class StorageSyncJob extends BaseJob { self = freshSelf(); } - Log.i(TAG, "Our version: " + localManifest.getVersion() + ", their version: " + remoteManifest.getVersion()); + Log.i(TAG, "Our version: " + localManifest.getVersionString() + ", their version: " + remoteManifest.getVersionString()); if (remoteManifest.getVersion() > localManifest.getVersion()) { Log.i(TAG, "[Remote Sync] Newer manifest version found!"); @@ -314,7 +314,7 @@ public class StorageSyncJob extends BaseJob { } if (remoteManifest != localManifest) { - Log.i(TAG, "[Remote Sync] Saved new manifest. Now at version: " + remoteManifest.getVersion()); + Log.i(TAG, "[Remote Sync] Saved new manifest. Now at version: " + remoteManifest.getVersionString()); SignalStore.storageService().setManifest(remoteManifest); } @@ -338,7 +338,7 @@ public class StorageSyncJob extends BaseJob { Log.i(TAG, "ID Difference :: " + idDifference); - remoteWriteOperation = new WriteOperationResult(new SignalStorageManifest(remoteManifest.getVersion() + 1, localStorageIds), + remoteWriteOperation = new WriteOperationResult(new SignalStorageManifest(remoteManifest.getVersion() + 1, SignalStore.account().getDeviceId(), localStorageIds), remoteInserts, remoteDeletes); @@ -361,14 +361,14 @@ public class StorageSyncJob extends BaseJob { throw new RetryLaterException(); } - Log.i(TAG, "Saved new manifest. Now at version: " + remoteWriteOperation.getManifest().getVersion()); + Log.i(TAG, "Saved new manifest. Now at version: " + remoteWriteOperation.getManifest().getVersionString()); SignalStore.storageService().setManifest(remoteWriteOperation.getManifest()); stopwatch.split("remote-write"); needsMultiDeviceSync = true; } else { - Log.i(TAG, "No remote writes needed. Still at version: " + remoteManifest.getVersion()); + Log.i(TAG, "No remote writes needed. Still at version: " + remoteManifest.getVersionString()); } List knownTypes = getKnownTypes(); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 2f2569b567..9410417aa7 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -557,7 +557,9 @@ public class SignalServiceAccountManager { boolean clearAll) throws IOException, InvalidKeyException { - ManifestRecord.Builder manifestRecordBuilder = ManifestRecord.newBuilder().setVersion(manifest.getVersion()); + ManifestRecord.Builder manifestRecordBuilder = ManifestRecord.newBuilder() + .setSourceDevice(manifest.getSourceDeviceId()) + .setVersion(manifest.getVersion()); for (StorageId id : manifest.getStorageIds()) { ManifestRecord.Identifier idProto = ManifestRecord.Identifier.newBuilder() @@ -599,7 +601,7 @@ public class SignalServiceAccountManager { ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getTypeValue())); } - SignalStorageManifest conflictManifest = new SignalStorageManifest(record.getVersion(), ids); + SignalStorageManifest conflictManifest = new SignalStorageManifest(record.getVersion(), record.getSourceDevice(), ids); return Optional.of(conflictManifest); } else { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageManifest.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageManifest.java index 905f70370a..95aedd011d 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageManifest.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageManifest.java @@ -14,14 +14,16 @@ import java.util.Map; import java.util.Optional; public class SignalStorageManifest { - public static final SignalStorageManifest EMPTY = new SignalStorageManifest(0, Collections.emptyList()); + public static final SignalStorageManifest EMPTY = new SignalStorageManifest(0, 1, Collections.emptyList()); private final long version; + private final int sourceDeviceId; private final List storageIds; private final Map> storageIdsByType; - public SignalStorageManifest(long version, List storageIds) { + public SignalStorageManifest(long version, int sourceDeviceId, List storageIds) { this.version = version; + this.sourceDeviceId = sourceDeviceId; this.storageIds = storageIds; this.storageIdsByType = new HashMap<>(); @@ -45,7 +47,7 @@ public class SignalStorageManifest { ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getTypeValue())); } - return new SignalStorageManifest(manifest.getVersion(), ids); + return new SignalStorageManifest(manifest.getVersion(), manifestRecord.getSourceDevice(), ids); } catch (InvalidProtocolBufferException e) { throw new AssertionError(e); } @@ -55,6 +57,14 @@ public class SignalStorageManifest { return version; } + public int getSourceDeviceId() { + return sourceDeviceId; + } + + public String getVersionString() { + return version + "." + sourceDeviceId; + } + public List getStorageIds() { return storageIds; } @@ -83,7 +93,10 @@ public class SignalStorageManifest { .build()); } - ManifestRecord manifestRecord = ManifestRecord.newBuilder().addAllIdentifiers(ids).build(); + ManifestRecord manifestRecord = ManifestRecord.newBuilder() + .addAllIdentifiers(ids) + .setSourceDevice(sourceDeviceId) + .build(); return StorageManifest.newBuilder() .setVersion(version) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageModels.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageModels.java index d1a3146403..212586a966 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageModels.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalStorageModels.java @@ -27,7 +27,7 @@ public final class SignalStorageModels { ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getTypeValue())); } - return new SignalStorageManifest(manifestRecord.getVersion(), ids); + return new SignalStorageManifest(manifestRecord.getVersion(), manifestRecord.getSourceDevice(), ids); } public static SignalStorageRecord remoteToLocalStorageRecord(StorageItem item, int type, StorageKey storageKey) throws IOException, InvalidKeyException { diff --git a/libsignal/service/src/main/proto/StorageService.proto b/libsignal/service/src/main/proto/StorageService.proto index c6870de26d..049886e3b7 100644 --- a/libsignal/service/src/main/proto/StorageService.proto +++ b/libsignal/service/src/main/proto/StorageService.proto @@ -56,8 +56,10 @@ message ManifestRecord { Type type = 2; } - uint64 version = 1; - repeated Identifier identifiers = 2; + uint64 version = 1; + uint32 sourceDevice = 3; + repeated Identifier identifiers = 2; + // Next ID: 4 } message StorageRecord {