1 // Copyright 2017 The Chromium OS 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 "policy/resilient_policy_util.h" 6 7 #include <algorithm> 8 9 #include <base/files/file_enumerator.h> 10 #include <base/files/file_util.h> 11 #include <base/strings/string_number_conversions.h> 12 #include <base/strings/string_util.h> 13 14 namespace policy { 15 16 std::map<int, base::FilePath> GetSortedResilientPolicyFilePaths( 17 const base::FilePath& default_policy_path) { 18 std::map<int, base::FilePath> sorted_policy_file_paths; 19 base::FilePath directory = default_policy_path.DirName(); 20 if (!base::PathExists(directory)) 21 return sorted_policy_file_paths; 22 23 // Iterate the list of files in the folder, identifying the policy files based 24 // on the name. Store in the map the absolute paths. 25 const std::string default_policy_file_name = 26 default_policy_path.BaseName().value(); 27 base::FileEnumerator file_iter(directory, false, base::FileEnumerator::FILES); 28 for (base::FilePath child_file = file_iter.Next(); !child_file.empty(); 29 child_file = file_iter.Next()) { 30 int index; 31 if (ParseResilientPolicyFilePath(child_file, default_policy_path, &index)) { 32 sorted_policy_file_paths[index] = child_file; 33 } 34 } 35 36 return sorted_policy_file_paths; 37 } 38 39 bool ParseResilientPolicyFilePath(const base::FilePath& policy_path, 40 const base::FilePath& default_policy_path, 41 int* index_out) { 42 if (!base::StartsWith(policy_path.value(), default_policy_path.value(), 43 base::CompareCase::SENSITIVE)) { 44 return false; 45 } 46 47 if (policy_path == default_policy_path) { 48 *index_out = 0; 49 return true; 50 } 51 52 const std::string extension = 53 policy_path.value().substr(default_policy_path.value().size()); 54 if (extension.empty() || extension[0] != '.' || 55 !base::StringToInt(extension.substr(1), index_out) || *index_out <= 0) { 56 return false; 57 } 58 59 return true; 60 } 61 62 base::FilePath GetResilientPolicyFilePathForIndex( 63 const base::FilePath& default_policy_path, 64 int index) { 65 if (index == 0) 66 return default_policy_path; 67 return base::FilePath(default_policy_path.value() + "." + 68 std::to_string(index)); 69 } 70 71 } // namespace policy 72