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
16 #include "bundle_sandbox_data_mgr.h"
17
18 #include "app_log_wrapper.h"
19 #include "bundle_constants.h"
20 #include "bundle_mgr_service.h"
21 #include "bundle_util.h"
22
23 namespace OHOS {
24 namespace AppExecFwk {
BundleSandboxDataMgr()25 BundleSandboxDataMgr::BundleSandboxDataMgr()
26 {
27 APP_LOGI("BundleSandboxDataMgr instance is created");
28 sandboxManagerDb_ = std::make_shared<SandboxManagerRdb>();
29 if (sandboxManagerDb_ == nullptr) {
30 APP_LOGE("create sandboxManagerDb_ failed.");
31 return;
32 }
33 if (!RestoreSandboxPersistentInnerBundleInfo()) {
34 APP_LOGW("RestoreSandboxPersistentInnerBundleInfo failed.");
35 }
36 }
37
~BundleSandboxDataMgr()38 BundleSandboxDataMgr::~BundleSandboxDataMgr()
39 {
40 APP_LOGI("BundleSandboxDataMgr instance is destroyed");
41 }
42
SaveSandboxAppInfo(const InnerBundleInfo & info,const int32_t & appIndex)43 void BundleSandboxDataMgr::SaveSandboxAppInfo(const InnerBundleInfo &info, const int32_t &appIndex)
44 {
45 APP_LOGI("SaveSandboxAppInfo begin");
46 std::string bundleName = info.GetBundleName();
47 if (bundleName.empty()) {
48 APP_LOGE("SaveSandboxAppInfo bundleName is empty");
49 return;
50 }
51 std::string key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + bundleName;
52 std::unique_lock<std::shared_mutex> lock(sandboxAppMutex_);
53 sandboxAppInfos_[key] = info;
54 APP_LOGD("save sandbox app %{public}s info successfully", key.c_str());
55 }
56
DeleteSandboxAppInfo(const std::string & bundleName,const int32_t & appIndex)57 void BundleSandboxDataMgr::DeleteSandboxAppInfo(const std::string &bundleName, const int32_t &appIndex)
58 {
59 APP_LOGI("DeleteSandboxAppInfo begin");
60 if (bundleName.empty()) {
61 APP_LOGE("DeleteSandboxAppInfo bundleName is empty");
62 return;
63 }
64 auto key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + bundleName;
65 std::unique_lock<std::shared_mutex> lock(sandboxAppMutex_);
66 auto ret = sandboxAppInfos_.erase(key);
67 if (ret == 0) {
68 APP_LOGE("delete sandbox app info failed due to no sandbox app in the dataMgr");
69 return;
70 }
71 APP_LOGD("delete sandbox app %{public}s info successfully", key.c_str());
72 }
73
GetSandboxAppInfo(const std::string & bundleName,const int32_t & appIndex,int32_t & userId,InnerBundleInfo & info) const74 ErrCode BundleSandboxDataMgr::GetSandboxAppInfo(
75 const std::string &bundleName, const int32_t &appIndex, int32_t &userId, InnerBundleInfo &info) const
76 {
77 APP_LOGI("GetSandboxAppInfo begin");
78 if (bundleName.empty()) {
79 APP_LOGE("GetSandboxAppInfo bundleName is empty");
80 return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
81 }
82 if (appIndex <= Constants::INITIAL_APP_INDEX) {
83 APP_LOGE("GetSandboxAppInfo appIndex is invalid");
84 return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
85 }
86 if (userId < Constants::DEFAULT_USERID) {
87 APP_LOGE("userId(%{public}d) is invalid.", userId);
88 return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
89 }
90
91 auto key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + bundleName;
92
93 {
94 std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
95 auto it = sandboxAppInfos_.find(key);
96 if (it == sandboxAppInfos_.end()) {
97 APP_LOGE("GetSandboxAppInfo no sandbox app info can be found");
98 return ERR_APPEXECFWK_SANDBOX_INSTALL_NO_SANDBOX_APP_INFO;
99 }
100
101 InnerBundleUserInfo userInfo;
102 if (!(it->second).GetInnerBundleUserInfo(userId, userInfo)) {
103 APP_LOGE("the sandbox app is not installed at this user %{public}d", userId);
104 return ERR_APPEXECFWK_SANDBOX_INSTALL_NOT_INSTALLED_AT_SPECIFIED_USERID;
105 }
106 info = it->second;
107 }
108
109 APP_LOGI("GetSandboxAppInfo successfully");
110 return ERR_OK;
111 }
112
GetSandboxAppBundleInfo(const std::string & bundleName,const int32_t & appIndex,const int32_t & userId,BundleInfo & info) const113 ErrCode BundleSandboxDataMgr::GetSandboxAppBundleInfo(
114 const std::string &bundleName, const int32_t &appIndex, const int32_t &userId, BundleInfo &info) const
115 {
116 APP_LOGI("GetSandboxAppBundleInfo begin");
117 InnerBundleInfo innerBundleInfo;
118 int32_t requestUserId = userId;
119 ErrCode result = ERR_OK;
120 if ((result = GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo)) != ERR_OK) {
121 APP_LOGE("GetSandboxAppBundleInfo get sandbox app info failed");
122 return result;
123 }
124 InnerBundleUserInfo userInfo;
125 if (!innerBundleInfo.GetInnerBundleUserInfo(requestUserId, userInfo)) {
126 APP_LOGE("the origin application is not installed at current user");
127 return ERR_APPEXECFWK_SANDBOX_INSTALL_NOT_INSTALLED_AT_SPECIFIED_USERID;
128 }
129
130 innerBundleInfo.GetBundleInfo(
131 BundleFlag::GET_BUNDLE_DEFAULT |
132 BundleFlag::GET_BUNDLE_WITH_ABILITIES |
133 BundleFlag::GET_BUNDLE_WITH_REQUESTED_PERMISSION |
134 BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO |
135 BundleFlag::GET_BUNDLE_WITH_HASH_VALUE, info, requestUserId);
136 APP_LOGI("GetSandboxAppBundleInfo successfully");
137 return ERR_OK;
138 }
139
GenerateSandboxAppIndex(const std::string & bundleName)140 int32_t BundleSandboxDataMgr::GenerateSandboxAppIndex(const std::string &bundleName)
141 {
142 APP_LOGI("GenerateSandboxAppIndex begin");
143 if (bundleName.empty()) {
144 APP_LOGE("GenerateSandboxAppIndex bundleName is empty");
145 return Constants::INITIAL_APP_INDEX;
146 }
147 std::unique_lock<std::mutex> lock(sandboxAppIndexMapMutex_);
148 auto firstIterator = sandboxAppIndexMap_.find(bundleName);
149 if (firstIterator == sandboxAppIndexMap_.end()) {
150 std::set<int32_t> innerSet { Constants::INITIAL_APP_INDEX + 1 };
151 sandboxAppIndexMap_.emplace(bundleName, innerSet);
152 APP_LOGD("GenerateSandboxAppIndex successfully");
153 return Constants::INITIAL_APP_INDEX + 1;
154 }
155
156 if (firstIterator->second.empty()) {
157 firstIterator->second.insert(Constants::INITIAL_APP_INDEX + 1);
158 APP_LOGD("GenerateSandboxAppIndex successfully");
159 return Constants::INITIAL_APP_INDEX + 1;
160 }
161
162 int32_t pre = Constants::INITIAL_APP_INDEX;
163 for (const auto &item : firstIterator->second) {
164 if (item == pre + 1) {
165 pre++;
166 continue;
167 }
168 break;
169 }
170
171 int32_t newAppIndex = pre + 1;
172 if (newAppIndex > Constants::MAX_APP_INDEX) {
173 APP_LOGE("GenerateSandboxAppIndex failed due to exceed limitation of maximum appIndex");
174 return Constants::INITIAL_APP_INDEX;
175 }
176 firstIterator->second.insert(newAppIndex);
177 APP_LOGD("GenerateSandboxAppIndex successfully with appIndex %{public}d", newAppIndex);
178 return newAppIndex;
179 }
180
DeleteSandboxAppIndex(const std::string & bundleName,int32_t appIndex)181 bool BundleSandboxDataMgr::DeleteSandboxAppIndex(const std::string &bundleName, int32_t appIndex)
182 {
183 APP_LOGI("DeleteSandboxAppIndex begin");
184 if (bundleName.empty()) {
185 APP_LOGE("DeleteSandboxAppIndex bundleName is empty");
186 return false;
187 }
188 std::unique_lock<std::mutex> lock(sandboxAppIndexMapMutex_);
189 auto it = sandboxAppIndexMap_.find(bundleName);
190 if (it == sandboxAppIndexMap_.end() || it->second.empty()) {
191 APP_LOGE("no sandbox app can be found %{public}s", bundleName.c_str());
192 return false;
193 }
194
195 auto ret = it->second.erase(appIndex);
196 if (ret == 0) {
197 APP_LOGE("no sandbox app index can be found %{public}d", appIndex);
198 return false;
199 }
200
201 if (it->second.empty()) {
202 sandboxAppIndexMap_.erase(bundleName);
203 }
204 APP_LOGI("DeleteSandboxAppIndex successfully");
205 return true;
206 }
207
GetSandboxAppInfoMap() const208 std::unordered_map<std::string, InnerBundleInfo> BundleSandboxDataMgr::GetSandboxAppInfoMap() const
209 {
210 std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
211 return sandboxAppInfos_;
212 }
213
GetSandboxHapModuleInfo(const AbilityInfo & abilityInfo,int32_t appIndex,int32_t userId,HapModuleInfo & hapModuleInfo) const214 ErrCode BundleSandboxDataMgr::GetSandboxHapModuleInfo(const AbilityInfo &abilityInfo, int32_t appIndex, int32_t userId,
215 HapModuleInfo &hapModuleInfo) const
216 {
217 APP_LOGD("GetSandboxHapModuleInfo %{public}s", abilityInfo.bundleName.c_str());
218 // check appIndex
219 if (appIndex <= Constants::INITIAL_APP_INDEX || appIndex > Constants::MAX_APP_INDEX) {
220 APP_LOGE("the appIndex %{public}d is invalid", appIndex);
221 return ERR_APPEXECFWK_SANDBOX_QUERY_PARAM_ERROR;
222 }
223 std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
224 auto key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + abilityInfo.bundleName;
225 auto infoItem = sandboxAppInfos_.find(key);
226 if (infoItem == sandboxAppInfos_.end()) {
227 APP_LOGE("no sandbox app can be found %{public}s", abilityInfo.bundleName.c_str());
228 return ERR_APPEXECFWK_SANDBOX_QUERY_NO_SANDBOX_APP;
229 }
230
231 const InnerBundleInfo &innerBundleInfo = infoItem->second;
232 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
233 auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
234 if (!module) {
235 APP_LOGE("can not find module %{public}s", abilityInfo.package.c_str());
236 return ERR_APPEXECFWK_SANDBOX_QUERY_NO_MODULE_INFO;
237 }
238 hapModuleInfo = *module;
239 return ERR_OK;
240 }
241
GetInnerBundleInfoByUid(const int32_t & uid,InnerBundleInfo & innerBundleInfo) const242 ErrCode BundleSandboxDataMgr::GetInnerBundleInfoByUid(const int32_t &uid, InnerBundleInfo &innerBundleInfo) const
243 {
244 APP_LOGD("GetInnerBundleInfoByUid with uid is %{public}d", uid);
245 int32_t userId = BundleUtil::GetUserIdByUid(uid);
246 APP_LOGD("GetInnerBundleInfoByUid with userId is %{public}d", userId);
247 if (userId == Constants::UNSPECIFIED_USERID || userId == Constants::INVALID_USERID) {
248 APP_LOGE("the uid %{public}d is illegal when get bundleName by uid.", uid);
249 return ERR_APPEXECFWK_SANDBOX_QUERY_INVALID_USER_ID;
250 }
251
252 {
253 std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
254 if (!sandboxAppInfos_.empty()) {
255 for (const auto &item : sandboxAppInfos_) {
256 const InnerBundleInfo &info = item.second;
257 auto innerUid = info.GetUid(userId);
258 APP_LOGD("GetInnerBundleInfoByUid with innerUid is %{public}d", innerUid);
259 if (innerUid == uid) {
260 innerBundleInfo = info;
261 return ERR_OK;
262 }
263 }
264 }
265 }
266 return ERR_APPEXECFWK_SANDBOX_QUERY_NO_SANDBOX_APP;
267 }
268
SaveSandboxPersistentInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)269 bool BundleSandboxDataMgr::SaveSandboxPersistentInfo(const std::string &bundleName,
270 const InnerBundleInfo &innerBundleInfo)
271 {
272 APP_LOGD("SaveSandboxPersistentInfo for bundleName %{public}s", bundleName.c_str());
273 std::unique_lock<std::shared_mutex> lock(sandboxDbMutex_);
274 if (sandboxManagerDb_ == nullptr) {
275 APP_LOGE("error sandboxManagerDb_ is nullptr.");
276 return false;
277 }
278 return sandboxManagerDb_->SaveSandboxInnerBundleInfo(bundleName, innerBundleInfo);
279 }
280
RemoveSandboxPersistentInfo(const std::string & bundleName)281 bool BundleSandboxDataMgr::RemoveSandboxPersistentInfo(const std::string &bundleName)
282 {
283 APP_LOGD("RemoveSandboxPersistentInfo for bundleName %{public}s", bundleName.c_str());
284 std::unique_lock<std::shared_mutex> lock(sandboxDbMutex_);
285 if (sandboxManagerDb_ == nullptr) {
286 APP_LOGE("error sandboxManagerDb_ is nullptr.");
287 return false;
288 }
289 return sandboxManagerDb_->DeleteSandboxInnerBundleInfo(bundleName);
290 }
291
RestoreSandboxPersistentInnerBundleInfo()292 bool BundleSandboxDataMgr::RestoreSandboxPersistentInnerBundleInfo()
293 {
294 APP_LOGD("start to RestoreSandboxPersistentInnerBundleInfo");
295 std::unique_lock<std::shared_mutex> lockDbMutex(sandboxDbMutex_);
296 if (sandboxManagerDb_ == nullptr) {
297 APP_LOGE("error sandboxManagerDb_ is nullptr.");
298 return false;
299 }
300 std::unique_lock<std::shared_mutex> lockAppMutex(sandboxAppMutex_);
301 if (!sandboxManagerDb_->QueryAllSandboxInnerBundleInfo(sandboxAppInfos_)) {
302 APP_LOGE("QueryAllSandboxInnerBundleInfo failed");
303 return false;
304 }
305 for (const auto &sandboxInfo : sandboxAppInfos_) {
306 auto fileUnderlinePos = sandboxInfo.first.find(Constants::FILE_UNDERLINE);
307 if (fileUnderlinePos == std::string::npos) {
308 APP_LOGW("invalid bundleName_appIndex");
309 continue;
310 }
311 std::string appIndexStr = sandboxInfo.first.substr(0, fileUnderlinePos);
312 std::string bundleName = sandboxInfo.first.substr(fileUnderlinePos + 1);
313 int32_t appIndex = 0;
314 if (!OHOS::StrToInt(appIndexStr, appIndex)) {
315 APP_LOGW("invalid appIndex %{public}s", appIndexStr.c_str());
316 continue;
317 }
318 if (!RestoreSandboxAppIndex(bundleName, appIndex)) {
319 APP_LOGW("RestoreSandboxAppIndex appIndex failed");
320 }
321 }
322 return true;
323 }
324
RestoreSandboxAppIndex(const std::string & bundleName,int32_t appIndex)325 bool BundleSandboxDataMgr::RestoreSandboxAppIndex(const std::string &bundleName, int32_t appIndex)
326 {
327 APP_LOGD("RestoreSandboxAppIndex begin");
328 if (bundleName.empty()) {
329 APP_LOGE("RestoreSandboxAppIndex bundleName is empty");
330 return false;
331 }
332 std::unique_lock<std::mutex> lock(sandboxAppIndexMapMutex_);
333 auto firstIterator = sandboxAppIndexMap_.find(bundleName);
334 if (firstIterator == sandboxAppIndexMap_.end()) {
335 std::set<int32_t> innerSet { appIndex };
336 sandboxAppIndexMap_.emplace(bundleName, innerSet);
337 APP_LOGD("RestoreSandboxAppIndex successfully");
338 return true;
339 }
340
341 firstIterator->second.insert(appIndex);
342 APP_LOGD("RestoreSandboxAppIndex finish");
343 return true;
344 }
345
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)346 void BundleSandboxDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
347 {
348 APP_LOGD("RestoreSandboxUidAndGid begin");
349 for (const auto &info : sandboxAppInfos_) {
350 for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
351 auto innerBundleUserInfo = infoItem.second;
352 int32_t bundleId = innerBundleUserInfo.uid -
353 innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
354 auto item = bundleIdMap.find(bundleId);
355 if (item == bundleIdMap.end()) {
356 bundleIdMap.emplace(bundleId, info.first);
357 } else {
358 bundleIdMap[bundleId] = info.first;
359 }
360 BundleUtil::MakeFsConfig(info.first, bundleId, Constants::HMDFS_CONFIG_PATH);
361 BundleUtil::MakeFsConfig(info.first, bundleId, Constants::SHAREFS_CONFIG_PATH);
362 }
363 }
364 APP_LOGD("RestoreSandboxUidAndGid finish");
365 }
366 } // AppExecFwk
367 } // OHOS