Index: chrome/installer/mac/app/AuthorizedInstall.m |
diff --git a/chrome/installer/mac/app/AuthorizedInstall.m b/chrome/installer/mac/app/AuthorizedInstall.m |
new file mode 100644 |
index 0000000000000000000000000000000000000000..550f718daf308d51e9cb542aee9277b34703097f |
--- /dev/null |
+++ b/chrome/installer/mac/app/AuthorizedInstall.m |
@@ -0,0 +1,85 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "AuthorizedInstall.h" |
+ |
+@implementation AuthorizedInstall |
+ |
+// Does the setup needed to authorize a tool to run as admin. |
+- (BOOL)setUpAuthorization { |
+ status_ = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, |
+ kAuthorizationFlagDefaults, &authRef_); |
+ |
+ AuthorizationItem items = {kAuthorizationRightExecute, 0, NULL, 0}; |
+ AuthorizationRights rights = {1, &items}; |
+ AuthorizationFlags flags = |
+ kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | |
+ kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; |
+ |
+ status_ = AuthorizationCopyRights(authRef_, &rights, NULL, flags, NULL); |
+ return (status_ == errAuthorizationSuccess); |
+} |
+ |
+// Starts up the proccess with privileged permissios. |
+- (void)startAuthorizedTool:(const char*)toolPath |
+ withArguments:(const char**)args { |
+ if (status_ != errAuthorizationSuccess) |
+ return; |
+ |
+#pragma clang diagnostic push |
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" |
Anna Zeng
2016/08/18 15:57:16
Mark (mark@chromium.org): Have we tried NSAppleScr
|
+ status_ = AuthorizationExecuteWithPrivileges( |
+ authRef_, toolPath, kAuthorizationFlagDefaults, (char* const*)args, |
+ &communicationPipe_); |
+#pragma clang diagnostic pop |
+} |
+ |
+// Finds the tool to be authorized, Finds the paths needed for the tool to do |
+// its job, and starts the process. |
+// TODO: Move attemptAuthorizedInstall body into Unpacker method which will |
Anna Zeng
2016/08/18 15:57:16
As discussed, we're actually going to have Authori
ivanhernandez
2016/08/22 15:34:49
Done.
|
+// provide alternative in the case where authorization failed. |
+- (BOOL)authorizeInstallationTool { |
+ NSString* toolPath = |
+ [[NSBundle mainBundle] pathForResource:@"copy_to_disk" ofType:@"sh"]; |
+ NSFileManager* manager = [NSFileManager defaultManager]; |
+ if (![manager fileExistsAtPath:toolPath]) { |
+ return false; |
+ } |
+ |
+ NSString* appBundleName = @"Google Chrome.app"; |
+ |
+ NSArray* applicationDirectories = NSSearchPathForDirectoriesInDomains( |
+ NSApplicationDirectory, NSLocalDomainMask, YES); |
+ NSString* applicationDirectory = applicationDirectories.firstObject; |
+ |
+ // TODO: Change sourceAppBundlePath to the temporary folder that chrome will |
+ // be downloaded and extracted to. |
+ NSArray* downloadDirectories = NSSearchPathForDirectoriesInDomains( |
+ NSDownloadsDirectory, NSUserDomainMask, YES); |
+ NSString* sourceAppBundlePath = [NSString |
Anna Zeng
2016/08/18 15:57:16
We can make this a parameter.
ivanhernandez
2016/08/22 15:34:49
We could but we would need to make some changes to
|
+ pathWithComponents:@[ downloadDirectories.firstObject, appBundleName ]]; |
+ NSString* destinationAppBundlePath = |
Anna Zeng
2016/08/18 15:57:16
If root, this can just be @"/Applications/Google C
ivanhernandez
2016/08/22 15:34:49
I don't know actually. Its true the path will alwa
|
+ [NSString pathWithComponents:@[ applicationDirectory, appBundleName ]]; |
+ |
+ const char* sourcePath = [sourceAppBundlePath UTF8String]; |
+ const char* destinationPath = [applicationDirectory UTF8String]; |
+ const char* fullDestinationPath = [destinationAppBundlePath UTF8String]; |
+ const char* args[] = {sourcePath, destinationPath, fullDestinationPath, NULL}; |
+ |
+ if ([self setUpAuthorization]) { |
+ [self startAuthorizedTool:[toolPath UTF8String] withArguments:args]; |
+ AuthorizationFree(authRef_, kAuthorizationFlagDestroyRights); |
+ } |
+ return (status_ == errAuthorizationSuccess); |
+} |
+ |
+// Sends a message to the auhtorized tool's stdin. |
+- (void)sendMessageToTool:(NSString*)message { |
+ if (communicationPipe_ != NULL) { |
+ const char* readyState = message.UTF8String; |
+ write(fileno(communicationPipe_), readyState, sizeof(readyState)); |
+ } |
+} |
+ |
+@end |