diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index 499bf9f929..367706530a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -15,6 +15,7 @@ import org.signal.libsignal.messagebackup.MessageBackupKey import org.signal.libsignal.protocol.ServiceId.Aci import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.thoughtcrime.securesms.attachments.AttachmentId +import org.thoughtcrime.securesms.attachments.Cdn import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.backup.v2.database.ChatItemImportInserter import org.thoughtcrime.securesms.backup.v2.database.clearAllDataForBackupRestore @@ -299,7 +300,7 @@ object BackupRepository { .then { credential -> api.getBackupInfo(backupKey, credential) } - .then { info -> getCdnReadCredentials().map { it.headers to info } } + .then { info -> getCdnReadCredentials(info.cdn ?: Cdn.CDN_3.cdnNumber).map { it.headers to info } } .map { pair -> val (cdnCredentials, info) = pair val messageReceiver = ApplicationDependencies.getSignalServiceMessageReceiver() @@ -456,7 +457,7 @@ object BackupRepository { /** * Retrieve credentials for reading from the backup cdn. */ - fun getCdnReadCredentials(): NetworkResult { + fun getCdnReadCredentials(cdnNumber: Int): NetworkResult { val cached = SignalStore.backup().cdnReadCredentials if (cached != null) { return NetworkResult.Success(cached) @@ -468,6 +469,7 @@ object BackupRepository { return getAuthCredential() .then { credential -> api.getCdnReadCredentials( + cdnNumber = cdnNumber, backupKey = backupKey, serviceCredential = credential ) @@ -490,7 +492,12 @@ object BackupRepository { val cachedBackupMediaDirectory = SignalStore.backup().cachedBackupMediaDirectory if (cachedBackupDirectory != null && cachedBackupMediaDirectory != null) { - return NetworkResult.Success(BackupDirectories(cachedBackupDirectory, cachedBackupMediaDirectory)) + return NetworkResult.Success( + BackupDirectories( + backupDir = cachedBackupDirectory, + mediaDir = cachedBackupMediaDirectory + ) + ) } val api = ApplicationDependencies.getSignalServiceAccountManager().archiveApi diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt index 5969ea6908..090564ffb4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt @@ -229,7 +229,7 @@ class AttachmentDownloadJob private constructor( val stream = if (useArchiveCdn) { archiveFile = SignalDatabase.attachments.getOrCreateArchiveTransferFile(attachmentId) - val cdnCredentials = BackupRepository.getCdnReadCredentials().successOrThrow().headers + val cdnCredentials = BackupRepository.getCdnReadCredentials(attachment.archiveCdn).successOrThrow().headers messageReceiver .retrieveArchivedAttachment( diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt index 1a0799fc7f..88eb206e92 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt @@ -226,7 +226,7 @@ class RestoreAttachmentJob private constructor( val stream = if (useArchiveCdn) { archiveFile = SignalDatabase.attachments.getOrCreateArchiveTransferFile(attachmentId) - val cdnCredentials = BackupRepository.getCdnReadCredentials().successOrThrow().headers + val cdnCredentials = BackupRepository.getCdnReadCredentials(attachment.archiveCdn).successOrThrow().headers messageReceiver .retrieveArchivedAttachment( diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt index 14482285f7..1928bd5d6b 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/archive/ArchiveApi.kt @@ -55,12 +55,12 @@ class ArchiveApi( } } - fun getCdnReadCredentials(backupKey: BackupKey, serviceCredential: ArchiveServiceCredential): NetworkResult { + fun getCdnReadCredentials(cdnNumber: Int, backupKey: BackupKey, serviceCredential: ArchiveServiceCredential): NetworkResult { return NetworkResult.fromFetch { val zkCredential = getZkCredential(backupKey, serviceCredential) val presentationData = CredentialPresentationData.from(backupKey, zkCredential, backupServerPublicParams) - pushServiceSocket.getArchiveCdnReadCredentials(presentationData.toArchiveCredentialPresentation()) + pushServiceSocket.getArchiveCdnReadCredentials(cdnNumber, presentationData.toArchiveCredentialPresentation()) } } @@ -225,7 +225,7 @@ class ArchiveApi( return backupRequestContext.receiveResponse( backupAuthResponse, backupServerPublicParams, - 20 + 201 ) } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 2f7b0a9a2a..36a050d34f 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -311,7 +311,7 @@ public class PushServiceSocket { private static final String BACKUP_AUTH_CHECK = "/v2/backup/auth/check"; private static final String ARCHIVE_CREDENTIALS = "/v1/archives/auth?redemptionStartSeconds=%d&redemptionEndSeconds=%d"; - private static final String ARCHIVE_READ_CREDENTIALS = "/v1/archives/auth/read"; + private static final String ARCHIVE_READ_CREDENTIALS = "/v1/archives/auth/read?cdn=%d"; private static final String ARCHIVE_BACKUP_ID = "/v1/archives/backupid"; private static final String ARCHIVE_PUBLIC_KEY = "/v1/archives/keys"; private static final String ARCHIVE_INFO = "/v1/archives"; @@ -590,10 +590,10 @@ public class PushServiceSocket { /** * Copy and re-encrypt media from the attachments cdn into the backup cdn. */ - public GetArchiveCdnCredentialsResponse getArchiveCdnReadCredentials(@Nonnull ArchiveCredentialPresentation credentialPresentation) throws IOException { + public GetArchiveCdnCredentialsResponse getArchiveCdnReadCredentials(int cdnNumber, @Nonnull ArchiveCredentialPresentation credentialPresentation) throws IOException { Map headers = credentialPresentation.toHeaders(); - String response = makeServiceRequestWithoutAuthentication(ARCHIVE_READ_CREDENTIALS, "GET", null, headers, NO_HANDLER); + String response = makeServiceRequestWithoutAuthentication(String.format(Locale.US, ARCHIVE_READ_CREDENTIALS, cdnNumber), "GET", null, headers, NO_HANDLER); return JsonUtil.fromJson(response, GetArchiveCdnCredentialsResponse.class); }