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