Rework database snapshot representation, encryption, etc.

pull/1/head
Matthew Chen 7 years ago
parent 0c81d5656f
commit fed524ba16

@ -40,7 +40,7 @@
340FC8C7204DE64D007AEB0F /* OWSBackupAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8C6204DE64D007AEB0F /* OWSBackupAPI.swift */; };
340FC8CA20517B84007AEB0F /* OWSBackupImportJob.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8C820517B84007AEB0F /* OWSBackupImportJob.m */; };
340FC8CD20518C77007AEB0F /* OWSBackupJob.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8CC20518C76007AEB0F /* OWSBackupJob.m */; };
340FC8D0205BF2FA007AEB0F /* OWSBackupEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8CE205BF2FA007AEB0F /* OWSBackupEncryption.m */; };
340FC8D0205BF2FA007AEB0F /* OWSBackupIO.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8CE205BF2FA007AEB0F /* OWSBackupIO.m */; };
341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */ = {isa = PBXBuildFile; fileRef = 341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */; };
3430FE181F7751D4000EC51B /* GiphyAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3430FE171F7751D4000EC51B /* GiphyAPI.swift */; };
34330A5A1E7875FB00DF2FB9 /* fontawesome-webfont.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A591E7875FB00DF2FB9 /* fontawesome-webfont.ttf */; };
@ -589,8 +589,8 @@
340FC8C920517B84007AEB0F /* OWSBackupImportJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSBackupImportJob.h; sourceTree = "<group>"; };
340FC8CB20518C76007AEB0F /* OWSBackupJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSBackupJob.h; sourceTree = "<group>"; };
340FC8CC20518C76007AEB0F /* OWSBackupJob.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackupJob.m; sourceTree = "<group>"; };
340FC8CE205BF2FA007AEB0F /* OWSBackupEncryption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackupEncryption.m; sourceTree = "<group>"; };
340FC8CF205BF2FA007AEB0F /* OWSBackupEncryption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSBackupEncryption.h; sourceTree = "<group>"; };
340FC8CE205BF2FA007AEB0F /* OWSBackupIO.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackupIO.m; sourceTree = "<group>"; };
340FC8CF205BF2FA007AEB0F /* OWSBackupIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSBackupIO.h; sourceTree = "<group>"; };
341458471FBE11C4005ABCF9 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = translations/fa.lproj/Localizable.strings; sourceTree = "<group>"; };
341F2C0D1F2B8AE700D07D6B /* DebugUIMisc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugUIMisc.h; sourceTree = "<group>"; };
341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugUIMisc.m; sourceTree = "<group>"; };
@ -1958,8 +1958,8 @@
34A9105E1FFEB113000C4745 /* OWSBackup.h */,
34A9105F1FFEB114000C4745 /* OWSBackup.m */,
340FC8C6204DE64D007AEB0F /* OWSBackupAPI.swift */,
340FC8CF205BF2FA007AEB0F /* OWSBackupEncryption.h */,
340FC8CE205BF2FA007AEB0F /* OWSBackupEncryption.m */,
340FC8CF205BF2FA007AEB0F /* OWSBackupIO.h */,
340FC8CE205BF2FA007AEB0F /* OWSBackupIO.m */,
340FC8BE204DB7D1007AEB0F /* OWSBackupExportJob.h */,
340FC8BF204DB7D2007AEB0F /* OWSBackupExportJob.m */,
340FC8C920517B84007AEB0F /* OWSBackupImportJob.h */,
@ -3177,7 +3177,7 @@
34D1F0B71F87F8850066283D /* OWSGenericAttachmentView.m in Sources */,
34B3F8801E8DF1700035BE1A /* InviteFlow.swift in Sources */,
457C87B82032645C008D52D6 /* DebugUINotifications.swift in Sources */,
340FC8D0205BF2FA007AEB0F /* OWSBackupEncryption.m in Sources */,
340FC8D0205BF2FA007AEB0F /* OWSBackupIO.m in Sources */,
458E38371D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m in Sources */,
4517642B1DE939FD00EDB8B9 /* ContactCell.swift in Sources */,
340FC8AB204DAC8D007AEB0F /* DomainFrontingCountryViewController.m in Sources */,

