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