session-ios/Signal/src/phone/signaling/number directory/PhoneNumberDirectoryFilter.m

64 lines
2.6 KiB
Mathematica
Raw Normal View History

2014-05-06 19:41:08 +02:00
#import "PhoneNumberDirectoryFilter.h"
#import "Constraints.h"
#define HASH_COUNT_HEADER_KEY @"X-Hash-Count"
#define MIN_NEW_EXPIRATION_SECONDS (12 * 60 * 60)
#define MAX_EXPIRATION_SECONDS (24 * 60 * 60)
@implementation PhoneNumberDirectoryFilter
@synthesize bloomFilter;
+(PhoneNumberDirectoryFilter*) phoneNumberDirectoryFilterDefault {
return [PhoneNumberDirectoryFilter phoneNumberDirectoryFilterWithBloomFilter:[BloomFilter bloomFilterWithNothing]
andExpirationDate:[NSDate date]];
}
+(PhoneNumberDirectoryFilter*) phoneNumberDirectoryFilterWithBloomFilter:(BloomFilter*)bloomFilter
andExpirationDate:(NSDate*)expirationDate {
require(bloomFilter != nil);
require(expirationDate != nil);
PhoneNumberDirectoryFilter* newInstance = [PhoneNumberDirectoryFilter new];
newInstance->bloomFilter = bloomFilter;
newInstance->expirationDate = expirationDate;
return newInstance;
}
-(NSDate*) getExpirationDate {
NSDate* currentDate = [NSDate date];
NSDate* maxExpiryDate = [NSDate dateWithTimeInterval:MAX_EXPIRATION_SECONDS sinceDate:currentDate];
expirationDate = [expirationDate earlierDate:maxExpiryDate];
return expirationDate;
}
2014-10-06 01:28:45 +02:00
+(PhoneNumberDirectoryFilter*) phoneNumberDirectoryFilterFromURLResponse:(NSHTTPURLResponse*)response body:(NSData*)data {
2014-05-06 19:41:08 +02:00
require(response != nil);
2014-10-06 01:28:45 +02:00
checkOperation(response.statusCode == 200);
2014-05-06 19:41:08 +02:00
2014-10-06 01:28:45 +02:00
NSString* hashCountHeader = response.allHeaderFields[HASH_COUNT_HEADER_KEY];
2014-05-06 19:41:08 +02:00
checkOperation(hashCountHeader != nil);
int hashCountValue = hashCountHeader.intValue;
2014-05-06 19:41:08 +02:00
checkOperation(hashCountValue > 0);
2014-10-06 01:28:45 +02:00
NSData* responseBody = data;
2014-08-14 03:13:24 +02:00
checkOperation(responseBody.length > 0);
2014-05-06 19:41:08 +02:00
BloomFilter* bloomFilter = [BloomFilter bloomFilterWithHashCount:(NSUInteger)hashCountValue
andData:responseBody];
NSTimeInterval expirationDuration = MIN_NEW_EXPIRATION_SECONDS
+ arc4random_uniform(MAX_EXPIRATION_SECONDS - MIN_NEW_EXPIRATION_SECONDS);
NSDate* expirationDate = [NSDate dateWithTimeInterval:expirationDuration sinceDate:[NSDate date]];
return [PhoneNumberDirectoryFilter phoneNumberDirectoryFilterWithBloomFilter:bloomFilter
andExpirationDate:expirationDate];
}
-(bool) containsPhoneNumber:(PhoneNumber*)phoneNumber {
if (phoneNumber == nil) return false;
return [bloomFilter contains:phoneNumber.toE164];
2014-05-06 19:41:08 +02:00
}
@end