|
|
|
@ -35,6 +35,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
return [Randomness generateRandomBytes:30];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (NSData *)randomDatabaseSalt
|
|
|
|
|
{
|
|
|
|
|
return [Randomness generateRandomBytes:kSQLCipherSaltLength];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// * Open a YapDatabase.
|
|
|
|
|
// * Do some work with a block.
|
|
|
|
|
// * Close the database.
|
|
|
|
@ -177,6 +182,15 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (nullable NSString *)createUnconvertedDatabase:(NSData *)databasePassword
|
|
|
|
|
{
|
|
|
|
|
return [self createDatabase:databasePassword
|
|
|
|
|
databaseSalt:nil];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If databaseSalt is nil, creates a non-converted database.
|
|
|
|
|
// Otherwise creates a pre-converted database.
|
|
|
|
|
- (nullable NSString *)createDatabase:(NSData *)databasePassword
|
|
|
|
|
databaseSalt:(NSData *_Nullable)databaseSalt
|
|
|
|
|
{
|
|
|
|
|
NSString *temporaryDirectory = NSTemporaryDirectory();
|
|
|
|
|
NSString *filename = [[NSUUID UUID].UUIDString stringByAppendingString:@".sqlite"];
|
|
|
|
@ -186,7 +200,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
[self createTestDatabase:databaseFilePath databasePassword:databasePassword];
|
|
|
|
|
|
|
|
|
|
BOOL isValid = [self verifyTestDatabase:databaseFilePath databasePassword:databasePassword databaseSalt:nil];
|
|
|
|
|
BOOL isValid = [self verifyTestDatabase:databaseFilePath databasePassword:databasePassword databaseSalt:databaseSalt];
|
|
|
|
|
OWSAssert(isValid);
|
|
|
|
|
|
|
|
|
|
return databaseFilePath;
|
|
|
|
@ -204,6 +218,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
// TODO: When we can create converted databases.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Verifies that legacy users with non-converted databases can convert.
|
|
|
|
|
- (void)testDatabaseConversion
|
|
|
|
|
{
|
|
|
|
|
NSData *databasePassword = [self randomDatabasePassword];
|
|
|
|
@ -227,7 +242,35 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
XCTAssertFalse([OWSDatabaseConverter doesDatabaseNeedToBeConverted:databaseFilePath]);
|
|
|
|
|
|
|
|
|
|
BOOL isValid =
|
|
|
|
|
[self verifyTestDatabase:databaseFilePath databasePassword:databasePassword databaseSalt:databaseSalt];
|
|
|
|
|
[self verifyTestDatabase:databaseFilePath databasePassword:databasePassword databaseSalt:databaseSalt];
|
|
|
|
|
XCTAssertTrue(isValid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Verifies new users who create new pre-converted databases.
|
|
|
|
|
- (void)testDatabaseCreation
|
|
|
|
|
{
|
|
|
|
|
NSData *databasePassword = [self randomDatabasePassword];
|
|
|
|
|
NSData *databaseSalt = [self randomDatabaseSalt];
|
|
|
|
|
NSString *_Nullable databaseFilePath = [self createDatabase:databasePassword
|
|
|
|
|
databaseSalt:databaseSalt];
|
|
|
|
|
XCTAssertFalse([OWSDatabaseConverter doesDatabaseNeedToBeConverted:databaseFilePath]);
|
|
|
|
|
|
|
|
|
|
OWSDatabaseSaltBlock saltBlock = ^(NSData *saltData) {
|
|
|
|
|
OWSAssert(saltData);
|
|
|
|
|
|
|
|
|
|
XCTFail(@"%s No conversion should be necessary", __PRETTY_FUNCTION__);
|
|
|
|
|
};
|
|
|
|
|
NSError *_Nullable error = [OWSDatabaseConverter convertDatabaseIfNecessary:databaseFilePath
|
|
|
|
|
databasePassword:databasePassword
|
|
|
|
|
saltBlock:saltBlock];
|
|
|
|
|
if (error) {
|
|
|
|
|
DDLogError(@"%s error: %@", __PRETTY_FUNCTION__, error);
|
|
|
|
|
}
|
|
|
|
|
XCTAssertNil(error);
|
|
|
|
|
XCTAssertFalse([OWSDatabaseConverter doesDatabaseNeedToBeConverted:databaseFilePath]);
|
|
|
|
|
|
|
|
|
|
BOOL isValid =
|
|
|
|
|
[self verifyTestDatabase:databaseFilePath databasePassword:databasePassword databaseSalt:databaseSalt];
|
|
|
|
|
XCTAssertTrue(isValid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|