Browse Source

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

Still need to wire up error messages to the user.
Grant Limberg 9 years ago
parent
commit
c2a01f6db4

+ 13 - 2
ZeroTier One/AppDelegate.m

@@ -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
     }
     }
 }
 }
 
 

+ 8 - 1
ZeroTier One/JoinNetworkViewController.m

@@ -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 = @"";
 
 

+ 13 - 2
ZeroTier One/NetworkInfoCell.m

@@ -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

+ 17 - 3
ZeroTier One/NetworkMonitor.m

@@ -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

+ 4 - 4
ZeroTier One/ServiceCom.h

@@ -20,9 +20,9 @@
 
 
 - (id)init;
 - (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
 @end

+ 74 - 21
ZeroTier One/ServiceCom.m

@@ -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) {
-                   NSLog(@"Error: %@", error);
+               if(err) {
+                   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) {
-                       NSLog(@"Error fetching node status: %@", err);
+                   if(err2) {
+                       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) {
-        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;
             return;
         }
         }