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.
pull/1/head
Frederic Jacobs 10 years ago
parent 50fa491c7b
commit b6ef5f0b7f

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

@ -396,6 +396,7 @@
B6B1013C196D213F007E3930 /* SignalKeyingStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B1013B196D213F007E3930 /* SignalKeyingStorage.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 */; };
B6BE7EED1AB100250038D0C8 /* BloomFilterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B6BE7EEC1AB100250038D0C8 /* BloomFilterTests.m */; };
B6C6AE551A305ED1006BAF8F /* redphone.cer in Resources */ = {isa = PBXBuildFile; fileRef = B6C6AE531A305ED1006BAF8F /* redphone.cer */; };
B6C6AE561A305ED1006BAF8F /* textsecure.cer in Resources */ = {isa = PBXBuildFile; fileRef = B6C6AE541A305ED1006BAF8F /* textsecure.cer */; };
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>"; };
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>"; };
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>"; };
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>"; };
@ -2021,6 +2023,7 @@
children = (
A157073017F0CD6D007C2BD6 /* PhoneNumberTest.m */,
A157073117F0CD6D007C2BD6 /* signaling */,
B6BE7EEC1AB100250038D0C8 /* BloomFilterTests.m */,
);
path = phone;
sourceTree = "<group>";
@ -2726,7 +2729,7 @@
};
};
D221A0A9169C9E5F00537ABF = {
DevelopmentTeam = AWR2FBJU75;
DevelopmentTeam = U68MSDN6DR;
TestTargetID = D221A088169C9E5E00537ABF;
};
};
@ -3238,6 +3241,7 @@
A157075717F0CD6D007C2BD6 /* AudioFrameTest.m in Sources */,
76EB063F18170B33006006FC /* Operation.m in Sources */,
76EB05AB18170B33006006FC /* SequenceCounter.m in Sources */,
B6BE7EED1AB100250038D0C8 /* BloomFilterTests.m in Sources */,
76EB061D18170B33006006FC /* ArrayUtil.m in Sources */,
76EB05E318170B33006006FC /* SecureEndPoint.m in Sources */,
76EB060D18170B33006006FC /* CategorizingLogger.m in Sources */,

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

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

@ -9,7 +9,6 @@
#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_DATA_KEY @"Directory Bloom Data"
#define PHONE_DIRECTORY_EXPIRATION @"Directory Expiration"
#define DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL 0.5
@ -29,11 +28,13 @@
#define HAS_ARCHIVED_A_MESSAGE_KEY @"User archived a message"
#define kSignalVersionKey @"SignalUpdateVersionKey"
#define BloomFilterCacheName @"bloomfilter"
@implementation PropertyListPreferences (PropertyUtil)
-(PhoneNumberDirectoryFilter*) tryGetSavedPhoneNumberDirectory {
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];
if (hashCount == 0 || data.length == 0 || expiration == nil) return nil;
BloomFilter* bloomFilter = [BloomFilter bloomFilterWithHashCount:hashCount andData:data];
@ -41,7 +42,7 @@
andExpirationDate:expiration];
}
-(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_EXPIRATION toValue:nil];
if (phoneNumberDirectoryFilter == nil) return;
@ -49,7 +50,7 @@
NSData* data = [[phoneNumberDirectoryFilter bloomFilter] data];
NSNumber* hashCount = @([[phoneNumberDirectoryFilter bloomFilter] hashCount]);
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_EXPIRATION toValue:expiry];
[self sendDirectoryUpdateNotification];
@ -213,4 +214,52 @@
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

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

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

@ -11,6 +11,7 @@
#import "Environment.h"
#import "PhoneNumberDirectoryFilterManager.h"
#import "PreferencesUtil.h"
#import "PropertyListPreferences.h"
#import "PushManager.h"
#import "TSAccountManager.h"
#import "RecentCallManager.h"
@ -21,6 +22,8 @@
#define IS_MIGRATING_FROM_1DOT0_TO_LARGER_KEY @"Migrating from 1.0 to Larger"
@interface SignalKeyingStorage(VersionMigrations)
+(void)storeString:(NSString*)string forKey:(NSString*)key;
@ -29,6 +32,13 @@
@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 {
if (!([self wasRedPhoneRegistered] || [self isMigratingTo2Dot0])) {

@ -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
Loading…
Cancel
Save