Bloomfilter moves to Cache folder

The bloom filter is not user generated content so Apple is not going to
let us store it into the Documents folder. Moving it to the Cache
folder.
This commit is contained in:
Frederic Jacobs 2015-03-12 00:46:31 +01:00
parent 50fa491c7b
commit b6ef5f0b7f
9 changed files with 125 additions and 9 deletions

2
Pods

@ -1 +1 @@
Subproject commit 1569cfc9475da09be8d415fdc9194fdb2b6388f9 Subproject commit 9aac93648cd42d0a94d9b04b8456f7183a8c3b8e

View file

@ -396,6 +396,7 @@
B6B1013C196D213F007E3930 /* SignalKeyingStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B1013B196D213F007E3930 /* SignalKeyingStorage.m */; }; B6B1013C196D213F007E3930 /* SignalKeyingStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B1013B196D213F007E3930 /* SignalKeyingStorage.m */; };
B6B50AAB1A4192C500F8F607 /* TSMessagesManager+attachments.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B50AAA1A4192C500F8F607 /* TSMessagesManager+attachments.m */; }; B6B50AAB1A4192C500F8F607 /* TSMessagesManager+attachments.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B50AAA1A4192C500F8F607 /* TSMessagesManager+attachments.m */; };
B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; }; B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; };
B6BE7EED1AB100250038D0C8 /* BloomFilterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B6BE7EEC1AB100250038D0C8 /* BloomFilterTests.m */; };
B6C6AE551A305ED1006BAF8F /* redphone.cer in Resources */ = {isa = PBXBuildFile; fileRef = B6C6AE531A305ED1006BAF8F /* redphone.cer */; }; B6C6AE551A305ED1006BAF8F /* redphone.cer in Resources */ = {isa = PBXBuildFile; fileRef = B6C6AE531A305ED1006BAF8F /* redphone.cer */; };
B6C6AE561A305ED1006BAF8F /* textsecure.cer in Resources */ = {isa = PBXBuildFile; fileRef = B6C6AE541A305ED1006BAF8F /* textsecure.cer */; }; B6C6AE561A305ED1006BAF8F /* textsecure.cer in Resources */ = {isa = PBXBuildFile; fileRef = B6C6AE541A305ED1006BAF8F /* textsecure.cer */; };
B6C93C4E199567AD00EDF894 /* DebugLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = B6C93C4D199567AD00EDF894 /* DebugLogger.m */; }; B6C93C4E199567AD00EDF894 /* DebugLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = B6C93C4D199567AD00EDF894 /* DebugLogger.m */; };
@ -1071,6 +1072,7 @@
B6B9ECFA198B31BA00C620D3 /* PushManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PushManager.h; sourceTree = "<group>"; }; B6B9ECFA198B31BA00C620D3 /* PushManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PushManager.h; sourceTree = "<group>"; };
B6B9ECFB198B31BA00C620D3 /* PushManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PushManager.m; sourceTree = "<group>"; }; B6B9ECFB198B31BA00C620D3 /* PushManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PushManager.m; sourceTree = "<group>"; };
B6BC3D0C1AA544B100C2907F /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = translations/da.lproj/Localizable.strings; sourceTree = "<group>"; }; B6BC3D0C1AA544B100C2907F /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = translations/da.lproj/Localizable.strings; sourceTree = "<group>"; };
B6BE7EEC1AB100250038D0C8 /* BloomFilterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BloomFilterTests.m; sourceTree = "<group>"; };
B6C6AE531A305ED1006BAF8F /* redphone.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = redphone.cer; sourceTree = "<group>"; }; B6C6AE531A305ED1006BAF8F /* redphone.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = redphone.cer; sourceTree = "<group>"; };
B6C6AE541A305ED1006BAF8F /* textsecure.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = textsecure.cer; sourceTree = "<group>"; }; B6C6AE541A305ED1006BAF8F /* textsecure.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = textsecure.cer; sourceTree = "<group>"; };
B6C93C4C199567AD00EDF894 /* DebugLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugLogger.h; sourceTree = "<group>"; }; B6C93C4C199567AD00EDF894 /* DebugLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugLogger.h; sourceTree = "<group>"; };
@ -2021,6 +2023,7 @@
children = ( children = (
A157073017F0CD6D007C2BD6 /* PhoneNumberTest.m */, A157073017F0CD6D007C2BD6 /* PhoneNumberTest.m */,
A157073117F0CD6D007C2BD6 /* signaling */, A157073117F0CD6D007C2BD6 /* signaling */,
B6BE7EEC1AB100250038D0C8 /* BloomFilterTests.m */,
); );
path = phone; path = phone;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2726,7 +2729,7 @@
}; };
}; };
D221A0A9169C9E5F00537ABF = { D221A0A9169C9E5F00537ABF = {
DevelopmentTeam = AWR2FBJU75; DevelopmentTeam = U68MSDN6DR;
TestTargetID = D221A088169C9E5E00537ABF; TestTargetID = D221A088169C9E5E00537ABF;
}; };
}; };
@ -3238,6 +3241,7 @@
A157075717F0CD6D007C2BD6 /* AudioFrameTest.m in Sources */, A157075717F0CD6D007C2BD6 /* AudioFrameTest.m in Sources */,
76EB063F18170B33006006FC /* Operation.m in Sources */, 76EB063F18170B33006006FC /* Operation.m in Sources */,
76EB05AB18170B33006006FC /* SequenceCounter.m in Sources */, 76EB05AB18170B33006006FC /* SequenceCounter.m in Sources */,
B6BE7EED1AB100250038D0C8 /* BloomFilterTests.m in Sources */,
76EB061D18170B33006006FC /* ArrayUtil.m in Sources */, 76EB061D18170B33006006FC /* ArrayUtil.m in Sources */,
76EB05E318170B33006006FC /* SecureEndPoint.m in Sources */, 76EB05E318170B33006006FC /* SecureEndPoint.m in Sources */,
76EB060D18170B33006006FC /* CategorizingLogger.m in Sources */, 76EB060D18170B33006006FC /* CategorizingLogger.m in Sources */,

