From 938b9c85b828008d62f4412a81baba38fe4a43fc Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 30 Jan 2018 08:54:50 -0800 Subject: [PATCH] Don't crash on clean install Otherwise we'll error when retrieving non-existent password. // FREEBIE --- Podfile.lock | 10 +++------- Signal/src/AppDelegate.m | 9 ++++++--- Signal/test/util/OWSDatabaseConverterTest.m | 20 ++++++++------------ SignalServiceKit/src/Storage/OWSStorage.m | 10 ++++++---- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index e2c1142f2..e09dd8b5e 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -141,7 +141,7 @@ DEPENDENCIES: - SocketRocket (from `https://github.com/facebook/SocketRocket.git`) - SQLCipher (from `https://github.com/sqlcipher/sqlcipher.git`, commit `d5c2bec`) - SSZipArchive - - YapDatabase/SQLCipher (from `https://github.com/WhisperSystems/YapDatabase.git`, branch `release/unencryptedHeaders`) + - YapDatabase/SQLCipher (from `../YapDatabase`) - YYImage EXTERNAL SOURCES: @@ -167,8 +167,7 @@ EXTERNAL SOURCES: :commit: d5c2bec :git: https://github.com/sqlcipher/sqlcipher.git YapDatabase: - :branch: release/unencryptedHeaders - :git: https://github.com/WhisperSystems/YapDatabase.git + :path: ../YapDatabase CHECKOUT OPTIONS: AxolotlKit: @@ -192,9 +191,6 @@ CHECKOUT OPTIONS: SQLCipher: :commit: d5c2bec :git: https://github.com/sqlcipher/sqlcipher.git - YapDatabase: - :commit: eaff655ebc774105e83f835ead71f8b7a02e4ac1 - :git: https://github.com/WhisperSystems/YapDatabase.git SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 @@ -221,6 +217,6 @@ SPEC CHECKSUMS: YapDatabase: 299a32de9d350d37a9ac5b0532609d87d5d2a5de YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54 -PODFILE CHECKSUM: 0d804514eb2db34b9874b653e543255d8c2f5751 +PODFILE CHECKSUM: bb32efdc239e2a93d6304d25de33a25dc4cdbab2 COCOAPODS: 1.3.1 diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 0f8d406d6..20adce933 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -251,6 +251,10 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; - (nullable NSError *)convertDatabaseIfNecessary { NSString *databaseFilePath = [TSStorageManager legacyDatabaseFilePath]; + if (![[NSFileManager defaultManager] fileExistsAtPath:databaseFilePath]) { + DDLogVerbose(@"%@ no legacy database file found", self.logTag); + return nil; + } NSError *error; NSData *_Nullable databasePassword = [OWSStorage tryToLoadDatabasePassword:&error]; @@ -260,7 +264,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; OWSErrorCodeDatabaseConversionFatalError, @"Failed to load database password")); } - YapDatabaseSaltBlock saltBlock = ^(NSData *saltData) { + YapDatabaseSaltBlock recordSaltBlock = ^(NSData *saltData) { DDLogVerbose(@"%@ saltData: %@", self.logTag, saltData.hexadecimalString); [OWSStorage storeDatabaseSalt:saltData]; }; @@ -271,8 +275,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; return [YapDatabaseCryptoUtils convertDatabaseIfNecessary:databaseFilePath databasePassword:databasePassword - saltBlock:saltBlock - keySpecBlock:keySpecBlock]; + recordSaltBlock:recordSaltBlock]; } - (void)startupLogging diff --git a/Signal/test/util/OWSDatabaseConverterTest.m b/Signal/test/util/OWSDatabaseConverterTest.m index 3ef874042..b9a24bfc3 100644 --- a/Signal/test/util/OWSDatabaseConverterTest.m +++ b/Signal/test/util/OWSDatabaseConverterTest.m @@ -298,7 +298,7 @@ NS_ASSUME_NONNULL_BEGIN XCTAssertTrue([YapDatabaseCryptoUtils doesDatabaseNeedToBeConverted:databaseFilePath]); __block NSData *_Nullable databaseSalt = nil; - YapDatabaseSaltBlock saltBlock = ^(NSData *saltData) { + YapDatabaseSaltBlock recordSaltBlock = ^(NSData *saltData) { OWSAssert(!databaseSalt); OWSAssert(saltData); @@ -313,8 +313,7 @@ NS_ASSUME_NONNULL_BEGIN }; NSError *_Nullable error = [YapDatabaseCryptoUtils convertDatabaseIfNecessary:databaseFilePath databasePassword:databasePassword - saltBlock:saltBlock - keySpecBlock:keySpecBlock]; + recordSaltBlock:recordSaltBlock]; if (error) { DDLogError(@"%s error: %@", __PRETTY_FUNCTION__, error); } @@ -355,8 +354,7 @@ NS_ASSUME_NONNULL_BEGIN }; NSError *_Nullable error = [YapDatabaseCryptoUtils convertDatabaseIfNecessary:databaseFilePath databasePassword:databasePassword - saltBlock:saltBlock - keySpecBlock:keySpecBlock]; + recordSaltBlock:recordSaltBlock]; if (error) { DDLogError(@"%s error: %@", __PRETTY_FUNCTION__, error); } @@ -400,7 +398,7 @@ NS_ASSUME_NONNULL_BEGIN XCTAssertTrue([YapDatabaseCryptoUtils doesDatabaseNeedToBeConverted:databaseFilePath]); __block NSData *_Nullable databaseSalt = nil; - YapDatabaseSaltBlock saltBlock = ^(NSData *saltData) { + YapDatabaseSaltBlock recordSaltBlock = ^(NSData *saltData) { OWSAssert(!databaseSalt); OWSAssert(saltData); @@ -450,7 +448,7 @@ NS_ASSUME_NONNULL_BEGIN [self createDatabase:databasePassword databaseSalt:databaseSalt databaseKeySpec:databaseKeySpec]; XCTAssertFalse([YapDatabaseCryptoUtils doesDatabaseNeedToBeConverted:databaseFilePath]); - YapDatabaseSaltBlock saltBlock = ^(NSData *saltData) { + YapDatabaseSaltBlock recordSaltBlock = ^(NSData *saltData) { OWSAssert(saltData); XCTFail(@"%s No conversion should be necessary", __PRETTY_FUNCTION__); @@ -463,8 +461,7 @@ NS_ASSUME_NONNULL_BEGIN NSError *_Nullable error = [YapDatabaseCryptoUtils convertDatabaseIfNecessary:databaseFilePath databasePassword:databasePassword - saltBlock:saltBlock - keySpecBlock:keySpecBlock]; + recordSaltBlock:recordSaltBlock]; if (error) { DDLogError(@"%s error: %@", __PRETTY_FUNCTION__, error); } @@ -488,7 +485,7 @@ NS_ASSUME_NONNULL_BEGIN [self createDatabase:databasePassword databaseSalt:databaseSalt databaseKeySpec:databaseKeySpec]; XCTAssertFalse([YapDatabaseCryptoUtils doesDatabaseNeedToBeConverted:databaseFilePath]); - YapDatabaseSaltBlock saltBlock = ^(NSData *saltData) { + YapDatabaseSaltBlock recordSaltBlock = ^(NSData *saltData) { OWSAssert(saltData); XCTFail(@"%s No conversion should be necessary", __PRETTY_FUNCTION__); @@ -501,8 +498,7 @@ NS_ASSUME_NONNULL_BEGIN NSError *_Nullable error = [YapDatabaseCryptoUtils convertDatabaseIfNecessary:databaseFilePath databasePassword:databasePassword - saltBlock:saltBlock - keySpecBlock:keySpecBlock]; + recordSaltBlock:recordSaltBlock]; if (error) { DDLogError(@"%s error: %@", __PRETTY_FUNCTION__, error); } diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index f99e40c06..918a589c4 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -388,10 +388,10 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); // Although we don't use databasePassword or databaseSalt in this method, // we use their accessors to ensure that all three exist in the keychain // and can be loaded or that we reset the database & keychain. - NSData *databasePassword = [self databasePassword]; - OWSAssert(databasePassword.length > 0); - NSData *databaseSalt = [self databaseSalt]; - OWSAssert(databaseSalt.length > 0); + // NSData *databasePassword = [self databasePassword]; + // OWSAssert(databasePassword.length > 0); + // NSData *databaseSalt = [self databaseSalt]; + // OWSAssert(databaseSalt.length > 0); NSData *databaseKeySpec = [self databaseKeySpec]; OWSAssert(databaseKeySpec.length == kSQLCipherKeySpecLength); @@ -608,6 +608,8 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); - (NSData *)databaseKeySpec { + // Get or generate salt and cipherKeyData + return [self loadMetadataOrClearDatabase:^(NSError **_Nullable errorHandle) { return [OWSStorage tryToLoadDatabaseKeySpec:errorHandle]; }