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