summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2016-08-30 20:28:52 -0700
committerGrant Limberg <glimberg@gmail.com>2016-08-30 20:28:52 -0700
commitc2a01f6db46273d7013d22c59e4cc6500866fbd3 (patch)
tree384bb15f5712c5f0906ba51d38abaf2451d17e25
parent35d5ed9c2bdbb920684a4088bd5bb6a3df332121 (diff)
downloadinfinitytier-c2a01f6db46273d7013d22c59e4cc6500866fbd3.tar.gz
infinitytier-c2a01f6db46273d7013d22c59e4cc6500866fbd3.zip
Added a path for error handling when fetching data from the ZeroTier daemon
Still need to wire up error messages to the user.
-rw-r--r--ZeroTier One/AppDelegate.m15
-rw-r--r--ZeroTier One/JoinNetworkViewController.m9
-rw-r--r--ZeroTier One/NetworkInfoCell.m15
-rw-r--r--ZeroTier One/NetworkMonitor.m20
-rw-r--r--ZeroTier One/ServiceCom.h8
-rw-r--r--ZeroTier One/ServiceCom.m95
6 files changed, 129 insertions, 33 deletions
diff --git a/ZeroTier One/AppDelegate.m b/ZeroTier One/AppDelegate.m
index f60ccb6b..048fa385 100644
--- a/ZeroTier One/AppDelegate.m
+++ b/ZeroTier One/AppDelegate.m
@@ -266,13 +266,24 @@
NSString *nwid = [NSString stringWithFormat:@"%10llx", network.nwid];
if(network.connected) {
- [[ServiceCom sharedInstance] leaveNetwork:nwid];
+ NSError *error = nil;
+
+ [[ServiceCom sharedInstance] leaveNetwork:nwid error:&error];
+
+ if (error) {
+ // TODO: Display error message
+
+ }
}
else {
+ NSError *error = nil;
[[ServiceCom sharedInstance] joinNetwork:nwid
allowManaged:network.allowManaged
allowGlobal:network.allowGlobal
- allowDefault:(network.allowDefault && ![Network defaultRouteExists:self.networks])];
+ allowDefault:(network.allowDefault && ![Network defaultRouteExists:self.networks])
+ error:&error];
+
+ // TODO: Display error message
}
}
diff --git a/ZeroTier One/JoinNetworkViewController.m b/ZeroTier One/JoinNetworkViewController.m
index 60e8e1cc..f91589d9 100644
--- a/ZeroTier One/JoinNetworkViewController.m
+++ b/ZeroTier One/JoinNetworkViewController.m
@@ -72,10 +72,17 @@ NSString * const JoinedNetworksKey = @"com.zerotier.one.joined-networks";
- (IBAction)onJoinClicked:(id)sender {
NSString *networkId = self.network.stringValue;
+ NSError *error = nil;
[[ServiceCom sharedInstance] joinNetwork:networkId
allowManaged:(self.allowManagedCheckBox.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 = @"";
diff --git a/ZeroTier One/NetworkInfoCell.m b/ZeroTier One/NetworkInfoCell.m
index 606bb849..6ffb9e71 100644
--- a/ZeroTier One/NetworkInfoCell.m
+++ b/ZeroTier One/NetworkInfoCell.m
@@ -42,15 +42,26 @@
- (void)joinNetwork:(NSString*)nwid
{
+ NSError *error = nil;
[[ServiceCom sharedInstance] joinNetwork:nwid
allowManaged:(self.allowManaged.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
{
- [[ServiceCom sharedInstance] leaveNetwork:nwid];
+ NSError *error = nil;
+ [[ServiceCom sharedInstance] leaveNetwork:nwid error:&error];
+
+ if (error) {
+ // TODO: Display error message
+ }
}
@end
diff --git a/ZeroTier One/NetworkMonitor.m b/ZeroTier One/NetworkMonitor.m
index 466d7db1..59451325 100644
--- a/ZeroTier One/NetworkMonitor.m
+++ b/ZeroTier One/NetworkMonitor.m
@@ -74,13 +74,21 @@ NSString * const StatusUpdateKey = @"com.zerotier.one.status";
}
}
+ NSError *error = nil;
+
[[ServiceCom sharedInstance] getNetworklist:^(NSArray<Network *> *networkList) {
_receivedNetworks = networkList;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self internal_updateNetworkInfo];
- }];
- }];
+ } ];
+ } error:&error];
+
+ if(error) {
+ // TODO: Display error message
+
+ [self stop];
+ }
[[ServiceCom sharedInstance] getNodeStatus:^(NodeStatus *status) {
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:status forKey:@"status"];
@@ -90,7 +98,13 @@ NSString * const StatusUpdateKey = @"com.zerotier.one.status";
object:nil
userInfo:userInfo];
}];
- }];
+ } error:&error];
+
+ if (error) {
+ // TODO: Display error message
+
+ [self stop];
+ }
}
- (void)deleteSavedNetwork:(NSString*)networkId
diff --git a/ZeroTier One/ServiceCom.h b/ZeroTier One/ServiceCom.h
index a0665001..b24dd4a2 100644
--- a/ZeroTier One/ServiceCom.h
+++ b/ZeroTier One/ServiceCom.h
@@ -20,9 +20,9 @@
- (id)init;
-- (void)getNetworklist:(void (^)(NSArray<Network*>*))completionHandler;
-- (void)getNodeStatus:(void (^)(NodeStatus*))completionHandler;
-- (void)joinNetwork:(NSString*)networkId allowManaged:(BOOL)allowManaged allowGlobal:(BOOL)allowGlobal allowDefault:(BOOL)allowDefault;
-- (void)leaveNetwork:(NSString*)networkId;
+- (void)getNetworklist:(void (^)(NSArray<Network*>*))completionHandler error:(NSError* __autoreleasing *)error;
+- (void)getNodeStatus:(void (^)(NodeStatus*))completionHandler error:(NSError*__autoreleasing*)error;
+- (void)joinNetwork:(NSString*)networkId allowManaged:(BOOL)allowManaged allowGlobal:(BOOL)allowGlobal allowDefault:(BOOL)allowDefault error:(NSError*__autoreleasing*)error;
+- (void)leaveNetwork:(NSString*)networkId error:(NSError*__autoreleasing*)error;
@end
diff --git a/ZeroTier One/ServiceCom.m b/ZeroTier One/ServiceCom.m
index 4e23d496..46468e25 100644
--- a/ZeroTier One/ServiceCom.m
+++ b/ZeroTier One/ServiceCom.m
@@ -39,7 +39,7 @@
return self;
}
-- (NSString*)key
+- (NSString*)key:(NSError* __autoreleasing *)err
{
static NSString *k = nil;
@@ -63,10 +63,20 @@
if (error) {
NSLog(@"Error: %@", error);
k = nil;
+ *err = error;
return @"";
}
}
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
withIntermediateDirectories:YES
attributes:nil
@@ -74,6 +84,7 @@
if (error) {
NSLog(@"Error: %@", error);
+ *err = error;
k = nil;
return @"";
}
@@ -83,6 +94,12 @@
if (status != errAuthorizationSuccess) {
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 @"";
}
@@ -104,6 +121,10 @@
if (status != errAuthorizationSuccess) {
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 @"";
}
@@ -120,21 +141,32 @@
if (error) {
NSLog(@"Error writing token to disk: %@", error);
+ *err = error;
}
}
}
}
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 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];
NSURLSessionDataTask *task =
@@ -171,31 +203,36 @@
[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];
NSURLSessionDataTask *task =
[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) {
- NSLog(@"Error: %@", error);
+ if(err) {
+ NSLog(@"Error: %@", err);
return;
}
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
NSInteger status = [httpResponse statusCode];
- NSError *err;
+ NSError *err2;
if(status == 200) {
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
options:0
- error:&err];
+ error:&err2];
- if(err) {
- NSLog(@"Error fetching node status: %@", err);
+ if(err2) {
+ NSLog(@"Error fetching node status: %@", err2);
return;
}
@@ -207,10 +244,17 @@
[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];
@@ -227,6 +271,7 @@
if(err) {
NSLog(@"Error creating json data: %@", err);
+ *error = err;
return;
}
@@ -236,9 +281,9 @@
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
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) {
- NSLog(@"Error posting join request: %@", error);
+ NSLog(@"Error posting join request: %@", err);
}
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
@@ -254,9 +299,17 @@
[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];
@@ -264,9 +317,9 @@
request.HTTPMethod = @"DELETE";
NSURLSessionDataTask *task =
- [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
- if(error) {
- NSLog(@"Error posting delete request: %@", error);
+ [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable err) {
+ if(err) {
+ NSLog(@"Error posting delete request: %@", err);
return;
}