View file

@ -38,7 +38,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2.0.17</string> <string>2.0.18</string>
<key>LOGS_EMAIL</key> <key>LOGS_EMAIL</key>
<string>support@whispersystems.org</string> <string>support@whispersystems.org</string>
<key>LOGS_URL</key> <key>LOGS_URL</key>

View file

@ -53,6 +53,8 @@ static NSString* const kCallSegue = @"2.0_6.0_Call_Segue";
DDLogError(@"No previous version found. Possibly first launch since install."); DDLogError(@"No previous version found. Possibly first launch since install.");
} else if(([self isVersion:previousVersion atLeast:@"1.0.2" andLessThan:@"2.0"]) || isCurrentlyMigrating) { } else if(([self isVersion:previousVersion atLeast:@"1.0.2" andLessThan:@"2.0"]) || isCurrentlyMigrating) {
[VersionMigrations migrateFrom1Dot0Dot2ToVersion2Dot0]; [VersionMigrations migrateFrom1Dot0Dot2ToVersion2Dot0];
} else if(([self isVersion:previousVersion atLeast:@"2.0.0" andLessThan:@"2.0.18"])) {
[VersionMigrations migrateBloomFilter];
} }
} }

View file

@ -9,7 +9,6 @@
#define CALL_STREAM_DES_BUFFER_LEVEL_KEY @"CallStreamDesiredBufferLevel" #define CALL_STREAM_DES_BUFFER_LEVEL_KEY @"CallStreamDesiredBufferLevel"
#define PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY @"Directory Bloom Hash Count" #define PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY @"Directory Bloom Hash Count"
#define PHONE_DIRECTORY_BLOOM_FILTER_DATA_KEY @"Directory Bloom Data"
#define PHONE_DIRECTORY_EXPIRATION @"Directory Expiration" #define PHONE_DIRECTORY_EXPIRATION @"Directory Expiration"
#define DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL 0.5 #define DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL 0.5
@ -29,11 +28,13 @@
#define HAS_ARCHIVED_A_MESSAGE_KEY @"User archived a message" #define HAS_ARCHIVED_A_MESSAGE_KEY @"User archived a message"
#define kSignalVersionKey @"SignalUpdateVersionKey" #define kSignalVersionKey @"SignalUpdateVersionKey"
#define BloomFilterCacheName @"bloomfilter"
@implementation PropertyListPreferences (PropertyUtil) @implementation PropertyListPreferences (PropertyUtil)
-(PhoneNumberDirectoryFilter*) tryGetSavedPhoneNumberDirectory { -(PhoneNumberDirectoryFilter*) tryGetSavedPhoneNumberDirectory {
NSUInteger hashCount = [[self tryGetValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY] unsignedIntegerValue]; NSUInteger hashCount = [[self tryGetValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY] unsignedIntegerValue];
NSData* data = [self tryGetValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_DATA_KEY]; NSData* data = [self tryRetreiveBloomFilter];
NSDate* expiration = [self tryGetValueForKey:PHONE_DIRECTORY_EXPIRATION]; NSDate* expiration = [self tryGetValueForKey:PHONE_DIRECTORY_EXPIRATION];
if (hashCount == 0 || data.length == 0 || expiration == nil) return nil; if (hashCount == 0 || data.length == 0 || expiration == nil) return nil;
BloomFilter* bloomFilter = [BloomFilter bloomFilterWithHashCount:hashCount andData:data]; BloomFilter* bloomFilter = [BloomFilter bloomFilterWithHashCount:hashCount andData:data];
@ -41,7 +42,7 @@
andExpirationDate:expiration]; andExpirationDate:expiration];
} }
-(void) setSavedPhoneNumberDirectory:(PhoneNumberDirectoryFilter*)phoneNumberDirectoryFilter { -(void) setSavedPhoneNumberDirectory:(PhoneNumberDirectoryFilter*)phoneNumberDirectoryFilter {
[self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_DATA_KEY toValue:nil]; [self storeBloomfilter:nil];
[self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY toValue:nil]; [self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY toValue:nil];
[self setValueForKey:PHONE_DIRECTORY_EXPIRATION toValue:nil]; [self setValueForKey:PHONE_DIRECTORY_EXPIRATION toValue:nil];
if (phoneNumberDirectoryFilter == nil) return; if (phoneNumberDirectoryFilter == nil) return;
@ -49,7 +50,7 @@
NSData* data = [[phoneNumberDirectoryFilter bloomFilter] data]; NSData* data = [[phoneNumberDirectoryFilter bloomFilter] data];
NSNumber* hashCount = @([[phoneNumberDirectoryFilter bloomFilter] hashCount]); NSNumber* hashCount = @([[phoneNumberDirectoryFilter bloomFilter] hashCount]);
NSDate* expiry = phoneNumberDirectoryFilter.getExpirationDate; NSDate* expiry = phoneNumberDirectoryFilter.getExpirationDate;
[self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_DATA_KEY toValue:data]; [self storeBloomfilter:data];
[self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY toValue:hashCount]; [self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY toValue:hashCount];
[self setValueForKey:PHONE_DIRECTORY_EXPIRATION toValue:expiry]; [self setValueForKey:PHONE_DIRECTORY_EXPIRATION toValue:expiry];
[self sendDirectoryUpdateNotification]; [self sendDirectoryUpdateNotification];
@ -213,4 +214,52 @@
return currentVersion; return currentVersion;
} }
#pragma mark Bloom filter
- (NSData*)tryRetreiveBloomFilter {
return [NSData dataWithContentsOfFile:[self bloomfilterPath]];
}
- (void)storeBloomfilter:(NSData*)bloomFilterData {
if (!bloomFilterData) {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
if ([fileManager fileExistsAtPath:[self bloomfilterPath]]) {
[fileManager removeItemAtPath:[self bloomfilterPath] error:&error];
}
if (error) {
DDLogError(@"Failed to remove bloomfilter with error: %@", error);
}
return;
}
NSError *error;
[bloomFilterData writeToFile:[self bloomfilterPath] options:NSDataWritingAtomic error:&error];
if (error) {
DDLogError(@"Failed to store bloomfilter with error: %@", error);
}
}
- (NSString*)bloomfilterPath {
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *cachesDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *bloomFilterPath = [cachesDir objectAtIndex:0];
NSError *error;
if (![fm fileExistsAtPath:bloomFilterPath]) {
[fm createDirectoryAtPath:bloomFilterPath withIntermediateDirectories:YES attributes:@{} error:&error];
}
if (error) {
DDLogError(@"Failed to create caches directory with error: %@", error.description);
}
bloomFilterPath = [bloomFilterPath stringByAppendingPathComponent:BloomFilterCacheName];
return bloomFilterPath;
}
@end @end