@ -3,7 +3,7 @@
//
#import "OWSBackupExportJob.h"
#import "OWSBackupEncryption.h"
#import "OWSBackupIO.h"
#import "OWSDatabaseMigration.h"
#import "OWSSignalServiceProtos.pb.h"
#import "Signal-Swift.h"
@ -65,7 +65,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSDBExportStream : NSObject
@property (nonatomic) OWSBackupEncryption *encryption;
@property (nonatomic) OWSBackupIO *backupIO;
@property (nonatomic) NSMutableArray<OWSBackupExportItem *> *exportItems;
@ -83,16 +83,16 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSDBExportStream
- (instancetype)initWithEncryption:(OWSBackupEncryption *)encryption
- (instancetype)initWithBackupIO:(OWSBackupIO *)backupIO
{
if (!(self = [super init])) {
return self;
}
OWSAssert(encryption);
OWSAssert(backupIO);
self.exportItems = [NSMutableArray new];
self.encryption = encryption;
self.backupIO = backupIO;
return self;
}
@ -146,9 +146,9 @@ NS_ASSUME_NONNULL_BEGIN
return NO;
}
NSData *compressedData = [self.encryption compressData:uncompressedData];
NSData *compressedData = [self.backupIO compressData:uncompressedData];
OWSBackupEncryptedItem *_Nullable encryptedItem = [self.encryption encryptDataAsTempFile:compressedData];
OWSBackupEncryptedItem *_Nullable encryptedItem = [self.backupIO encryptDataAsTempFile:compressedData];
if (!encryptedItem) {
OWSProdLogAndFail(@"%@ couldn't encrypt database snapshot.", self.logTag);
return NO;
@ -167,7 +167,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSAttachmentExport : NSObject
@property (nonatomic) OWSBackupEncryption *encryption;
@property (nonatomic) OWSBackupIO *backupIO;
@property (nonatomic) NSString *attachmentId;
@property (nonatomic) NSString *attachmentFilePath;
@property (nonatomic, nullable) NSString *relativeFilePath;
@ -181,19 +181,19 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSAttachmentExport
- (instancetype)initWithEncryption:(OWSBackupEncryption *)encryption
attachmentId:(NSString *)attachmentId
attachmentFilePath:(NSString *)attachmentFilePath
- (instancetype)initWithBackupIO:(OWSBackupIO *)backupIO
attachmentId:(NSString *)attachmentId
attachmentFilePath:(NSString *)attachmentFilePath
{
if (!(self = [super init])) {
return self;
}
OWSAssert(encryption);
OWSAssert(backupIO);
OWSAssert(attachmentId.length > 0);
OWSAssert(attachmentFilePath.length > 0);
self.encryption = encryption;
self.backupIO = backupIO;
self.attachmentId = attachmentId;
self.attachmentFilePath = attachmentFilePath;
@ -225,7 +225,7 @@ NS_ASSUME_NONNULL_BEGIN
}
self.relativeFilePath = relativeFilePath;
OWSBackupEncryptedItem *_Nullable encryptedItem = [self.encryption encryptFileAsTempFile:self.attachmentFilePath];
OWSBackupEncryptedItem *_Nullable encryptedItem = [self.backupIO encryptFileAsTempFile:self.attachmentFilePath];
if (!encryptedItem) {
DDLogError(@"%@ attachment could not be encrypted.", self.logTag);
OWSFail(@"%@ attachment could not be encrypted: %@", self.logTag, self.attachmentFilePath);
@ -243,7 +243,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, nullable) OWSBackgroundTask *backgroundTask;
@property (nonatomic) OWSBackupEncryption *encryption;
@property (nonatomic) OWSBackupIO *backupIO;
@property (nonatomic) NSMutableArray<OWSBackupExportItem *> *unsavedDatabaseItems;
@ -338,7 +338,7 @@ NS_ASSUME_NONNULL_BEGIN
return completion(NO);
}
self.encryption = [[OWSBackupEncryption alloc] initWithJobTempDirPath:self.jobTempDirPath];
self.backupIO = [[OWSBackupIO alloc] initWithJobTempDirPath:self.jobTempDirPath];
// We need to verify that we have a valid account.
// Otherwise, if we re-register on another device, we
@ -365,7 +365,7 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)exportDatabase
{
OWSAssert(self.encryption);
OWSAssert(self.backupIO);
DDLogVerbose(@"%@ %s", self.logTag, __PRETTY_FUNCTION__);
@ -379,7 +379,7 @@ NS_ASSUME_NONNULL_BEGIN
return NO;
}
OWSDBExportStream *exportStream = [[OWSDBExportStream alloc] initWithEncryption:self.encryption];
OWSDBExportStream *exportStream = [[OWSDBExportStream alloc] initWithBackupIO:self.backupIO];
__block BOOL aborted = NO;
typedef BOOL (^EntityFilter)(id object);
@ -453,9 +453,9 @@ NS_ASSUME_NONNULL_BEGIN
// OWSAttachmentExport is used to lazily write an encrypted copy of the
// attachment to disk.
OWSAttachmentExport *attachmentExport =
[[OWSAttachmentExport alloc] initWithEncryption:self.encryption
attachmentId:attachmentStream.uniqueId
attachmentFilePath:filePath];
[[OWSAttachmentExport alloc] initWithBackupIO:self.backupIO
attachmentId:attachmentStream.uniqueId
attachmentFilePath:filePath];
[self.unsavedAttachmentExports addObject:attachmentExport];
return YES;
@ -727,7 +727,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssert(self.savedDatabaseItems.count > 0);
OWSAssert(self.savedAttachmentItems);
OWSAssert(self.jobTempDirPath.length > 0);
OWSAssert(self.encryption);
OWSAssert(self.backupIO);
NSDictionary *json = @{
kOWSBackup_ManifestKey_DatabaseFiles : [self jsonForItems:self.savedDatabaseItems],
@ -743,7 +743,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSProdLogAndFail(@"%@ error encoding manifest file: %@", self.logTag, error);
return nil;
}
return [self.encryption encryptDataAsTempFile:jsonData encryptionKey:self.delegate.backupEncryptionKey];
return [self.backupIO encryptDataAsTempFile:jsonData encryptionKey:self.delegate.backupEncryptionKey];
}
- (NSArray<NSDictionary<NSString *, id> *> *)jsonForItems:(NSArray<OWSBackupExportItem *> *)items

