| Index: chrome/browser/policy/policy_path_parser_mac.mm
|
| diff --git a/chrome/browser/policy/policy_path_parser_mac.mm b/chrome/browser/policy/policy_path_parser_mac.mm
|
| index b734faa3b554cdb5bb98d5d751997a5a2f3b519b..f723a89682cf2770f45cea4182a20e8a2f87c430 100644
|
| --- a/chrome/browser/policy/policy_path_parser_mac.mm
|
| +++ b/chrome/browser/policy/policy_path_parser_mac.mm
|
| @@ -4,7 +4,7 @@
|
|
|
| #include "chrome/browser/policy/policy_path_parser.h"
|
|
|
| -#include "base/basictypes.h"
|
| +#include "base/bind.h"
|
| #include "base/files/file_path.h"
|
| #include "base/logging.h"
|
| #import "base/mac/scoped_nsautorelease_pool.h"
|
| @@ -21,79 +21,69 @@ namespace policy {
|
|
|
| namespace path_parser {
|
|
|
| -const char* kUserNamePolicyVarName = "${user_name}";
|
| -const char* kMachineNamePolicyVarName = "${machine_name}";
|
| -const char* kMacUsersDirectory = "${users}";
|
| -const char* kMacDocumentsFolderVarName = "${documents}";
|
| +namespace internal {
|
|
|
| -struct MacFolderNamesToSPDMaping {
|
| - const char* name;
|
| - NSSearchPathDirectory id;
|
| -};
|
| -
|
| -// Mapping from variable names to MacOS NSSearchPathDirectory ids.
|
| -const MacFolderNamesToSPDMaping mac_folder_mapping[] = {
|
| - { kMacUsersDirectory, NSUserDirectory},
|
| - { kMacDocumentsFolderVarName, NSDocumentDirectory}
|
| -};
|
| -
|
| -// Replaces all variable occurrences in the policy string with the respective
|
| -// system settings values.
|
| -base::FilePath::StringType ExpandPathVariables(
|
| - const base::FilePath::StringType& untranslated_string) {
|
| - base::FilePath::StringType result(untranslated_string);
|
| - if (result.length() == 0)
|
| - return result;
|
| - // Sanitize quotes in case of any around the whole string.
|
| - if (result.length() > 1 &&
|
| - ((result[0] == '"' && result[result.length() - 1] == '"') ||
|
| - (result[0] == '\'' && result[result.length() - 1] == '\''))) {
|
| - // Strip first and last char which should be matching quotes now.
|
| - result = result.substr(1, result.length() - 2);
|
| - }
|
| - // First translate all path variables we recognize.
|
| - for (size_t i = 0; i < arraysize(mac_folder_mapping); ++i) {
|
| - size_t position = result.find(mac_folder_mapping[i].name);
|
| - if (position != std::string::npos) {
|
| - NSArray* searchpaths = NSSearchPathForDirectoriesInDomains(
|
| - mac_folder_mapping[i].id, NSAllDomainsMask, true);
|
| - if ([searchpaths count] > 0) {
|
| - NSString *variable_value = [searchpaths objectAtIndex:0];
|
| - result.replace(position, strlen(mac_folder_mapping[i].name),
|
| - base::SysNSStringToUTF8(variable_value));
|
| - }
|
| - }
|
| +bool GetFolder(NSSearchPathDirectory id, base::FilePath::StringType* value) {
|
| + NSArray* searchpaths =
|
| + NSSearchPathForDirectoriesInDomains(id, NSAllDomainsMask, true);
|
| + if ([searchpaths count] > 0) {
|
| + NSString* variable_value = [searchpaths objectAtIndex:0];
|
| + *value = base::SysNSStringToUTF8(variable_value);
|
| + return true;
|
| }
|
| - // Next translate two special variables ${user_name} and ${machine_name}
|
| - size_t position = result.find(kUserNamePolicyVarName);
|
| - if (position != std::string::npos) {
|
| - NSString* username = NSUserName();
|
| - if (username) {
|
| - result.replace(position, strlen(kUserNamePolicyVarName),
|
| - base::SysNSStringToUTF8(username));
|
| - } else {
|
| - LOG(ERROR) << "Username variable can not be resolved.";
|
| - }
|
| + return false;
|
| +}
|
| +
|
| +#define WRAP_GET_FORLDER_FUNCTION(FunctionName, MacId) \
|
| + bool FunctionName(base::FilePath::StringType* value) { \
|
| + return GetFolder(MacId, value); \
|
| }
|
| - position = result.find(kMachineNamePolicyVarName);
|
| - if (position != std::string::npos) {
|
| - SCDynamicStoreContext context = { 0, NULL, NULL, NULL };
|
| - SCDynamicStoreRef store = SCDynamicStoreCreate(kCFAllocatorDefault,
|
| - CFSTR("policy_subsystem"),
|
| - NULL, &context);
|
| - CFStringRef machinename = SCDynamicStoreCopyLocalHostName(store);
|
| - if (machinename) {
|
| - result.replace(position, strlen(kMachineNamePolicyVarName),
|
| - base::SysCFStringRefToUTF8(machinename));
|
| - CFRelease(machinename);
|
| - } else {
|
| - LOG(ERROR) << "Machine name variable can not be resolved.";
|
| - }
|
| - CFRelease(store);
|
| +
|
| +WRAP_GET_FORLDER_FUNCTION(GetMacUserFolderPath, NSUserDirectory)
|
| +WRAP_GET_FORLDER_FUNCTION(GetMacDocumentsFolderPath, NSDocumentDirectory)
|
| +
|
| +bool GetUserName(base::FilePath::StringType* value) {
|
| + NSString* username = NSUserName();
|
| + if (username)
|
| + *value = base::SysNSStringToUTF8(username);
|
| + else
|
| + LOG(ERROR) << "Username variable can not be resolved.";
|
| + return (username != NULL);
|
| +}
|
| +
|
| +bool GetMachineName(base::FilePath::StringType* value) {
|
| + SCDynamicStoreContext context = {0, NULL, NULL, NULL};
|
| + SCDynamicStoreRef store = SCDynamicStoreCreate(
|
| + kCFAllocatorDefault, CFSTR("policy_subsystem"), NULL, &context);
|
| + CFStringRef machinename = SCDynamicStoreCopyLocalHostName(store);
|
| + if (machinename) {
|
| + *value = base::SysCFStringRefToUTF8(machinename);
|
| + CFRelease(machinename);
|
| + } else {
|
| + LOG(ERROR) << "Machine name variable can not be resolved.";
|
| }
|
| - return result;
|
| + CFRelease(store);
|
| + return (machinename != NULL);
|
| }
|
|
|
| +const char* kUserNamePolicyVarName = "${user_name}";
|
| +const char* kMachineNamePolicyVarName = "${machine_name}";
|
| +const char* kMacUsersDirectory = "${users}";
|
| +const char* kMacDocumentsFolderVarName = "${documents}";
|
| +
|
| +// A table mapping variable names to their respective get value function
|
| +// pointers.
|
| +const VariableNameAndValueCallback kVariableNameAndValueCallbacks[] = {
|
| + {kUserNamePolicyVarName, &GetUserName},
|
| + {kMachineNamePolicyVarName, &GetMachineName},
|
| + {kMacUsersDirectory, &GetMacUserFolderPath},
|
| + {kMacDocumentsFolderVarName, &GetMacDocumentsFolderPath}};
|
| +
|
| +// Total number of entries in the mapping table.
|
| +const int kNoOfVariables = arraysize(kVariableNameAndValueCallbacks);
|
| +
|
| +} // namespace internal
|
| +
|
| void CheckUserDataDirPolicy(base::FilePath* user_data_dir) {
|
| base::mac::ScopedNSAutoreleasePool pool;
|
|
|
|
|