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
GetChecker(const std::string & checker)93 CheckerManager::Checker *CheckerManager::GetChecker(const std::string &checker)
94 {
95 auto it = checkers_.find(checker);
96 if (it == checkers_.end()) {
97 return nullptr;
98 }
99 return it->second;
100 }
101 } // namespace DistributedData
102 } // namespace OHOS