Home | History | Annotate | Download | only in policy
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/policy/policy_path_parser.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/sys_string_conversions.h"
      9 
     10 #import <Cocoa/Cocoa.h>
     11 
     12 #include <string>
     13 
     14 namespace policy {
     15 
     16 namespace path_parser {
     17 
     18 const char* kUserNamePolicyVarName = "${user_name}";
     19 const char* kMachineNamePolicyVarName = "${machine_name}";
     20 const char* kMacUsersDirectory = "${users}";
     21 const char* kMacDocumentsFolderVarName = "${documents}";
     22 
     23 struct MacFolderNamesToSPDMaping {
     24   const char* name;
     25   NSSearchPathDirectory id;
     26 };
     27 
     28 // Mapping from variable names to MacOS NSSearchPathDirectory ids.
     29 const MacFolderNamesToSPDMaping mac_folder_mapping[] = {
     30     { kMacUsersDirectory, NSUserDirectory},
     31     { kMacDocumentsFolderVarName, NSDocumentDirectory}
     32 };
     33 
     34 // Replaces all variable occurrences in the policy string with the respective
     35 // system settings values.
     36 FilePath::StringType ExpandPathVariables(
     37     const FilePath::StringType& untranslated_string) {
     38   FilePath::StringType result(untranslated_string);
     39   // First translate all path variables we recognize.
     40   for (size_t i = 0; i < arraysize(mac_folder_mapping); ++i) {
     41     size_t position = result.find(mac_folder_mapping[i].name);
     42     if (position != std::string::npos) {
     43       NSArray* searchpaths = NSSearchPathForDirectoriesInDomains(
     44           mac_folder_mapping[i].id, NSAllDomainsMask, true);
     45       if ([searchpaths count] > 0) {
     46         NSString *variable_value = [searchpaths objectAtIndex:0];
     47         result.replace(position, strlen(mac_folder_mapping[i].name),
     48                        base::SysNSStringToUTF8(variable_value));
     49       }
     50     }
     51   }
     52   // Next translate two special variables ${user_name} and ${machine_name}
     53   size_t position = result.find(kUserNamePolicyVarName);
     54   if (position != std::string::npos) {
     55     NSString* username = NSUserName();
     56     if (username) {
     57       result.replace(position, strlen(kUserNamePolicyVarName),
     58                      base::SysNSStringToUTF8(username));
     59     } else {
     60       LOG(ERROR) << "Username variable can not be resolved.";
     61     }
     62   }
     63   position = result.find(kMachineNamePolicyVarName);
     64   if (position != std::string::npos) {
     65     NSString* machinename = [[NSHost currentHost] name];
     66     if (machinename) {
     67       result.replace(position, strlen(kMachineNamePolicyVarName),
     68                      base::SysNSStringToUTF8(machinename));
     69     } else {
     70       LOG(ERROR) << "Machine name variable can not be resolved.";
     71     }
     72   }
     73   return result;
     74 }
     75 
     76 }  // namespace path_parser
     77 
     78 }  // namespace policy
     79