| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "policy/resilient_policy_util.h" |
| |
| #include <algorithm> |
| |
| #include <base/files/file_enumerator.h> |
| #include <base/files/file_util.h> |
| #include <base/strings/string_number_conversions.h> |
| #include <base/strings/string_util.h> |
| |
| namespace policy { |
| |
| std::map<int, base::FilePath> GetSortedResilientPolicyFilePaths( |
| const base::FilePath& default_policy_path) { |
| std::map<int, base::FilePath> sorted_policy_file_paths; |
| base::FilePath directory = default_policy_path.DirName(); |
| if (!base::PathExists(directory)) |
| return sorted_policy_file_paths; |
| |
| // Iterate the list of files in the folder, identifying the policy files based |
| // on the name. Store in the map the absolute paths. |
| const std::string default_policy_file_name = |
| default_policy_path.BaseName().value(); |
| base::FileEnumerator file_iter(directory, false, base::FileEnumerator::FILES); |
| for (base::FilePath child_file = file_iter.Next(); !child_file.empty(); |
| child_file = file_iter.Next()) { |
| int index; |
| if (ParseResilientPolicyFilePath(child_file, default_policy_path, &index)) { |
| sorted_policy_file_paths[index] = child_file; |
| } |
| } |
| |
| return sorted_policy_file_paths; |
| } |
| |
| bool ParseResilientPolicyFilePath(const base::FilePath& policy_path, |
| const base::FilePath& default_policy_path, |
| int* index_out) { |
| if (!base::StartsWith(policy_path.value(), default_policy_path.value(), |
| base::CompareCase::SENSITIVE)) { |
| return false; |
| } |
| |
| if (policy_path == default_policy_path) { |
| *index_out = 0; |
| return true; |
| } |
| |
| const std::string extension = |
| policy_path.value().substr(default_policy_path.value().size()); |
| if (extension.empty() || extension[0] != '.' || |
| !base::StringToInt(extension.substr(1), index_out) || *index_out <= 0) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| base::FilePath GetResilientPolicyFilePathForIndex( |
| const base::FilePath& default_policy_path, |
| int index) { |
| if (index == 0) |
| return default_policy_path; |
| return base::FilePath(default_policy_path.value() + "." + |
| std::to_string(index)); |
| } |
| |
| } // namespace policy |