diff options
| author | Grant Limberg <grant.limberg@red.com> | 2016-05-31 17:19:22 -0700 |
|---|---|---|
| committer | Grant Limberg <grant.limberg@red.com> | 2016-05-31 17:23:11 -0700 |
| commit | 975bcb8affa7fbd7ca534dac9ec8d642e6c977f7 (patch) | |
| tree | 75f5f57d31302fddf2bc20d54bb6713fe08f873e /ZeroTier One | |
| parent | 51e74f8d4f200a7e3be9a6ac4bef8486f83a5d5d (diff) | |
| download | infinitytier-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.h | 16 | ||||
| -rw-r--r-- | ZeroTier One/AuthtokenCopy.m | 87 | ||||
| -rw-r--r-- | ZeroTier One/ServiceCom.swift | 31 | ||||
| -rw-r--r-- | ZeroTier One/ZeroTier One-Bridging-Header.h | 5 |
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" |
