summaryrefslogtreecommitdiffstats
path: root/chrome/browser/mac
diff options
context:
space:
mode:
authorlambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-21 20:55:05 +0000
committerlambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-21 20:55:05 +0000
commitef12d1e6acb871dbd01f330d0b10ada24d209371 (patch)
tree1b8976cebc4c141acb3e314406d662a7931a731b /chrome/browser/mac
parenta160baecdd408a80a6861635a398011622f04718 (diff)
downloadchromium_src-ef12d1e6acb871dbd01f330d0b10ada24d209371.zip
chromium_src-ef12d1e6acb871dbd01f330d0b10ada24d209371.tar.gz
chromium_src-ef12d1e6acb871dbd01f330d0b10ada24d209371.tar.bz2
Move authorization_util files into base/mac.
No logical code changes in this CL. This moves some Mac utilities from chrome/browser/mac to base/mac, so they can be used by the Remoting Host plugin code in remoting/host/plugin BUG=None TEST=Compiles, unit_tests run Review URL: https://chromiumcodereview.appspot.com/9764013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128053 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/mac')
-rw-r--r--chrome/browser/mac/authorization_util.h67
-rw-r--r--chrome/browser/mac/authorization_util.mm185
-rw-r--r--chrome/browser/mac/install_from_dmg.mm12
-rw-r--r--chrome/browser/mac/keystone_glue.h6
-rw-r--r--chrome/browser/mac/keystone_glue.mm12
-rwxr-xr-xchrome/browser/mac/keystone_promote_postflight.sh4
-rwxr-xr-xchrome/browser/mac/keystone_promote_preflight.sh4
-rw-r--r--chrome/browser/mac/scoped_authorizationref.h80
8 files changed, 19 insertions, 351 deletions
diff --git a/chrome/browser/mac/authorization_util.h b/chrome/browser/mac/authorization_util.h
deleted file mode 100644
index c25f0cb..0000000
--- a/chrome/browser/mac/authorization_util.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef CHROME_BROWSER_MAC_AUTHORIZATION_UTIL_H_
-#define CHROME_BROWSER_MAC_AUTHORIZATION_UTIL_H_
-#pragma once
-
-// AuthorizationExecuteWithPrivileges fork()s and exec()s the tool, but it
-// does not wait() for it. It also doesn't provide the caller with access to
-// the forked pid. If used irresponsibly, zombie processes will accumulate.
-//
-// Apple's really gotten us between a rock and a hard place, here.
-//
-// Fortunately, AuthorizationExecuteWithPrivileges does give access to the
-// tool's stdout (and stdin) via a FILE* pipe. The tool can output its pid
-// to this pipe, and the main program can read it, and then have something
-// that it can wait() for.
-//
-// The contract is that any tool executed by the wrappers declared in this
-// file must print its pid to stdout on a line by itself before doing anything
-// else.
-//
-// http://developer.apple.com/library/mac/#samplecode/BetterAuthorizationSample/Listings/BetterAuthorizationSampleLib_c.html
-// (Look for "What's This About Zombies?")
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Authorization.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-namespace authorization_util {
-
-// Obtains an AuthorizationRef that can be used to run commands as root. If
-// necessary, prompts the user for authentication. If the user is prompted,
-// |prompt| will be used as the prompt string and an icon appropriate for the
-// application will be displayed in a prompt dialog. Note that the system
-// appends its own text to the prompt string. Returns NULL on failure.
-AuthorizationRef AuthorizationCreateToRunAsRoot(CFStringRef prompt);
-
-// Calls straight through to AuthorizationExecuteWithPrivileges. If that
-// call succeeds, |pid| will be set to the pid of the executed tool. If the
-// pid can't be determined, |pid| will be set to -1. |pid| must not be NULL.
-// |pipe| may be NULL, but the tool will always be executed with a pipe in
-// order to read the pid from its stdout.
-OSStatus ExecuteWithPrivilegesAndGetPID(AuthorizationRef authorization,
- const char* tool_path,
- AuthorizationFlags options,
- const char** arguments,
- FILE** pipe,
- pid_t* pid);
-
-// Calls ExecuteWithPrivilegesAndGetPID, and if that call succeeds, calls
-// waitpid() to wait for the process to exit. If waitpid() succeeds, the
-// exit status is placed in |exit_status|, otherwise, -1 is stored.
-// |exit_status| may be NULL and this function will still wait for the process
-// to exit.
-OSStatus ExecuteWithPrivilegesAndWait(AuthorizationRef authorization,
- const char* tool_path,
- AuthorizationFlags options,
- const char** arguments,
- FILE** pipe,
- int* exit_status);
-
-} // namespace authorization_util
-
-#endif // CHROME_BROWSER_MAC_AUTHORIZATION_UTIL_H_
diff --git a/chrome/browser/mac/authorization_util.mm b/chrome/browser/mac/authorization_util.mm
deleted file mode 100644
index 734ee7f..0000000
--- a/chrome/browser/mac/authorization_util.mm
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "chrome/browser/mac/authorization_util.h"
-
-#import <Foundation/Foundation.h>
-#include <sys/wait.h>
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/eintr_wrapper.h"
-#include "base/logging.h"
-#include "base/mac/bundle_locations.h"
-#include "base/mac/mac_logging.h"
-#import "base/mac/mac_util.h"
-#include "base/string_number_conversions.h"
-#include "base/string_util.h"
-#include "chrome/browser/mac/scoped_authorizationref.h"
-
-namespace authorization_util {
-
-AuthorizationRef AuthorizationCreateToRunAsRoot(CFStringRef prompt) {
- // Create an empty AuthorizationRef.
- ScopedAuthorizationRef authorization;
- OSStatus status = AuthorizationCreate(NULL,
- kAuthorizationEmptyEnvironment,
- kAuthorizationFlagDefaults,
- &authorization);
- if (status != errAuthorizationSuccess) {
- OSSTATUS_LOG(ERROR, status) << "AuthorizationCreate";
- return NULL;
- }
-
- // Specify the "system.privilege.admin" right, which allows
- // AuthorizationExecuteWithPrivileges to run commands as root.
- AuthorizationItem right_items[] = {
- {kAuthorizationRightExecute, 0, NULL, 0}
- };
- AuthorizationRights rights = {arraysize(right_items), right_items};
-
- // product_logo_32.png is used instead of app.icns because Authorization
- // Services can't deal with .icns files.
- NSString* icon_path =
- [base::mac::FrameworkBundle() pathForResource:@"product_logo_32"
- ofType:@"png"];
- const char* icon_path_c = [icon_path fileSystemRepresentation];
- size_t icon_path_length = icon_path_c ? strlen(icon_path_c) : 0;
-
- // The OS will append " Type an administrator's name and password to allow
- // <CFBundleDisplayName> to make changes."
- NSString* prompt_ns = base::mac::CFToNSCast(prompt);
- const char* prompt_c = [prompt_ns UTF8String];
- size_t prompt_length = prompt_c ? strlen(prompt_c) : 0;
-
- AuthorizationItem environment_items[] = {
- {kAuthorizationEnvironmentIcon, icon_path_length, (void*)icon_path_c, 0},
- {kAuthorizationEnvironmentPrompt, prompt_length, (void*)prompt_c, 0}
- };
-
- AuthorizationEnvironment environment = {arraysize(environment_items),
- environment_items};
-
- AuthorizationFlags flags = kAuthorizationFlagDefaults |
- kAuthorizationFlagInteractionAllowed |
- kAuthorizationFlagExtendRights |
- kAuthorizationFlagPreAuthorize;
-
- status = AuthorizationCopyRights(authorization,
- &rights,
- &environment,
- flags,
- NULL);
- if (status != errAuthorizationSuccess) {
- if (status != errAuthorizationCanceled) {
- OSSTATUS_LOG(ERROR, status) << "AuthorizationCopyRights";
- }
- return NULL;
- }
-
- return authorization.release();
-}
-
-OSStatus ExecuteWithPrivilegesAndGetPID(AuthorizationRef authorization,
- const char* tool_path,
- AuthorizationFlags options,
- const char** arguments,
- FILE** pipe,
- pid_t* pid) {
- // pipe may be NULL, but this function needs one. In that case, use a local
- // pipe.
- FILE* local_pipe;
- FILE** pipe_pointer;
- if (pipe) {
- pipe_pointer = pipe;
- } else {
- pipe_pointer = &local_pipe;
- }
-
- // AuthorizationExecuteWithPrivileges wants |char* const*| for |arguments|,
- // but it doesn't actually modify the arguments, and that type is kind of
- // silly and callers probably aren't dealing with that. Put the cast here
- // to make things a little easier on callers.
- OSStatus status = AuthorizationExecuteWithPrivileges(authorization,
- tool_path,
- options,
- (char* const*)arguments,
- pipe_pointer);
- if (status != errAuthorizationSuccess) {
- return status;
- }
-
- int line_pid = -1;
- size_t line_length = 0;
- char* line_c = fgetln(*pipe_pointer, &line_length);
- if (line_c) {
- if (line_length > 0 && line_c[line_length - 1] == '\n') {
- // line_c + line_length is the start of the next line if there is one.
- // Back up one character.
- --line_length;
- }
- std::string line(line_c, line_length);
- if (!base::StringToInt(line, &line_pid)) {
- // StringToInt may have set line_pid to something, but if the conversion
- // was imperfect, use -1.
- LOG(ERROR) << "ExecuteWithPrivilegesAndGetPid: funny line: " << line;
- line_pid = -1;
- }
- } else {
- LOG(ERROR) << "ExecuteWithPrivilegesAndGetPid: no line";
- }
-
- if (!pipe) {
- fclose(*pipe_pointer);
- }
-
- if (pid) {
- *pid = line_pid;
- }
-
- return status;
-}
-
-OSStatus ExecuteWithPrivilegesAndWait(AuthorizationRef authorization,
- const char* tool_path,
- AuthorizationFlags options,
- const char** arguments,
- FILE** pipe,
- int* exit_status) {
- pid_t pid;
- OSStatus status = ExecuteWithPrivilegesAndGetPID(authorization,
- tool_path,
- options,
- arguments,
- pipe,
- &pid);
- if (status != errAuthorizationSuccess) {
- return status;
- }
-
- // exit_status may be NULL, but this function needs it. In that case, use a
- // local version.
- int local_exit_status;
- int* exit_status_pointer;
- if (exit_status) {
- exit_status_pointer = exit_status;
- } else {
- exit_status_pointer = &local_exit_status;
- }
-
- if (pid != -1) {
- pid_t wait_result = HANDLE_EINTR(waitpid(pid, exit_status_pointer, 0));
- if (wait_result != pid) {
- PLOG(ERROR) << "waitpid";
- *exit_status_pointer = -1;
- }
- } else {
- *exit_status_pointer = -1;
- }
-
- return status;
-}
-
-} // namespace authorization_util
diff --git a/chrome/browser/mac/install_from_dmg.mm b/chrome/browser/mac/install_from_dmg.mm
index 1d11ecd..dc6bca4 100644
--- a/chrome/browser/mac/install_from_dmg.mm
+++ b/chrome/browser/mac/install_from_dmg.mm
@@ -21,16 +21,16 @@
#include "base/command_line.h"
#include "base/file_path.h"
#include "base/logging.h"
+#include "base/mac/authorization_util.h"
#include "base/mac/bundle_locations.h"
#include "base/mac/mac_logging.h"
#import "base/mac/mac_util.h"
+#include "base/mac/scoped_authorizationref.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/mac/scoped_nsautorelease_pool.h"
#include "base/string_util.h"
#include "base/sys_string_conversions.h"
-#include "chrome/browser/mac/authorization_util.h"
#include "chrome/browser/mac/dock.h"
-#include "chrome/browser/mac/scoped_authorizationref.h"
#include "chrome/browser/mac/scoped_ioobject.h"
#import "chrome/browser/mac/keystone_glue.h"
#include "chrome/browser/mac/relauncher.h"
@@ -279,7 +279,7 @@ AuthorizationRef MaybeShowAuthorizationDialog(NSString* application_directory) {
NSString* prompt = l10n_util::GetNSStringFWithFixup(
IDS_INSTALL_FROM_DMG_AUTHENTICATION_PROMPT,
l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
- return authorization_util::AuthorizationCreateToRunAsRoot(
+ return base::mac::AuthorizationCreateToRunAsRoot(
base::mac::NSToCFCast(prompt));
}
@@ -292,7 +292,7 @@ bool InstallFromDiskImage(AuthorizationRef authorization_arg,
NSString* installer_path,
NSString* source_path,
NSString* target_path) {
- ScopedAuthorizationRef authorization(authorization_arg);
+ base::mac::ScopedAuthorizationRef authorization(authorization_arg);
authorization_arg = NULL;
int exit_status;
if (authorization) {
@@ -301,7 +301,7 @@ bool InstallFromDiskImage(AuthorizationRef authorization_arg,
const char* target_path_c = [target_path fileSystemRepresentation];
const char* arguments[] = {source_path_c, target_path_c, NULL};
- OSStatus status = authorization_util::ExecuteWithPrivilegesAndWait(
+ OSStatus status = base::mac::ExecuteWithPrivilegesAndWait(
authorization,
installer_path_c,
kAuthorizationFlagDefaults,
@@ -448,7 +448,7 @@ bool MaybeInstallFromDiskImage() {
return false;
}
- ScopedAuthorizationRef authorization(
+ base::mac::ScopedAuthorizationRef authorization(
MaybeShowAuthorizationDialog(application_directory));
// authorization will be NULL if it's deemed unnecessary or if
// authentication fails. In either case, try to install without privilege
diff --git a/chrome/browser/mac/keystone_glue.h b/chrome/browser/mac/keystone_glue.h
index c57219b..755b408d 100644
--- a/chrome/browser/mac/keystone_glue.h
+++ b/chrome/browser/mac/keystone_glue.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -12,8 +12,8 @@
#import <Foundation/Foundation.h>
+#include "base/mac/scoped_authorizationref.h"
#import "base/memory/scoped_nsobject.h"
-#include "chrome/browser/mac/scoped_authorizationref.h"
// Possible outcomes of various operations. A version may accompany some of
// these, but beware: a version is never required. For statuses that can be
@@ -94,7 +94,7 @@ enum BrandFileType {
// The authorization object, when it needs to persist because it's being
// carried across threads.
- ScopedAuthorizationRef authorization_;
+ base::mac::ScopedAuthorizationRef authorization_;
// YES if a synchronous promotion operation is in progress (promotion during
// installation).
diff --git a/chrome/browser/mac/keystone_glue.mm b/chrome/browser/mac/keystone_glue.mm
index 35eaca9..8b00373 100644
--- a/chrome/browser/mac/keystone_glue.mm
+++ b/chrome/browser/mac/keystone_glue.mm
@@ -13,6 +13,7 @@
#include "base/file_util.h"
#include "base/location.h"
#include "base/logging.h"
+#include "base/mac/authorization_util.h"
#include "base/mac/bundle_locations.h"
#include "base/mac/mac_logging.h"
#include "base/mac/mac_util.h"
@@ -21,7 +22,6 @@
#include "base/memory/ref_counted.h"
#include "base/sys_string_conversions.h"
#include "base/threading/worker_pool.h"
-#include "chrome/browser/mac/authorization_util.h"
#import "chrome/browser/mac/keystone_registration.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_version_info.h"
@@ -778,8 +778,8 @@ NSString* const kVersionKey = @"KSVersion";
NSString* prompt = l10n_util::GetNSStringFWithFixup(
IDS_PROMOTE_AUTHENTICATION_PROMPT,
l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
- ScopedAuthorizationRef authorization(
- authorization_util::AuthorizationCreateToRunAsRoot(
+ base::mac::ScopedAuthorizationRef authorization(
+ base::mac::AuthorizationCreateToRunAsRoot(
base::mac::NSToCFCast(prompt)));
if (!authorization.get()) {
return;
@@ -790,7 +790,7 @@ NSString* const kVersionKey = @"KSVersion";
- (void)promoteTicketWithAuthorization:(AuthorizationRef)authorization_arg
synchronous:(BOOL)synchronous {
- ScopedAuthorizationRef authorization(authorization_arg);
+ base::mac::ScopedAuthorizationRef authorization(authorization_arg);
authorization_arg = NULL;
if ([self asyncOperationPending]) {
@@ -846,7 +846,7 @@ NSString* const kVersionKey = @"KSVersion";
const char* arguments[] = {userBrandFile, systemBrandFile, NULL};
int exit_status;
- OSStatus status = authorization_util::ExecuteWithPrivilegesAndWait(
+ OSStatus status = base::mac::ExecuteWithPrivilegesAndWait(
authorization,
preflightPathC,
kAuthorizationFlagDefaults,
@@ -934,7 +934,7 @@ NSString* const kVersionKey = @"KSVersion";
const char* arguments[] = {appPathC, NULL};
int exit_status;
- OSStatus status = authorization_util::ExecuteWithPrivilegesAndWait(
+ OSStatus status = base::mac::ExecuteWithPrivilegesAndWait(
authorization_,
toolPathC,
kAuthorizationFlagDefaults,
diff --git a/chrome/browser/mac/keystone_promote_postflight.sh b/chrome/browser/mac/keystone_promote_postflight.sh
index 6344cd3..9624004 100755
--- a/chrome/browser/mac/keystone_promote_postflight.sh
+++ b/chrome/browser/mac/keystone_promote_postflight.sh
@@ -1,6 +1,6 @@
#!/bin/bash -p
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Copyright (c) 2012 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.
@@ -25,7 +25,7 @@ set -e
export PATH="/usr/bin:/usr/sbin:/bin:/sbin"
# Output the pid to stdout before doing anything else. See
-# chrome/browser/mac/authorization_util.h.
+# base/mac/authorization_util.h.
echo "${$}"
if [ ${#} -ne 1 ] ; then
diff --git a/chrome/browser/mac/keystone_promote_preflight.sh b/chrome/browser/mac/keystone_promote_preflight.sh
index e054ff0..6582e08 100755
--- a/chrome/browser/mac/keystone_promote_preflight.sh
+++ b/chrome/browser/mac/keystone_promote_preflight.sh
@@ -1,6 +1,6 @@
#!/bin/bash -p
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Copyright (c) 2012 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.
@@ -26,7 +26,7 @@ set -e
export PATH="/usr/bin:/usr/sbin:/bin:/sbin"
# Output the pid to stdout before doing anything else. See
-# chrome/browser/mac/authorization_util.h.
+# base/mac/authorization_util.h.
echo "${$}"
if [ ${#} -ne 0 ] && [ ${#} -ne 2 ] ; then
diff --git a/chrome/browser/mac/scoped_authorizationref.h b/chrome/browser/mac/scoped_authorizationref.h
deleted file mode 100644
index fbe0b9d..0000000
--- a/chrome/browser/mac/scoped_authorizationref.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef CHROME_BROWSER_MAC_SCOPED_AUTHORIZATIONREF_H_
-#define CHROME_BROWSER_MAC_SCOPED_AUTHORIZATIONREF_H_
-#pragma once
-
-#include <Security/Authorization.h>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-
-// ScopedAuthorizationRef maintains ownership of an AuthorizationRef. It is
-// patterned after the scoped_ptr interface.
-
-class ScopedAuthorizationRef {
- public:
- explicit ScopedAuthorizationRef(AuthorizationRef authorization = NULL)
- : authorization_(authorization) {
- }
-
- ~ScopedAuthorizationRef() {
- if (authorization_) {
- AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
- }
- }
-
- void reset(AuthorizationRef authorization = NULL) {
- if (authorization_ != authorization) {
- if (authorization_) {
- AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
- }
- authorization_ = authorization;
- }
- }
-
- bool operator==(AuthorizationRef that) const {
- return authorization_ == that;
- }
-
- bool operator!=(AuthorizationRef that) const {
- return authorization_ != that;
- }
-
- operator AuthorizationRef() const {
- return authorization_;
- }
-
- AuthorizationRef* operator&() {
- return &authorization_;
- }
-
- AuthorizationRef get() const {
- return authorization_;
- }
-
- void swap(ScopedAuthorizationRef& that) {
- AuthorizationRef temp = that.authorization_;
- that.authorization_ = authorization_;
- authorization_ = temp;
- }
-
- // ScopedAuthorizationRef::release() is like scoped_ptr<>::release. It is
- // NOT a wrapper for AuthorizationFree(). To force a
- // ScopedAuthorizationRef object to call AuthorizationFree(), use
- // ScopedAuthorizationRef::reset().
- AuthorizationRef release() WARN_UNUSED_RESULT {
- AuthorizationRef temp = authorization_;
- authorization_ = NULL;
- return temp;
- }
-
- private:
- AuthorizationRef authorization_;
-
- DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef);
-};
-
-#endif // CHROME_BROWSER_MAC_SCOPED_AUTHORIZATIONREF_H_