1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "checker/checker_manager.h"
16 namespace OHOS {
17 namespace DistributedData {
GetInstance()18 CheckerManager &CheckerManager::GetInstance()
19 {
20     static CheckerManager instance;
21     return instance;
22 }
23 
LoadCheckers(std::vector<std::string> & checkers)24 void CheckerManager::LoadCheckers(std::vector<std::string> &checkers)
25 {
26     for (const auto &checker : checkers) {
27         if (checkers_.find(checker) != checkers_.end()) {
28             continue;
29         }
30         auto it = getters_.Find(checker);
31         if (!it.first || it.second == nullptr) {
32             continue;
33         }
34         auto *bundleChecker = it.second();
35         if (bundleChecker == nullptr) {
36             continue;
37         }
38         bundleChecker->Initialize();
39         checkers_[checker] = bundleChecker;
40     }
41 }
42 
RegisterPlugin(const std::string & checker,std::function<Checker * ()> getter)43 void CheckerManager::RegisterPlugin(const std::string &checker, std::function<Checker *()> getter)
44 {
45     getters_.ComputeIfAbsent(checker, [&getter](const auto &) mutable {
46         return std::move(getter);
47     });
48 }
49 
GetAppId(const StoreInfo & info)50 std::string CheckerManager::GetAppId(const StoreInfo &info)
51 {
52     for (auto &[name, checker] : checkers_) {
53         if (checker == nullptr) {
54             continue;
55         }
56         auto appId = checker->GetAppId(info);
57         if (appId.empty()) {
58             continue;
59         }
60         return appId;
61     }
62     return "";
63 }
64 
IsValid(const StoreInfo & info)65 bool CheckerManager::IsValid(const StoreInfo &info)
66 {
67     for (auto &[name, checker] : checkers_) {
68         if (checker == nullptr) {
69             continue;
70         }
71         if (!checker->IsValid(info)) {
72             continue;
73         }
74         return true;
75     }
76     return false;
77 }
78 
IsDistrust(const StoreInfo & info)79 bool CheckerManager::IsDistrust(const StoreInfo &info)
80 {
81     for (auto &[name, checker] : checkers_) {
82         if (checker == nullptr) {
83             continue;
84         }
85         if (!checker->IsDistrust(info)) {
86             continue;
87         }
88         return true;
89     }
90     return false;
91 }
92 
IsSwitches(const StoreInfo & info)93 bool CheckerManager::IsSwitches(const StoreInfo &info)
94 {
95     for (auto &[name, checker] : checkers_) {
96         if (checker == nullptr) {
97             continue;
98         }
99         if (checker->IsSwitches(info)) {
100             return true;
101         }
102     }
103     return false;
104 }
105 
GetChecker(const std::string & checker)106 CheckerManager::Checker *CheckerManager::GetChecker(const std::string &checker)
107 {
108     auto it = checkers_.find(checker);
109     if (it == checkers_.end()) {
110         return nullptr;
111     }
112     return it->second;
113 }
114 
GetDynamicStores()115 std::vector<CheckerManager::StoreInfo> CheckerManager::GetDynamicStores()
116 {
117     std::vector<CheckerManager::StoreInfo> res;
118     for (auto &[name, checker] : checkers_) {
119         if (checker == nullptr) {
120             continue;
121         }
122         res = checker->GetDynamicStores();
123         if (!res.empty()) {
124             return res;
125         }
126     }
127     return res;
128 }
GetStaticStores()129 std::vector<CheckerManager::StoreInfo> CheckerManager::GetStaticStores()
130 {
131     std::vector<CheckerManager::StoreInfo> res;
132     for (auto &[name, checker] : checkers_) {
133         if (checker == nullptr) {
134             continue;
135         }
136         res = checker->GetStaticStores();
137         if (!res.empty()) {
138             return res;
139         }
140     }
141     return res;
142 }
IsDynamic(const CheckerManager::StoreInfo & info)143 bool CheckerManager::IsDynamic(const CheckerManager::StoreInfo &info)
144 {
145     for (auto &[name, checker] : checkers_) {
146         if (checker == nullptr) {
147             continue;
148         }
149         if (checker->IsDynamic(info)) {
150             return true;
151         }
152     }
153     return false;
154 }
IsStatic(const CheckerManager::StoreInfo & info)155 bool CheckerManager::IsStatic(const CheckerManager::StoreInfo &info)
156 {
157     for (auto &[name, checker] : checkers_) {
158         if (checker == nullptr) {
159             continue;
160         }
161         if (checker->IsStatic(info)) {
162             return true;
163         }
164     }
165     return false;
166 }
167 } // namespace DistributedData
168 } // namespace OHOS