2014-07-30 08:05:36 +02:00
|
|
|
//
|
|
|
|
// VersionMigrations.m
|
|
|
|
// Signal
|
|
|
|
//
|
|
|
|
// Created by Frederic Jacobs on 29/07/14.
|
|
|
|
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#import "VersionMigrations.h"
|
|
|
|
|
2015-01-11 17:48:18 +01:00
|
|
|
#import "Environment.h"
|
2015-08-23 00:00:39 +02:00
|
|
|
#import "LockInteractionController.h"
|
2015-01-11 17:48:18 +01:00
|
|
|
#import "PreferencesUtil.h"
|
|
|
|
#import "PushManager.h"
|
|
|
|
#import "RecentCallManager.h"
|
|
|
|
#import "SignalKeyingStorage.h"
|
2015-12-22 12:45:09 +01:00
|
|
|
#import "TSAccountManager.h"
|
|
|
|
#import "TSNetworkManager.h"
|
2015-03-12 00:46:31 +01:00
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
#define NEEDS_TO_REGISTER_PUSH_KEY @"Register For Push"
|
2015-08-23 00:00:39 +02:00
|
|
|
#define NEEDS_TO_REGISTER_ATTRIBUTES @"Register Attributes"
|
2015-03-12 00:46:31 +01:00
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
@interface SignalKeyingStorage (VersionMigrations)
|
2015-01-11 17:48:18 +01:00
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (void)storeString:(NSString *)string forKey:(NSString *)key;
|
|
|
|
+ (void)storeData:(NSData *)data forKey:(NSString *)key;
|
2015-01-11 17:48:18 +01:00
|
|
|
@end
|
|
|
|
|
2014-07-30 08:05:36 +02:00
|
|
|
@implementation VersionMigrations
|
|
|
|
|
2015-04-25 16:59:32 +02:00
|
|
|
#pragma mark Utility methods
|
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (void)performUpdateCheck {
|
|
|
|
NSString *previousVersion = Environment.preferences.lastRanVersion;
|
|
|
|
NSString *currentVersion = [Environment.preferences setAndGetCurrentVersion];
|
|
|
|
BOOL VOIPRegistration =
|
|
|
|
[[PushManager sharedManager] supportsVOIPPush] && ![Environment.preferences hasRegisteredVOIPPush];
|
|
|
|
|
2015-04-25 16:59:32 +02:00
|
|
|
if (!previousVersion) {
|
|
|
|
DDLogError(@"No previous version found. Possibly first launch since install.");
|
|
|
|
return;
|
|
|
|
}
|
2015-12-22 12:45:09 +01:00
|
|
|
|
|
|
|
if (([self isVersion:previousVersion atLeast:@"1.0.2" andLessThan:@"2.0"])) {
|
2015-08-23 00:00:39 +02:00
|
|
|
// We don't migrate from RedPhone anymore, too painful to maintain.
|
|
|
|
// Resetting the app data and quitting.
|
|
|
|
[Environment resetAppData];
|
|
|
|
exit(0);
|
2015-04-25 16:59:32 +02:00
|
|
|
}
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
// VOIP Push might need to be enabled because 1) user ran old version 2) Update to compatible iOS version
|
|
|
|
if (VOIPRegistration && [TSAccountManager isRegistered]) {
|
|
|
|
[self nonBlockingPushRegistration];
|
2015-04-25 16:59:32 +02:00
|
|
|
}
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-09-01 19:22:08 +02:00
|
|
|
if ([self isVersion:previousVersion atLeast:@"2.0.0" andLessThan:@"2.1.70"] && [TSAccountManager isRegistered]) {
|
2015-04-25 16:59:32 +02:00
|
|
|
[self clearVideoCache];
|
2015-08-23 00:00:39 +02:00
|
|
|
[self blockingAttributesUpdate];
|
2015-04-28 14:41:50 +02:00
|
|
|
}
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-11-29 01:14:49 +01:00
|
|
|
if ([self isVersion:previousVersion atLeast:@"2.0.0" andLessThan:@"2.3.0"] && [TSAccountManager isRegistered]) {
|
|
|
|
NSFileManager *fm = [NSFileManager defaultManager];
|
2015-12-22 12:45:09 +01:00
|
|
|
NSArray *cachesDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
|
|
|
|
NSString *bloomFilterPath = [[cachesDir objectAtIndex:0] stringByAppendingPathComponent:@"bloomfilter"];
|
|
|
|
[fm removeItemAtPath:bloomFilterPath error:nil];
|
|
|
|
[[TSStorageManager sharedManager]
|
|
|
|
.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) {
|
|
|
|
[transaction removeAllObjectsInCollection:@"TSRecipient"];
|
2015-11-29 01:14:49 +01:00
|
|
|
}];
|
|
|
|
}
|
2015-04-25 16:59:32 +02:00
|
|
|
}
|
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (BOOL)isVersion:(NSString *)thisVersionString
|
|
|
|
atLeast:(NSString *)openLowerBoundVersionString
|
|
|
|
andLessThan:(NSString *)closedUpperBoundVersionString {
|
|
|
|
return [self isVersion:thisVersionString atLeast:openLowerBoundVersionString] &&
|
|
|
|
[self isVersion:thisVersionString lessThan:closedUpperBoundVersionString];
|
2015-04-25 16:59:32 +02:00
|
|
|
}
|
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (BOOL)isVersion:(NSString *)thisVersionString atLeast:(NSString *)thatVersionString {
|
2015-04-25 16:59:32 +02:00
|
|
|
return [thisVersionString compare:thatVersionString options:NSNumericSearch] != NSOrderedAscending;
|
|
|
|
}
|
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (BOOL)isVersion:(NSString *)thisVersionString lessThan:(NSString *)thatVersionString {
|
2015-04-25 16:59:32 +02:00
|
|
|
return [thisVersionString compare:thatVersionString options:NSNumericSearch] == NSOrderedAscending;
|
|
|
|
}
|
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
#pragma mark Upgrading to 2.1 - Needs to register VOIP token + Removing video cache folder
|
2015-04-25 16:59:32 +02:00
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (void)nonBlockingPushRegistration {
|
|
|
|
__block failedBlock failedBlock = ^(NSError *error) {
|
|
|
|
DDLogError(@"Failed to register VOIP push token: %@", error.debugDescription);
|
2015-08-23 00:00:39 +02:00
|
|
|
};
|
2015-12-22 12:45:09 +01:00
|
|
|
[[PushManager sharedManager] requestPushTokenWithSuccess:^(NSString *pushToken, NSString *voipToken) {
|
|
|
|
[TSAccountManager registerForPushNotifications:pushToken
|
|
|
|
voipToken:voipToken
|
|
|
|
success:^{
|
|
|
|
DDLogWarn(@"Registered for VOIP Push.");
|
|
|
|
}
|
|
|
|
failure:failedBlock];
|
|
|
|
}
|
|
|
|
failure:failedBlock];
|
2015-03-12 00:46:31 +01:00
|
|
|
}
|
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (void)blockingPushRegistration {
|
|
|
|
LIControllerBlockingOperation blockingOperation = ^BOOL(void) {
|
|
|
|
[[NSUserDefaults standardUserDefaults] setObject:@YES forKey:NEEDS_TO_REGISTER_PUSH_KEY];
|
|
|
|
|
|
|
|
__block dispatch_semaphore_t sema = dispatch_semaphore_create(0);
|
|
|
|
|
|
|
|
__block BOOL success;
|
|
|
|
|
|
|
|
__block failedBlock failedBlock = ^(NSError *error) {
|
|
|
|
success = NO;
|
|
|
|
dispatch_semaphore_signal(sema);
|
|
|
|
};
|
|
|
|
|
|
|
|
[[PushManager sharedManager] requestPushTokenWithSuccess:^(NSString *pushToken, NSString *voipToken) {
|
|
|
|
[TSAccountManager registerForPushNotifications:pushToken
|
|
|
|
voipToken:voipToken
|
|
|
|
success:^{
|
|
|
|
success = YES;
|
|
|
|
dispatch_semaphore_signal(sema);
|
|
|
|
}
|
|
|
|
failure:failedBlock];
|
|
|
|
}
|
|
|
|
failure:failedBlock];
|
|
|
|
|
|
|
|
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
|
|
|
|
|
|
|
|
return success;
|
2015-08-23 00:00:39 +02:00
|
|
|
};
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
LIControllerRetryBlock retryBlock = [LockInteractionController defaultNetworkRetry];
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
[LockInteractionController performBlock:blockingOperation
|
|
|
|
completionBlock:^{
|
2015-12-22 12:45:09 +01:00
|
|
|
[[NSUserDefaults standardUserDefaults] removeObjectForKey:NEEDS_TO_REGISTER_PUSH_KEY];
|
|
|
|
DDLogWarn(@"Successfully migrated to 2.1");
|
2015-08-23 00:00:39 +02:00
|
|
|
}
|
|
|
|
retryBlock:retryBlock
|
|
|
|
usesNetwork:YES];
|
2015-04-25 16:59:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
+ (BOOL)needsRegisterPush {
|
|
|
|
return [self userDefaultsBoolForKey:NEEDS_TO_REGISTER_PUSH_KEY];
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (void)clearVideoCache {
|
2015-12-22 12:45:09 +01:00
|
|
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
2015-04-25 16:59:32 +02:00
|
|
|
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
|
2015-12-22 12:45:09 +01:00
|
|
|
basePath = [basePath stringByAppendingPathComponent:@"videos"];
|
|
|
|
|
2015-04-25 16:59:32 +02:00
|
|
|
NSError *error;
|
2015-12-22 12:45:09 +01:00
|
|
|
if ([[NSFileManager defaultManager] fileExistsAtPath:basePath]) {
|
2015-04-25 16:59:32 +02:00
|
|
|
[NSFileManager.defaultManager removeItemAtPath:basePath error:&error];
|
|
|
|
}
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
if (error) {
|
|
|
|
DDLogError(@"An error occured while removing the videos cache folder from old location: %@",
|
|
|
|
error.debugDescription);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark Upgrading to 2.1.3 - Adding VOIP flag on TS Server
|
|
|
|
|
|
|
|
+ (BOOL)needsRegisterAttributes {
|
2015-09-01 19:22:08 +02:00
|
|
|
return [self userDefaultsBoolForKey:NEEDS_TO_REGISTER_ATTRIBUTES] && [TSAccountManager isRegistered];
|
2015-08-23 00:00:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
+ (void)blockingAttributesUpdate {
|
2015-12-22 12:45:09 +01:00
|
|
|
LIControllerBlockingOperation blockingOperation = ^BOOL(void) {
|
|
|
|
[[NSUserDefaults standardUserDefaults] setObject:@YES forKey:NEEDS_TO_REGISTER_ATTRIBUTES];
|
|
|
|
|
|
|
|
__block dispatch_semaphore_t sema = dispatch_semaphore_create(0);
|
|
|
|
|
|
|
|
__block BOOL success;
|
|
|
|
|
|
|
|
TSUpdateAttributesRequest *request = [[TSUpdateAttributesRequest alloc] initWithUpdatedAttributesWithVoice:YES];
|
|
|
|
[[TSNetworkManager sharedManager] makeRequest:request
|
|
|
|
success:^(NSURLSessionDataTask *task, id responseObject) {
|
2015-08-23 00:00:39 +02:00
|
|
|
success = YES;
|
|
|
|
dispatch_semaphore_signal(sema);
|
2015-12-22 12:45:09 +01:00
|
|
|
}
|
|
|
|
failure:^(NSURLSessionDataTask *task, NSError *error) {
|
2015-08-23 00:00:39 +02:00
|
|
|
success = NO;
|
|
|
|
DDLogError(@"Updating attributess failed with error: %@", error.description);
|
|
|
|
dispatch_semaphore_signal(sema);
|
2015-12-22 12:45:09 +01:00
|
|
|
}];
|
|
|
|
|
|
|
|
|
|
|
|
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
|
|
|
|
|
|
|
|
return success;
|
2015-08-23 00:00:39 +02:00
|
|
|
};
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
LIControllerRetryBlock retryBlock = [LockInteractionController defaultNetworkRetry];
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
[LockInteractionController performBlock:blockingOperation
|
|
|
|
completionBlock:^{
|
2015-12-22 12:45:09 +01:00
|
|
|
[[NSUserDefaults standardUserDefaults] removeObjectForKey:NEEDS_TO_REGISTER_ATTRIBUTES];
|
|
|
|
DDLogWarn(@"Successfully updated attributes.");
|
2015-08-23 00:00:39 +02:00
|
|
|
}
|
|
|
|
retryBlock:retryBlock
|
|
|
|
usesNetwork:YES];
|
2015-04-25 16:59:32 +02:00
|
|
|
}
|
|
|
|
|
2015-08-23 00:00:39 +02:00
|
|
|
#pragma mark Util
|
|
|
|
|
2015-12-22 12:45:09 +01:00
|
|
|
+ (BOOL)userDefaultsBoolForKey:(NSString *)key {
|
2015-04-25 16:59:32 +02:00
|
|
|
NSNumber *num = [[NSUserDefaults standardUserDefaults] objectForKey:key];
|
2015-12-22 12:45:09 +01:00
|
|
|
|
2015-02-21 03:47:52 +01:00
|
|
|
if (!num) {
|
|
|
|
return NO;
|
|
|
|
} else {
|
|
|
|
return [num boolValue];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-30 08:05:36 +02:00
|
|
|
@end
|