summaryrefslogtreecommitdiff
path: root/ZeroTier One
diff options
context:
space:
mode:
authorGrant Limberg <grant.limberg@red.com>2016-05-31 17:19:22 -0700
committerGrant Limberg <grant.limberg@red.com>2016-05-31 17:23:11 -0700
commit975bcb8affa7fbd7ca534dac9ec8d642e6c977f7 (patch)
tree75f5f57d31302fddf2bc20d54bb6713fe08f873e /ZeroTier One
parent51e74f8d4f200a7e3be9a6ac4bef8486f83a5d5d (diff)
downloadinfinitytier-975bcb8affa7fbd7ca534dac9ec8d642e6c977f7.tar.gz
infinitytier-975bcb8affa7fbd7ca534dac9ec8d642e6c977f7.zip
some OS X Authentication Services wizardry to get /Library/Application Support/ZeroTier/One/authtoken.secret and copy it to ~/Library/Application Support/ZeroTier/One/authtoken.secret
Diffstat (limited to 'ZeroTier One')
-rw-r--r--ZeroTier One/AuthtokenCopy.h16
-rw-r--r--ZeroTier One/AuthtokenCopy.m87
-rw-r--r--ZeroTier One/ServiceCom.swift31
-rw-r--r--ZeroTier One/ZeroTier One-Bridging-Header.h5
4 files changed, 138 insertions, 1 deletions
diff --git a/ZeroTier One/AuthtokenCopy.h b/ZeroTier One/AuthtokenCopy.h
new file mode 100644
index 00000000..43c927e2
--- /dev/null
+++ b/ZeroTier One/AuthtokenCopy.h
@@ -0,0 +1,16 @@
+//
+// AuthtokenCopy.h
+// ZeroTier One
+//
+// Created by Grant Limberg on 5/31/16.
+// Copyright © 2016 ZeroTier, Inc. All rights reserved.
+//
+
+#ifndef AuthtokenCopy_h
+#define AuthtokenCopy_h
+
+#import <Foundation/Foundation.h>
+
+NSString* getAdminAuthToken(AuthorizationRef authRef);
+
+#endif /* AuthtokenCopy_h */
diff --git a/ZeroTier One/AuthtokenCopy.m b/ZeroTier One/AuthtokenCopy.m
new file mode 100644
index 00000000..893d90cf
--- /dev/null
+++ b/ZeroTier One/AuthtokenCopy.m
@@ -0,0 +1,87 @@
+//
+// AuthtokenCopy.m
+// ZeroTier One
+//
+// Created by Grant Limberg on 5/31/16.
+// Copyright © 2016 ZeroTier, Inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "AuthtokenCopy.h"
+
+
+NSString* getAdminAuthToken(AuthorizationRef authRef) {
+ char *tool = "/bin/cat";
+ char *args[] = { "/Library/Application Support/ZeroTier/One/authtoken.secret", NULL};
+ FILE *pipe = nil;
+ char token[25];
+ memset(token, 0, sizeof(char)*25);
+
+
+ OSStatus status = AuthorizationExecuteWithPrivileges(authRef, tool, kAuthorizationFlagDefaults, args, &pipe);
+
+ if (status != errAuthorizationSuccess) {
+ NSLog(@"Reading authtoken failed!");
+
+
+ switch(status) {
+ case errAuthorizationDenied:
+ NSLog(@"Autorization Denied");
+ break;
+ case errAuthorizationCanceled:
+ NSLog(@"Authorization Canceled");
+ break;
+ case errAuthorizationInternal:
+ NSLog(@"Authorization Internal");
+ break;
+ case errAuthorizationBadAddress:
+ NSLog(@"Bad Address");
+ break;
+ case errAuthorizationInvalidRef:
+ NSLog(@"Invalid Ref");
+ break;
+ case errAuthorizationInvalidSet:
+ NSLog(@"Invalid Set");
+ break;
+ case errAuthorizationInvalidTag:
+ NSLog(@"Invalid Tag");
+ break;
+ case errAuthorizationInvalidFlags:
+ NSLog(@"Invalid Flags");
+ break;
+ case errAuthorizationInvalidPointer:
+ NSLog(@"Invalid Pointer");
+ break;
+ case errAuthorizationToolExecuteFailure:
+ NSLog(@"Tool Execute Failure");
+ break;
+ case errAuthorizationToolEnvironmentError:
+ NSLog(@"Tool Environment Failure");
+ break;
+ case errAuthorizationExternalizeNotAllowed:
+ NSLog(@"Externalize Not Allowed");
+ break;
+ case errAuthorizationInteractionNotAllowed:
+ NSLog(@"Interaction Not Allowed");
+ break;
+ case errAuthorizationInternalizeNotAllowed:
+ NSLog(@"Internalize Not Allowed");
+ break;
+ default:
+ NSLog(@"Unknown Error");
+ break;
+ }
+
+ return @"";
+ }
+
+ if(pipe != nil) {
+ fread(&token, sizeof(char), 24, pipe);
+ fclose(pipe);
+
+ return [NSString stringWithUTF8String:token];
+ }
+
+ return @"";
+} \ No newline at end of file
diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift
index 3aa9dc54..e2526610 100644
--- a/ZeroTier One/ServiceCom.swift
+++ b/ZeroTier One/ServiceCom.swift
@@ -30,7 +30,36 @@ class ServiceCom: NSObject {
Holder.key = try String(contentsOfURL: authtokenURL)
}
else {
- // TODO: Elevate priviledge to copy /Library/Application Support/ZeroTier/One/authtoken.secret to the user's local AppSupport directory
+ try NSFileManager.defaultManager().createDirectoryAtURL(appSupportDir, withIntermediateDirectories: true, attributes: nil)
+
+ var authRef: AuthorizationRef = nil
+ var status = AuthorizationCreate(nil, nil, .Defaults, &authRef)
+
+ if status != errAuthorizationSuccess {
+ NSLog("Authorization Failed! \(status)")
+ return ""
+ }
+
+ var authItem = AuthorizationItem(name: kAuthorizationRightExecute, valueLength: 0, value: nil, flags: 0)
+ var authRights = AuthorizationRights(count: 1, items: &authItem)
+ let authFlags: AuthorizationFlags = [.Defaults, .InteractionAllowed, .PreAuthorize, .ExtendRights]
+
+ status = AuthorizationCopyRights(authRef, &authRights, nil, authFlags, nil)
+
+ if status != errAuthorizationSuccess {
+ NSLog("Authorization Failed! \(status)")
+ return ""
+ }
+
+ let localKey = getAdminAuthToken(authRef)
+ AuthorizationFree(authRef, .DestroyRights)
+
+ if localKey != nil && localKey.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 0 {
+ NSLog("\(localKey)")
+ Holder.key = localKey
+
+ try localKey.writeToURL(authtokenURL, atomically: true, encoding: NSUTF8StringEncoding)
+ }
}
}
catch {
diff --git a/ZeroTier One/ZeroTier One-Bridging-Header.h b/ZeroTier One/ZeroTier One-Bridging-Header.h
new file mode 100644
index 00000000..68795a0e
--- /dev/null
+++ b/ZeroTier One/ZeroTier One-Bridging-Header.h
@@ -0,0 +1,5 @@
+//
+// Use this file to import your target's public headers that you would like to expose to Swift.
+//
+
+#import "AuthtokenCopy.h"