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