15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pwd.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/policy_path_parser.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace path_parser { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kMachineNamePolicyVarName = "${machine_name}"; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kUserNamePolicyVarName = "${user_name}"; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Replaces all variable occurrences in the policy string with the respective 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system settings values. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath::StringType ExpandPathVariables( 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& untranslated_string) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType result(untranslated_string); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.length() == 0) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sanitize quotes in case of any around the whole string. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.length() > 1 && 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((result[0] == '"' && result[result.length() - 1] == '"') || 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (result[0] == '\'' && result[result.length() - 1] == '\''))) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strip first and last char which should be matching quotes now. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = result.substr(1, result.length() - 2); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Translate two special variables ${user_name} and ${machine_name} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t position = result.find(kUserNamePolicyVarName); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (position != std::string::npos) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct passwd* user = getpwuid(geteuid()); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.replace(position, strlen(kUserNamePolicyVarName), user->pw_name); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Username variable can not be resolved. "; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) position = result.find(kMachineNamePolicyVarName); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (position != std::string::npos) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char machinename[255]; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gethostname(machinename, 255) == 0) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.replace(position, strlen(kMachineNamePolicyVarName), machinename); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Machine name variable can not be resolved."; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckUserDataDirPolicy(base::FilePath* user_data_dir) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This function is not implemented in Linux because we don't support the 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // policy on this platform. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace path_parser 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 65