Merge pull request #37 from WhisperSystems/mkirk/more-resilient-db-setup

more resilient db setup
pull/1/head
Michael Kirk 9 years ago committed by GitHub
commit cf035a597d

@ -21,8 +21,8 @@ typedef void (^failedBlock)(NSError *error);
*
* @return registered or not
*/
+ (BOOL)isRegistered;
+ (void)runIfRegistered:(void (^)())block;
/**
* Returns registered number

@ -40,6 +40,11 @@
return [TSStorageManager localNumber] ? YES : NO;
}
+ (void)runIfRegistered:(void (^)())block
{
[[TSStorageManager sharedManager] runIfHasLocalNumber:block];
}
+ (void)didRegister {
TSAccountManager *sharedManager = [self sharedInstance];
__strong NSString *phoneNumber = sharedManager.phoneNumberAwaitingVerification;

@ -33,8 +33,8 @@
*
* @return E164 string of the registered phone number
*/
+ (NSString *)localNumber;
- (void)runIfHasLocalNumber:(void (^)())block;
+ (void)storeServerToken:(NSString *)authToken signalingKey:(NSString *)signalingKey;

@ -14,6 +14,17 @@
return [[self sharedManager] stringForKey:TSStorageRegisteredNumberKey inCollection:TSStorageUserAccountCollection];
}
- (void)runIfHasLocalNumber:(void (^)())block
{
[self.newDatabaseConnection asyncReadWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) {
if ([transaction objectForKey:TSStorageRegisteredNumberKey inCollection:TSStorageUserAccountCollection]) {
block();
} else {
DDLogDebug(@"%@ Skipping block since no local number is registered", self.tag);
}
}];
}
+ (NSString *)signalingKey {
return [[self sharedManager] stringForKey:TSStorageServerSignalingKey inCollection:TSStorageUserAccountCollection];
}
@ -44,4 +55,16 @@
}];
}
#pragma mark - Logging
+ (NSString *)tag
{
return [NSString stringWithFormat:@"[%@]", self.class];
}
- (NSString *)tag
{
return self.class.tag;
}
@end

@ -32,19 +32,39 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
@end
@implementation TSRecipient
@interface OWSUnknownObject : NSObject <NSCoding>
@end
/**
* A default object to returned when we can't deserialize an object from YapDB. This can prevent crashes when
* old objects linger after their definition file is removed. The danger is that, the objects can lay in wait
* until the next time a DB extension is added and we necessarily enumerate the entire DB.
*/
@implementation OWSUnknownObject
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
DDLogWarn(@"Ignoring decoding signal recipient with coder.");
self = [super init];
return nil;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
DDLogWarn(@"Ignoring encoding signal recipient with coder.");
}
@end
@interface OWSUnarchiverDelegate : NSObject <NSKeyedUnarchiverDelegate>
@end
@implementation OWSUnarchiverDelegate
- (nullable Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray<NSString *> *)classNames
{
DDLogError(@"[OWSUnarchiverDelegate] Ignoring unknown class name: %@. Was the class definition deleted?", name);
return [OWSUnknownObject class];
}
@end
@ -86,13 +106,17 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
**/
+ (YapDatabaseDeserializer)logOnFailureDeserializer
{
OWSUnarchiverDelegate *unarchiverDelegate = [OWSUnarchiverDelegate new];
return ^id(NSString __unused *collection, NSString __unused *key, NSData *data) {
if (!data || data.length <= 0) {
return nil;
}
@try {
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = unarchiverDelegate;
return [unarchiver decodeObjectForKey:@"root"];
} @catch (NSException *exception) {
// Sync log in case we bail.
DDLogError(@"%@ Unarchiving key:%@ from collection:%@ and data %@ failed with error: %@",
@ -103,8 +127,6 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass";
exception.reason);
DDLogError(@"%@ Raising exception.", self.tag);
@throw exception;
// DDLogWarn(@"%@ Ignoring exception.", self.tag);
// return nil;
}
};
}

Loading…
Cancel
Save