Convert databases if necessary.
This commit is contained in:
parent
6b51be75a5
commit
dc73342573
5
Podfile
5
Podfile
|
@ -5,6 +5,9 @@ use_frameworks!
|
|||
|
||||
def shared_pods
|
||||
# OWS Pods
|
||||
pod 'SQLCipher', :git => 'https://github.com/sqlcipher/sqlcipher.git', :commit => 'd5c2bec'
|
||||
pod 'YapDatabase/SQLCipher', path: '../YapDatabase'
|
||||
# pod 'YapDatabase/SQLCipher', :git => 'https://github.com/WhisperSystems/YapDatabase.git', branch: 'charlesmchen/signal'
|
||||
pod 'SignalServiceKit', path: '.'
|
||||
pod 'AxolotlKit', git: 'https://github.com/WhisperSystems/SignalProtocolKit.git', branch: 'mkirk/framework-friendly'
|
||||
#pod 'AxolotlKit', path: '../SignalProtocolKit'
|
||||
|
@ -21,7 +24,7 @@ def shared_pods
|
|||
#pod 'JSQMessagesViewController', git: 'https://github.com/WhisperSystems/JSQMessagesViewController.git', branch: 'signal-master', :inhibit_warnings => true
|
||||
#pod 'JSQMessagesViewController', path: '../JSQMessagesViewController'
|
||||
pod 'Mantle', :inhibit_warnings => true
|
||||
pod 'YapDatabase/SQLCipher', :inhibit_warnings => true
|
||||
# pod 'YapDatabase/SQLCipher', :inhibit_warnings => true
|
||||
pod 'PureLayout', :inhibit_warnings => true
|
||||
pod 'Reachability', :inhibit_warnings => true
|
||||
pod 'SocketRocket', :git => 'https://github.com/facebook/SocketRocket.git', :inhibit_warnings => true
|
||||
|
|
23
Podfile.lock
23
Podfile.lock
|
@ -54,10 +54,10 @@ PODS:
|
|||
- TwistedOakCollapsingFutures
|
||||
- YapDatabase/SQLCipher
|
||||
- SocketRocket (0.5.1)
|
||||
- SQLCipher (3.4.1):
|
||||
- SQLCipher/standard (= 3.4.1)
|
||||
- SQLCipher/common (3.4.1)
|
||||
- SQLCipher/standard (3.4.1):
|
||||
- SQLCipher (3.4.2):
|
||||
- SQLCipher/standard (= 3.4.2)
|
||||
- SQLCipher/common (3.4.2)
|
||||
- SQLCipher/standard (3.4.2):
|
||||
- SQLCipher/common
|
||||
- SSZipArchive (2.1.1)
|
||||
- TwistedOakCollapsingFutures (1.0.0):
|
||||
|
@ -139,8 +139,9 @@ DEPENDENCIES:
|
|||
- Reachability
|
||||
- SignalServiceKit (from `.`)
|
||||
- SocketRocket (from `https://github.com/facebook/SocketRocket.git`)
|
||||
- SQLCipher (from `https://github.com/sqlcipher/sqlcipher.git`, commit `d5c2bec`)
|
||||
- SSZipArchive
|
||||
- YapDatabase/SQLCipher
|
||||
- YapDatabase/SQLCipher (from `../YapDatabase`)
|
||||
- YYImage
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
|
@ -162,6 +163,11 @@ EXTERNAL SOURCES:
|
|||
:path: .
|
||||
SocketRocket:
|
||||
:git: https://github.com/facebook/SocketRocket.git
|
||||
SQLCipher:
|
||||
:commit: d5c2bec
|
||||
:git: https://github.com/sqlcipher/sqlcipher.git
|
||||
YapDatabase:
|
||||
:path: ../YapDatabase
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
AxolotlKit:
|
||||
|
@ -182,6 +188,9 @@ CHECKOUT OPTIONS:
|
|||
SocketRocket:
|
||||
:commit: 28035e1a98a427853e4038ff1b70479fa8374cfa
|
||||
:git: https://github.com/facebook/SocketRocket.git
|
||||
SQLCipher:
|
||||
:commit: d5c2bec
|
||||
:git: https://github.com/sqlcipher/sqlcipher.git
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67
|
||||
|
@ -201,13 +210,13 @@ SPEC CHECKSUMS:
|
|||
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
|
||||
SignalServiceKit: 8f9038e584080bee8c367268067e6e0ec0feefcf
|
||||
SocketRocket: dbb1554b8fc288ef8ef370d6285aeca7361be31e
|
||||
SQLCipher: 43d12c0eb9c57fb438749618fc3ce0065509a559
|
||||
SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990
|
||||
SSZipArchive: 14401ade5f8e82aba1ff03e9f88e9de60937ae60
|
||||
TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c
|
||||
UnionFind: c33be5adb12983981d6e827ea94fc7f9e370f52d
|
||||
YapDatabase: 299a32de9d350d37a9ac5b0532609d87d5d2a5de
|
||||
YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54
|
||||
|
||||
PODFILE CHECKSUM: fe273b089523b52e20652cebcf4854a80934f46c
|
||||
PODFILE CHECKSUM: 5d70451d47917767e5120e09e4b5967959971dd6
|
||||
|
||||
COCOAPODS: 1.3.1
|
||||
|
|
|
@ -104,6 +104,8 @@
|
|||
34612A071FD7238600532771 /* OWSContactsSyncing.m in Sources */ = {isa = PBXBuildFile; fileRef = 34612A051FD7238500532771 /* OWSContactsSyncing.m */; };
|
||||
346B66311F4E29B200E5122F /* CropScaleImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346B66301F4E29B200E5122F /* CropScaleImageViewController.swift */; };
|
||||
3472229F1EB22FFE00E53955 /* AddToGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3472229E1EB22FFE00E53955 /* AddToGroupViewController.m */; };
|
||||
34782E452011428D00A6F16B /* OWSDatabaseConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 34782E432011428D00A6F16B /* OWSDatabaseConverter.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
34782E462011428D00A6F16B /* OWSDatabaseConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 34782E442011428D00A6F16B /* OWSDatabaseConverter.m */; };
|
||||
347850311FD7494A007B8332 /* dripicons-v2.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A5B1E787A9800DF2FB9 /* dripicons-v2.ttf */; };
|
||||
347850321FD7494A007B8332 /* ElegantIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A5D1E787BD800DF2FB9 /* ElegantIcons.ttf */; };
|
||||
347850331FD7494A007B8332 /* fontawesome-webfont.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A591E7875FB00DF2FB9 /* fontawesome-webfont.ttf */; };
|
||||
|
@ -591,6 +593,8 @@
|
|||
346B66301F4E29B200E5122F /* CropScaleImageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropScaleImageViewController.swift; sourceTree = "<group>"; };
|
||||
3472229D1EB22FFE00E53955 /* AddToGroupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddToGroupViewController.h; sourceTree = "<group>"; };
|
||||
3472229E1EB22FFE00E53955 /* AddToGroupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddToGroupViewController.m; sourceTree = "<group>"; };
|
||||
34782E432011428D00A6F16B /* OWSDatabaseConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDatabaseConverter.h; sourceTree = "<group>"; };
|
||||
34782E442011428D00A6F16B /* OWSDatabaseConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSDatabaseConverter.m; sourceTree = "<group>"; };
|
||||
347850561FD86544007B8332 /* SAEFailedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SAEFailedViewController.swift; sourceTree = "<group>"; };
|
||||
347850581FD9972E007B8332 /* SwiftSingletons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSingletons.swift; sourceTree = "<group>"; };
|
||||
3478505A1FD999D5007B8332 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = translations/et.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
|
@ -1108,6 +1112,8 @@
|
|||
45666EC51D99483D008FE134 /* OWSAvatarBuilder.m */,
|
||||
45855F351D9498A40084F340 /* OWSContactAvatarBuilder.h */,
|
||||
45855F361D9498A40084F340 /* OWSContactAvatarBuilder.m */,
|
||||
34782E432011428D00A6F16B /* OWSDatabaseConverter.h */,
|
||||
34782E442011428D00A6F16B /* OWSDatabaseConverter.m */,
|
||||
346129A81FD1F0DF00532771 /* OWSFormat.h */,
|
||||
346129AA1FD1F0EE00532771 /* OWSFormat.m */,
|
||||
45666EC71D994C0D008FE134 /* OWSGroupAvatarBuilder.h */,
|
||||
|
@ -1122,11 +1128,11 @@
|
|||
34480B511FD0A7A400BC14EF /* OWSScrubbingLogFormatter.m */,
|
||||
346129331FD1A88700532771 /* OWSSwiftUtils.swift */,
|
||||
45360B8C1F9521F800FA666C /* Searcher.swift */,
|
||||
347850581FD9972E007B8332 /* SwiftSingletons.swift */,
|
||||
346129BD1FD2068600532771 /* ThreadUtil.h */,
|
||||
346129BE1FD2068600532771 /* ThreadUtil.m */,
|
||||
B97940251832BD2400BD66CB /* UIUtil.h */,
|
||||
B97940261832BD2400BD66CB /* UIUtil.m */,
|
||||
347850581FD9972E007B8332 /* SwiftSingletons.swift */,
|
||||
346129751FD1E0B500532771 /* WeakTimer.swift */,
|
||||
);
|
||||
path = utils;
|
||||
|
@ -2034,6 +2040,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
451F8A3A1FD711D9005CB9DA /* ContactsViewHelper.h in Headers */,
|
||||
34782E452011428D00A6F16B /* OWSDatabaseConverter.h in Headers */,
|
||||
34480B491FD0A60200BC14EF /* OWSMath.h in Headers */,
|
||||
346129E71FD5C0C600532771 /* OWSDatabaseMigrationRunner.h in Headers */,
|
||||
344D6CEA20069E070042AF96 /* SelectRecipientViewController.h in Headers */,
|
||||
|
@ -2792,6 +2799,7 @@
|
|||
346129D01FD207F300532771 /* OWSAlerts.swift in Sources */,
|
||||
454A965F1FD60EA3008D2A0E /* OWSFlatButton.swift in Sources */,
|
||||
346129B61FD1F7E800532771 /* ProfileFetcherJob.swift in Sources */,
|
||||
34782E462011428D00A6F16B /* OWSDatabaseConverter.m in Sources */,
|
||||
346129F51FD5F31400532771 /* OWS102MoveLoggingPreferenceToUserDefaults.m in Sources */,
|
||||
45194F8F1FD71FF500333B2C /* ThreadUtil.m in Sources */,
|
||||
451F8A3B1FD71297005CB9DA /* UIUtil.m in Sources */,
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#import <SignalMessaging/Environment.h>
|
||||
#import <SignalMessaging/OWSContactsManager.h>
|
||||
#import <SignalMessaging/OWSContactsSyncing.h>
|
||||
#import <SignalMessaging/OWSDatabaseConverter.h>
|
||||
#import <SignalMessaging/OWSMath.h>
|
||||
#import <SignalMessaging/OWSPreferences.h>
|
||||
#import <SignalMessaging/OWSProfileManager.h>
|
||||
|
@ -219,6 +220,8 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
|
|||
return;
|
||||
}
|
||||
|
||||
[OWSDatabaseConverter convertDatabaseIfNecessary];
|
||||
|
||||
[NSUserDefaults migrateToSharedUserDefaults];
|
||||
|
||||
[TSStorageManager migrateToSharedData];
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
// Used to convert YapDatabase/SQLCipher databases whose header is encrypted
|
||||
// to databases whose first 32 bytes are unencrypted so that iOS can determine
|
||||
// that this is a SQLite database using WAL and therefore not terminate the app
|
||||
// when it is suspended.
|
||||
@interface OWSDatabaseConverter : NSObject
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
+ (void)convertDatabaseIfNecessary;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,67 @@
|
|||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OWSDatabaseConverter.h"
|
||||
#import <SignalServiceKit/OWSFileSystem.h>
|
||||
#import <SignalServiceKit/TSStorageManager.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@implementation OWSDatabaseConverter
|
||||
|
||||
+ (BOOL)doesDatabaseNeedToBeConverted
|
||||
{
|
||||
NSString *databaseFilePath = [TSStorageManager legacyDatabaseFilePath];
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:databaseFilePath]) {
|
||||
DDLogVerbose(@"%@ Skipping database conversion; no legacy database found.", self.logTag);
|
||||
return NO;
|
||||
}
|
||||
NSError *error;
|
||||
// We use NSDataReadingMappedAlways instead of NSDataReadingMappedIfSafe because
|
||||
// we know the database will always exist for the duration of this instance of NSData.
|
||||
NSData *_Nullable data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:databaseFilePath]
|
||||
options:NSDataReadingMappedAlways
|
||||
error:&error];
|
||||
if (!data || error) {
|
||||
DDLogError(@"%@ Couldn't read legacy database file header.", self.logTag);
|
||||
// TODO: Make a convenience method (on a category of NSException?) that
|
||||
// flushes DDLog before raising a terminal exception.
|
||||
[NSException raise:@"Couldn't read legacy database file header" format:@""];
|
||||
}
|
||||
// Pull this constant out so that we can use it in our YapDatabase fork.
|
||||
const int kSqliteHeaderLength = 32;
|
||||
NSData *_Nullable headerData = [data subdataWithRange:NSMakeRange(0, kSqliteHeaderLength)];
|
||||
if (!headerData || headerData.length != kSqliteHeaderLength) {
|
||||
[NSException raise:@"Database database file header has unexpected length"
|
||||
format:@"Database database file header has unexpected length: %zd", headerData.length];
|
||||
}
|
||||
NSString *kUnencryptedHeader = @"SQLite format 3\0";
|
||||
NSData *unencryptedHeaderData = [kUnencryptedHeader dataUsingEncoding:NSUTF8StringEncoding];
|
||||
BOOL isUnencrypted = [unencryptedHeaderData
|
||||
isEqualToData:[headerData subdataWithRange:NSMakeRange(0, unencryptedHeaderData.length)]];
|
||||
if (isUnencrypted) {
|
||||
DDLogVerbose(@"%@ Skipping database conversion; legacy database header already decrypted.", self.logTag);
|
||||
return NO;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
+ (void)convertDatabaseIfNecessary
|
||||
{
|
||||
if (![self doesDatabaseNeedToBeConverted]) {
|
||||
return;
|
||||
}
|
||||
|
||||
[self convertDatabase];
|
||||
}
|
||||
|
||||
+ (void)convertDatabase
|
||||
{
|
||||
// TODO:
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -25,6 +25,8 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage);
|
|||
|
||||
+ (NSString *)databaseFilePath;
|
||||
|
||||
+ (NSString *)legacyDatabaseFilePath;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
|
Loading…
Reference in New Issue