1 /*
2 * Copyright (C) 2023 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 <algorithm>
16 #include <string>
17 #include <utility>
18 #include "app_domain_verify_data_mgr.h"
19 #include "inner_verify_status.h"
20
21 namespace OHOS {
22 namespace AppDomainVerify {
AppDomainVerifyDataMgr()23 AppDomainVerifyDataMgr::AppDomainVerifyDataMgr()
24 {
25 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "new instance created.");
26 verifyMap_ = std::make_shared<std::unordered_map<std::string, VerifyResultInfo>>();
27 if (InitRdb()) {
28 LoadAllFromRdb();
29 }
30 }
31
~AppDomainVerifyDataMgr()32 AppDomainVerifyDataMgr::~AppDomainVerifyDataMgr()
33 {
34 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "instance dead.");
35 }
36
GetVerifyStatus(const std::string & bundleName,VerifyResultInfo & verifyResultInfo)37 bool AppDomainVerifyDataMgr::GetVerifyStatus(const std::string& bundleName, VerifyResultInfo& verifyResultInfo)
38 {
39 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
40 std::string key;
41 if (!GetParamKey(bundleName, key)) {
42 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "key is empty");
43 return false;
44 }
45 std::lock_guard<std::mutex> lock(verifyMapMutex_);
46 auto it = verifyMap_->find(key);
47 if (it != verifyMap_->end()) {
48 verifyResultInfo = it->second;
49 return true;
50 }
51 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE,
52 "get verify status fail, verify result can't find");
53 return true;
54 }
VerifyResultInfoToDB(const std::string bundleName,const VerifyResultInfo & verifyResultInfo)55 bool AppDomainVerifyDataMgr::VerifyResultInfoToDB(
56 const std::string bundleName, const VerifyResultInfo& verifyResultInfo)
57 {
58 if (!rdbDataManager_->DeleteData(bundleName)) {
59 APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "try delete bundleName failed.");
60 }
61 for (auto it : verifyResultInfo.hostVerifyStatusMap) {
62 std::string domain = it.first;
63 auto [status, verifyTime, cnt] = it.second;
64 RdbDataItem item = { .bundleName = bundleName,
65 .appIdentifier = verifyResultInfo.appIdentifier,
66 .domain = domain,
67 .status = status,
68 .verifyTs = verifyTime,
69 .count = cnt };
70 if (!rdbDataManager_->InsertData(item)) {
71 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "insert to db failed!");
72 return false;
73 }
74 }
75 return true;
76 }
DBToVerifyResultInfo(const std::vector<RdbDataItem> & items,VerifyResultInfo & verifyResultInfo)77 bool AppDomainVerifyDataMgr::DBToVerifyResultInfo(
78 const std::vector<RdbDataItem>& items, VerifyResultInfo& verifyResultInfo)
79 {
80 if (items.empty()) {
81 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "items empty!");
82 return false;
83 }
84 verifyResultInfo.appIdentifier = items[0].appIdentifier;
85 for (auto it : items) {
86 verifyResultInfo.hostVerifyStatusMap.insert(std::make_pair(it.domain,
87 std::make_tuple(InnerVerifyStatus(it.status), it.verifyTs, it.count)));
88 }
89 return true;
90 }
91
SaveVerifyStatus(const std::string & bundleName,const VerifyResultInfo & verifyResultInfo)92 bool AppDomainVerifyDataMgr::SaveVerifyStatus(const std::string& bundleName, const VerifyResultInfo& verifyResultInfo)
93 {
94 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
95 std::string key;
96 if (!GetParamKey(bundleName, key)) {
97 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "key is empty!");
98 return false;
99 }
100 if (rdbDataManager_ == nullptr) {
101 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdbDataManager is null");
102 return false;
103 }
104
105 std::lock_guard<std::mutex> lock(verifyMapMutex_);
106 UpdateVerifyMap(key, verifyResultInfo);
107 auto completeBundleInfo = verifyMap_->find(key);
108 if (completeBundleInfo == verifyMap_->end()) {
109 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "InnerVerifyStatus save bundleInfo failed");
110 return false;
111 }
112 if (!VerifyResultInfoToDB(key, completeBundleInfo->second)) {
113 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "InnerVerifyStatus save to db failed");
114 return false;
115 }
116 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "call end");
117 return true;
118 }
119
UpdateVerifyMap(const std::string & bundleName,const VerifyResultInfo & verifyResultInfo)120 void AppDomainVerifyDataMgr::UpdateVerifyMap(const std::string& bundleName, const VerifyResultInfo& verifyResultInfo)
121 {
122 auto bundleInfo = verifyMap_->find(bundleName);
123 auto& hostVerifyStatusMap = verifyResultInfo.hostVerifyStatusMap;
124 if (bundleInfo != verifyMap_->end()) {
125 auto& hostVerifyStatusMapTarget = bundleInfo->second.hostVerifyStatusMap;
126 std::for_each(hostVerifyStatusMap.begin(), hostVerifyStatusMap.end(),
127 [&hostVerifyStatusMapTarget](auto iter) {
128 hostVerifyStatusMapTarget.insert_or_assign(iter.first, iter.second);
129 });
130 } else {
131 verifyMap_->insert_or_assign(bundleName, verifyResultInfo);
132 }
133 }
134
DeleteVerifyStatus(const std::string & bundleName)135 bool AppDomainVerifyDataMgr::DeleteVerifyStatus(const std::string& bundleName)
136 {
137 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
138
139 std::string key;
140 if (!GetParamKey(bundleName, key)) {
141 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "key is empty!");
142 return false;
143 }
144 if (rdbDataManager_ == nullptr) {
145 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdbDataManager is null");
146 return false;
147 }
148 std::lock_guard<std::mutex> lock(verifyMapMutex_);
149 verifyMap_->erase(key);
150 if (!rdbDataManager_->DeleteData(key)) {
151 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "InnerVerifyStatus db delete failed");
152 return false;
153 }
154 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "call end");
155 return true;
156 }
157
GetAllVerifyStatus()158 const std::unordered_map<std::string, VerifyResultInfo>& AppDomainVerifyDataMgr::GetAllVerifyStatus()
159 {
160 std::lock_guard<std::mutex> lock(verifyMapMutex_);
161 return *verifyMap_;
162 }
163
GetParamKey(const std::string & bundleName,std::string & paramKey)164 bool AppDomainVerifyDataMgr::GetParamKey(const std::string& bundleName, std::string& paramKey)
165 {
166 if (bundleName.empty()) {
167 return false;
168 }
169 paramKey = bundleName;
170 return true;
171 }
172
InitRdb()173 bool AppDomainVerifyDataMgr::InitRdb()
174 {
175 AppDomainVerifyRdbConfig rdbConfig;
176 rdbConfig.dbName = Constants::RDB_NAME;
177 rdbConfig.tableName = Constants::RDB_TABLE_NAME;
178 rdbDataManager_ = std::make_shared<AppDomainVerifyRdbDataManager>(rdbConfig);
179 return rdbDataManager_->CreateTable();
180 }
181
LoadAllFromRdb()182 bool AppDomainVerifyDataMgr::LoadAllFromRdb()
183 {
184 std::unordered_map<std::string, std::vector<RdbDataItem>> dataMap;
185 if (!rdbDataManager_->QueryAllData(dataMap)) {
186 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "LoadAllFromRdb failed");
187 return false;
188 }
189 for (auto it = dataMap.begin(); it != dataMap.end(); ++it) {
190 VerifyResultInfo verifyResultInfo;
191 DBToVerifyResultInfo(it->second, verifyResultInfo);
192 verifyMap_->insert(std::make_pair(it->first, verifyResultInfo));
193 }
194 return true;
195 }
QueryAssociatedDomains(const std::string & bundleName,std::vector<std::string> & domains)196 bool AppDomainVerifyDataMgr::QueryAssociatedDomains(const std::string& bundleName, std::vector<std::string>& domains)
197 {
198 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
199 std::vector<RdbDataItem> items;
200 if (!rdbDataManager_->QueryDomainByBundleName(bundleName, items)) {
201 return false;
202 }
203 for (const auto& item : items) {
204 domains.emplace_back(item.domain);
205 }
206 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "call end");
207 return true;
208 }
QueryAssociatedBundleNames(const std::string & domain,std::vector<std::string> & bundleNames)209 bool AppDomainVerifyDataMgr::QueryAssociatedBundleNames(
210 const std::string& domain, std::vector<std::string>& bundleNames)
211 {
212 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
213 std::vector<RdbDataItem> items;
214 if (!rdbDataManager_->QueryBundleNameByDomain(domain, items)) {
215 return false;
216 }
217 for (const auto& item : items) {
218 bundleNames.emplace_back(item.bundleName);
219 }
220 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "call end");
221 return true;
222 }
223 } // namespace AppDomainVerify
224 } // namespace OHOS
225