| OLD | NEW | 
|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/common/sandbox_mac.h" | 5 #include "chrome/common/sandbox_mac.h" | 
| 6 | 6 | 
| 7 #include "base/debug_util.h" | 7 #include "base/debug_util.h" | 
| 8 | 8 | 
| 9 #import <Cocoa/Cocoa.h> | 9 #import <Cocoa/Cocoa.h> | 
| 10 extern "C" { | 10 extern "C" { | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 77     NSData* data = [NSData dataWithBytes:png_header | 77     NSData* data = [NSData dataWithBytes:png_header | 
| 78                                   length:arraysize(png_header)]; | 78                                   length:arraysize(png_header)]; | 
| 79     scoped_cftyperef<CGImageSourceRef> img( | 79     scoped_cftyperef<CGImageSourceRef> img( | 
| 80         CGImageSourceCreateWithData((CFDataRef)data, | 80         CGImageSourceCreateWithData((CFDataRef)data, | 
| 81         NULL)); | 81         NULL)); | 
| 82     CGImageSourceGetStatus(img); | 82     CGImageSourceGetStatus(img); | 
| 83   } | 83   } | 
| 84 } | 84 } | 
| 85 | 85 | 
| 86 // Turns on the OS X sandbox for this process. | 86 // Turns on the OS X sandbox for this process. | 
| 87 bool EnableSandbox() { | 87 bool EnableSandbox(SandboxProcessType sandbox_type, | 
| 88   // For the renderer, we give it a custom sandbox to lock things down as | 88                    const FilePath& allowed_dir) { | 
| 89   // tightly as possible, while still enabling drawing. | 89   // Sanity - currently only SANDBOX_TYPE_UTILITY supports a directory being | 
|  | 90   // passed in. | 
|  | 91   if (sandbox_type != SANDBOX_TYPE_UTILITY) { | 
|  | 92     DCHECK(allowed_dir.empty()) | 
|  | 93         << "Only SANDBOX_TYPE_UTILITY allows a custom directory parameter."; | 
|  | 94   } else { | 
|  | 95     DCHECK(!allowed_dir.empty()) | 
|  | 96         << "SANDBOX_TYPE_UTILITY " | 
|  | 97         << "needs a custom directory parameter, but an empty one was provided."; | 
|  | 98   } | 
|  | 99 | 
|  | 100   // We use a custom sandbox definition file to lock things down as | 
|  | 101   // tightly as possible. | 
|  | 102   // TODO(jeremy): Look at using include syntax to unify common parts of sandbox | 
|  | 103   // definition files. | 
|  | 104   NSString* sandbox_config_filename = nil; | 
|  | 105   switch (sandbox_type) { | 
|  | 106     case SANDBOX_TYPE_RENDERER: | 
|  | 107       sandbox_config_filename = @"renderer"; | 
|  | 108       break; | 
|  | 109     case SANDBOX_TYPE_WORKER: | 
|  | 110       sandbox_config_filename = @"worker"; | 
|  | 111       break; | 
|  | 112     case SANDBOX_TYPE_UTILITY: | 
|  | 113       sandbox_config_filename = @"utility"; | 
|  | 114       break; | 
|  | 115     default: | 
|  | 116       NOTREACHED(); | 
|  | 117       return false; | 
|  | 118   } | 
|  | 119 | 
| 90   NSString* sandbox_profile_path = | 120   NSString* sandbox_profile_path = | 
| 91       [mac_util::MainAppBundle() pathForResource:@"renderer" ofType:@"sb"]; | 121       [mac_util::MainAppBundle() pathForResource:sandbox_config_filename | 
|  | 122                                           ofType:@"sb"]; | 
| 92   NSString* sandbox_data = [NSString | 123   NSString* sandbox_data = [NSString | 
| 93       stringWithContentsOfFile:sandbox_profile_path | 124       stringWithContentsOfFile:sandbox_profile_path | 
| 94       encoding:NSUTF8StringEncoding | 125       encoding:NSUTF8StringEncoding | 
| 95       error:nil]; | 126       error:nil]; | 
| 96 | 127 | 
| 97   if (!sandbox_data) { | 128   if (!sandbox_data) { | 
| 98     LOG(ERROR) << "Failed to find the sandbox profile on disk"; | 129     LOG(ERROR) << "Failed to find the sandbox profile on disk"; | 
| 99     return false; | 130     return false; | 
| 100   } | 131   } | 
| 101 | 132 | 
| 102   // Enable verbose logging if enabled on the command line. | 133   // Enable verbose logging if enabled on the command line. | 
| 103   // (see renderer.sb for details). | 134   // (see renderer.sb for details). | 
| 104   const CommandLine *command_line = CommandLine::ForCurrentProcess(); | 135   const CommandLine *command_line = CommandLine::ForCurrentProcess(); | 
| 105   if (command_line->HasSwitch(switches::kEnableSandboxLogging)) { | 136   if (command_line->HasSwitch(switches::kEnableSandboxLogging)) { | 
| 106     sandbox_data = [sandbox_data | 137     sandbox_data = [sandbox_data | 
| 107         stringByReplacingOccurrencesOfString:@";ENABLE_LOGGING" | 138         stringByReplacingOccurrencesOfString:@";ENABLE_LOGGING" | 
| 108                                   withString:@""]; | 139                                   withString:@""]; | 
| 109   } | 140   } | 
| 110 | 141 | 
|  | 142   if (!allowed_dir.empty()) { | 
|  | 143     NSString* allowed_dir_ns = base::SysUTF8ToNSString(allowed_dir.value()); | 
|  | 144     sandbox_data = [sandbox_data | 
|  | 145         stringByReplacingOccurrencesOfString:@"DIR_TO_ALLOW_ACCESS" | 
|  | 146                                   withString:allowed_dir_ns]; | 
|  | 147   } | 
|  | 148 | 
| 111   int32 major_version, minor_version, bugfix_version; | 149   int32 major_version, minor_version, bugfix_version; | 
| 112   base::SysInfo::OperatingSystemVersionNumbers(&major_version, | 150   base::SysInfo::OperatingSystemVersionNumbers(&major_version, | 
| 113       &minor_version, &bugfix_version); | 151       &minor_version, &bugfix_version); | 
| 114 | 152 | 
| 115   if (major_version > 10 || (major_version == 10 && minor_version >= 6)) { | 153   if (major_version > 10 || (major_version == 10 && minor_version >= 6)) { | 
| 116     // 10.6-only Sandbox rules. | 154     // 10.6-only Sandbox rules. | 
| 117     sandbox_data = [sandbox_data | 155     sandbox_data = [sandbox_data | 
| 118         stringByReplacingOccurrencesOfString:@";10.6_ONLY" | 156         stringByReplacingOccurrencesOfString:@";10.6_ONLY" | 
| 119                                   withString:@""]; | 157                                   withString:@""]; | 
| 120     // Splice the path of the user's home directory into the sandbox profile | 158     // Splice the path of the user's home directory into the sandbox profile | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 136   int error = sandbox_init([sandbox_data UTF8String], 0, &error_buff); | 174   int error = sandbox_init([sandbox_data UTF8String], 0, &error_buff); | 
| 137   bool success = (error == 0 && error_buff == NULL); | 175   bool success = (error == 0 && error_buff == NULL); | 
| 138   if (error == -1) { | 176   if (error == -1) { | 
| 139     LOG(ERROR) << "Failed to Initialize Sandbox: " << error_buff; | 177     LOG(ERROR) << "Failed to Initialize Sandbox: " << error_buff; | 
| 140   } | 178   } | 
| 141   sandbox_free_error(error_buff); | 179   sandbox_free_error(error_buff); | 
| 142   return success; | 180   return success; | 
| 143 } | 181 } | 
| 144 | 182 | 
| 145 }  // namespace sandbox | 183 }  // namespace sandbox | 
| OLD | NEW | 
|---|