Added a path for error handling when fetching data from the ZeroTier daemon

Still need to wire up error messages to the user.
This commit is contained in:
Grant Limberg 2016-08-30 20:28:52 -07:00
parent 35d5ed9c2b
commit c2a01f6db4
6 changed files with 129 additions and 33 deletions

View File

@ -266,13 +266,24 @@
NSString *nwid = [NSString stringWithFormat:@"%10llx", network.nwid]; NSString *nwid = [NSString stringWithFormat:@"%10llx", network.nwid];
if(network.connected) { if(network.connected) {
[[ServiceCom sharedInstance] leaveNetwork:nwid]; NSError *error = nil;
[[ServiceCom sharedInstance] leaveNetwork:nwid error:&error];
if (error) {
// TODO: Display error message
}
} }
else { else {
NSError *error = nil;
[[ServiceCom sharedInstance] joinNetwork:nwid [[ServiceCom sharedInstance] joinNetwork:nwid
allowManaged:network.allowManaged allowManaged:network.allowManaged
allowGlobal:network.allowGlobal allowGlobal:network.allowGlobal
allowDefault:(network.allowDefault && ![Network defaultRouteExists:self.networks])]; allowDefault:(network.allowDefault && ![Network defaultRouteExists:self.networks])
error:&error];
// TODO: Display error message
} }
} }

View File

@ -72,10 +72,17 @@ NSString * const JoinedNetworksKey = @"com.zerotier.one.joined-networks";
- (IBAction)onJoinClicked:(id)sender { - (IBAction)onJoinClicked:(id)sender {
NSString *networkId = self.network.stringValue; NSString *networkId = self.network.stringValue;
NSError *error = nil;
[[ServiceCom sharedInstance] joinNetwork:networkId [[ServiceCom sharedInstance] joinNetwork:networkId
allowManaged:(self.allowManagedCheckBox.state == NSOnState) allowManaged:(self.allowManagedCheckBox.state == NSOnState)
allowGlobal:(self.allowGlobalCheckBox.state == NSOnState) allowGlobal:(self.allowGlobalCheckBox.state == NSOnState)
allowDefault:(self.allowDefaultCheckBox.state == NSOnState)]; allowDefault:(self.allowDefaultCheckBox.state == NSOnState)
error:&error];
if(error) {
// TODO: display error message
return;
}
self.network.stringValue = @""; self.network.stringValue = @"";

View File

@ -42,15 +42,26 @@
- (void)joinNetwork:(NSString*)nwid - (void)joinNetwork:(NSString*)nwid
{ {
NSError *error = nil;
[[ServiceCom sharedInstance] joinNetwork:nwid [[ServiceCom sharedInstance] joinNetwork:nwid
allowManaged:(self.allowManaged.state == NSOnState) allowManaged:(self.allowManaged.state == NSOnState)
allowGlobal:(self.allowGlobal.state == NSOnState) allowGlobal:(self.allowGlobal.state == NSOnState)
allowDefault:![Network defaultRouteExists:_parent.networkList] && (self.allowDefault.state == NSOnState)]; allowDefault:![Network defaultRouteExists:_parent.networkList] && (self.allowDefault.state == NSOnState)
error:&error];
if (error) {
// TODO: Display error message
}
} }
- (void)leaveNetwork:(NSString*)nwid - (void)leaveNetwork:(NSString*)nwid
{ {
[[ServiceCom sharedInstance] leaveNetwork:nwid]; NSError *error = nil;
[[ServiceCom sharedInstance] leaveNetwork:nwid error:&error];
if (error) {
// TODO: Display error message
}
} }
@end @end

View File

@ -74,13 +74,21 @@ NSString * const StatusUpdateKey = @"com.zerotier.one.status";
} }
} }
NSError *error = nil;
[[ServiceCom sharedInstance] getNetworklist:^(NSArray<Network *> *networkList) { [[ServiceCom sharedInstance] getNetworklist:^(NSArray<Network *> *networkList) {
_receivedNetworks = networkList; _receivedNetworks = networkList;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ [[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self internal_updateNetworkInfo]; [self internal_updateNetworkInfo];
}]; } ];
}]; } error:&error];
if(error) {
// TODO: Display error message
[self stop];
}
[[ServiceCom sharedInstance] getNodeStatus:^(NodeStatus *status) { [[ServiceCom sharedInstance] getNodeStatus:^(NodeStatus *status) {
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:status forKey:@"status"]; NSDictionary *userInfo = [NSDictionary dictionaryWithObject:status forKey:@"status"];
@ -90,7 +98,13 @@ NSString * const StatusUpdateKey = @"com.zerotier.one.status";
object:nil object:nil
userInfo:userInfo]; userInfo:userInfo];
}]; }];
}]; } error:&error];
if (error) {
// TODO: Display error message
[self stop];
}
} }
- (void)deleteSavedNetwork:(NSString*)networkId - (void)deleteSavedNetwork:(NSString*)networkId