View file

@ -4,6 +4,7 @@
#define SignalDatabaseCollection @"SignalPreferences" #define SignalDatabaseCollection @"SignalPreferences"
@implementation PropertyListPreferences @implementation PropertyListPreferences
-(void) clear { -(void) clear {
@ -33,6 +34,4 @@
} }
} }
@end @end

View file

@ -12,8 +12,11 @@
@interface VersionMigrations : NSObject @interface VersionMigrations : NSObject
+ (void)migrateBloomFilter;
+ (void)migrateFrom1Dot0Dot2ToVersion2Dot0; + (void)migrateFrom1Dot0Dot2ToVersion2Dot0;
+ (BOOL)isMigratingTo2Dot0; + (BOOL)isMigratingTo2Dot0;
@end @end

View file

@ -11,6 +11,7 @@
#import "Environment.h" #import "Environment.h"
#import "PhoneNumberDirectoryFilterManager.h" #import "PhoneNumberDirectoryFilterManager.h"
#import "PreferencesUtil.h" #import "PreferencesUtil.h"
#import "PropertyListPreferences.h"
#import "PushManager.h" #import "PushManager.h"
#import "TSAccountManager.h" #import "TSAccountManager.h"
#import "RecentCallManager.h" #import "RecentCallManager.h"
@ -21,6 +22,8 @@
#define IS_MIGRATING_FROM_1DOT0_TO_LARGER_KEY @"Migrating from 1.0 to Larger" #define IS_MIGRATING_FROM_1DOT0_TO_LARGER_KEY @"Migrating from 1.0 to Larger"
@interface SignalKeyingStorage(VersionMigrations) @interface SignalKeyingStorage(VersionMigrations)
+(void)storeString:(NSString*)string forKey:(NSString*)key; +(void)storeString:(NSString*)string forKey:(NSString*)key;
@ -29,6 +32,13 @@
@implementation VersionMigrations @implementation VersionMigrations
+ (void)migrateBloomFilter {
// The bloom filter had to be moved to the cache folder after rejection of the 2.0.1
NSString *oldBloomKey = @"Directory Bloom Data";
[[Environment preferences] setValueForKey:oldBloomKey toValue:nil];
return;
}
+ (void)migrateFrom1Dot0Dot2ToVersion2Dot0 { + (void)migrateFrom1Dot0Dot2ToVersion2Dot0 {
if (!([self wasRedPhoneRegistered] || [self isMigratingTo2Dot0])) { if (!([self wasRedPhoneRegistered] || [self isMigratingTo2Dot0])) {

View file

@ -0,0 +1,49 @@
//
// BloomFilterTests.m
// Signal
//
// Created by Frederic Jacobs on 11/03/15.
// Copyright (c) 2015 Open Whisper Systems. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import "Cryptography.h"
#import "Environment.h"
#import "PropertyListPreferences.h"
@interface PropertyListPreferences()
- (NSData*)tryRetreiveBloomFilter;
- (void)storeBloomfilter:(NSData*)bloomFilterData;
@end
@interface BloomFilterTests : XCTestCase
@end
@implementation BloomFilterTests
- (void)tearDown{
PropertyListPreferences *prefs = [Environment preferences];
[prefs storeBloomfilter:nil];
}
- (void)testCreationRetreivalDeletion{
NSData *randomData = [Cryptography generateRandomBytes:30];
PropertyListPreferences *prefs = [Environment preferences];
NSData *bloomFilter = [prefs tryRetreiveBloomFilter];
XCTAssert(bloomFilter == nil);
[prefs storeBloomfilter:randomData];
bloomFilter = [prefs tryRetreiveBloomFilter];
XCTAssert([bloomFilter isEqualToData:randomData]);
[prefs storeBloomfilter:nil];
bloomFilter = [prefs tryRetreiveBloomFilter];
XCTAssert(bloomFilter == nil);
}
@end