• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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