View File

@ -20,9 +20,9 @@
- (id)init; - (id)init;
- (void)getNetworklist:(void (^)(NSArray<Network*>*))completionHandler; - (void)getNetworklist:(void (^)(NSArray<Network*>*))completionHandler error:(NSError* __autoreleasing *)error;
- (void)getNodeStatus:(void (^)(NodeStatus*))completionHandler; - (void)getNodeStatus:(void (^)(NodeStatus*))completionHandler error:(NSError*__autoreleasing*)error;
- (void)joinNetwork:(NSString*)networkId allowManaged:(BOOL)allowManaged allowGlobal:(BOOL)allowGlobal allowDefault:(BOOL)allowDefault; - (void)joinNetwork:(NSString*)networkId allowManaged:(BOOL)allowManaged allowGlobal:(BOOL)allowGlobal allowDefault:(BOOL)allowDefault error:(NSError*__autoreleasing*)error;
- (void)leaveNetwork:(NSString*)networkId; - (void)leaveNetwork:(NSString*)networkId error:(NSError*__autoreleasing*)error;
@end @end

View File

@ -39,7 +39,7 @@
return self; return self;
} }
- (NSString*)key - (NSString*)key:(NSError* __autoreleasing *)err
{ {
static NSString *k = nil; static NSString *k = nil;
@ -63,10 +63,20 @@
if (error) { if (error) {
NSLog(@"Error: %@", error); NSLog(@"Error: %@", error);
k = nil; k = nil;
*err = error;
return @""; return @"";
} }
} }
else { else {
NSURL *sysAppSupportDir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSSystemDomainMask appropriateForURL:nil create:false error:nil];
sysAppSupportDir = [[sysAppSupportDir URLByAppendingPathComponent:@"ZeroTier"] URLByAppendingPathComponent:@"One"];
NSURL *sysAuthtokenURL = [sysAppSupportDir URLByAppendingPathComponent:@"authtoken.secret"];
if(![[NSFileManager defaultManager] fileExistsAtPath:[sysAuthtokenURL path]]) {
}
[[NSFileManager defaultManager] createDirectoryAtURL:appSupportDir [[NSFileManager defaultManager] createDirectoryAtURL:appSupportDir
withIntermediateDirectories:YES withIntermediateDirectories:YES
attributes:nil attributes:nil
@ -74,6 +84,7 @@
if (error) { if (error) {
NSLog(@"Error: %@", error); NSLog(@"Error: %@", error);
*err = error;
k = nil; k = nil;
return @""; return @"";
} }
@ -83,6 +94,12 @@
if (status != errAuthorizationSuccess) { if (status != errAuthorizationSuccess) {
NSLog(@"Authorization Failed! %d", status); NSLog(@"Authorization Failed! %d", status);
NSDictionary *userInfo = @{
NSLocalizedDescriptionKey: NSLocalizedString(@"Couldn't create AuthorizationRef", nil),
};
*err = [NSError errorWithDomain:@"com.zerotier.one" code:-1 userInfo:userInfo];
return @""; return @"";
} }
@ -104,6 +121,10 @@
if (status != errAuthorizationSuccess) { if (status != errAuthorizationSuccess) {
NSLog(@"Authorization Failed! %d", status); NSLog(@"Authorization Failed! %d", status);
NSDictionary *userInfo = @{
NSLocalizedDescriptionKey: NSLocalizedString(@"Couldn't copy authorization rights", nil),
};
*err = [NSError errorWithDomain:@"com.zerotier.one" code:-1 userInfo:userInfo];
return @""; return @"";
} }
@ -120,21 +141,32 @@
if (error) { if (error) {
NSLog(@"Error writing token to disk: %@", error); NSLog(@"Error writing token to disk: %@", error);
*err = error;
} }
} }
} }
} }
if (k == nil) { if (k == nil) {
NSDictionary *userInfo = @{
NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown error finding authorization key", nil),
};
*err = [NSError errorWithDomain:@"com.zerotier.one" code:-1 userInfo:userInfo];
return @""; return @"";
} }
return k; return k;
} }
- (void)getNetworklist:(void (^)(NSArray*))completionHandler - (void)getNetworklist:(void (^)(NSArray<Network *> *))completionHandler error:(NSError *__autoreleasing*)error
{ {
NSString *urlString = [[baseURL stringByAppendingString:@"/network?auth="] stringByAppendingString:[self key]]; NSString* key = [self key:error];
if(*error) {
return;
}
NSString *urlString = [[baseURL stringByAppendingString:@"/network?auth="] stringByAppendingString:key];
NSURL *url = [NSURL URLWithString:urlString]; NSURL *url = [NSURL URLWithString:urlString];
NSURLSessionDataTask *task = NSURLSessionDataTask *task =
@ -171,31 +203,36 @@
[task resume]; [task resume];
} }
- (void)getNodeStatus:(void (^)(NodeStatus*))completionHandler - (void)getNodeStatus:(void (^)(NodeStatus*))completionHandler error:(NSError*__autoreleasing*)error
{ {
NSString *urlString = [[baseURL stringByAppendingString:@"/status?auth="] stringByAppendingString:[self key]]; NSString *key = [self key:error];
if(*error) {
return;
}
NSString *urlString = [[baseURL stringByAppendingString:@"/status?auth="] stringByAppendingString:key];
NSURL *url = [NSURL URLWithString:urlString]; NSURL *url = [NSURL URLWithString:urlString];
NSURLSessionDataTask *task = NSURLSessionDataTask *task =
[session dataTaskWithURL:url [session dataTaskWithURL:url
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable err) {
if(error) { if(err) {
NSLog(@"Error: %@", error); NSLog(@"Error: %@", err);
return; return;
} }
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
NSInteger status = [httpResponse statusCode]; NSInteger status = [httpResponse statusCode];
NSError *err; NSError *err2;
if(status == 200) { if(status == 200) {
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
options:0 options:0
error:&err]; error:&err2];
if(err) { if(err2) {
NSLog(@"Error fetching node status: %@", err); NSLog(@"Error fetching node status: %@", err2);
return; return;
} }
@ -207,10 +244,17 @@
[task resume]; [task resume];
} }
- (void)joinNetwork:(NSString*)networkId allowManaged:(BOOL)allowManaged allowGlobal:(BOOL)allowGlobal allowDefault:(BOOL)allowDefault - (void)joinNetwork:(NSString*)networkId allowManaged:(BOOL)allowManaged allowGlobal:(BOOL)allowGlobal allowDefault:(BOOL)allowDefault error:(NSError *__autoreleasing*)error
{ {
NSString *key = [self key:error];
if(*error) {
return;
}
NSString *urlString = [[[[baseURL stringByAppendingString:@"/network/"] stringByAppendingString:networkId] stringByAppendingString:@"?auth="] stringByAppendingString:[self key]]; NSString *urlString = [[[[baseURL stringByAppendingString:@"/network/"]
stringByAppendingString:networkId]
stringByAppendingString:@"?auth="]
stringByAppendingString:key];
NSURL *url = [NSURL URLWithString:urlString]; NSURL *url = [NSURL URLWithString:urlString];
@ -227,6 +271,7 @@
if(err) { if(err) {
NSLog(@"Error creating json data: %@", err); NSLog(@"Error creating json data: %@", err);
*error = err;
return; return;
} }
@ -236,9 +281,9 @@
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSURLSessionDataTask *task = NSURLSessionDataTask *task =
[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable err) {
if(error) { if(error) {
NSLog(@"Error posting join request: %@", error); NSLog(@"Error posting join request: %@", err);
} }
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
@ -254,9 +299,17 @@
[task resume]; [task resume];
} }
- (void)leaveNetwork:(NSString*)networkId - (void)leaveNetwork:(NSString*)networkId error:(NSError*__autoreleasing*)error
{ {
NSString *urlString = [[[[baseURL stringByAppendingString:@"/network/"] stringByAppendingString:networkId] stringByAppendingString:@"?auth="] stringByAppendingString:[self key]]; NSString *key = [self key:error];
if(*error) {
return;
}
NSString *urlString = [[[[baseURL stringByAppendingString:@"/network/"]
stringByAppendingString:networkId]
stringByAppendingString:@"?auth="]
stringByAppendingString:key];
NSURL *url = [NSURL URLWithString:urlString]; NSURL *url = [NSURL URLWithString:urlString];
@ -264,9 +317,9 @@
request.HTTPMethod = @"DELETE"; request.HTTPMethod = @"DELETE";
NSURLSessionDataTask *task = NSURLSessionDataTask *task =
[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable err) {
if(error) { if(err) {
NSLog(@"Error posting delete request: %@", error); NSLog(@"Error posting delete request: %@", err);
return; return;
} }