@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark -
@interface OWSBackupEncryption : NSObject
@interface OWSBackupIO : NSObject
- (instancetype)init NS_UNAVAILABLE;

@ -2,7 +2,7 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSBackupEncryption.h"
#import "OWSBackupIO.h"
#import <Curve25519Kit/Randomness.h>
#import <SignalServiceKit/OWSFileSystem.h>
@ -19,7 +19,7 @@ static const NSUInteger kOWSBackupKeyLength = 32;
#pragma mark -
@interface OWSBackupEncryption ()
@interface OWSBackupIO ()
@property (nonatomic) NSString *jobTempDirPath;
@ -27,7 +27,7 @@ static const NSUInteger kOWSBackupKeyLength = 32;
#pragma mark -
@implementation OWSBackupEncryption
@implementation OWSBackupIO
- (instancetype)initWithJobTempDirPath:(NSString *)jobTempDirPath
{

@ -3,7 +3,7 @@
//
#import "OWSBackupImportJob.h"
#import "OWSBackupEncryption.h"
#import "OWSBackupIO.h"
#import "OWSDatabaseMigration.h"
#import "OWSDatabaseMigrationRunner.h"
#import "Signal-Swift.h"
@ -46,7 +46,7 @@ NSString *const kOWSBackup_ImportDatabaseKeySpec = @"kOWSBackup_ImportDatabaseKe
@property (nonatomic, nullable) OWSBackgroundTask *backgroundTask;
@property (nonatomic) OWSBackupEncryption *encryption;
@property (nonatomic) OWSBackupIO *backupIO;
@property (nonatomic) NSArray<OWSBackupImportItem *> *databaseItems;
@property (nonatomic) NSArray<OWSBackupImportItem *> *attachmentsItems;
@ -173,7 +173,7 @@ NSString *const kOWSBackup_ImportDatabaseKeySpec = @"kOWSBackup_ImportDatabaseKe
return NO;
}
self.encryption = [[OWSBackupEncryption alloc] initWithJobTempDirPath:self.jobTempDirPath];
self.backupIO = [[OWSBackupIO alloc] initWithJobTempDirPath:self.jobTempDirPath];
return YES;
}
@ -209,7 +209,7 @@ NSString *const kOWSBackup_ImportDatabaseKeySpec = @"kOWSBackup_ImportDatabaseKe
- (void)processManifest:(NSData *)manifestDataEncrypted completion:(OWSBackupJobBoolCompletion)completion
{
OWSAssert(completion);
OWSAssert(self.encryption);
OWSAssert(self.backupIO);
if (self.isComplete) {
return;
@ -218,7 +218,7 @@ NSString *const kOWSBackup_ImportDatabaseKeySpec = @"kOWSBackup_ImportDatabaseKe
DDLogVerbose(@"%@ %s", self.logTag, __PRETTY_FUNCTION__);
NSData *_Nullable manifestDataDecrypted =
[self.encryption decryptDataAsData:manifestDataEncrypted encryptionKey:self.delegate.backupEncryptionKey];
[self.backupIO decryptDataAsData:manifestDataEncrypted encryptionKey:self.delegate.backupEncryptionKey];
if (!manifestDataDecrypted) {
OWSProdLogAndFail(@"%@ Could not decrypt manifest.", self.logTag);
return completion(NO);
@ -408,9 +408,9 @@ NSString *const kOWSBackup_ImportDatabaseKeySpec = @"kOWSBackup_ImportDatabaseKe
DDLogError(@"%@ skipping redundant file restore: %@.", self.logTag, dstFilePath);
continue;
}
if (![self.encryption decryptFileAsFile:item.downloadFilePath
dstFilePath:dstFilePath
encryptionKey:item.encryptionKey]) {
if (![self.backupIO decryptFileAsFile:item.downloadFilePath
dstFilePath:dstFilePath
encryptionKey:item.encryptionKey]) {
DDLogError(@"%@ attachment could not be restored.", self.logTag);
// Attachment-related errors are recoverable and can be ignored.
continue;
@ -498,15 +498,15 @@ NSString *const kOWSBackup_ImportDatabaseKeySpec = @"kOWSBackup_ImportDatabaseKe
progress:@(count / (CGFloat)self.databaseItems.count)];
NSData *_Nullable compressedData =
[self.encryption decryptFileAsData:item.downloadFilePath encryptionKey:item.encryptionKey];
[self.backupIO decryptFileAsData:item.downloadFilePath encryptionKey:item.encryptionKey];
if (!compressedData) {
// Database-related errors are unrecoverable.
aborted = YES;
return completion(NO);
}
NSData *_Nullable uncompressedData =
[self.encryption decompressData:compressedData
uncompressedDataLength:item.uncompressedDataLength.unsignedIntValue];
[self.backupIO decompressData:compressedData
uncompressedDataLength:item.uncompressedDataLength.unsignedIntValue];
if (!uncompressedData) {
// Database-related errors are unrecoverable.
aborted = YES;

@ -3,7 +3,6 @@
//
#import "OWSBackupJob.h"
#import "OWSBackupEncryption.h"
#import "Signal-Swift.h"
#import <Curve25519Kit/Randomness.h>
#import <SAMKeychain/SAMKeychain.h>

Loading…
Cancel
Save