1 /*
2 * Copyright (c) 2021-2025 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_data_mgr.h"
17
18 #include <sys/stat.h>
19 #include <tuple>
20
21 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
22 #ifdef ACCOUNT_ENABLE
23 #include "os_account_info.h"
24 #endif
25 #endif
26 #include "account_helper.h"
27 #include "app_log_tag_wrapper.h"
28 #include "app_provision_info_manager.h"
29 #include "bms_extension_client.h"
30 #include "bundle_data_storage_rdb.h"
31 #include "preinstall_data_storage_rdb.h"
32 #include "bundle_event_callback_death_recipient.h"
33 #include "bundle_mgr_service.h"
34 #include "bundle_mgr_client.h"
35 #include "bundle_parser.h"
36 #include "bundle_permission_mgr.h"
37 #include "bundle_status_callback_death_recipient.h"
38 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
39 #include "default_app_mgr.h"
40 #endif
41 #include "hitrace_meter.h"
42 #include "inner_bundle_clone_common.h"
43 #include "installd_client.h"
44 #include "ipc_skeleton.h"
45 #ifdef GLOBAL_I18_ENABLE
46 #include "locale_config.h"
47 #include "locale_info.h"
48 #endif
49 #include "mime_type_mgr.h"
50 #include "parameters.h"
51 #include "router_map_helper.h"
52 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
53 #include "bundle_overlay_data_manager.h"
54 #endif
55 #include "bundle_extractor.h"
56 #include "scope_guard.h"
57 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
58 #include "type_descriptor.h"
59 #include "utd_client.h"
60 #endif
61
62 #ifdef APP_DOMAIN_VERIFY_ENABLED
63 #include "app_domain_verify_mgr_client.h"
64 #endif
65
66 #include "router_data_storage_rdb.h"
67 #include "shortcut_data_storage_rdb.h"
68 #include "system_ability_helper.h"
69 #include "ohos_account_kits.h"
70 #include "xcollie_helper.h"
71
72 namespace OHOS {
73 namespace AppExecFwk {
74 namespace {
75 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
76 constexpr int8_t DATA_GROUP_INDEX_START = 1;
77 constexpr int8_t UUID_LENGTH = 36;
78 constexpr int8_t PROFILE_PREFIX_LENGTH = 9;
79 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
80 // freeInstall action
81 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
82 // share action
83 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
84 constexpr const char* WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
85 constexpr const char* SUMMARY_TOTAL_COUNT = "totalCount";
86 constexpr const char* WANT_PARAM_SUMMARY = "summary";
87 constexpr int8_t DEFAULT_SUMMARY_COUNT = 0;
88 // data share
89 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
90 constexpr int8_t DATA_PROXY_URI_PREFIX_LEN = 17;
91 // profile path
92 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
93 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
94 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
95 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
96 constexpr const char* PKG_CONTEXT_PROFILE_PATH = "pkgContextInfo.json";
97 constexpr const char* PROFILE_PATH = "resources/base/profile/";
98 constexpr const char* PROFILE_PREFIX = "$profile:";
99 constexpr const char* JSON_SUFFIX = ".json";
100 constexpr const char* SCHEME_HTTPS = "https";
101 constexpr const char* META_DATA_SHORTCUTS_NAME = "ohos.ability.shortcuts";
102 constexpr const char* BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
103 constexpr const char* ENTRY = "entry";
104 constexpr const char* CLONE_BUNDLE_PREFIX = "clone_";
105 constexpr const char* RESOURCE_STRING_PREFIX = "$string:";
106
107 const std::map<ProfileType, const char*> PROFILE_TYPE_MAP = {
108 { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
109 { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
110 { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
111 { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH },
112 { ProfileType::PKG_CONTEXT_PROFILE, PKG_CONTEXT_PROFILE_PATH }
113 };
114 const std::string SCHEME_END = "://";
115 const std::string LINK_FEATURE = "linkFeature";
116 const std::string ATOMIC_SERVICE_DIR_PREFIX = "+auid-";
117 const std::string CLONE_APP_DIR_PREFIX = "+clone-";
118 const std::string PLUS = "+";
119 constexpr const char* PARAM_URI_SEPARATOR = ":///";
120 constexpr const char* URI_SEPARATOR = "://";
121 constexpr uint8_t PARAM_URI_SEPARATOR_LEN = 4;
122 constexpr int8_t INVALID_BUNDLEID = -1;
123 constexpr int32_t DATA_GROUP_UID_OFFSET = 100000;
124 constexpr int32_t MAX_APP_UID = 65535;
125 constexpr int8_t ONLY_ONE_USER = 1;
126 constexpr unsigned int OTA_CODE_ENCRYPTION_TIMEOUT = 4 * 60;
127 const std::string FUNCATION_HANDLE_OTA_CODE_ENCRYPTION = "BundleDataMgr::HandleOTACodeEncryption()";
128 #ifndef BUNDLE_FRAMEWORK_FREE_INSTALL
129 constexpr int APP_MGR_SERVICE_ID = 501;
130 #endif
131 }
132
BundleDataMgr()133 BundleDataMgr::BundleDataMgr()
134 {
135 InitStateTransferMap();
136 dataStorage_ = std::make_shared<BundleDataStorageRdb>();
137 preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
138 sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
139 bundleStateStorage_ = std::make_shared<BundleStateStorage>();
140 shortcutStorage_ = std::make_shared<ShortcutDataStorageRdb>();
141 routerStorage_ = std::make_shared<RouterDataStorageRdb>();
142 uninstallDataMgr_ = std::make_shared<UninstallDataMgrStorageRdb>();
143 firstInstallDataMgr_ = std::make_shared<FirstInstallDataMgrStorageRdb>();
144 baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
145 if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) {
146 baseAppUid_ = Constants::BASE_APP_UID;
147 }
148 APP_LOGI("BundleDataMgr instance is created");
149 }
150
~BundleDataMgr()151 BundleDataMgr::~BundleDataMgr()
152 {
153 APP_LOGI("BundleDataMgr instance is destroyed");
154 installStates_.clear();
155 transferStates_.clear();
156 bundleInfos_.clear();
157 }
158
LoadDataFromPersistentStorage()159 bool BundleDataMgr::LoadDataFromPersistentStorage()
160 {
161 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
162 // Judge whether bundleState json db exists.
163 // If it does not exist, create it and return the judgment result.
164 bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
165 if (!dataStorage_->LoadAllData(bundleInfos_)) {
166 APP_LOGW("LoadAllData failed");
167 return false;
168 }
169
170 if (bundleInfos_.empty()) {
171 APP_LOGW("persistent data is empty");
172 return false;
173 }
174
175 for (const auto &item : bundleInfos_) {
176 std::lock_guard<std::mutex> stateLock(stateMutex_);
177 installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
178 AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
179 }
180
181 RestoreUidAndGid();
182 if (!bundleStateDbExist) {
183 // Compatible old bundle status in kV db
184 CompatibleOldBundleStateInKvDb();
185 } else {
186 ResetBundleStateData();
187 // Load all bundle status from json db.
188 LoadAllBundleStateDataFromJsonDb();
189 }
190
191 SetInitialUserFlag(true);
192
193 RestoreSandboxUidAndGid(bundleIdMap_);
194 return true;
195 }
196
CompatibleOldBundleStateInKvDb()197 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
198 {
199 for (const auto& bundleInfoItem : bundleInfos_) {
200 for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
201 auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
202 if (bundleUserInfo.IsInitialState()) {
203 continue;
204 }
205
206 // save old bundle state to json db
207 bundleStateStorage_->SaveBundleStateStorage(
208 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
209 }
210 }
211 }
212
LoadAllBundleStateDataFromJsonDb()213 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
214 {
215 APP_LOGD("Load all bundle state start");
216 std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
217 if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
218 APP_LOGW("Load all bundle state failed");
219 return;
220 }
221
222 for (const auto& bundleState : bundleStateInfos) {
223 auto infoItem = bundleInfos_.find(bundleState.first);
224 if (infoItem == bundleInfos_.end()) {
225 APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
226 continue;
227 }
228
229 InnerBundleInfo& newInfo = infoItem->second;
230 for (auto& bundleUserState : bundleState.second) {
231 auto& tempUserInfo = bundleUserState.second;
232 newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.second.setEnabledCaller,
233 bundleUserState.first);
234 for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
235 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
236 }
237 }
238 }
239
240 APP_LOGD("Load all bundle state end");
241 }
242
ResetBundleStateData()243 void BundleDataMgr::ResetBundleStateData()
244 {
245 for (auto& bundleInfoItem : bundleInfos_) {
246 bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
247 }
248 }
249
UpdateBundleInstallState(const std::string & bundleName,const InstallState state,const bool isKeepData)250 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName,
251 const InstallState state, const bool isKeepData)
252 {
253 if (bundleName.empty()) {
254 APP_LOGW("update failed: bundle name is empty");
255 return false;
256 }
257
258 // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
259 std::unique_lock<std::shared_mutex> lck(bundleInfoMutex_);
260 std::lock_guard<std::mutex> lock(stateMutex_);
261 auto item = installStates_.find(bundleName);
262 if (item == installStates_.end()) {
263 if (state == InstallState::INSTALL_START) {
264 installStates_.emplace(bundleName, state);
265 APP_LOGD("update succeed");
266 return true;
267 }
268 APP_LOGW("update failed: incorrect state, -n: %{public}s", bundleName.c_str());
269 return false;
270 }
271
272 auto stateRange = transferStates_.equal_range(state);
273 for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
274 if (item->second == previousState->second) {
275 APP_LOGD("update succeed, current:%{public}d, state:%{public}d",
276 static_cast<int32_t>(previousState->second), static_cast<int32_t>(state));
277 if (IsDeleteDataState(state)) {
278 installStates_.erase(item);
279 DeleteBundleInfo(bundleName, state, isKeepData);
280 return true;
281 }
282 item->second = state;
283 return true;
284 }
285 }
286 APP_LOGW_NOFUNC("UpdateBundleInstallState -n %{public}s fail current:%{public}d state:%{public}d",
287 bundleName.c_str(), static_cast<int32_t>(item->second), static_cast<int32_t>(state));
288 return false;
289 }
290
AddInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info,bool checkStatus)291 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info, bool checkStatus)
292 {
293 APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
294 if (bundleName.empty()) {
295 APP_LOGW("save info fail, empty bundle name");
296 return false;
297 }
298
299 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
300 auto infoItem = bundleInfos_.find(bundleName);
301 if (infoItem != bundleInfos_.end()) {
302 APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
303 return false;
304 }
305 std::lock_guard<std::mutex> stateLock(stateMutex_);
306 auto statusItem = installStates_.find(bundleName);
307 if (statusItem == installStates_.end()) {
308 APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
309 return false;
310 }
311 if (!checkStatus || statusItem->second == InstallState::INSTALL_START) {
312 APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
313 if (info.GetBaseApplicationInfo().needAppDetail) {
314 AddAppDetailAbilityInfo(info);
315 }
316 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
317 if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
318 InnerBundleInfo newInfo = info;
319 std::string targetBundleName = newInfo.GetTargetBundleName();
320 auto targetInfoItem = bundleInfos_.find(targetBundleName);
321 if (targetInfoItem != bundleInfos_.end()) {
322 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
323 // storage target bundle info
324 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
325 }
326 }
327 if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
328 info.SetOverlayModuleState(info.GetCurrentModulePackage(), OverlayState::OVERLAY_INVALID,
329 info.GetUserId());
330 }
331 if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
332 // build overlay connection for external overlay
333 BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
334 }
335 #endif
336 bundleInfos_.emplace(bundleName, info);
337 AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
338 return true;
339 }
340 return false;
341 }
342
AddNewModuleInfo(const std::string & bundleName,const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)343 bool BundleDataMgr::AddNewModuleInfo(
344 const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
345 {
346 LOG_I(BMS_TAG_DEFAULT, "addInfo:%{public}s", newInfo.GetCurrentModulePackage().c_str());
347 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
348 auto infoItem = bundleInfos_.find(bundleName);
349 if (infoItem == bundleInfos_.end()) {
350 APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
351 return false;
352 }
353 std::lock_guard<std::mutex> stateLock(stateMutex_);
354 auto statusItem = installStates_.find(bundleName);
355 if (statusItem == installStates_.end()) {
356 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
357 return false;
358 }
359 if (statusItem->second == InstallState::UPDATING_SUCCESS) {
360 if (AddNewModuleInfo(newInfo, oldInfo)) {
361 bundleInfos_.at(bundleName) = oldInfo;
362 return true;
363 }
364 }
365 return false;
366 }
367
UpdateBaseBundleInfoIntoOld(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)368 void BundleDataMgr::UpdateBaseBundleInfoIntoOld(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
369 {
370 oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
371 oldInfo.UpdateBaseApplicationInfo(newInfo);
372 oldInfo.UpdateRemovable(newInfo.IsPreInstallApp(), newInfo.IsRemovable());
373 oldInfo.UpdateMultiAppMode(newInfo);
374 oldInfo.UpdateReleaseType(newInfo);
375 oldInfo.SetAppType(newInfo.GetAppType());
376 oldInfo.SetAppFeature(newInfo.GetAppFeature());
377 }
378
AddNewModuleInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)379 bool BundleDataMgr::AddNewModuleInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
380 {
381 APP_LOGD("save bundle:%{public}s info", oldInfo.GetBundleName().c_str());
382 ProcessAllowedAcls(newInfo, oldInfo);
383 if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
384 UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
385 }
386 if (oldInfo.GetOldAppIds().empty()) {
387 oldInfo.AddOldAppId(oldInfo.GetAppId());
388 }
389 oldInfo.SetProvisionId(newInfo.GetProvisionId());
390 oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
391 oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
392 oldInfo.SetCertificate(newInfo.GetCertificate());
393 oldInfo.AddOldAppId(newInfo.GetAppId());
394 oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
395 oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
396 oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
397 oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
398 oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
399 oldInfo.AddModuleInfo(newInfo);
400 oldInfo.UpdateAppDetailAbilityAttrs();
401 if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
402 AddAppDetailAbilityInfo(oldInfo);
403 }
404 oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
405 oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
406 oldInfo.UpdateOdidByBundleInfo(newInfo);
407 oldInfo.SetDFXParamStatus();
408 oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
409 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
410 if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
411 oldInfo.SetOverlayType(newInfo.GetOverlayType());
412 }
413 if (!UpdateOverlayInfo(newInfo, oldInfo)) {
414 APP_LOGD("bundleName: %{public}s : update overlay info failed", oldInfo.GetBundleName().c_str());
415 return false;
416 }
417 #endif
418 APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
419 return true;
420 }
421
RemoveModuleInfo(const std::string & bundleName,const std::string & modulePackage,InnerBundleInfo & oldInfo,bool needSaveStorage)422 bool BundleDataMgr::RemoveModuleInfo(
423 const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo, bool needSaveStorage)
424 {
425 APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
426 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
427 auto infoItem = bundleInfos_.find(bundleName);
428 if (infoItem == bundleInfos_.end()) {
429 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
430 return false;
431 }
432 std::lock_guard<std::mutex> stateLock(stateMutex_);
433 auto statusItem = installStates_.find(bundleName);
434 if (statusItem == installStates_.end()) {
435 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
436 return false;
437 }
438 if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
439 APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
440 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
441 std::string targetBundleName = oldInfo.GetTargetBundleName();
442 InnerBundleInfo targetInnerBundleInfo;
443 if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
444 targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
445 }
446 OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
447 targetInnerBundleInfo);
448 if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
449 // save target innerBundleInfo
450 if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
451 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
452 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
453 }
454 }
455 // remove target module and overlay module state will change to OVERLAY_INVALID
456 if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
457 ResetExternalOverlayModuleState(bundleName, modulePackage);
458 }
459 #endif
460 oldInfo.RemoveModuleInfo(modulePackage);
461 oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
462 if (!oldInfo.isExistedOverlayModule()) {
463 oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
464 }
465 oldInfo.SetDFXParamStatus();
466 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(oldInfo)) {
467 APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
468 return false;
469 }
470 DeleteRouterInfo(bundleName, modulePackage);
471 bundleInfos_.at(bundleName) = oldInfo;
472 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
473 }
474 return true;
475 }
476
UpdateUninstallBundleInfo(const std::string & bundleName,const UninstallBundleInfo & uninstallBundleInfo)477 bool BundleDataMgr::UpdateUninstallBundleInfo(const std::string &bundleName,
478 const UninstallBundleInfo &uninstallBundleInfo)
479 {
480 if (uninstallDataMgr_ == nullptr) {
481 APP_LOGE("rdbDataManager is null");
482 return false;
483 }
484 if (bundleName.empty() || uninstallBundleInfo.userInfos.empty()) {
485 APP_LOGE("param error");
486 return false;
487 }
488 UninstallBundleInfo oldUninstallBundleInfo;
489 if (uninstallDataMgr_->GetUninstallBundleInfo(bundleName, oldUninstallBundleInfo)) {
490 std::string newUser = uninstallBundleInfo.userInfos.begin()->first;
491 if (oldUninstallBundleInfo.userInfos.find(newUser) != oldUninstallBundleInfo.userInfos.end()) {
492 APP_LOGE("u %{public}s has been saved", newUser.c_str());
493 return false;
494 }
495 oldUninstallBundleInfo.userInfos[newUser] = uninstallBundleInfo.userInfos.begin()->second;
496 return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, oldUninstallBundleInfo);
497 }
498 return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
499 }
500
GetUninstallBundleInfo(const std::string & bundleName,UninstallBundleInfo & uninstallBundleInfo)501 bool BundleDataMgr::GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)
502 {
503 if (uninstallDataMgr_ == nullptr) {
504 APP_LOGE("rdbDataManager is null");
505 return false;
506 }
507 if (bundleName.empty()) {
508 APP_LOGE("param error");
509 return false;
510 }
511 return uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo);
512 }
513
GetAllUninstallBundleInfo(std::map<std::string,UninstallBundleInfo> & uninstallBundleInfos)514 bool BundleDataMgr::GetAllUninstallBundleInfo(
515 std::map<std::string, UninstallBundleInfo> &uninstallBundleInfos)
516 {
517 if (uninstallDataMgr_ == nullptr) {
518 APP_LOGE("rdbDataManager is null");
519 return false;
520 }
521 return uninstallDataMgr_->GetAllUninstallBundleInfo(uninstallBundleInfos);
522 }
523
DeleteUninstallBundleInfo(const std::string & bundleName,int32_t userId)524 bool BundleDataMgr::DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)
525 {
526 if (uninstallDataMgr_ == nullptr) {
527 APP_LOGE("rdbDataManager is null");
528 return false;
529 }
530 if (bundleName.empty()) {
531 APP_LOGE("param error");
532 return false;
533 }
534 UninstallBundleInfo uninstallBundleInfo;
535 if (!uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo)) {
536 APP_LOGE("bundle %{public}s is not found", bundleName.c_str());
537 return false;
538 }
539 auto it = uninstallBundleInfo.userInfos.find(std::to_string(userId));
540 if (it == uninstallBundleInfo.userInfos.end()) {
541 APP_LOGE("user %{public}d is not found", userId);
542 return false;
543 }
544 uninstallBundleInfo.userInfos.erase(std::to_string(userId));
545 if (uninstallBundleInfo.userInfos.empty()) {
546 return uninstallDataMgr_->DeleteUninstallBundleInfo(bundleName);
547 }
548 return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
549 }
550
AddFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,const FirstInstallBundleInfo & firstInstallBundleInfo)551 bool BundleDataMgr::AddFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
552 const FirstInstallBundleInfo &firstInstallBundleInfo)
553 {
554 if (bundleName.empty()) {
555 APP_LOGE("bundleName is empty");
556 return false;
557 }
558 if (firstInstallDataMgr_ == nullptr) {
559 APP_LOGE("firstInstallDataMgr_ is null");
560 return false;
561 }
562
563 if (firstInstallDataMgr_->IsExistFirstInstallBundleInfo(bundleName, userId)) {
564 APP_LOGW("bundleName %{public}s, user %{public}d has been saved", bundleName.c_str(), userId);
565 return true;
566 }
567 return firstInstallDataMgr_->AddFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
568 }
569
GetFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,FirstInstallBundleInfo & firstInstallBundleInfo)570 bool BundleDataMgr::GetFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
571 FirstInstallBundleInfo &firstInstallBundleInfo)
572 {
573 if (bundleName.empty()) {
574 APP_LOGE("bundleName is empty");
575 return false;
576 }
577 if (firstInstallDataMgr_ == nullptr) {
578 APP_LOGE("firstInstallDataMgr_ is null");
579 return false;
580 }
581 return firstInstallDataMgr_->GetFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
582 }
583
DeleteFirstInstallBundleInfo(int32_t userId)584 bool BundleDataMgr::DeleteFirstInstallBundleInfo(int32_t userId)
585 {
586 if (firstInstallDataMgr_ == nullptr) {
587 APP_LOGE("firstInstallDataMgr_ is null");
588 return false;
589 }
590 return firstInstallDataMgr_->DeleteFirstInstallBundleInfo(userId);
591 }
592
RemoveHspModuleByVersionCode(int32_t versionCode,InnerBundleInfo & info)593 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
594 {
595 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
596 std::string bundleName = info.GetBundleName();
597 auto infoItem = bundleInfos_.find(bundleName);
598 if (infoItem == bundleInfos_.end()) {
599 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
600 return false;
601 }
602 std::lock_guard<std::mutex> stateLock(stateMutex_);
603 auto statusItem = installStates_.find(bundleName);
604 if (statusItem == installStates_.end()) {
605 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
606 return false;
607 }
608 if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
609 info.DeleteHspModuleByVersion(versionCode);
610 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
611 if (dataStorage_->SaveStorageBundleInfo(info)) {
612 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
613 bundleInfos_.at(bundleName) = info;
614 return true;
615 }
616 }
617 return true;
618 }
619
AddInnerBundleUserInfo(const std::string & bundleName,const InnerBundleUserInfo & newUserInfo)620 bool BundleDataMgr::AddInnerBundleUserInfo(
621 const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
622 {
623 APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
624 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
625 auto infoItem = bundleInfos_.find(bundleName);
626 if (infoItem == bundleInfos_.end()) {
627 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
628 return false;
629 }
630
631 std::lock_guard<std::mutex> stateLock(stateMutex_);
632 auto& info = bundleInfos_.at(bundleName);
633 info.AddInnerBundleUserInfo(newUserInfo);
634 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
635 if (!dataStorage_->SaveStorageBundleInfo(info)) {
636 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
637 return false;
638 }
639 return true;
640 }
641
RemoveInnerBundleUserInfo(const std::string & bundleName,int32_t userId)642 bool BundleDataMgr::RemoveInnerBundleUserInfo(
643 const std::string &bundleName, int32_t userId)
644 {
645 APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
646 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
647 auto infoItem = bundleInfos_.find(bundleName);
648 if (infoItem == bundleInfos_.end()) {
649 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
650 return false;
651 }
652
653 std::lock_guard<std::mutex> stateLock(stateMutex_);
654 auto& info = bundleInfos_.at(bundleName);
655 info.RemoveInnerBundleUserInfo(userId);
656 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
657 if (!dataStorage_->SaveStorageBundleInfo(info)) {
658 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
659 return false;
660 }
661
662 bundleStateStorage_->DeleteBundleState(bundleName, userId);
663 return true;
664 }
665
UpdateInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)666 bool BundleDataMgr::UpdateInnerBundleInfo(
667 const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
668 {
669 LOG_I(BMS_TAG_DEFAULT, "updateInfo:%{public}s", bundleName.c_str());
670 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
671 auto infoItem = bundleInfos_.find(bundleName);
672 if (infoItem == bundleInfos_.end()) {
673 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
674 return false;
675 }
676 std::lock_guard<std::mutex> stateLock(stateMutex_);
677 auto statusItem = installStates_.find(bundleName);
678 if (statusItem == installStates_.end()) {
679 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
680 return false;
681 }
682 // ROLL_BACK and USER_CHANGE should not be here
683 if (statusItem->second == InstallState::UPDATING_SUCCESS
684 || statusItem->second == InstallState::ROLL_BACK
685 || statusItem->second == InstallState::USER_CHANGE) {
686 APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
687 oldInfo.GetBundleName().c_str(), newInfo.GetCurrentModulePackage().c_str());
688 if (UpdateInnerBundleInfo(newInfo, oldInfo)) {
689 bundleInfos_.at(bundleName) = oldInfo;
690 APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
691 return true;
692 }
693 }
694 return false;
695 }
696
UpdateInnerBundleInfo(InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)697 bool BundleDataMgr::UpdateInnerBundleInfo(InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
698 {
699 if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
700 oldInfo.KeepOldOverlayConnection(newInfo);
701 }
702 ProcessAllowedAcls(newInfo, oldInfo);
703 oldInfo.UpdateModuleInfo(newInfo);
704 oldInfo.SetDFXParamStatus();
705 // 1.exist entry, update entry.
706 // 2.only exist feature, update feature.
707 if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
708 UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
709 }
710 oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
711 if (oldInfo.GetOldAppIds().empty()) {
712 oldInfo.AddOldAppId(oldInfo.GetAppId());
713 }
714 oldInfo.AddOldAppId(newInfo.GetAppId());
715 oldInfo.SetProvisionId(newInfo.GetProvisionId());
716 oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
717 oldInfo.SetCertificate(newInfo.GetCertificate());
718 oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
719 oldInfo.UpdateAppDetailAbilityAttrs();
720 oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
721 if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
722 AddAppDetailAbilityInfo(oldInfo);
723 }
724 oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
725 oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
726 oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
727 if (newInfo.GetAppCrowdtestDeadline() != Constants::INHERIT_CROWDTEST_DEADLINE) {
728 oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
729 }
730 oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
731 // clear apply quick fix frequency
732 oldInfo.ResetApplyQuickFixFrequency();
733 oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
734 oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
735 oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
736 oldInfo.UpdateOdidByBundleInfo(newInfo);
737 oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
738 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
739 if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
740 if (!UpdateOverlayInfo(newInfo, oldInfo)) {
741 APP_LOGD("update overlay info failed");
742 return false;
743 }
744 }
745 if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
746 APP_LOGD("update overlay info failed");
747 return false;
748 }
749 #endif
750 return true;
751 }
752
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const753 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
754 int32_t appIndex) const
755 {
756 int32_t requestUserId = GetUserId(userId);
757 if (requestUserId == Constants::INVALID_USERID) {
758 APP_LOGE("request user id is invalid");
759 return false;
760 }
761
762 ElementName element = want.GetElement();
763 std::string bundleName = element.GetBundleName();
764 std::string abilityName = element.GetAbilityName();
765 LOG_D(BMS_TAG_QUERY, "QueryAbilityInfo bundleName:%{public}s abilityName:%{public}s",
766 bundleName.c_str(), abilityName.c_str());
767 // explicit query
768 if (!bundleName.empty() && !abilityName.empty()) {
769 bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
770 if (!ret) {
771 LOG_NOFUNC_D(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d"
772 " -i %{public}d", bundleName.c_str(), abilityName.c_str(), userId, appIndex);
773 return false;
774 }
775 return true;
776 }
777 std::vector<AbilityInfo> abilityInfos;
778 bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
779 if (!ret) {
780 LOG_D(BMS_TAG_QUERY,
781 "implicit queryAbilityInfos error action:%{public}s uri:%{private}s type:%{public}s",
782 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
783 return false;
784 }
785 if (abilityInfos.size() == 0) {
786 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s",
787 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
788 return false;
789 }
790 abilityInfo = abilityInfos[0];
791 return true;
792 }
793
GetCloneAbilityInfos(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const794 void BundleDataMgr::GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos,
795 const ElementName &element, int32_t flags, int32_t userId) const
796 {
797 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
798 if (cloneAppIndexes.empty()) {
799 APP_LOGI("clone app index is empty");
800 return;
801 }
802 for (int32_t appIndex: cloneAppIndexes) {
803 AbilityInfo cloneAbilityInfo;
804 bool ret = ExplicitQueryCloneAbilityInfo(element, flags, userId, appIndex, cloneAbilityInfo);
805 if (ret) {
806 abilityInfos.emplace_back(cloneAbilityInfo);
807 }
808 }
809 }
810
GetCloneAbilityInfosV9(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const811 void BundleDataMgr::GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos,
812 const ElementName &element, int32_t flags, int32_t userId) const
813 {
814 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
815 if (cloneAppIndexes.empty()) {
816 APP_LOGI("clone app index is empty");
817 return;
818 }
819 for (int32_t appIndex: cloneAppIndexes) {
820 AbilityInfo cloneAbilityInfo;
821 ErrCode ret = ExplicitQueryCloneAbilityInfoV9(element, flags, userId, appIndex, cloneAbilityInfo);
822 if (ret == ERR_OK) {
823 abilityInfos.emplace_back(cloneAbilityInfo);
824 }
825 }
826 }
827
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const828 bool BundleDataMgr::QueryAbilityInfos(
829 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
830 {
831 int32_t requestUserId = GetUserId(userId);
832 if (requestUserId == Constants::INVALID_USERID) {
833 APP_LOGE("request user id is invalid");
834 return false;
835 }
836
837 ElementName element = want.GetElement();
838 std::string bundleName = element.GetBundleName();
839 std::string abilityName = element.GetAbilityName();
840 LOG_D(BMS_TAG_QUERY, "QueryAbilityInfos bundleName:%{public}s abilityName:%{public}s",
841 bundleName.c_str(), abilityName.c_str());
842 // explicit query
843 if (!bundleName.empty() && !abilityName.empty()) {
844 AbilityInfo abilityInfo;
845 bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
846 LOG_D(BMS_TAG_QUERY, "explicit query ret:%{public}d bundleName:%{public}s abilityName:%{public}s",
847 ret, bundleName.c_str(), abilityName.c_str());
848 if (ret) {
849 abilityInfos.emplace_back(abilityInfo);
850 }
851 // get cloneApp's abilityInfos
852 GetCloneAbilityInfos(abilityInfos, element, flags, userId);
853 if (abilityInfos.empty()) {
854 LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d",
855 bundleName.c_str(), abilityName.c_str(), userId);
856 }
857 return !abilityInfos.empty();
858 }
859 // implicit query
860 (void)ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
861 ImplicitQueryCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
862 if (abilityInfos.size() == 0) {
863 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
864 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
865 requestUserId);
866 return false;
867 }
868 return true;
869 }
870
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const871 ErrCode BundleDataMgr::QueryAbilityInfosV9(
872 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
873 {
874 int32_t requestUserId = GetUserId(userId);
875 if (requestUserId == Constants::INVALID_USERID) {
876 APP_LOGE("request user id is invalid");
877 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
878 }
879
880 ElementName element = want.GetElement();
881 std::string bundleName = element.GetBundleName();
882 std::string abilityName = element.GetAbilityName();
883 LOG_D(BMS_TAG_QUERY, "QueryAbilityInfosV9 bundleName:%{public}s abilityName:%{public}s",
884 bundleName.c_str(), abilityName.c_str());
885 // explicit query
886 if (!bundleName.empty() && !abilityName.empty()) {
887 AbilityInfo abilityInfo;
888 ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
889 LOG_D(BMS_TAG_QUERY, "explicit queryV9 ret:%{public}d, bundleName:%{public}s abilityName:%{public}s",
890 ret, bundleName.c_str(), abilityName.c_str());
891 if (ret == ERR_OK) {
892 abilityInfos.emplace_back(abilityInfo);
893 }
894 // get cloneApp's abilityInfos
895 GetCloneAbilityInfosV9(abilityInfos, element, flags, userId);
896 if (abilityInfos.empty()) {
897 LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility V9 error -n %{public}s -a %{public}s -u %{public}d",
898 bundleName.c_str(), abilityName.c_str(), userId);
899 return ret;
900 }
901 return ERR_OK;
902 }
903 // implicit query
904 ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
905 ImplicitQueryCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
906 if (abilityInfos.empty()) {
907 if (ret != ERR_OK) {
908 return ret;
909 }
910 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
911 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
912 requestUserId);
913 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
914 }
915 return ERR_OK;
916 }
917
BatchQueryAbilityInfos(const std::vector<Want> & wants,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const918 ErrCode BundleDataMgr::BatchQueryAbilityInfos(
919 const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
920 {
921 int32_t requestUserId = GetUserId(userId);
922 if (requestUserId == Constants::INVALID_USERID) {
923 APP_LOGE("request user id is invalid");
924 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
925 }
926
927 for (size_t i = 0; i < wants.size(); i++) {
928 std::vector<AbilityInfo> tmpAbilityInfos;
929 ElementName element = wants[i].GetElement();
930 std::string bundleName = element.GetBundleName();
931 std::string abilityName = element.GetAbilityName();
932 APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
933 bundleName.c_str(), abilityName.c_str());
934 // explicit query
935 if (!bundleName.empty() && !abilityName.empty()) {
936 AbilityInfo abilityInfo;
937 ErrCode ret = ExplicitQueryAbilityInfoV9(wants[i], flags, requestUserId, abilityInfo);
938 if (ret != ERR_OK) {
939 APP_LOGE("explicit queryAbilityInfoV9 error:%{public}d, bundleName:%{public}s, abilityName:%{public}s",
940 ret, bundleName.c_str(), abilityName.c_str());
941 return ret;
942 }
943 tmpAbilityInfos.emplace_back(abilityInfo);
944 } else {
945 // implicit query
946 ErrCode ret = ImplicitQueryAbilityInfosV9(wants[i], flags, requestUserId, tmpAbilityInfos);
947 if (ret != ERR_OK) {
948 APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
949 wants[i].GetAction().c_str(), wants[i].GetUriString().c_str(), wants[i].GetType().c_str());
950 return ret;
951 }
952 }
953 for (size_t j = 0; j < tmpAbilityInfos.size(); j++) {
954 auto it = std::find_if(abilityInfos.begin(), abilityInfos.end(),
955 [&](const AbilityInfo& info) {
956 return tmpAbilityInfos[j].bundleName == info.bundleName &&
957 tmpAbilityInfos[j].moduleName == info.moduleName &&
958 tmpAbilityInfos[j].name == info.name;
959 });
960 if (it == abilityInfos.end()) {
961 abilityInfos.push_back(tmpAbilityInfos[j]);
962 }
963 }
964 }
965
966 if (abilityInfos.empty()) {
967 APP_LOGW("no matching abilityInfo");
968 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
969 }
970
971 return ERR_OK;
972 }
973
ExplicitQueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const974 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
975 AbilityInfo &abilityInfo, int32_t appIndex) const
976 {
977 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
978 ElementName element = want.GetElement();
979 std::string bundleName = element.GetBundleName();
980 std::string abilityName = element.GetAbilityName();
981 std::string moduleName = element.GetModuleName();
982 LOG_D(BMS_TAG_QUERY,
983 "ExplicitQueryAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
984 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
985 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
986
987 int32_t requestUserId = GetUserId(userId);
988 if (requestUserId == Constants::INVALID_USERID) {
989 APP_LOGE("request user id is invalid");
990 return false;
991 }
992
993 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
994 InnerBundleInfo innerBundleInfo;
995 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
996 LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
997 return false;
998 }
999 // explict query from sandbox manager
1000 if (appIndex > 0) {
1001 if (sandboxAppHelper_ == nullptr) {
1002 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1003 return false;
1004 }
1005 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1006 if (ret != ERR_OK) {
1007 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1008 ret, bundleName.c_str());
1009 return false;
1010 }
1011 }
1012
1013 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1014 auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
1015 if (!ability) {
1016 LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility not found UIAbility -n %{public}s -m %{public}s "
1017 "-a %{public}s -u %{public}d", bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), responseUserId);
1018 return false;
1019 }
1020 return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1021 }
1022
ExplicitQueryAbilityInfoV9(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const1023 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
1024 AbilityInfo &abilityInfo, int32_t appIndex) const
1025 {
1026 ElementName element = want.GetElement();
1027 std::string bundleName = element.GetBundleName();
1028 std::string abilityName = element.GetAbilityName();
1029 std::string moduleName = element.GetModuleName();
1030 LOG_D(BMS_TAG_QUERY,
1031 "ExplicitQueryAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
1032 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1033 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1034 int32_t requestUserId = GetUserId(userId);
1035 if (requestUserId == Constants::INVALID_USERID) {
1036 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1037 }
1038 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1039 InnerBundleInfo innerBundleInfo;
1040 if (appIndex == 0) {
1041 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
1042 if (ret != ERR_OK) {
1043 LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
1044 return ret;
1045 }
1046 }
1047 // explict query from sandbox manager
1048 if (appIndex > 0) {
1049 if (sandboxAppHelper_ == nullptr) {
1050 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1051 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1052 }
1053 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1054 if (ret != ERR_OK) {
1055 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1056 ret, bundleName.c_str());
1057 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1058 }
1059 }
1060
1061 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1062 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
1063 if (!ability) {
1064 LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 not found UIAbility -n %{public}s -m %{public}s "
1065 "-a %{public}s", bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1066 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1067 }
1068
1069 return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1070 }
1071
FilterAbilityInfosByModuleName(const std::string & moduleName,std::vector<AbilityInfo> & abilityInfos) const1072 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
1073 std::vector<AbilityInfo> &abilityInfos) const
1074 {
1075 LOG_D(BMS_TAG_QUERY, "FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
1076 if (moduleName.empty()) {
1077 return;
1078 }
1079 for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
1080 if (iter->moduleName != moduleName) {
1081 iter = abilityInfos.erase(iter);
1082 } else {
1083 ++iter;
1084 }
1085 }
1086 }
1087
ImplicitQueryCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1088 void BundleDataMgr::ImplicitQueryCloneAbilityInfos(
1089 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1090 {
1091 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfos");
1092 int32_t requestUserId = GetUserId(userId);
1093 if (requestUserId == Constants::INVALID_USERID) {
1094 return;
1095 }
1096
1097 if (want.GetAction().empty() && want.GetEntities().empty()
1098 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1099 LOG_E(BMS_TAG_QUERY, "param invalid");
1100 return;
1101 }
1102 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1103 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1104 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1105 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1106 if (bundleInfos_.empty()) {
1107 LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1108 return;
1109 }
1110 std::string bundleName = want.GetElement().GetBundleName();
1111 if (!bundleName.empty()) {
1112 // query in current bundleName
1113 if (!ImplicitQueryCurCloneAbilityInfos(want, flags, requestUserId, abilityInfos)) {
1114 return;
1115 }
1116 } else {
1117 // query all
1118 ImplicitQueryAllCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
1119 }
1120 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1121 // sort by priority, descending order.
1122 if (abilityInfos.size() > 1) {
1123 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1124 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1125 }
1126 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfos");
1127 }
1128
ImplicitQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1129 bool BundleDataMgr::ImplicitQueryAbilityInfos(
1130 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1131 {
1132 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1133 int32_t requestUserId = GetUserId(userId);
1134 if (requestUserId == Constants::INVALID_USERID) {
1135 return false;
1136 }
1137
1138 if (want.GetAction().empty() && want.GetEntities().empty()
1139 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1140 LOG_E(BMS_TAG_QUERY, "param invalid");
1141 return false;
1142 }
1143 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1144 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1145 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1146 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1147 if (bundleInfos_.empty()) {
1148 LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1149 return false;
1150 }
1151 std::string bundleName = want.GetElement().GetBundleName();
1152 if (!bundleName.empty()) {
1153 // query in current bundleName
1154 if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
1155 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s",
1156 bundleName.c_str());
1157 return false;
1158 }
1159 } else {
1160 // query all
1161 ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
1162 }
1163 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1164 // sort by priority, descending order.
1165 if (abilityInfos.size() > 1) {
1166 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1167 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1168 }
1169 return true;
1170 }
1171
ImplicitQueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1172 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
1173 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1174 {
1175 int32_t requestUserId = GetUserId(userId);
1176 if (requestUserId == Constants::INVALID_USERID) {
1177 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1178 }
1179
1180 if (want.GetAction().empty() && want.GetEntities().empty()
1181 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1182 LOG_E(BMS_TAG_QUERY, "param invalid");
1183 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1184 }
1185 LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1186 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1187 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1188 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1189 if (bundleInfos_.empty()) {
1190 APP_LOGW("bundleInfos_ is empty");
1191 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1192 }
1193 std::string bundleName = want.GetElement().GetBundleName();
1194 if (!bundleName.empty()) {
1195 // query in current bundleName
1196 ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1197 if (ret != ERR_OK) {
1198 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed bundleName:%{public}s",
1199 bundleName.c_str());
1200 return ret;
1201 }
1202 } else {
1203 // query all
1204 ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1205 }
1206 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1207 // sort by priority, descending order.
1208 if (abilityInfos.size() > 1) {
1209 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1210 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1211 }
1212 return ERR_OK;
1213 }
1214
ImplicitQueryCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1215 void BundleDataMgr::ImplicitQueryCloneAbilityInfosV9(
1216 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1217 {
1218 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfosV9");
1219 int32_t requestUserId = GetUserId(userId);
1220 if (requestUserId == Constants::INVALID_USERID) {
1221 return;
1222 }
1223 if (want.GetAction().empty() && want.GetEntities().empty()
1224 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1225 LOG_E(BMS_TAG_QUERY, "param invalid");
1226 return;
1227 }
1228 LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1229 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1230 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1231
1232 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1233 if (bundleInfos_.empty()) {
1234 APP_LOGW("bundleInfos_ is empty");
1235 return;
1236 }
1237 std::string bundleName = want.GetElement().GetBundleName();
1238 if (!bundleName.empty()) {
1239 // query in current bundleName
1240 if (!ImplicitQueryCurCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos)) {
1241 return;
1242 }
1243 } else {
1244 // query all
1245 ImplicitQueryAllCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
1246 }
1247 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1248 // sort by priority, descending order.
1249 if (abilityInfos.size() > 1) {
1250 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1251 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1252 }
1253 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfosV9");
1254 }
1255
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1256 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
1257 const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const
1258 {
1259 LOG_D(BMS_TAG_QUERY,
1260 "begin to QueryAbilityInfoWithFlags flags=%{public}d,userId=%{public}d,appIndex=%{public}d",
1261 flags, userId, appIndex);
1262 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1263 !innerBundleInfo.IsSystemApp()) {
1264 LOG_W(BMS_TAG_QUERY, "no system app ability info for this calling");
1265 return false;
1266 }
1267 if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1268 if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1269 LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1270 option->bundleName.c_str(), option->name.c_str());
1271 return false;
1272 }
1273 }
1274 info = (*option);
1275 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
1276 info.permissions.clear();
1277 }
1278 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1279 info.metaData.customizeData.clear();
1280 info.metadata.clear();
1281 }
1282 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
1283 info.skills.clear();
1284 }
1285 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
1286 innerBundleInfo.GetApplicationInfo(
1287 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
1288 }
1289 // set uid for NAPI cache use
1290 InnerBundleUserInfo innerBundleUserInfo;
1291 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1292 if (appIndex == 0) {
1293 info.uid = innerBundleUserInfo.uid;
1294 } else {
1295 std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1296 if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1297 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1298 info.uid = cloneInfo.uid;
1299 info.appIndex = cloneInfo.appIndex;
1300 } else {
1301 LOG_W(BMS_TAG_QUERY, "can't find cloneInfos");
1302 return false;
1303 }
1304 }
1305 }
1306 return true;
1307 }
1308
IsSystemApp(const std::string & bundleName,bool & isSystemApp)1309 ErrCode BundleDataMgr::IsSystemApp(const std::string &bundleName, bool &isSystemApp)
1310 {
1311 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1312 auto bundleInfoItem = bundleInfos_.find(bundleName);
1313 if (bundleInfoItem == bundleInfos_.end()) {
1314 APP_LOGW("%{public}s not found", bundleName.c_str());
1315 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1316 }
1317 isSystemApp = bundleInfoItem->second.IsSystemApp();
1318 return ERR_OK;
1319 }
1320
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1321 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
1322 int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info,
1323 int32_t appIndex) const
1324 {
1325 LOG_D(BMS_TAG_QUERY, "begin to QueryAbilityInfoWithFlagsV9");
1326 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1327 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
1328 !innerBundleInfo.IsSystemApp()) {
1329 LOG_W(BMS_TAG_QUERY, "target not system app");
1330 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1331 }
1332 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1333 if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1334 LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1335 option->bundleName.c_str(), option->name.c_str());
1336 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1337 }
1338 }
1339 info = (*option);
1340 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1341 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1342 info.permissions.clear();
1343 }
1344 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1345 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1346 info.metaData.customizeData.clear();
1347 info.metadata.clear();
1348 }
1349 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1350 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1351 info.skills.clear();
1352 }
1353 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1354 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1355 innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1356 userId, info.applicationInfo, appIndex);
1357 }
1358 // set uid for NAPI cache use
1359 InnerBundleUserInfo innerBundleUserInfo;
1360 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1361 if (appIndex == 0) {
1362 info.uid = innerBundleUserInfo.uid;
1363 } else {
1364 std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1365 if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1366 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1367 info.uid = cloneInfo.uid;
1368 info.appIndex = cloneInfo.appIndex;
1369 } else {
1370 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1371 }
1372 }
1373 }
1374 return ERR_OK;
1375 }
1376
ImplicitQueryCurAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1377 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1378 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1379 {
1380 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfos");
1381 std::string bundleName = want.GetElement().GetBundleName();
1382 InnerBundleInfo innerBundleInfo;
1383 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
1384 LOG_W(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s", bundleName.c_str());
1385 return false;
1386 }
1387 if (appIndex > 0) {
1388 if (sandboxAppHelper_ == nullptr) {
1389 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1390 return false;
1391 }
1392 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1393 if (ret != ERR_OK) {
1394 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode:%{public}d bundleName:%{public}s",
1395 ret, bundleName.c_str());
1396 return false;
1397 }
1398 }
1399 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1400 std::vector<std::string> mimeTypes;
1401 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1402 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1403 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1404 return true;
1405 }
1406
ImplicitQueryCurCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1407 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1408 std::vector<AbilityInfo> &abilityInfos) const
1409 {
1410 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfos");
1411 std::string bundleName = want.GetElement().GetBundleName();
1412 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1413 if (cloneAppIndexes.empty()) {
1414 return false;
1415 }
1416 std::vector<std::string> mimeTypes;
1417 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1418 for (int32_t appIndex: cloneAppIndexes) {
1419 InnerBundleInfo innerBundleInfo;
1420 if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex)) {
1421 continue;
1422 }
1423 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1424
1425 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1426 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1427 }
1428 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfos");
1429 return true;
1430 }
1431
ImplicitQueryCurAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1432 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1433 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1434 {
1435 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1436 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfosV9");
1437 std::string bundleName = want.GetElement().GetBundleName();
1438 InnerBundleInfo innerBundleInfo;
1439 if (appIndex == 0) {
1440 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1441 if (ret != ERR_OK) {
1442 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s",
1443 bundleName.c_str());
1444 return ret;
1445 }
1446 }
1447 if (appIndex > 0) {
1448 if (sandboxAppHelper_ == nullptr) {
1449 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1450 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1451 }
1452 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1453 if (ret != ERR_OK) {
1454 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d bundleName:%{public}s",
1455 ret, bundleName.c_str());
1456 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1457 }
1458 }
1459 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1460 std::vector<std::string> mimeTypes;
1461 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1462 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1463 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1464 return ERR_OK;
1465 }
1466
ImplicitQueryCurCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1467 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1468 std::vector<AbilityInfo> &abilityInfos) const
1469 {
1470 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfosV9");
1471 std::string bundleName = want.GetElement().GetBundleName();
1472
1473 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1474 if (cloneAppIndexes.empty()) {
1475 return false;
1476 }
1477 std::vector<std::string> mimeTypes;
1478 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1479 for (int32_t appIndex: cloneAppIndexes) {
1480 InnerBundleInfo innerBundleInfo;
1481 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
1482 if (ret != ERR_OK) {
1483 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1484 bundleName.c_str(), appIndex);
1485 continue;
1486 }
1487 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1488 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1489 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1490 }
1491 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfosV9");
1492 return true;
1493 }
1494
ImplicitQueryAllAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1495 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1496 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1497 {
1498 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfos");
1499 int32_t requestUserId = GetUserId(userId);
1500 if (requestUserId == Constants::INVALID_USERID) {
1501 LOG_W(BMS_TAG_QUERY, "invalid userId");
1502 return;
1503 }
1504 std::vector<std::string> mimeTypes;
1505 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1506 // query from bundleInfos_
1507 if (appIndex == 0) {
1508 for (const auto &item : bundleInfos_) {
1509 const InnerBundleInfo &innerBundleInfo = item.second;
1510 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1511 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1512 LOG_D(BMS_TAG_QUERY,
1513 "ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1514 innerBundleInfo.GetBundleName().c_str(), responseUserId);
1515 continue;
1516 }
1517 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1518 }
1519 } else {
1520 // query from sandbox manager for sandbox bundle
1521 if (sandboxAppHelper_ == nullptr) {
1522 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1523 return;
1524 }
1525 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1526 for (const auto &item : sandboxMap) {
1527 InnerBundleInfo info;
1528 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1529 if (pos == std::string::npos) {
1530 LOG_D(BMS_TAG_QUERY, "sandbox map contains invalid element");
1531 continue;
1532 }
1533 std::string innerBundleName = item.first.substr(pos + 1);
1534 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1535 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1536 continue;
1537 }
1538 int32_t responseUserId = info.GetResponseUserId(userId);
1539 GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1540 }
1541 }
1542 APP_LOGD("finish to ImplicitQueryAllAbilityInfos");
1543 }
1544
ImplicitQueryAllCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1545 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1546 std::vector<AbilityInfo> &abilityInfos) const
1547 {
1548 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfos");
1549 int32_t requestUserId = GetUserId(userId);
1550 if (requestUserId == Constants::INVALID_USERID) {
1551 LOG_W(BMS_TAG_QUERY, "invalid userId");
1552 return;
1553 }
1554 std::vector<std::string> mimeTypes;
1555 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1556 for (const auto &item : bundleInfos_) {
1557 const InnerBundleInfo &innerBundleInfo = item.second;
1558 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
1559 if (cloneAppIndexes.empty()) {
1560 continue;
1561 }
1562 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1563 for (int32_t appIndex: cloneAppIndexes) {
1564 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
1565 LOG_D(BMS_TAG_QUERY,
1566 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
1567 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
1568 continue;
1569 }
1570 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1571 }
1572 }
1573 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfos");
1574 }
1575
ImplicitQueryAllAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1576 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1577 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1578 {
1579 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1580 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfosV9");
1581 // query from bundleInfos_
1582 std::vector<std::string> mimeTypes;
1583 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1584 if (appIndex == 0) {
1585 for (const auto &item : bundleInfos_) {
1586 const InnerBundleInfo &innerBundleInfo = item.second;
1587 ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
1588 if (ret != ERR_OK) {
1589 continue;
1590 }
1591
1592 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1593 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1594 }
1595 } else {
1596 // query from sandbox manager for sandbox bundle
1597 if (sandboxAppHelper_ == nullptr) {
1598 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1599 return;
1600 }
1601 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1602 for (const auto &item : sandboxMap) {
1603 InnerBundleInfo info;
1604 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1605 if (pos == std::string::npos) {
1606 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
1607 continue;
1608 }
1609 std::string innerBundleName = item.first.substr(pos + 1);
1610 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1611 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1612 continue;
1613 }
1614
1615 int32_t responseUserId = info.GetResponseUserId(userId);
1616 GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1617 }
1618 }
1619 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllAbilityInfosV9");
1620 }
1621
ImplicitQueryAllCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1622 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1623 std::vector<AbilityInfo> &abilityInfos) const
1624 {
1625 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfosV9");
1626 std::vector<std::string> mimeTypes;
1627 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1628 for (const auto &item : bundleInfos_) {
1629 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(item.second.GetBundleName(), userId);
1630 if (cloneAppIndexes.empty()) {
1631 continue;
1632 }
1633 for (int32_t appIndex: cloneAppIndexes) {
1634 InnerBundleInfo innerBundleInfo;
1635 ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId, appIndex);
1636 if (ret != ERR_OK) {
1637 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1638 item.first.c_str(), appIndex);
1639 continue;
1640 }
1641
1642 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1643 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1644 }
1645 }
1646 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfosV9");
1647 }
1648
CheckAbilityInfoFlagExist(int32_t flags,AbilityInfoFlag abilityInfoFlag) const1649 bool BundleDataMgr::CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const
1650 {
1651 return (static_cast<uint32_t>(flags) & static_cast<uint32_t>(abilityInfoFlag)) == abilityInfoFlag;
1652 }
1653
GetMatchAbilityInfos(const Want & want,int32_t flags,const InnerBundleInfo & info,int32_t userId,std::vector<AbilityInfo> & abilityInfos,const std::vector<std::string> & paramMimeTypes,int32_t appIndex) const1654 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags, const InnerBundleInfo &info,
1655 int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1656 const std::vector<std::string> ¶mMimeTypes, int32_t appIndex) const
1657 {
1658 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1659 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_SYSTEMAPP_ONLY) && !info.IsSystemApp()) {
1660 return;
1661 }
1662 std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1663 for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1664 bool isPrivateType = MatchPrivateType(
1665 want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1666 auto skillsPair = skillInfos.find(abilityInfoPair.first);
1667 if (skillsPair == skillInfos.end()) {
1668 continue;
1669 }
1670 for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1671 const Skill &skill = skillsPair->second[skillIndex];
1672 size_t matchUriIndex = 0;
1673 if (isPrivateType || skill.Match(want, matchUriIndex)) {
1674 AbilityInfo abilityinfo = abilityInfoPair.second;
1675 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1676 continue;
1677 }
1678 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_DISABLE) &&
1679 !info.IsAbilityEnabled(abilityinfo, GetUserId(userId), appIndex)) {
1680 LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityinfo.name.c_str());
1681 continue;
1682 }
1683 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_APPLICATION)) {
1684 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1685 userId, abilityinfo.applicationInfo, appIndex);
1686 }
1687 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_PERMISSION)) {
1688 abilityinfo.permissions.clear();
1689 }
1690 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_METADATA)) {
1691 abilityinfo.metaData.customizeData.clear();
1692 abilityinfo.metadata.clear();
1693 }
1694 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL)) {
1695 abilityinfo.skills.clear();
1696 }
1697 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL_URI)) {
1698 AddSkillUrisInfo(skillsPair->second, abilityinfo.skillUri, skillIndex, matchUriIndex);
1699 }
1700 abilityinfo.appIndex = appIndex;
1701 abilityInfos.emplace_back(abilityinfo);
1702 break;
1703 }
1704 }
1705 }
1706 }
1707
AddSkillUrisInfo(const std::vector<Skill> & skills,std::vector<SkillUriForAbilityAndExtension> & skillUris,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex) const1708 void BundleDataMgr::AddSkillUrisInfo(const std::vector<Skill> &skills,
1709 std::vector<SkillUriForAbilityAndExtension> &skillUris,
1710 std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const
1711 {
1712 for (size_t skillIndex = 0; skillIndex < skills.size(); ++skillIndex) {
1713 const Skill &skill = skills[skillIndex];
1714 for (size_t uriIndex = 0; uriIndex < skill.uris.size(); ++uriIndex) {
1715 const SkillUri &uri = skill.uris[uriIndex];
1716 SkillUriForAbilityAndExtension skillinfo;
1717 skillinfo.scheme = uri.scheme;
1718 skillinfo.host = uri.host;
1719 skillinfo.port = uri.port;
1720 skillinfo.path = uri.path;
1721 skillinfo.pathStartWith = uri.pathStartWith;
1722 skillinfo.pathRegex = uri.pathRegex;
1723 skillinfo.type = uri.type;
1724 skillinfo.utd = uri.utd;
1725 skillinfo.maxFileSupported = uri.maxFileSupported;
1726 skillinfo.linkFeature = uri.linkFeature;
1727 if (matchSkillIndex.has_value() && matchUriIndex.has_value() &&
1728 skillIndex == matchSkillIndex.value() && uriIndex == matchUriIndex.value()) {
1729 skillinfo.isMatch = true;
1730 }
1731 skillUris.emplace_back(skillinfo);
1732 }
1733 }
1734 }
1735
EmplaceAbilityInfo(const InnerBundleInfo & info,const std::vector<Skill> & skills,AbilityInfo & abilityInfo,int32_t flags,int32_t userId,std::vector<AbilityInfo> & infos,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex,int32_t appIndex) const1736 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
1737 AbilityInfo &abilityInfo, int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos,
1738 std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
1739 {
1740 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1741 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1742 if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId), appIndex)) {
1743 LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityInfo.name.c_str());
1744 return;
1745 }
1746 }
1747 if ((static_cast<uint32_t>(flags) &
1748 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1749 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1750 info.GetApplicationInfoV9(static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1751 userId, abilityInfo.applicationInfo, appIndex);
1752 }
1753 if ((static_cast<uint32_t>(flags) &
1754 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1755 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1756 abilityInfo.permissions.clear();
1757 }
1758 if ((static_cast<uint32_t>(flags) &
1759 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1760 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1761 abilityInfo.metaData.customizeData.clear();
1762 abilityInfo.metadata.clear();
1763 }
1764 if ((static_cast<uint32_t>(flags) &
1765 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1766 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1767 abilityInfo.skills.clear();
1768 }
1769 if ((static_cast<uint32_t>(flags) &
1770 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) ==
1771 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) {
1772 AddSkillUrisInfo(skills, abilityInfo.skillUri, matchSkillIndex, matchUriIndex);
1773 }
1774 if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
1775 // set uid for NAPI cache use
1776 InnerBundleUserInfo innerBundleUserInfo;
1777 if (info.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1778 std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1779 if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1780 abilityInfo.uid = innerBundleUserInfo.cloneInfos.at(appIndexKey).uid;
1781 abilityInfo.appIndex = innerBundleUserInfo.cloneInfos.at(appIndexKey).appIndex;
1782 }
1783 }
1784 }
1785 infos.emplace_back(abilityInfo);
1786 }
1787
GetMatchAbilityInfosV9(const Want & want,int32_t flags,const InnerBundleInfo & info,int32_t userId,std::vector<AbilityInfo> & abilityInfos,const std::vector<std::string> & paramMimeTypes,int32_t appIndex) const1788 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags, const InnerBundleInfo &info,
1789 int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1790 const std::vector<std::string> ¶mMimeTypes, int32_t appIndex) const
1791 {
1792 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1793 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1794 static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1795 LOG_W(BMS_TAG_QUERY, "target not system app");
1796 return;
1797 }
1798 std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1799 for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1800 AbilityInfo abilityinfo = abilityInfoPair.second;
1801 auto skillsPair = skillInfos.find(abilityInfoPair.first);
1802 if (skillsPair == skillInfos.end()) {
1803 continue;
1804 }
1805 bool isPrivateType = MatchPrivateType(
1806 want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1807 if (isPrivateType) {
1808 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1809 std::nullopt, std::nullopt, appIndex);
1810 continue;
1811 }
1812 if (want.GetAction() == SHARE_ACTION) {
1813 if (!MatchShare(want, skillsPair->second)) {
1814 continue;
1815 }
1816 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1817 std::nullopt, std::nullopt, appIndex);
1818 continue;
1819 }
1820 for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1821 const Skill &skill = skillsPair->second[skillIndex];
1822 size_t matchUriIndex = 0;
1823 if (skill.Match(want, matchUriIndex)) {
1824 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1825 continue;
1826 }
1827 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1828 skillIndex, matchUriIndex, appIndex);
1829 break;
1830 }
1831 }
1832 }
1833 }
1834
MatchShare(const Want & want,const std::vector<Skill> & skills) const1835 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1836 {
1837 if (want.GetAction() != SHARE_ACTION) {
1838 LOG_E(BMS_TAG_QUERY, "action not action");
1839 return false;
1840 }
1841 std::vector<Skill> shareActionSkills = FindSkillsContainShareAction(skills);
1842 if (shareActionSkills.empty()) {
1843 LOG_D(BMS_TAG_QUERY, "shareActionSkills is empty");
1844 return false;
1845 }
1846 auto wantParams = want.GetParams();
1847 auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1848 int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1849 if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1850 LOG_W(BMS_TAG_QUERY, "Invalid total count");
1851 }
1852 auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1853 auto utds = shareSummary.KeySet();
1854 for (auto &skill : shareActionSkills) {
1855 bool match = true;
1856 for (const auto &utd : utds) {
1857 int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1858 if (!MatchUtd(skill, utd, count)) {
1859 match = false;
1860 break;
1861 }
1862 }
1863 if (match) {
1864 return true;
1865 }
1866 }
1867 return false;
1868 }
1869
MatchUtd(Skill & skill,const std::string & utd,int32_t count) const1870 bool BundleDataMgr::MatchUtd(Skill &skill, const std::string &utd, int32_t count) const
1871 {
1872 if (skill.uris.empty() || count <= DEFAULT_SUMMARY_COUNT) {
1873 LOG_W(BMS_TAG_QUERY, "skill.uris is empty or invalid utd count");
1874 return false;
1875 }
1876 bool isMatch = false;
1877 for (SkillUri &skillUri : skill.uris) {
1878 if (!skillUri.utd.empty()) {
1879 if (MatchUtd(skillUri.utd, utd)) {
1880 skillUri.maxFileSupported -= count;
1881 isMatch = true;
1882 if (skillUri.maxFileSupported < 0) {
1883 return false;
1884 }
1885 }
1886 } else {
1887 if (MatchTypeWithUtd(skillUri.type, utd)) {
1888 skillUri.maxFileSupported -= count;
1889 isMatch = true;
1890 if (skillUri.maxFileSupported < 0) {
1891 return false;
1892 }
1893 }
1894 }
1895 }
1896 return isMatch;
1897 }
1898
MatchUtd(const std::string & skillUtd,const std::string & wantUtd) const1899 bool BundleDataMgr::MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const
1900 {
1901 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1902 LOG_W(BMS_TAG_QUERY, "skillUtd %{public}s, wantUtd %{public}s", skillUtd.c_str(), wantUtd.c_str());
1903 std::shared_ptr<UDMF::TypeDescriptor> wantTypeDescriptor;
1904 auto ret = UDMF::UtdClient::GetInstance().GetTypeDescriptor(wantUtd, wantTypeDescriptor);
1905 if (ret != ERR_OK || wantTypeDescriptor == nullptr) {
1906 LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1907 return false;
1908 }
1909 bool matchRet = false;
1910 ret = wantTypeDescriptor->BelongsTo(skillUtd, matchRet);
1911 if (ret != ERR_OK) {
1912 LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1913 return false;
1914 }
1915 return matchRet;
1916 #endif
1917 return false;
1918 }
1919
MatchTypeWithUtd(const std::string & mimeType,const std::string & wantUtd) const1920 bool BundleDataMgr::MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const
1921 {
1922 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1923 LOG_W(BMS_TAG_QUERY, "mimeType %{public}s, wantUtd %{public}s", mimeType.c_str(), wantUtd.c_str());
1924 std::vector<std::string> typeUtdVector = BundleUtil::GetUtdVectorByMimeType(mimeType);
1925 for (const std::string &typeUtd : typeUtdVector) {
1926 if (MatchUtd(typeUtd, wantUtd)) {
1927 return true;
1928 }
1929 }
1930 return false;
1931 #endif
1932 return false;
1933 }
1934
FindSkillsContainShareAction(const std::vector<Skill> & skills) const1935 std::vector<Skill> BundleDataMgr::FindSkillsContainShareAction(const std::vector<Skill> &skills) const
1936 {
1937 std::vector<Skill> shareActionSkills;
1938 for (const auto &skill : skills) {
1939 auto &actions = skill.actions;
1940 auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1941 return SHARE_ACTION == action;
1942 });
1943 if (matchAction == actions.end()) {
1944 continue;
1945 }
1946 shareActionSkills.emplace_back(skill);
1947 }
1948 return shareActionSkills;
1949 }
1950
ModifyLauncherAbilityInfo(bool isStage,AbilityInfo & abilityInfo) const1951 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1952 {
1953 if (abilityInfo.labelId == 0) {
1954 if (isStage) {
1955 abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1956 abilityInfo.label = abilityInfo.applicationInfo.label;
1957 } else {
1958 abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1959 abilityInfo.label = abilityInfo.bundleName;
1960 }
1961 }
1962
1963 if (abilityInfo.iconId == 0) {
1964 abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1965 }
1966 }
1967
GetMatchLauncherAbilityInfos(const Want & want,const InnerBundleInfo & info,std::vector<AbilityInfo> & abilityInfos,int64_t installTime,int32_t userId) const1968 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1969 const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1970 int64_t installTime, int32_t userId) const
1971 {
1972 int32_t requestUserId = GetUserId(userId);
1973 if (requestUserId == Constants::INVALID_USERID) {
1974 APP_LOGD("request user id is invalid");
1975 return;
1976 }
1977 int32_t responseUserId = info.GetResponseUserId(requestUserId);
1978 if (responseUserId == Constants::INVALID_USERID) {
1979 APP_LOGD("response user id is invalid");
1980 return;
1981 }
1982 // get clone bundle info
1983 InnerBundleUserInfo bundleUserInfo;
1984 (void)info.GetInnerBundleUserInfo(responseUserId, bundleUserInfo);
1985 if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(info.GetBundleName()) !=
1986 ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) {
1987 GetMultiLauncherAbilityInfo(want, info, bundleUserInfo, installTime, abilityInfos);
1988 return;
1989 }
1990 AbilityInfo mainAbilityInfo;
1991 info.GetMainAbilityInfo(mainAbilityInfo);
1992 if (!mainAbilityInfo.name.empty() && (mainAbilityInfo.type == AbilityType::PAGE)) {
1993 APP_LOGD("bundleName %{public}s exist mainAbility", info.GetBundleName().c_str());
1994 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1995 responseUserId, mainAbilityInfo.applicationInfo);
1996 if (mainAbilityInfo.applicationInfo.removable && info.IsNeedSendNotify()) {
1997 mainAbilityInfo.applicationInfo.removable = info.GetUninstallState();
1998 }
1999 mainAbilityInfo.installTime = installTime;
2000 // fix labelId or iconId is equal 0
2001 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), mainAbilityInfo);
2002 abilityInfos.emplace_back(mainAbilityInfo);
2003 GetMatchLauncherAbilityInfosForCloneInfos(info, mainAbilityInfo, bundleUserInfo,
2004 abilityInfos);
2005 return;
2006 }
2007 // add app detail ability
2008 if (info.GetBaseApplicationInfo().needAppDetail) {
2009 LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s add detail ability info", info.GetBundleName().c_str());
2010 std::string moduleName = "";
2011 auto ability = info.FindAbilityInfo(moduleName, ServiceConstants::APP_DETAIL_ABILITY, responseUserId);
2012 if (!ability) {
2013 LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s cant find ability", info.GetBundleName().c_str());
2014 return;
2015 }
2016 if (!info.GetIsNewVersion()) {
2017 ability->applicationInfo.label = info.GetBundleName();
2018 }
2019 ability->installTime = installTime;
2020 abilityInfos.emplace_back(*ability);
2021 GetMatchLauncherAbilityInfosForCloneInfos(info, *ability, bundleUserInfo, abilityInfos);
2022 }
2023 }
2024
GetMultiLauncherAbilityInfo(const Want & want,const InnerBundleInfo & info,const InnerBundleUserInfo & bundleUserInfo,int64_t installTime,std::vector<AbilityInfo> & abilityInfos) const2025 void BundleDataMgr::GetMultiLauncherAbilityInfo(const Want& want,
2026 const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo,
2027 int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const
2028 {
2029 int32_t count = 0;
2030 std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
2031 for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
2032 auto skillsPair = skillInfos.find(abilityInfoPair.first);
2033 if (skillsPair == skillInfos.end()) {
2034 continue;
2035 }
2036 for (const Skill& skill : skillsPair->second) {
2037 if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
2038 count++;
2039 AbilityInfo abilityInfo = abilityInfoPair.second;
2040 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2041 bundleUserInfo.bundleUserInfo.userId, abilityInfo.applicationInfo);
2042 abilityInfo.installTime = installTime;
2043 // fix labelId or iconId is equal 0
2044 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), abilityInfo);
2045 abilityInfos.emplace_back(abilityInfo);
2046 GetMatchLauncherAbilityInfosForCloneInfos(info, abilityInfoPair.second, bundleUserInfo, abilityInfos);
2047 break;
2048 }
2049 }
2050 }
2051 APP_LOGI_NOFUNC("GetMultiLauncherAbilityInfo -n %{public}s has %{public}d launcher ability",
2052 info.GetBundleName().c_str(), count);
2053 }
2054
GetMatchLauncherAbilityInfosForCloneInfos(const InnerBundleInfo & info,const AbilityInfo & abilityInfo,const InnerBundleUserInfo & bundleUserInfo,std::vector<AbilityInfo> & abilityInfos) const2055 void BundleDataMgr::GetMatchLauncherAbilityInfosForCloneInfos(
2056 const InnerBundleInfo& info,
2057 const AbilityInfo &abilityInfo,
2058 const InnerBundleUserInfo &bundleUserInfo,
2059 std::vector<AbilityInfo>& abilityInfos) const
2060 {
2061 for (const auto &item : bundleUserInfo.cloneInfos) {
2062 APP_LOGD("bundleName:%{public}s appIndex:%{public}d start", info.GetBundleName().c_str(), item.second.appIndex);
2063 AbilityInfo cloneAbilityInfo = abilityInfo;
2064 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2065 bundleUserInfo.bundleUserInfo.userId, cloneAbilityInfo.applicationInfo, item.second.appIndex);
2066 cloneAbilityInfo.installTime = item.second.installTime;
2067 cloneAbilityInfo.uid = item.second.uid;
2068 cloneAbilityInfo.appIndex = item.second.appIndex;
2069 // fix labelId or iconId is equal 0
2070 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), cloneAbilityInfo);
2071 abilityInfos.emplace_back(cloneAbilityInfo);
2072 }
2073 }
2074
ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,ApplicationInfo & applicationInfo) const2075 void BundleDataMgr::ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2076 ApplicationInfo &applicationInfo) const
2077 {
2078 applicationInfo.accessTokenId = cloneInfo.accessTokenId;
2079 applicationInfo.accessTokenIdEx = cloneInfo.accessTokenIdEx;
2080 applicationInfo.enabled = cloneInfo.enabled;
2081 applicationInfo.uid = cloneInfo.uid;
2082 applicationInfo.appIndex = cloneInfo.appIndex;
2083 }
2084
ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,BundleInfo & bundleInfo) const2085 void BundleDataMgr::ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2086 BundleInfo &bundleInfo) const
2087 {
2088 bundleInfo.uid = cloneInfo.uid;
2089 bundleInfo.gid = cloneInfo.uid; // no gids, need add
2090 bundleInfo.installTime = cloneInfo.installTime;
2091 bundleInfo.appIndex = cloneInfo.appIndex;
2092 if (!bundleInfo.applicationInfo.bundleName.empty()) {
2093 ModifyApplicationInfoByCloneInfo(cloneInfo, bundleInfo.applicationInfo);
2094 }
2095 }
2096
GetCloneBundleInfos(const InnerBundleInfo & info,int32_t flags,int32_t userId,BundleInfo & bundleInfo,std::vector<BundleInfo> & bundleInfos) const2097 void BundleDataMgr::GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId,
2098 BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const
2099 {
2100 // get clone bundle info
2101 InnerBundleUserInfo bundleUserInfo;
2102 (void)info.GetInnerBundleUserInfo(userId, bundleUserInfo);
2103 if (bundleUserInfo.cloneInfos.empty()) {
2104 return;
2105 }
2106 LOG_D(BMS_TAG_QUERY, "app %{public}s start get bundle clone info",
2107 info.GetBundleName().c_str());
2108 for (const auto &item : bundleUserInfo.cloneInfos) {
2109 BundleInfo cloneBundleInfo;
2110 ErrCode ret = info.GetBundleInfoV9(flags, cloneBundleInfo, userId, item.second.appIndex);
2111 if (ret == ERR_OK) {
2112 ProcessBundleMenu(cloneBundleInfo, flags, true);
2113 ProcessBundleRouterMap(cloneBundleInfo, flags);
2114 bundleInfos.emplace_back(cloneBundleInfo);
2115 }
2116 }
2117 }
2118
GetBundleNameAndIndexByName(const std::string & keyName,std::string & bundleName,int32_t & appIndex) const2119 void BundleDataMgr::GetBundleNameAndIndexByName(
2120 const std::string &keyName, std::string &bundleName, int32_t &appIndex) const
2121 {
2122 bundleName = keyName;
2123 appIndex = 0;
2124 // for clone bundle name
2125 auto pos = keyName.find(CLONE_BUNDLE_PREFIX);
2126 if ((pos == std::string::npos) || (pos == 0)) {
2127 return;
2128 }
2129 std::string index = keyName.substr(0, pos);
2130 if (!OHOS::StrToInt(index, appIndex)) {
2131 appIndex = 0;
2132 return;
2133 }
2134 bundleName = keyName.substr(pos + strlen(CLONE_BUNDLE_PREFIX));
2135 }
2136
GetCloneAppIndexes(const std::string & bundleName,int32_t userId) const2137 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const
2138 {
2139 std::vector<int32_t> cloneAppIndexes;
2140 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2141 if (userId == Constants::ANY_USERID) {
2142 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2143 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2144 return cloneAppIndexes;
2145 }
2146 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2147 }
2148 int32_t requestUserId = GetUserId(userId);
2149 if (requestUserId == Constants::INVALID_USERID) {
2150 return cloneAppIndexes;
2151 }
2152 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2153 auto infoItem = bundleInfos_.find(bundleName);
2154 if (infoItem == bundleInfos_.end()) {
2155 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2156 return cloneAppIndexes;
2157 }
2158 const InnerBundleInfo &bundleInfo = infoItem->second;
2159 InnerBundleUserInfo innerBundleUserInfo;
2160 if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2161 return cloneAppIndexes;
2162 }
2163 const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2164 if (cloneInfos.empty()) {
2165 return cloneAppIndexes;
2166 }
2167 for (const auto &cloneInfo : cloneInfos) {
2168 LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes: %{public}d", cloneInfo.second.appIndex);
2169 cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2170 }
2171 return cloneAppIndexes;
2172 }
2173
GetCloneAppIndexesNoLock(const std::string & bundleName,int32_t userId) const2174 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const
2175 {
2176 std::vector<int32_t> cloneAppIndexes;
2177 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2178 if (userId == Constants::ANY_USERID) {
2179 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2180 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2181 return cloneAppIndexes;
2182 }
2183 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2184 }
2185 int32_t requestUserId = GetUserId(userId);
2186 if (requestUserId == Constants::INVALID_USERID) {
2187 return cloneAppIndexes;
2188 }
2189 auto infoItem = bundleInfos_.find(bundleName);
2190 if (infoItem == bundleInfos_.end()) {
2191 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2192 return cloneAppIndexes;
2193 }
2194 const InnerBundleInfo &bundleInfo = infoItem->second;
2195 InnerBundleUserInfo innerBundleUserInfo;
2196 if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2197 return cloneAppIndexes;
2198 }
2199 const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2200 if (cloneInfos.empty()) {
2201 return cloneAppIndexes;
2202 }
2203 for (const auto &cloneInfo : cloneInfos) {
2204 LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes unLock: %{public}d", cloneInfo.second.appIndex);
2205 cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2206 }
2207 return cloneAppIndexes;
2208 }
2209
AddAppDetailAbilityInfo(InnerBundleInfo & info) const2210 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
2211 {
2212 AbilityInfo appDetailAbility;
2213 appDetailAbility.name = ServiceConstants::APP_DETAIL_ABILITY;
2214 appDetailAbility.bundleName = info.GetBundleName();
2215 appDetailAbility.enabled = true;
2216 appDetailAbility.type = AbilityType::PAGE;
2217 appDetailAbility.isNativeAbility = true;
2218
2219 ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
2220 appDetailAbility.applicationName = applicationInfo.name;
2221 appDetailAbility.labelId = applicationInfo.labelResource.id;
2222 if (!info.GetIsNewVersion()) {
2223 appDetailAbility.labelId = 0;
2224 appDetailAbility.label = info.GetBundleName();
2225 }
2226 appDetailAbility.iconId = applicationInfo.iconResource.id;
2227 appDetailAbility.moduleName = applicationInfo.iconResource.moduleName;
2228
2229 if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
2230 LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo appDetailAbility.iconId is 0");
2231 // get system resource icon Id
2232 auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
2233 if (iter != bundleInfos_.end()) {
2234 LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo get system resource iconId");
2235 appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
2236 } else {
2237 LOG_W(BMS_TAG_QUERY, "AddAppDetailAbilityInfo error: ohos.global.systemres does not exist");
2238 }
2239 }
2240 // not show in the mission list
2241 appDetailAbility.removeMissionAfterTerminate = true;
2242 // set hapPath, for label resource
2243 auto innerModuleInfo = info.GetInnerModuleInfoByModuleName(appDetailAbility.moduleName);
2244 if (innerModuleInfo) {
2245 appDetailAbility.package = innerModuleInfo->modulePackage;
2246 appDetailAbility.hapPath = innerModuleInfo->hapPath;
2247 }
2248 appDetailAbility.visible = true;
2249 std::string keyName;
2250 keyName.append(appDetailAbility.bundleName).append(".")
2251 .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
2252 info.InsertAbilitiesInfo(keyName, appDetailAbility);
2253 }
2254
GetAllLauncherAbility(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2255 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2256 const int32_t userId, const int32_t requestUserId) const
2257 {
2258 for (const auto &item : bundleInfos_) {
2259 const InnerBundleInfo &info = item.second;
2260 if (info.IsDisabled()) {
2261 LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2262 continue;
2263 }
2264 if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2265 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
2266 continue;
2267 }
2268 if (info.GetBaseBundleInfo().entryInstallationFree) {
2269 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon",
2270 info.GetBundleName().c_str());
2271 continue;
2272 }
2273
2274 // get installTime from innerBundleUserInfo
2275 int64_t installTime = 0;
2276 std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2277 std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2278 auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2279 [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2280 return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2281 });
2282 if (iter != info.GetInnerBundleUserInfos().end()) {
2283 installTime = iter->second.installTime;
2284 }
2285 GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
2286 }
2287 }
2288
GetLauncherAbilityByBundleName(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2289 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2290 const int32_t userId, const int32_t requestUserId) const
2291 {
2292 ElementName element = want.GetElement();
2293 std::string bundleName = element.GetBundleName();
2294 const auto &item = bundleInfos_.find(bundleName);
2295 if (item == bundleInfos_.end()) {
2296 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2297 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2298 }
2299 const InnerBundleInfo &info = item->second;
2300 if(!BundlePermissionMgr::IsSystemApp()){
2301 int32_t responseUserId = info.GetResponseUserId(userId);
2302 if (responseUserId == Constants::INVALID_USERID) {
2303 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2304 }
2305 }
2306 if (info.IsDisabled()) {
2307 LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2308 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
2309 }
2310 if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2311 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2312 return ERR_OK;
2313 }
2314 if (info.GetBaseBundleInfo().entryInstallationFree) {
2315 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2316 return ERR_OK;
2317 }
2318 // get installTime from innerBundleUserInfo
2319 int64_t installTime = 0;
2320 std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2321 std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2322 auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2323 [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2324 return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2325 });
2326 if (iter != info.GetInnerBundleUserInfos().end()) {
2327 installTime = iter->second.installTime;
2328 }
2329 GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2330 FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2331 return ERR_OK;
2332 }
2333
QueryLauncherAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2334 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
2335 const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
2336 {
2337 int32_t requestUserId = GetUserId(userId);
2338 if (requestUserId == Constants::INVALID_USERID) {
2339 LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2340 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2341 }
2342 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2343 if (bundleInfos_.empty()) {
2344 LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
2345 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2346 }
2347
2348 ElementName element = want.GetElement();
2349 std::string bundleName = element.GetBundleName();
2350 if (bundleName.empty()) {
2351 // query all launcher ability
2352 GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
2353 return ERR_OK;
2354 }
2355 // query definite abilities by bundle name
2356 ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
2357 if (ret == ERR_OK) {
2358 LOG_D(BMS_TAG_QUERY, "ability infos have been found");
2359 }
2360 return ret;
2361 }
2362
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo) const2363 bool BundleDataMgr::QueryAbilityInfoByUri(
2364 const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
2365 {
2366 LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2367 int32_t requestUserId = GetUserId(userId);
2368 if (requestUserId == Constants::INVALID_USERID) {
2369 return false;
2370 }
2371
2372 if (abilityUri.empty()) {
2373 return false;
2374 }
2375 if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2376 return false;
2377 }
2378 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2379 if (bundleInfos_.empty()) {
2380 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2381 return false;
2382 }
2383 std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2384 auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2385 if (posFirstSeparator == std::string::npos) {
2386 return false;
2387 }
2388 auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2389 std::string uri;
2390 if (posSecondSeparator == std::string::npos) {
2391 uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2392 } else {
2393 uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2394 }
2395 for (const auto &item : bundleInfos_) {
2396 const InnerBundleInfo &info = item.second;
2397 if (info.IsDisabled()) {
2398 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2399 continue;
2400 }
2401
2402 int32_t responseUserId = info.GetResponseUserId(requestUserId);
2403 if (!info.GetApplicationEnabled(responseUserId)) {
2404 continue;
2405 }
2406
2407 auto ability = info.FindAbilityInfoByUri(uri);
2408 if (!ability) {
2409 continue;
2410 }
2411
2412 abilityInfo = (*ability);
2413 info.GetApplicationInfo(
2414 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
2415 abilityInfo.applicationInfo);
2416 return true;
2417 }
2418
2419 LOG_W(BMS_TAG_QUERY, "query abilityUri(%{private}s) failed", abilityUri.c_str());
2420 return false;
2421 }
2422
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)2423 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
2424 {
2425 LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2426 if (abilityUri.empty()) {
2427 return false;
2428 }
2429 if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2430 return false;
2431 }
2432 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2433 if (bundleInfos_.empty()) {
2434 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2435 return false;
2436 }
2437 std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2438 auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2439 if (posFirstSeparator == std::string::npos) {
2440 return false;
2441 }
2442 auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2443 std::string uri;
2444 if (posSecondSeparator == std::string::npos) {
2445 uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2446 } else {
2447 uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2448 }
2449
2450 for (auto &item : bundleInfos_) {
2451 InnerBundleInfo &info = item.second;
2452 if (info.IsDisabled()) {
2453 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2454 continue;
2455 }
2456 info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
2457 }
2458 if (abilityInfos.size() == 0) {
2459 return false;
2460 }
2461
2462 return true;
2463 }
2464
GetApplicationInfo(const std::string & appName,int32_t flags,const int userId,ApplicationInfo & appInfo) const2465 bool BundleDataMgr::GetApplicationInfo(
2466 const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
2467 {
2468 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2469 int32_t requestUserId = GetUserId(userId);
2470 if (requestUserId == Constants::INVALID_USERID) {
2471 return false;
2472 }
2473
2474 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2475 InnerBundleInfo innerBundleInfo;
2476 if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
2477 LOG_D(BMS_TAG_QUERY, "GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
2478 return false;
2479 }
2480
2481 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2482 innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
2483 return true;
2484 }
2485
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo,const int32_t appIndex) const2486 ErrCode BundleDataMgr::GetApplicationInfoV9(
2487 const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const
2488 {
2489 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2490 int32_t requestUserId = GetUserId(userId);
2491 if (requestUserId == Constants::INVALID_USERID) {
2492 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2493 }
2494
2495 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2496 InnerBundleInfo innerBundleInfo;
2497 int32_t flag = 0;
2498 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2499 == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2500 flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2501 }
2502 auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId, appIndex);
2503 if (ret != ERR_OK) {
2504 LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2505 appName.c_str(), requestUserId, appIndex);
2506 return ret;
2507 }
2508
2509 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2510 ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo, appIndex);
2511 if (ret != ERR_OK) {
2512 LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2513 appName.c_str(), responseUserId, appIndex);
2514 return ret;
2515 }
2516 return ret;
2517 }
2518
GetApplicationInfoWithResponseId(const std::string & appName,int32_t flags,int32_t & userId,ApplicationInfo & appInfo) const2519 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
2520 const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
2521 {
2522 int32_t requestUserId = GetUserId(userId);
2523 if (requestUserId == Constants::INVALID_USERID) {
2524 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2525 }
2526
2527 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2528 InnerBundleInfo innerBundleInfo;
2529 int32_t flag = 0;
2530 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2531 == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2532 flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2533 }
2534 auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
2535 if (ret != ERR_OK) {
2536 LOG_D(BMS_TAG_QUERY,
2537 "GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
2538 appName.c_str(), requestUserId);
2539 return ret;
2540 }
2541
2542 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2543 ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
2544 if (ret != ERR_OK) {
2545 LOG_D(BMS_TAG_QUERY,
2546 "GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
2547 appName.c_str(), responseUserId);
2548 return ret;
2549 }
2550 userId = responseUserId;
2551 return ret;
2552 }
2553
GetCloneAppInfo(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2554 void BundleDataMgr::GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2555 std::vector<ApplicationInfo> &appInfos) const
2556 {
2557 std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2558 for (int32_t appIndex : appIndexVec) {
2559 bool isEnabled = false;
2560 ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2561 if (ret != ERR_OK) {
2562 continue;
2563 }
2564 if (isEnabled || (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2565 ApplicationInfo cloneAppInfo;
2566 info.GetApplicationInfo(flags, userId, cloneAppInfo, appIndex);
2567 if (cloneAppInfo.appIndex == appIndex) {
2568 appInfos.emplace_back(cloneAppInfo);
2569 }
2570 }
2571 }
2572 }
2573
GetApplicationInfos(int32_t flags,const int userId,std::vector<ApplicationInfo> & appInfos) const2574 bool BundleDataMgr::GetApplicationInfos(
2575 int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
2576 {
2577 int32_t requestUserId = GetUserId(userId);
2578 if (requestUserId == Constants::INVALID_USERID) {
2579 return false;
2580 }
2581
2582 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2583 if (bundleInfos_.empty()) {
2584 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2585 return false;
2586 }
2587
2588 for (const auto &item : bundleInfos_) {
2589 const InnerBundleInfo &info = item.second;
2590 if (info.IsDisabled()) {
2591 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2592 continue;
2593 }
2594 int32_t responseUserId = info.GetResponseUserId(requestUserId);
2595 if (info.GetApplicationEnabled(responseUserId) ||
2596 (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2597 ApplicationInfo appInfo;
2598 info.GetApplicationInfo(flags, responseUserId, appInfo);
2599 appInfos.emplace_back(appInfo);
2600 }
2601 GetCloneAppInfo(info, responseUserId, flags, appInfos);
2602 }
2603 LOG_D(BMS_TAG_QUERY, "get installed bundles success");
2604 return !appInfos.empty();
2605 }
2606
UpateExtResources(const std::string & bundleName,const std::vector<ExtendResourceInfo> & extendResourceInfos)2607 bool BundleDataMgr::UpateExtResources(const std::string &bundleName,
2608 const std::vector<ExtendResourceInfo> &extendResourceInfos)
2609 {
2610 if (bundleName.empty()) {
2611 APP_LOGW("bundleName is empty");
2612 return false;
2613 }
2614
2615 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2616 auto infoItem = bundleInfos_.find(bundleName);
2617 if (infoItem == bundleInfos_.end()) {
2618 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2619 return false;
2620 }
2621
2622 auto info = infoItem->second;
2623 info.AddExtendResourceInfos(extendResourceInfos);
2624 if (!dataStorage_->SaveStorageBundleInfo(info)) {
2625 APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2626 return false;
2627 }
2628
2629 bundleInfos_.at(bundleName) = info;
2630 return true;
2631 }
2632
RemoveExtResources(const std::string & bundleName,const std::vector<std::string> & moduleNames)2633 bool BundleDataMgr::RemoveExtResources(const std::string &bundleName,
2634 const std::vector<std::string> &moduleNames)
2635 {
2636 if (bundleName.empty()) {
2637 APP_LOGW("bundleName is empty");
2638 return false;
2639 }
2640
2641 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2642 auto infoItem = bundleInfos_.find(bundleName);
2643 if (infoItem == bundleInfos_.end()) {
2644 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2645 return false;
2646 }
2647
2648 auto info = infoItem->second;
2649 info.RemoveExtendResourceInfos(moduleNames);
2650 if (!dataStorage_->SaveStorageBundleInfo(info)) {
2651 APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2652 return false;
2653 }
2654
2655 bundleInfos_.at(bundleName) = info;
2656 return true;
2657 }
2658
UpateCurDynamicIconModule(const std::string & bundleName,const std::string & moduleName)2659 bool BundleDataMgr::UpateCurDynamicIconModule(
2660 const std::string &bundleName, const std::string &moduleName)
2661 {
2662 if (bundleName.empty()) {
2663 APP_LOGW("bundleName is empty");
2664 return false;
2665 }
2666
2667 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2668 auto infoItem = bundleInfos_.find(bundleName);
2669 if (infoItem == bundleInfos_.end()) {
2670 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2671 return false;
2672 }
2673
2674 auto info = infoItem->second;
2675 info.SetCurDynamicIconModule(moduleName);
2676 if (!dataStorage_->SaveStorageBundleInfo(info)) {
2677 APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2678 return false;
2679 }
2680
2681 bundleInfos_.at(bundleName) = info;
2682 return true;
2683 }
2684
GetCloneAppInfoV9(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2685 void BundleDataMgr::GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2686 std::vector<ApplicationInfo> &appInfos) const
2687 {
2688 std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2689 for (int32_t appIndex : appIndexVec) {
2690 bool isEnabled = false;
2691 ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2692 if (ret != ERR_OK) {
2693 continue;
2694 }
2695 if (isEnabled || (static_cast<uint32_t>(flags) &
2696 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2697 ApplicationInfo cloneAppInfo;
2698 ret = info.GetApplicationInfoV9(flags, userId, cloneAppInfo, appIndex);
2699 if (ret == ERR_OK) {
2700 appInfos.emplace_back(cloneAppInfo);
2701 }
2702 }
2703 }
2704 }
2705
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos) const2706 ErrCode BundleDataMgr::GetApplicationInfosV9(
2707 int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
2708 {
2709 int32_t requestUserId = GetUserId(userId);
2710 if (requestUserId == Constants::INVALID_USERID) {
2711 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2712 }
2713
2714 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2715 if (bundleInfos_.empty()) {
2716 APP_LOGW("bundleInfos_ data is empty");
2717 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2718 }
2719 for (const auto &item : bundleInfos_) {
2720 const InnerBundleInfo &info = item.second;
2721 if (info.IsDisabled()) {
2722 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2723 continue;
2724 }
2725 int32_t responseUserId = info.GetResponseUserId(requestUserId);
2726 if (info.GetApplicationEnabled(responseUserId) ||
2727 (static_cast<uint32_t>(flags) &
2728 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2729 ApplicationInfo appInfo;
2730 if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) == ERR_OK) {
2731 appInfos.emplace_back(appInfo);
2732 }
2733 }
2734 GetCloneAppInfoV9(info, responseUserId, flags, appInfos);
2735 }
2736 APP_LOGD("get installed bundles success");
2737 return ERR_OK;
2738 }
2739
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const2740 bool BundleDataMgr::GetBundleInfo(
2741 const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
2742 {
2743 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2744 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2745 if (userId == Constants::ANY_USERID) {
2746 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2747 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2748 return false;
2749 }
2750 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2751 }
2752
2753 int32_t requestUserId = GetUserId(userId);
2754 if (requestUserId == Constants::INVALID_USERID) {
2755 return false;
2756 }
2757 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2758 InnerBundleInfo innerBundleInfo;
2759 if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
2760 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d",
2761 bundleName.c_str(), requestUserId);
2762 return false;
2763 }
2764 // for only one user, bundle info can not be obtained during installation
2765 if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2766 (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2767 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2768 bundleName.c_str(), requestUserId);
2769 return false;
2770 }
2771
2772 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2773 innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
2774
2775 if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
2776 ProcessBundleMenu(bundleInfo, flags, false);
2777 }
2778 if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) ==
2779 BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) {
2780 ProcessBundleRouterMap(bundleInfo, static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
2781 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP));
2782 }
2783 LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2784 bundleName.c_str(), userId);
2785 return true;
2786 }
2787
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId,int32_t appIndex) const2788 ErrCode BundleDataMgr::GetBundleInfoV9(
2789 const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const
2790 {
2791 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2792
2793 if (userId == Constants::ANY_USERID) {
2794 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2795 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2796 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2797 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2798 }
2799 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2800 }
2801
2802 int32_t requestUserId = GetUserId(userId);
2803 if (requestUserId == Constants::INVALID_USERID) {
2804 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2805 }
2806
2807 int32_t originalUserId = requestUserId;
2808 PreProcessAnyUserFlag(bundleName, flags, requestUserId);
2809 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2810 InnerBundleInfo innerBundleInfo;
2811
2812 auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
2813 if (ret != ERR_OK) {
2814 LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s",
2815 ret, bundleName.c_str());
2816 return ret;
2817 }
2818 // for only one user, bundle info can not be obtained during installation
2819 if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2820 (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2821 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2822 bundleName.c_str(), requestUserId);
2823 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2824 }
2825
2826 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2827 innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
2828 PostProcessAnyUserFlags(flags, responseUserId, originalUserId, bundleInfo, innerBundleInfo);
2829
2830 ProcessBundleMenu(bundleInfo, flags, true);
2831 ProcessBundleRouterMap(bundleInfo, flags);
2832 LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2833 bundleName.c_str(), userId);
2834 return ERR_OK;
2835 }
2836
BatchGetBundleInfo(const std::vector<std::string> & bundleNames,int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2837 void BundleDataMgr::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
2838 std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2839 {
2840 for (const auto &bundleName : bundleNames) {
2841 BundleInfo bundleInfo;
2842 ErrCode ret = GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2843 if (ret != ERR_OK) {
2844 continue;
2845 }
2846 bundleInfos.push_back(bundleInfo);
2847 }
2848 }
2849
GetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2850 ErrCode BundleDataMgr::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2851 {
2852 int32_t uid = IPCSkeleton::GetCallingUid();
2853 int32_t appIndex = 0;
2854 InnerBundleInfo innerBundleInfo;
2855 if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
2856 if (sandboxAppHelper_ == nullptr) {
2857 LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
2858 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2859 }
2860 if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2861 LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
2862 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2863 }
2864 }
2865 int32_t userId = uid / Constants::BASE_USER_RANGE;
2866 innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, userId, appIndex);
2867 ProcessBundleMenu(bundleInfo, flags, true);
2868 ProcessBundleRouterMap(bundleInfo, flags);
2869 LOG_D(BMS_TAG_QUERY, "get bundleInfoForSelf %{public}s successfully in user %{public}d",
2870 innerBundleInfo.GetBundleName().c_str(), userId);
2871 return ERR_OK;
2872 }
2873
ProcessBundleMenu(BundleInfo & bundleInfo,int32_t flags,bool clearData) const2874 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
2875 {
2876 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2877 if (clearData) {
2878 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2879 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2880 return ERR_OK;
2881 }
2882 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
2883 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
2884 APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
2885 std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
2886 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
2887 });
2888 return ERR_OK;
2889 }
2890 }
2891 for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2892 std::string menuProfile = hapModuleInfo.fileContextMenu;
2893 auto pos = menuProfile.find(PROFILE_PREFIX);
2894 if (pos == std::string::npos) {
2895 APP_LOGD("invalid menu profile");
2896 continue;
2897 }
2898 std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
2899 std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
2900
2901 std::string menuProfileContent;
2902 GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
2903 hapModuleInfo.fileContextMenu = menuProfileContent;
2904 }
2905 return ERR_OK;
2906 }
2907
ProcessBundleRouterMap(BundleInfo & bundleInfo,int32_t flag) const2908 void BundleDataMgr::ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const
2909 {
2910 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2911 if (routerStorage_ == nullptr) {
2912 APP_LOGE("routerStorage_ is null");
2913 return;
2914 }
2915 APP_LOGD("ProcessBundleRouterMap with flags: %{public}d", flag);
2916 if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2917 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2918 return;
2919 }
2920 if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP))
2921 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP)) {
2922 return;
2923 }
2924 for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2925 std::string routerPath = hapModuleInfo.routerMap;
2926 auto pos = routerPath.find(PROFILE_PREFIX);
2927 if (pos == std::string::npos) {
2928 APP_LOGD("invalid router profile");
2929 continue;
2930 }
2931 if (!routerStorage_->GetRouterInfo(bundleInfo.name, hapModuleInfo.moduleName, hapModuleInfo.routerArray)) {
2932 APP_LOGE("get failed for %{public}s", hapModuleInfo.moduleName.c_str());
2933 continue;
2934 }
2935 }
2936 RouterMapHelper::MergeRouter(bundleInfo);
2937 }
2938
DeleteRouterInfo(const std::string & bundleName,const std::string & moduleName)2939 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName, const std::string &moduleName)
2940 {
2941 if (routerStorage_ == nullptr) {
2942 APP_LOGE("routerStorage_ is null");
2943 return false;
2944 }
2945 return routerStorage_->DeleteRouterInfo(bundleName, moduleName);
2946 }
2947
DeleteRouterInfo(const std::string & bundleName)2948 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName)
2949 {
2950 if (routerStorage_ == nullptr) {
2951 APP_LOGE("routerStorage_ is null");
2952 return false;
2953 }
2954 return routerStorage_->DeleteRouterInfo(bundleName);
2955 }
2956
UpdateRouterInfo(const std::string & bundleName)2957 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName)
2958 {
2959 if (routerStorage_ == nullptr) {
2960 APP_LOGE("routerStorage_ is null");
2961 return;
2962 }
2963 std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
2964 {
2965 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2966 const auto infoItem = bundleInfos_.find(bundleName);
2967 if (infoItem == bundleInfos_.end()) {
2968 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
2969 return;
2970 }
2971 FindRouterHapPath(infoItem->second, hapPathMap);
2972 }
2973 UpdateRouterInfo(bundleName, hapPathMap);
2974 }
2975
FindRouterHapPath(const InnerBundleInfo & innerBundleInfo,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)2976 void BundleDataMgr::FindRouterHapPath(const InnerBundleInfo &innerBundleInfo,
2977 std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
2978 {
2979 auto moduleMap = innerBundleInfo.GetInnerModuleInfos();
2980 for (auto it = moduleMap.begin(); it != moduleMap.end(); it++) {
2981 std::string routerPath = it->second.routerMap;
2982 auto pos = routerPath.find(PROFILE_PREFIX);
2983 if (pos == std::string::npos) {
2984 continue;
2985 }
2986 std::string routerJsonName = routerPath.substr(pos + PROFILE_PREFIX_LENGTH);
2987 std::string routerJsonPath = PROFILE_PATH + routerJsonName + JSON_SUFFIX;
2988 hapPathMap[it->second.moduleName] = std::make_pair(it->second.hapPath, routerJsonPath);
2989 }
2990 }
2991
UpdateRouterInfo(InnerBundleInfo & innerBundleInfo)2992 void BundleDataMgr::UpdateRouterInfo(InnerBundleInfo &innerBundleInfo)
2993 {
2994 std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
2995 FindRouterHapPath(innerBundleInfo, hapPathMap);
2996 UpdateRouterInfo(innerBundleInfo.GetBundleName(), hapPathMap);
2997 }
2998
UpdateRouterInfo(const std::string & bundleName,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)2999 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName,
3000 std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
3001 {
3002 std::map<std::string, std::string> routerInfoMap;
3003 for (auto hapIter = hapPathMap.begin(); hapIter != hapPathMap.end(); hapIter++) {
3004 std::string routerMapString;
3005 if (GetJsonProfileByExtractor(hapIter->second.first, hapIter->second.second, routerMapString) != ERR_OK) {
3006 APP_LOGW("get json string from %{public}s failed", hapIter->second.second.c_str());
3007 continue;
3008 }
3009 routerInfoMap[hapIter->first] = routerMapString;
3010 }
3011 if (!routerStorage_->UpdateRouterInfo(bundleName, routerInfoMap)) {
3012 APP_LOGW("add router for %{public}s failed", bundleName.c_str());
3013 }
3014 }
3015
GetAllBundleNames(std::set<std::string> & bundleNames)3016 void BundleDataMgr::GetAllBundleNames(std::set<std::string> &bundleNames)
3017 {
3018 if (routerStorage_ == nullptr) {
3019 APP_LOGE("routerStorage_ is null");
3020 return;
3021 }
3022 return routerStorage_->GetAllBundleNames(bundleNames);
3023 }
3024
PreProcessAnyUserFlag(const std::string & bundleName,int32_t & flags,int32_t & userId) const3025 void BundleDataMgr::PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const
3026 {
3027 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0) {
3028 flags = static_cast<uint32_t>(
3029 static_cast<uint32_t>(flags) | static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE));
3030 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
3031 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
3032 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
3033 return;
3034 }
3035 if (innerBundleUserInfos.empty()) {
3036 return;
3037 }
3038 for (auto &bundleUserInfo: innerBundleUserInfos) {
3039 if (bundleUserInfo.bundleUserInfo.userId == userId) {
3040 return;
3041 }
3042 if (bundleUserInfo.bundleUserInfo.userId < Constants::START_USERID) {
3043 return;
3044 }
3045 }
3046 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
3047 }
3048 }
3049
PostProcessAnyUserFlags(int32_t flags,int32_t userId,int32_t originalUserId,BundleInfo & bundleInfo,const InnerBundleInfo & innerBundleInfo) const3050 void BundleDataMgr::PostProcessAnyUserFlags(
3051 int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo,
3052 const InnerBundleInfo &innerBundleInfo) const
3053 {
3054 bool withApplicationFlag =
3055 (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION))
3056 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
3057 if (withApplicationFlag) {
3058 if (userId >= Constants::START_USERID && userId != originalUserId) {
3059 uint32_t flagInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_INSTALLED);
3060 uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3061 if ((applicationFlags & flagInstalled) != 0) {
3062 bundleInfo.applicationInfo.applicationFlags = static_cast<int32_t>(applicationFlags ^ flagInstalled);
3063 }
3064 }
3065
3066 bool withAnyUser =
3067 (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER))
3068 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER);
3069 if (withAnyUser) {
3070 const std::map<std::string, InnerBundleUserInfo>& innerUserInfos
3071 = innerBundleInfo.GetInnerBundleUserInfos();
3072 uint32_t flagOtherInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_OTHER_INSTALLED);
3073 uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3074 if (!innerBundleInfo.HasInnerBundleUserInfo(originalUserId)) {
3075 bundleInfo.applicationInfo.applicationFlags =
3076 static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3077 } else if (innerUserInfos.size() > 1) {
3078 bundleInfo.applicationInfo.applicationFlags =
3079 static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3080 }
3081 }
3082 }
3083 }
3084
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,GetDependentBundleInfoFlag flag) const3085 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
3086 std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
3087 {
3088 APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
3089 if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
3090 (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
3091 // for app service hsp
3092 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3093 std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
3094 for (const std::string &hspName : appServiceHspBundleName_) {
3095 APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
3096 auto infoItem = bundleInfos_.find(hspName);
3097 if (infoItem == bundleInfos_.end()) {
3098 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
3099 continue;
3100 }
3101 ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
3102 }
3103 }
3104 if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
3105 flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
3106 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3107 auto infoItem = bundleInfos_.find(bundleName);
3108 if (infoItem == bundleInfos_.end()) {
3109 APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
3110 return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
3111 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
3112 }
3113 const InnerBundleInfo &innerBundleInfo = infoItem->second;
3114 std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
3115 for (const auto &item : dependencies) {
3116 BaseSharedBundleInfo baseSharedBundleInfo;
3117 if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
3118 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
3119 }
3120 }
3121 }
3122 APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
3123 return ERR_OK;
3124 }
3125
GetBundleType(const std::string & bundleName,BundleType & bundleType) const3126 bool BundleDataMgr::GetBundleType(const std::string &bundleName, BundleType &bundleType)const
3127 {
3128 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3129 auto item = bundleInfos_.find(bundleName);
3130 if (item == bundleInfos_.end()) {
3131 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3132 return false;
3133 }
3134 bundleType = item->second.GetApplicationBundleType();
3135 APP_LOGI("bundle %{public}s bundleType is %{public}d", bundleName.c_str(), bundleType);
3136 return true;
3137 }
3138
GetBaseSharedBundleInfo(const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const3139 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
3140 BaseSharedBundleInfo &baseSharedBundleInfo) const
3141 {
3142 auto infoItem = bundleInfos_.find(dependency.bundleName);
3143 if (infoItem == bundleInfos_.end()) {
3144 APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
3145 dependency.bundleName.c_str());
3146 return false;
3147 }
3148 const InnerBundleInfo &innerBundleInfo = infoItem->second;
3149 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3150 innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3151 } else {
3152 APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
3153 innerBundleInfo.GetApplicationBundleType());
3154 return false;
3155 }
3156 APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
3157 return true;
3158 }
3159
DeleteSharedBundleInfo(const std::string & bundleName)3160 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
3161 {
3162 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
3163 auto infoItem = bundleInfos_.find(bundleName);
3164 if (infoItem != bundleInfos_.end()) {
3165 APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
3166 const InnerBundleInfo &innerBundleInfo = infoItem->second;
3167 bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
3168 if (!ret) {
3169 APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
3170 }
3171 bundleInfos_.erase(bundleName);
3172 return ret;
3173 }
3174 return false;
3175 }
3176
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId) const3177 ErrCode BundleDataMgr::GetBundlePackInfo(
3178 const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
3179 {
3180 APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
3181 int32_t requestUserId;
3182 if (userId == Constants::UNSPECIFIED_USERID) {
3183 requestUserId = GetUserIdByCallingUid();
3184 } else {
3185 requestUserId = userId;
3186 }
3187
3188 if (requestUserId == Constants::INVALID_USERID) {
3189 APP_LOGW("getBundlePackInfo userId is invalid");
3190 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3191 }
3192 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3193 InnerBundleInfo innerBundleInfo;
3194 if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
3195 APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
3196 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3197 }
3198 BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
3199 if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
3200 bundlePackInfo.packages = innerBundlePackInfo.packages;
3201 return ERR_OK;
3202 }
3203 if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
3204 bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
3205 bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3206 return ERR_OK;
3207 }
3208 if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
3209 bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3210 return ERR_OK;
3211 }
3212 bundlePackInfo = innerBundlePackInfo;
3213 return ERR_OK;
3214 }
3215
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos) const3216 bool BundleDataMgr::GetBundleInfosByMetaData(
3217 const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
3218 {
3219 if (metaData.empty()) {
3220 APP_LOGW("bundle name is empty");
3221 return false;
3222 }
3223
3224 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3225 if (bundleInfos_.empty()) {
3226 APP_LOGW("bundleInfos_ data is empty");
3227 return false;
3228 }
3229
3230 bool find = false;
3231 int32_t requestUserId = GetUserId();
3232 for (const auto &item : bundleInfos_) {
3233 const InnerBundleInfo &info = item.second;
3234 if (info.IsDisabled()) {
3235 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3236 continue;
3237 }
3238 if (info.CheckSpecialMetaData(metaData)) {
3239 BundleInfo bundleInfo;
3240 int32_t responseUserId = info.GetResponseUserId(requestUserId);
3241 info.GetBundleInfo(
3242 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3243 bundleInfos.emplace_back(bundleInfo);
3244 find = true;
3245 }
3246 }
3247 return find;
3248 }
3249
GetBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3250 bool BundleDataMgr::GetBundleList(
3251 std::vector<std::string> &bundleNames, int32_t userId) const
3252 {
3253 int32_t requestUserId = GetUserId(userId);
3254 if (requestUserId == Constants::INVALID_USERID) {
3255 return false;
3256 }
3257
3258 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3259 if (bundleInfos_.empty()) {
3260 APP_LOGW("bundleInfos_ data is empty");
3261 return false;
3262 }
3263
3264 bool find = false;
3265 for (const auto &infoItem : bundleInfos_) {
3266 const InnerBundleInfo &innerBundleInfo = infoItem.second;
3267 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3268 if (CheckInnerBundleInfoWithFlags(
3269 innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3270 continue;
3271 }
3272
3273 bundleNames.emplace_back(infoItem.first);
3274 find = true;
3275 }
3276 APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
3277 return find;
3278 }
3279
GetDebugBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3280 bool BundleDataMgr::GetDebugBundleList(std::vector<std::string> &bundleNames, int32_t userId) const
3281 {
3282 int32_t requestUserId = GetUserId(userId);
3283 if (requestUserId == Constants::INVALID_USERID) {
3284 APP_LOGE("UserId is invalid");
3285 return false;
3286 }
3287
3288 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3289 if (bundleInfos_.empty()) {
3290 APP_LOGE("bundleInfos_ data is empty");
3291 return false;
3292 }
3293
3294 for (const auto &infoItem : bundleInfos_) {
3295 const InnerBundleInfo &innerBundleInfo = infoItem.second;
3296 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3297 if (CheckInnerBundleInfoWithFlags(
3298 innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3299 continue;
3300 }
3301
3302 ApplicationInfo appInfo = innerBundleInfo.GetBaseApplicationInfo();
3303 if (appInfo.appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG) {
3304 bundleNames.emplace_back(infoItem.first);
3305 }
3306 }
3307
3308 bool find = !bundleNames.empty();
3309 APP_LOGD("user(%{public}d) get installed debug bundles list result(%{public}d)", userId, find);
3310 return find;
3311 }
3312
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3313 bool BundleDataMgr::GetBundleInfos(
3314 int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3315 {
3316 if (userId == Constants::ALL_USERID) {
3317 return GetAllBundleInfos(flags, bundleInfos);
3318 }
3319
3320 int32_t requestUserId = GetUserId(userId);
3321 if (requestUserId == Constants::INVALID_USERID) {
3322 return false;
3323 }
3324
3325 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3326 if (bundleInfos_.empty()) {
3327 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3328 return false;
3329 }
3330
3331 bool find = false;
3332 for (const auto &item : bundleInfos_) {
3333 const InnerBundleInfo &innerBundleInfo = item.second;
3334 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3335 LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3336 innerBundleInfo.GetBundleName().c_str());
3337 continue;
3338 }
3339
3340 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3341 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
3342 continue;
3343 }
3344
3345 BundleInfo bundleInfo;
3346 if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
3347 continue;
3348 }
3349
3350 bundleInfos.emplace_back(bundleInfo);
3351 find = true;
3352 // add clone bundle info
3353 // flags convert
3354 GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3355 }
3356
3357 LOG_D(BMS_TAG_QUERY, "get bundleInfos result(%{public}d) in user(%{public}d)", find, userId);
3358 return find;
3359 }
3360
CheckInnerBundleInfoWithFlags(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3361 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
3362 const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3363 {
3364 if (userId == Constants::INVALID_USERID) {
3365 APP_LOGD("userId is invalid");
3366 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3367 }
3368 if (innerBundleInfo.IsDisabled()) {
3369 APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3370 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3371 }
3372
3373 if (appIndex == 0) {
3374 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
3375 && !innerBundleInfo.GetApplicationEnabled(userId)) {
3376 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3377 innerBundleInfo.GetBundleName().c_str(), userId);
3378 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3379 }
3380 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3381 int32_t requestUserId = GetUserId(userId);
3382 if (requestUserId == Constants::INVALID_USERID) {
3383 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3384 }
3385 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3386 bool isEnabled = false;
3387 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3388 if (ret != ERR_OK) {
3389 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3390 }
3391 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
3392 APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3393 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3394 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3395 }
3396 } else {
3397 return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3398 }
3399 return ERR_OK;
3400 }
3401
CheckInnerBundleInfoWithFlagsV9(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3402 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlagsV9(
3403 const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3404 {
3405 if (userId == Constants::INVALID_USERID) {
3406 APP_LOGD("userId is invalid");
3407 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3408 }
3409 if (innerBundleInfo.IsDisabled()) {
3410 APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3411 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3412 }
3413
3414 if (appIndex == 0) {
3415 if (!(static_cast<uint32_t>(flags) &
3416 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
3417 bool isEnabled = false;
3418 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(userId, isEnabled, appIndex);
3419 if (ret != ERR_OK) {
3420 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3421 innerBundleInfo.GetBundleName().c_str(), userId);
3422 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3423 }
3424 if (!isEnabled) {
3425 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3426 innerBundleInfo.GetBundleName().c_str(), userId);
3427 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3428 }
3429 }
3430 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3431 int32_t requestUserId = GetUserId(userId);
3432 if (requestUserId == Constants::INVALID_USERID) {
3433 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3434 }
3435 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3436 bool isEnabled = false;
3437 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3438 if (ret != ERR_OK) {
3439 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3440 }
3441 if (!(static_cast<uint32_t>(flags) &
3442 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
3443 && !isEnabled) {
3444 APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3445 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3446 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3447 }
3448 } else {
3449 return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3450 }
3451 return ERR_OK;
3452 }
3453
CheckBundleAndAbilityDisabled(const InnerBundleInfo & info,int32_t flags,int32_t userId) const3454 ErrCode BundleDataMgr::CheckBundleAndAbilityDisabled(
3455 const InnerBundleInfo &info, int32_t flags, int32_t userId) const
3456 {
3457 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
3458 int32_t requestUserId = GetUserId(userId);
3459 if (requestUserId == Constants::INVALID_USERID) {
3460 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3461 }
3462
3463 if (info.IsDisabled()) {
3464 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -f %{public}d",
3465 info.GetBundleName().c_str(), userId, flags);
3466 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3467 }
3468
3469 int32_t responseUserId = info.GetResponseUserId(requestUserId);
3470 bool isEnabled = false;
3471 auto ret = info.GetApplicationEnabledV9(responseUserId, isEnabled);
3472 if (ret != ERR_OK) {
3473 APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d -n %{public}s",
3474 ret, info.GetBundleName().c_str());
3475 return ret;
3476 }
3477 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
3478 && !isEnabled) {
3479 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -f %{public}d",
3480 info.GetBundleName().c_str(), responseUserId, flags);
3481 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3482 }
3483 return ERR_OK;
3484 }
3485
GetAllBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3486 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3487 {
3488 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3489 if (bundleInfos_.empty()) {
3490 APP_LOGW("bundleInfos_ data is empty");
3491 return false;
3492 }
3493
3494 bool find = false;
3495 for (const auto &item : bundleInfos_) {
3496 const InnerBundleInfo &info = item.second;
3497 if (info.IsDisabled()) {
3498 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3499 continue;
3500 }
3501 if (info.GetApplicationBundleType() == BundleType::SHARED) {
3502 APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3503 continue;
3504 }
3505 BundleInfo bundleInfo;
3506 info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
3507 bundleInfos.emplace_back(bundleInfo);
3508 find = true;
3509 // add clone bundle info
3510 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3511 }
3512
3513 APP_LOGD("get all bundleInfos result(%{public}d)", find);
3514 return find;
3515 }
3516
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3517 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3518 {
3519 if (userId == Constants::ALL_USERID) {
3520 return GetAllBundleInfosV9(flags, bundleInfos);
3521 }
3522 int32_t requestUserId = GetUserId(userId);
3523 if (requestUserId == Constants::INVALID_USERID) {
3524 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3525 }
3526 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3527 if (bundleInfos_.empty()) {
3528 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3529 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3530 }
3531 bool ofAnyUserFlag =
3532 (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0;
3533 for (const auto &item : bundleInfos_) {
3534 const InnerBundleInfo &innerBundleInfo = item.second;
3535 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3536 LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3537 innerBundleInfo.GetBundleName().c_str());
3538 continue;
3539 }
3540 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3541 auto flag = GET_BASIC_APPLICATION_INFO;
3542 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
3543 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
3544 flag = GET_APPLICATION_INFO_WITH_DISABLE;
3545 }
3546 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
3547 auto &hp = innerBundleInfo.GetInnerBundleUserInfos();
3548 if (ofAnyUserFlag && hp.size() > 0) {
3549 responseUserId = hp.begin()->second.bundleUserInfo.userId;
3550 } else {
3551 continue;
3552 }
3553 }
3554 uint32_t launchFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY);
3555 if (((static_cast<uint32_t>(flags) & launchFlag) == launchFlag) && (innerBundleInfo.IsHideDesktopIcon())) {
3556 LOG_D(BMS_TAG_QUERY, "bundleName %{public}s is hide desktopIcon",
3557 innerBundleInfo.GetBundleName().c_str());
3558 continue;
3559 }
3560 BundleInfo bundleInfo;
3561 if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
3562 continue;
3563 }
3564 ProcessBundleMenu(bundleInfo, flags, true);
3565 ProcessBundleRouterMap(bundleInfo, flags);
3566 PostProcessAnyUserFlags(flags, responseUserId, requestUserId, bundleInfo, innerBundleInfo);
3567 bundleInfos.emplace_back(bundleInfo);
3568 if (!ofAnyUserFlag && ((static_cast<uint32_t>(flags) &
3569 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3570 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3571 // add clone bundle info
3572 GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3573 }
3574 }
3575 if (bundleInfos.empty()) {
3576 LOG_W(BMS_TAG_QUERY, "bundleInfos is empty");
3577 }
3578 return ERR_OK;
3579 }
3580
GetAllBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3581 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3582 {
3583 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3584 if (bundleInfos_.empty()) {
3585 APP_LOGW("bundleInfos_ data is empty");
3586 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3587 }
3588
3589 for (const auto &item : bundleInfos_) {
3590 const InnerBundleInfo &info = item.second;
3591 if (info.IsDisabled()) {
3592 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3593 continue;
3594 }
3595 if (info.GetApplicationBundleType() == BundleType::SHARED) {
3596 APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3597 continue;
3598 }
3599 if (((static_cast<uint32_t>(flags) &
3600 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) ==
3601 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) &&
3602 (info.IsHideDesktopIcon())) {
3603 APP_LOGD("getAllBundleInfosV9 bundleName %{public}s is hide desktopIcon",
3604 info.GetBundleName().c_str());
3605 continue;
3606 }
3607 BundleInfo bundleInfo;
3608 info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
3609 auto ret = ProcessBundleMenu(bundleInfo, flags, true);
3610 if (ret == ERR_OK) {
3611 bundleInfos.emplace_back(bundleInfo);
3612 if (((static_cast<uint32_t>(flags) &
3613 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3614 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3615 // add clone bundle info
3616 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3617 }
3618 }
3619 }
3620 if (bundleInfos.empty()) {
3621 APP_LOGW("bundleInfos is empty");
3622 }
3623 return ERR_OK;
3624 }
3625
GetBundleNameForUid(const int32_t uid,std::string & bundleName) const3626 bool BundleDataMgr::GetBundleNameForUid(const int32_t uid, std::string &bundleName) const
3627 {
3628 int32_t appIndex = 0;
3629 return GetBundleNameAndIndexForUid(uid, bundleName, appIndex) == ERR_OK;
3630 }
3631
GetBundleNameAndIndexForUid(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3632 ErrCode BundleDataMgr::GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName,
3633 int32_t &appIndex) const
3634 {
3635 InnerBundleInfo innerBundleInfo;
3636 if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
3637 if (sandboxAppHelper_ == nullptr) {
3638 return ERR_BUNDLE_MANAGER_INVALID_UID;
3639 }
3640 if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3641 return ERR_BUNDLE_MANAGER_INVALID_UID;
3642 }
3643 }
3644
3645 bundleName = innerBundleInfo.GetBundleName();
3646 APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
3647 uid, bundleName.c_str(), appIndex);
3648 return ERR_OK;
3649 }
3650
GetBundleNameAndIndex(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3651 ErrCode BundleDataMgr::GetBundleNameAndIndex(const int32_t uid, std::string &bundleName,
3652 int32_t &appIndex) const
3653 {
3654 if (uid < Constants::BASE_APP_UID) {
3655 APP_LOGD("the uid(%{public}d) is not an application", uid);
3656 return ERR_BUNDLE_MANAGER_INVALID_UID;
3657 }
3658 int32_t userId = GetUserIdByUid(uid);
3659 int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3660 if (bundleId < 0) {
3661 APP_LOGD("the uid(%{public}d) is not an application", uid);
3662 return ERR_BUNDLE_MANAGER_INVALID_UID;
3663 }
3664
3665 std::shared_lock<std::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3666 auto bundleIdIter = bundleIdMap_.find(bundleId);
3667 if (bundleIdIter == bundleIdMap_.end()) {
3668 APP_LOGW_NOFUNC("bundleId %{public}d is not existed", bundleId);
3669 return ERR_BUNDLE_MANAGER_INVALID_UID;
3670 }
3671 std::string keyName = bundleIdIter->second;
3672 if (keyName.empty()) {
3673 return ERR_BUNDLE_MANAGER_INVALID_UID;
3674 }
3675 // bundleName, sandbox_app: \d+_w+, clone_app: \d+clone_w+, others
3676 if (isdigit(keyName[0])) {
3677 size_t pos = keyName.find_first_not_of("0123456789");
3678 if (pos == std::string::npos) {
3679 return ERR_BUNDLE_MANAGER_INVALID_UID;
3680 }
3681 std::string index = keyName.substr(0, pos);
3682 if (!OHOS::StrToInt(index, appIndex)) {
3683 return ERR_BUNDLE_MANAGER_INVALID_UID;
3684 }
3685
3686 auto clonePos = keyName.find(CLONE_BUNDLE_PREFIX);
3687 if (clonePos != std::string::npos && clonePos == pos) {
3688 bundleName = keyName.substr(clonePos + strlen(CLONE_BUNDLE_PREFIX));
3689 return ERR_OK;
3690 }
3691
3692 auto sandboxPos = keyName.find(Constants::FILE_UNDERLINE);
3693 if (sandboxPos != std::string::npos && sandboxPos == pos) {
3694 bundleName = keyName.substr(sandboxPos + strlen(Constants::FILE_UNDERLINE));
3695 return ERR_OK;
3696 }
3697 }
3698
3699 bundleName = keyName;
3700 appIndex = 0;
3701 return ERR_OK;
3702 }
3703
GetInnerBundleInfoAndIndexByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo,int32_t & appIndex) const3704 ErrCode BundleDataMgr::GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo,
3705 int32_t &appIndex) const
3706 {
3707 if (uid < Constants::BASE_APP_UID) {
3708 APP_LOGD("the uid(%{public}d) is not an application", uid);
3709 return ERR_BUNDLE_MANAGER_INVALID_UID;
3710 }
3711 int32_t userId = GetUserIdByUid(uid);
3712 int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3713
3714 std::string keyName;
3715 {
3716 std::shared_lock<std::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3717 auto bundleIdIter = bundleIdMap_.find(bundleId);
3718 if (bundleIdIter == bundleIdMap_.end()) {
3719 APP_LOGW_NOFUNC("uid %{public}d is not existed", uid);
3720 return ERR_BUNDLE_MANAGER_INVALID_UID;
3721 }
3722 keyName = bundleIdIter->second;
3723 }
3724 std::string bundleName = keyName;
3725 GetBundleNameAndIndexByName(keyName, bundleName, appIndex);
3726
3727 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3728 auto bundleInfoIter = bundleInfos_.find(bundleName);
3729 if (bundleInfoIter == bundleInfos_.end()) {
3730 APP_LOGE("bundleName %{public}s is not existed in bundleInfos_", bundleName.c_str());
3731 return ERR_BUNDLE_MANAGER_INVALID_UID;
3732 }
3733 int32_t oriUid = bundleInfoIter->second.GetUid(userId, appIndex);
3734 if (oriUid == uid) {
3735 innerBundleInfo = bundleInfoIter->second;
3736 return ERR_OK;
3737 }
3738
3739 APP_LOGW("bn %{public}s uid %{public}d oriUid %{public}d ", bundleName.c_str(), uid, oriUid);
3740 return ERR_BUNDLE_MANAGER_INVALID_UID;
3741 }
3742
GetInnerBundleInfoByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo) const3743 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const
3744 {
3745 int32_t appIndex = 0;
3746 return GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex);
3747 }
3748
GetRecoverablePreInstallBundleInfos()3749 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
3750 {
3751 std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
3752 int32_t userId = AccountHelper::GetCurrentActiveUserId();
3753 if (userId == Constants::INVALID_USERID) {
3754 APP_LOGW("userId %{public}d is invalid", userId);
3755 return recoverablePreInstallBundleInfos;
3756 }
3757 std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
3758 for (auto preInstallBundleInfo: preInstallBundleInfos) {
3759 if (!preInstallBundleInfo.IsRemovable()) {
3760 continue;
3761 }
3762 if (preInstallBundleInfo.HasForceUninstalledUser(userId)) {
3763 APP_LOGW("-n %{public}s is force unisntalled in -u %{public}d",
3764 preInstallBundleInfo.GetBundleName().c_str(), userId);
3765 continue;
3766 }
3767 if (BundleUserMgrHostImpl::SkipThirdPreloadAppInstallation(userId, preInstallBundleInfo)) {
3768 continue;
3769 }
3770 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3771 auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
3772 if (infoItem == bundleInfos_.end()) {
3773 recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3774 continue;
3775 }
3776 if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
3777 !infoItem->second.HasInnerBundleUserInfo(userId)) {
3778 recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3779 }
3780 }
3781 return recoverablePreInstallBundleInfos;
3782 }
3783
IsBundleExist(const std::string & bundleName) const3784 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
3785 {
3786 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3787 return bundleInfos_.find(bundleName) != bundleInfos_.end();
3788 }
3789
HasUserInstallInBundle(const std::string & bundleName,const int32_t userId) const3790 bool BundleDataMgr::HasUserInstallInBundle(
3791 const std::string &bundleName, const int32_t userId) const
3792 {
3793 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3794 auto infoItem = bundleInfos_.find(bundleName);
3795 if (infoItem == bundleInfos_.end()) {
3796 return false;
3797 }
3798
3799 return infoItem->second.HasInnerBundleUserInfo(userId);
3800 }
3801
3802 #ifdef ABILITY_RUNTIME_ENABLE
GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,const std::string & bundleName,const std::vector<int32_t> & cloneAppIndexes) const3803 std::vector<int32_t> BundleDataMgr::GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,
3804 const std::string &bundleName, const std::vector<int32_t> &cloneAppIndexes) const
3805 {
3806 std::vector<int32_t> noRunningCloneAppIndexes;
3807 if (appMgrProxy == nullptr) {
3808 APP_LOGW("fail to find the app mgr service to check app is running");
3809 return noRunningCloneAppIndexes;
3810 }
3811
3812 for (const auto &appIndex : cloneAppIndexes) {
3813 bool running = SystemAbilityHelper::IsAppRunning(appMgrProxy, bundleName, appIndex);
3814 if (running) {
3815 APP_LOGW("No del cache for %{public}s[%{public}d]: is running", bundleName.c_str(), appIndex);
3816 continue;
3817 }
3818 noRunningCloneAppIndexes.emplace_back(appIndex);
3819 }
3820 return noRunningCloneAppIndexes;
3821 }
3822 #endif
3823
GetBundleCacheInfo(std::function<std::vector<int32_t> (std::string &,std::vector<int32_t> &)> idxFilter,const InnerBundleInfo & info,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,const int32_t userId,bool isClean) const3824 void BundleDataMgr::GetBundleCacheInfo(
3825 std::function<std::vector<int32_t>(std::string&, std::vector<int32_t>&)> idxFilter,
3826 const InnerBundleInfo &info,
3827 std::vector<std::tuple<std::string, std::vector<std::string>, std::vector<int32_t>>> &validBundles,
3828 const int32_t userId, bool isClean) const
3829 {
3830 std::string bundleName = info.GetBundleName();
3831 if (isClean && !info.GetBaseApplicationInfo().userDataClearable) {
3832 APP_LOGW("Not clearable:%{public}s, userid:%{public}d", bundleName.c_str(), userId);
3833 return;
3834 }
3835 std::vector<std::string> moduleNameList;
3836 info.GetModuleNames(moduleNameList);
3837 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
3838 cloneAppIndexes.emplace_back(0);
3839 std::vector<int32_t> allAppIndexes = cloneAppIndexes;
3840 if (isClean) {
3841 allAppIndexes = idxFilter(bundleName, cloneAppIndexes);
3842 }
3843 validBundles.emplace_back(std::make_tuple(bundleName, moduleNameList, allAppIndexes));
3844 // add atomic service
3845 if (info.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE) {
3846 std::string atomicServiceName;
3847 AccountSA::OhosAccountInfo accountInfo;
3848 auto ret = GetDirForAtomicServiceByUserId(bundleName, userId, accountInfo, atomicServiceName);
3849 if (ret == ERR_OK && !atomicServiceName.empty()) {
3850 APP_LOGD("atomicServiceName: %{public}s", atomicServiceName.c_str());
3851 validBundles.emplace_back(std::make_tuple(atomicServiceName, moduleNameList, allAppIndexes));
3852 }
3853 }
3854 }
3855
GetBundleCacheInfos(const int32_t userId,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,bool isClean) const3856 void BundleDataMgr::GetBundleCacheInfos(const int32_t userId, std::vector<std::tuple<std::string,
3857 std::vector<std::string>, std::vector<int32_t>>> &validBundles, bool isClean) const
3858 {
3859 #ifdef ABILITY_RUNTIME_ENABLE
3860 sptr<IAppMgr> appMgrProxy = iface_cast<IAppMgr>(SystemAbilityHelper::GetSystemAbility(APP_MGR_SERVICE_ID));
3861 if (appMgrProxy == nullptr) {
3862 APP_LOGE("CleanBundleCache fail to find the app mgr service to check app is running");
3863 return;
3864 }
3865 auto idxFiltor = [&appMgrProxy, this](std::string &bundleName, std::vector<int32_t> &allidx) {
3866 return this->GetNoRunningBundleCloneIndexes(appMgrProxy, bundleName, allidx);
3867 };
3868 #else
3869 auto idxFiltor = [](std::string &bundleName, std::vector<int32_t> &allidx) {
3870 return allidx;
3871 };
3872 #endif
3873 std::map<std::string, InnerBundleInfo> infos = GetAllInnerBundleInfos();
3874 for (const auto &item : infos) {
3875 GetBundleCacheInfo(idxFiltor, item.second, validBundles, userId, isClean);
3876 }
3877 return;
3878 }
3879
GetBundleStats(const std::string & bundleName,const int32_t userId,std::vector<int64_t> & bundleStats,const int32_t appIndex,const uint32_t statFlag) const3880 bool BundleDataMgr::GetBundleStats(const std::string &bundleName,
3881 const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex, const uint32_t statFlag) const
3882 {
3883 int32_t responseUserId = -1;
3884 int32_t uid = -1;
3885 std::vector<std::string> moduleNameList;
3886 {
3887 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3888 const auto infoItem = bundleInfos_.find(bundleName);
3889 if (infoItem == bundleInfos_.end()) {
3890 return false;
3891 }
3892 responseUserId = infoItem->second.GetResponseUserId(userId);
3893 uid = infoItem->second.GetUid(responseUserId, appIndex);
3894 infoItem->second.GetModuleNames(moduleNameList);
3895 }
3896 ErrCode ret = InstalldClient::GetInstance()->GetBundleStats(
3897 bundleName, responseUserId, bundleStats, uid, appIndex, statFlag, moduleNameList);
3898 if (ret != ERR_OK) {
3899 APP_LOGW("%{public}s getStats failed", bundleName.c_str());
3900 return false;
3901 }
3902 {
3903 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3904 const auto infoItem = bundleInfos_.find(bundleName);
3905 if (infoItem == bundleInfos_.end()) {
3906 return false;
3907 }
3908 if (appIndex == 0 && infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
3909 for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
3910 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
3911 continue;
3912 }
3913 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
3914 }
3915 }
3916 }
3917
3918 return true;
3919 }
3920
GetBundleModuleNames(const std::string & bundleName,std::vector<std::string> & moduleNameList) const3921 void BundleDataMgr::GetBundleModuleNames(const std::string &bundleName,
3922 std::vector<std::string> &moduleNameList) const
3923 {
3924 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3925 const auto infoItem = bundleInfos_.find(bundleName);
3926 if (infoItem == bundleInfos_.end()) {
3927 APP_LOGW("No modules of: %{public}s", bundleName.c_str());
3928 return;
3929 }
3930 infoItem->second.GetModuleNames(moduleNameList);
3931 }
3932
GetAllBundleStats(const int32_t userId,std::vector<int64_t> & bundleStats) const3933 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
3934 {
3935 std::vector<int32_t> uids;
3936 int32_t responseUserId = userId;
3937 int32_t requestUserId = GetUserId(userId);
3938 if (requestUserId == Constants::INVALID_USERID) {
3939 APP_LOGE("invalid userid :%{public}d", userId);
3940 return false;
3941 }
3942 {
3943 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3944 for (const auto &item : bundleInfos_) {
3945 const InnerBundleInfo &info = item.second;
3946 std::string bundleName = info.GetBundleName();
3947 responseUserId = info.GetResponseUserId(requestUserId);
3948 if (responseUserId == Constants::INVALID_USERID) {
3949 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
3950 continue;
3951 }
3952 BundleType type = info.GetApplicationBundleType();
3953 if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
3954 APP_LOGD("BundleType is invalid: %{public}d, bundname: %{public}s", type, bundleName.c_str());
3955 continue;
3956 }
3957 std::vector<int32_t> allAppIndexes = {0};
3958 if (type == BundleType::APP) {
3959 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
3960 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
3961 }
3962 for (int32_t appIndex: allAppIndexes) {
3963 int32_t uid = info.GetUid(responseUserId, appIndex);
3964 uids.emplace_back(uid);
3965 }
3966 }
3967 }
3968 if (InstalldClient::GetInstance()->GetAllBundleStats(responseUserId, bundleStats, uids) != ERR_OK) {
3969 APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
3970 return false;
3971 }
3972 if (bundleStats.empty()) {
3973 APP_LOGE("bundle stats is empty");
3974 return true;
3975 }
3976 return true;
3977 }
3978 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string & bundleName) const3979 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
3980 {
3981 return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
3982 }
3983
GetBundleSpaceSize(const std::string & bundleName,int32_t userId) const3984 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
3985 {
3986 int64_t spaceSize = 0;
3987 if (userId != Constants::ALL_USERID) {
3988 std::vector<int64_t> bundleStats;
3989 if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
3990 APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
3991 return spaceSize;
3992 }
3993
3994 spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
3995 return spaceSize;
3996 }
3997
3998 for (const auto &iterUserId : GetAllUser()) {
3999 std::vector<int64_t> bundleStats;
4000 if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
4001 APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
4002 continue;
4003 }
4004
4005 auto startIter = bundleStats.begin();
4006 auto endIter = bundleStats.end();
4007 if (spaceSize == 0) {
4008 spaceSize = std::accumulate(startIter, endIter, spaceSize);
4009 } else {
4010 spaceSize = std::accumulate(++startIter, endIter, spaceSize);
4011 }
4012 }
4013
4014 return spaceSize;
4015 }
4016
GetAllFreeInstallBundleSpaceSize() const4017 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
4018 {
4019 int64_t allSize = 0;
4020 std::map<std::string, std::vector<std::string>> freeInstallModules;
4021 if (!GetFreeInstallModules(freeInstallModules)) {
4022 APP_LOGW("no removable bundles");
4023 return allSize;
4024 }
4025
4026 for (const auto &iter : freeInstallModules) {
4027 APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
4028 allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
4029 }
4030
4031 APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
4032 return allSize;
4033 }
4034
GetFreeInstallModules(std::map<std::string,std::vector<std::string>> & freeInstallModules) const4035 bool BundleDataMgr::GetFreeInstallModules(
4036 std::map<std::string, std::vector<std::string>> &freeInstallModules) const
4037 {
4038 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4039 if (bundleInfos_.empty()) {
4040 APP_LOGW("bundleInfos_ is data is empty");
4041 return false;
4042 }
4043
4044 for (const auto &iter : bundleInfos_) {
4045 std::vector<std::string> modules;
4046 if (!iter.second.GetFreeInstallModules(modules)) {
4047 continue;
4048 }
4049
4050 freeInstallModules.emplace(iter.first, modules);
4051 }
4052
4053 return !freeInstallModules.empty();
4054 }
4055 #endif
4056
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames) const4057 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
4058 {
4059 InnerBundleInfo innerBundleInfo;
4060 if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4061 APP_LOGD("get innerBundleInfo by uid :%{public}d failed", uid);
4062 return false;
4063 }
4064
4065 bundleNames.emplace_back(innerBundleInfo.GetBundleName());
4066 return true;
4067 }
4068
GetNameForUid(const int uid,std::string & name) const4069 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
4070 {
4071 int32_t appIndex = 0;
4072 ErrCode ret = GetBundleNameAndIndex(uid, name, appIndex);
4073 if (ret != ERR_OK) {
4074 APP_LOGE("the uid(%{public}d) is not an application", uid);
4075 return ret;
4076 }
4077 APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
4078 uid, name.c_str(), appIndex);
4079 return ERR_OK;
4080 }
4081
GetInnerBundleInfoWithSandboxByUid(const int uid,InnerBundleInfo & innerBundleInfo) const4082 ErrCode BundleDataMgr::GetInnerBundleInfoWithSandboxByUid(const int uid, InnerBundleInfo &innerBundleInfo) const
4083 {
4084 ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
4085 if (ret != ERR_OK) {
4086 APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed");
4087 if (sandboxAppHelper_ == nullptr) {
4088 APP_LOGW("sandboxAppHelper_ is nullptr");
4089 return ERR_BUNDLE_MANAGER_INVALID_UID;
4090 }
4091 if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4092 APP_LOGE("Call GetInnerBundleInfoByUid failed");
4093 return ERR_BUNDLE_MANAGER_INVALID_UID;
4094 }
4095 }
4096 return ERR_OK;
4097 }
4098
GetBundleGids(const std::string & bundleName,std::vector<int> & gids) const4099 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
4100 {
4101 int32_t requestUserId = GetUserId();
4102 InnerBundleUserInfo innerBundleUserInfo;
4103 if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
4104 APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) ",
4105 requestUserId, bundleName.c_str());
4106 return false;
4107 }
4108
4109 gids = innerBundleUserInfo.gids;
4110 return true;
4111 }
4112
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids) const4113 bool BundleDataMgr::GetBundleGidsByUid(
4114 const std::string &bundleName, const int &uid, std::vector<int> &gids) const
4115 {
4116 return true;
4117 }
4118
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos) const4119 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
4120 {
4121 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4122 if (bundleInfos_.empty()) {
4123 APP_LOGW("bundleInfos_ data is empty");
4124 return false;
4125 }
4126
4127 int32_t requestUserId = GetUserId();
4128 for (const auto &info : bundleInfos_) {
4129 if (info.second.IsDisabled()) {
4130 APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
4131 continue;
4132 }
4133 if (info.second.GetIsKeepAlive()) {
4134 BundleInfo bundleInfo;
4135 int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
4136 info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
4137 if (bundleInfo.name == "") {
4138 continue;
4139 }
4140 bundleInfos.emplace_back(bundleInfo);
4141 }
4142 }
4143 return !(bundleInfos.empty());
4144 }
4145
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label) const4146 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
4147 const std::string &abilityName, std::string &label) const
4148 {
4149 #ifdef GLOBAL_RESMGR_ENABLE
4150 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4151 int32_t requestUserId = GetUserId();
4152 if (requestUserId == Constants::INVALID_USERID) {
4153 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4154 }
4155 InnerBundleInfo innerBundleInfo;
4156 ErrCode ret =
4157 GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
4158 if (ret != ERR_OK) {
4159 return ret;
4160 }
4161 AbilityInfo abilityInfo;
4162 ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
4163 if (ret != ERR_OK) {
4164 APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
4165 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
4166 return ret;
4167 }
4168 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4169 bool isEnable = false;
4170 ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
4171 if (ret != ERR_OK) {
4172 return ret;
4173 }
4174 if (!isEnable) {
4175 APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
4176 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
4177 }
4178 if (abilityInfo.labelId == 0) {
4179 label = abilityInfo.label;
4180 return ERR_OK;
4181 }
4182 std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
4183 GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
4184 if (resourceManager == nullptr) {
4185 APP_LOGW("InitResourceManager failed");
4186 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4187 }
4188 auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
4189 if (state != OHOS::Global::Resource::RState::SUCCESS) {
4190 APP_LOGW("ResourceManager GetStringById failed");
4191 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4192 }
4193 return ERR_OK;
4194 #else
4195 APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
4196 return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
4197 #endif
4198 }
4199
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo,int32_t userId) const4200 bool BundleDataMgr::GetHapModuleInfo(
4201 const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
4202 {
4203 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4204 int32_t requestUserId = GetUserId(userId);
4205 if (requestUserId == Constants::INVALID_USERID) {
4206 return false;
4207 }
4208
4209 if (bundleInfos_.empty()) {
4210 APP_LOGW("bundleInfos_ data is empty");
4211 return false;
4212 }
4213
4214 APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
4215 auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4216 if (infoItem == bundleInfos_.end()) {
4217 return false;
4218 }
4219
4220 const InnerBundleInfo &innerBundleInfo = infoItem->second;
4221 if (innerBundleInfo.IsDisabled()) {
4222 APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4223 return false;
4224 }
4225
4226 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4227 auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
4228 if (!module) {
4229 APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
4230 abilityInfo.bundleName.c_str());
4231 return false;
4232 }
4233 hapModuleInfo = *module;
4234 return true;
4235 }
4236
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId) const4237 ErrCode BundleDataMgr::GetLaunchWantForBundle(
4238 const std::string &bundleName, Want &want, int32_t userId) const
4239 {
4240 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4241 InnerBundleInfo innerBundleInfo;
4242 ErrCode ret = GetInnerBundleInfoWithFlagsV9(
4243 bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
4244 if (ret != ERR_OK) {
4245 APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
4246 return ret;
4247 }
4248
4249 std::string mainAbility = innerBundleInfo.GetMainAbility();
4250 if (mainAbility.empty()) {
4251 APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
4252 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4253 }
4254
4255 want.SetElementName("", bundleName, mainAbility);
4256 want.SetAction(Constants::ACTION_HOME);
4257 want.AddEntity(Constants::ENTITY_HOME);
4258 return ERR_OK;
4259 }
4260
CheckIsSystemAppByUid(const int uid) const4261 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
4262 {
4263 // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
4264 // the uid should be the system uid.
4265 if (uid == Constants::ROOT_UID || uid == ServiceConstants::BMS_UID) {
4266 return true;
4267 }
4268
4269 InnerBundleInfo innerBundleInfo;
4270 if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4271 return false;
4272 }
4273
4274 return innerBundleInfo.IsSystemApp();
4275 }
4276
InitStateTransferMap()4277 void BundleDataMgr::InitStateTransferMap()
4278 {
4279 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
4280 transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
4281 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
4282 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
4283 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
4284 transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
4285 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
4286 transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
4287 transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
4288 transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
4289 transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
4290 transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
4291 transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
4292 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
4293 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
4294 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
4295 transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
4296 transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
4297 transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
4298 transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
4299 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
4300 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
4301 transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
4302 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
4303 transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
4304 transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
4305 transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
4306 transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
4307 }
4308
IsDeleteDataState(const InstallState state) const4309 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
4310 {
4311 return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
4312 state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
4313 }
4314
IsDisableState(const InstallState state) const4315 bool BundleDataMgr::IsDisableState(const InstallState state) const
4316 {
4317 if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
4318 return true;
4319 }
4320 return false;
4321 }
4322
DeleteBundleInfo(const std::string & bundleName,const InstallState state,const bool isKeepData)4323 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state, const bool isKeepData)
4324 {
4325 if (InstallState::INSTALL_FAIL == state) {
4326 APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
4327 return;
4328 }
4329
4330 auto infoItem = bundleInfos_.find(bundleName);
4331 if (infoItem == bundleInfos_.end()) {
4332 APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
4333 return;
4334 }
4335 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
4336 // remove external overlay bundle info and connection
4337 RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
4338 #endif
4339 APP_LOGI("del bundle name:%{public}s", bundleName.c_str());
4340 const InnerBundleInfo &innerBundleInfo = infoItem->second;
4341 if (!isKeepData) {
4342 RecycleUidAndGid(innerBundleInfo);
4343 }
4344 bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
4345 if (!ret) {
4346 APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
4347 }
4348 bundleInfos_.erase(bundleName);
4349 std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
4350 if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
4351 appServiceHspBundleName_.erase(bundleName);
4352 }
4353 DeleteDesktopShortcutInfo(bundleName);
4354 }
4355
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,int32_t userId,int32_t appIndex) const4356 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4357 const int32_t flags, int32_t userId, int32_t appIndex) const
4358 {
4359 if (bundleName.empty()) {
4360 return false;
4361 }
4362 int32_t requestUserId = GetUserId(userId);
4363 if (requestUserId == Constants::INVALID_USERID) {
4364 return false;
4365 }
4366
4367 if (bundleInfos_.empty()) {
4368 APP_LOGW("bundleInfos_ data is empty");
4369 return false;
4370 }
4371 APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
4372 auto item = bundleInfos_.find(bundleName);
4373 if (item == bundleInfos_.end()) {
4374 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4375 bundleName.c_str(), userId, appIndex, flags);
4376 return false;
4377 }
4378 const InnerBundleInfo &innerBundleInfo = item->second;
4379 if (innerBundleInfo.IsDisabled()) {
4380 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4381 bundleName.c_str(), userId, appIndex, flags);
4382 return false;
4383 }
4384
4385 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4386 if (appIndex == 0) {
4387 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
4388 && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
4389 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4390 bundleName.c_str(), responseUserId, appIndex, flags);
4391 return false;
4392 }
4393 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
4394 bool isEnabled = false;
4395 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4396 if (ret != ERR_OK) {
4397 APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d", ret);
4398 return false;
4399 }
4400 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
4401 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4402 bundleName.c_str(), responseUserId, appIndex, flags);
4403 return false;
4404 }
4405 } else {
4406 return false;
4407 }
4408 return true;
4409 }
4410
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4411 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4412 const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4413 {
4414 bool res = GetInnerBundleInfoWithFlags(bundleName, flags, userId, appIndex);
4415 if (!res) {
4416 return false;
4417 }
4418 auto item = bundleInfos_.find(bundleName);
4419 if (item == bundleInfos_.end()) {
4420 APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4421 return false;
4422 }
4423 info = item->second;
4424 return true;
4425 }
4426
GetInnerBundleInfoWithBundleFlagsAndLock(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const4427 bool BundleDataMgr::GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName,
4428 const int32_t flags, InnerBundleInfo &info, int32_t userId) const
4429 {
4430 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4431 bool res = GetInnerBundleInfoWithFlags(bundleName, flags, info, userId);
4432 if (!res) {
4433 APP_LOGD("GetInnerBundleInfoWithBundleFlagsAndLock: bundleName %{public}s not find", bundleName.c_str());
4434 return res;
4435 }
4436 return true;
4437 }
4438
GetInnerBundleInfoWithFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4439 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
4440 const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4441 {
4442 int32_t requestUserId = GetUserId(userId);
4443 if (requestUserId == Constants::INVALID_USERID) {
4444 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4445 }
4446
4447 if (bundleInfos_.empty()) {
4448 APP_LOGD("bundleInfos_ data is empty");
4449 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4450 }
4451 APP_LOGD(
4452 "GetInnerBundleInfoWithFlagsV9:bundleName:%{public}s,flags:%{public}d,userId:%{public}d,appIndex:%{public}d",
4453 bundleName.c_str(), flags, userId, appIndex);
4454 auto item = bundleInfos_.find(bundleName);
4455 if (item == bundleInfos_.end()) {
4456 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4457 bundleName.c_str(), userId, appIndex, flags);
4458 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4459 }
4460 const InnerBundleInfo &innerBundleInfo = item->second;
4461 if (innerBundleInfo.IsDisabled()) {
4462 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4463 bundleName.c_str(), userId, appIndex, flags);
4464 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4465 }
4466
4467 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4468 bool isEnabled = false;
4469 auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4470 if (ret != ERR_OK) {
4471 APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d -n %{public}s", ret, bundleName.c_str());
4472 return ret;
4473 }
4474 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
4475 && !isEnabled) {
4476 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4477 bundleName.c_str(), responseUserId, appIndex, flags);
4478 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4479 }
4480 info = innerBundleInfo;
4481 return ERR_OK;
4482 }
4483
GetInnerBundleInfoWithBundleFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4484 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
4485 const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4486 {
4487 if (bundleName.empty()) {
4488 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4489 }
4490 int32_t requestUserId = GetUserId(userId);
4491 if (requestUserId == Constants::INVALID_USERID) {
4492 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4493 }
4494
4495 if (bundleInfos_.empty()) {
4496 APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
4497 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4498 }
4499 APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
4500 auto item = bundleInfos_.find(bundleName);
4501 if (item == bundleInfos_.end()) {
4502 APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4503 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4504 }
4505 const InnerBundleInfo &innerBundleInfo = item->second;
4506 if (innerBundleInfo.IsDisabled()) {
4507 APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
4508 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4509 }
4510
4511 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4512 bool isEnabled = false;
4513 auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4514 if (ret != ERR_OK) {
4515 return ret;
4516 }
4517 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
4518 && !isEnabled) {
4519 APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4520 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4521 }
4522 info = innerBundleInfo;
4523 return ERR_OK;
4524 }
4525
GetInnerBundleInfoWithDisable(const std::string & bundleName,InnerBundleInfo & info)4526 bool BundleDataMgr::GetInnerBundleInfoWithDisable(const std::string &bundleName, InnerBundleInfo &info)
4527 {
4528 APP_LOGD("GetInnerBundleInfoWithDisable %{public}s", bundleName.c_str());
4529 if (bundleName.empty()) {
4530 APP_LOGW("bundleName is empty");
4531 return false;
4532 }
4533
4534 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4535 auto infoItem = bundleInfos_.find(bundleName);
4536 if (infoItem == bundleInfos_.end()) {
4537 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4538 return false;
4539 }
4540 infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4541 info = infoItem->second;
4542 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4543 return true;
4544 }
4545
DisableBundle(const std::string & bundleName)4546 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
4547 {
4548 APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
4549 if (bundleName.empty()) {
4550 APP_LOGW("bundleName empty");
4551 return false;
4552 }
4553
4554 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4555 auto infoItem = bundleInfos_.find(bundleName);
4556 if (infoItem == bundleInfos_.end()) {
4557 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4558 return false;
4559 }
4560 infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4561 return true;
4562 }
4563
EnableBundle(const std::string & bundleName)4564 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
4565 {
4566 APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
4567 if (bundleName.empty()) {
4568 APP_LOGW("bundleName empty");
4569 return false;
4570 }
4571
4572 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4573 auto infoItem = bundleInfos_.find(bundleName);
4574 if (infoItem == bundleInfos_.end()) {
4575 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4576 return false;
4577 }
4578 infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4579 return true;
4580 }
4581
IsApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool & isEnabled,int32_t userId) const4582 ErrCode BundleDataMgr::IsApplicationEnabled(
4583 const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const
4584 {
4585 APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
4586 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4587 auto infoItem = bundleInfos_.find(bundleName);
4588 if (infoItem == bundleInfos_.end()) {
4589 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4590 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4591 }
4592 int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId(userId));
4593 if (appIndex == 0) {
4594 ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
4595 if (ret != ERR_OK) {
4596 APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
4597 }
4598 return ret;
4599 }
4600 const InnerBundleInfo &bundleInfo = infoItem->second;
4601 InnerBundleUserInfo innerBundleUserInfo;
4602 if (!bundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
4603 APP_LOGW("can not find userId %{public}d", responseUserId);
4604 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4605 }
4606 auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex));
4607 if (iter == innerBundleUserInfo.cloneInfos.end()) {
4608 APP_LOGW("can not find appIndex %{public}d", appIndex);
4609 return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4610 }
4611 isEnabled = iter->second.enabled;
4612 return ERR_OK;
4613 }
4614
SetApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool isEnable,const std::string & caller,int32_t userId)4615 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName,
4616 int32_t appIndex, bool isEnable, const std::string &caller, int32_t userId)
4617 {
4618 APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
4619 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4620 int32_t requestUserId = GetUserId(userId);
4621 if (requestUserId == Constants::INVALID_USERID) {
4622 APP_LOGW("Request userId %{public}d is invalid, bundleName:%{public}s", userId, bundleName.c_str());
4623 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4624 }
4625 auto infoItem = bundleInfos_.find(bundleName);
4626 if (infoItem == bundleInfos_.end()) {
4627 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4628 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4629 }
4630
4631 InnerBundleInfo& newInfo = infoItem->second;
4632 if (appIndex != 0) {
4633 auto ret = newInfo.SetCloneApplicationEnabled(isEnable, appIndex, caller, requestUserId);
4634 if (ret != ERR_OK) {
4635 APP_LOGW("SetCloneApplicationEnabled for innerBundleInfo fail, errCode is %{public}d", ret);
4636 return ret;
4637 }
4638 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4639 APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", newInfo.GetBundleName().c_str());
4640 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4641 }
4642 return ERR_OK;
4643 }
4644 auto ret = newInfo.SetApplicationEnabled(isEnable, caller, requestUserId);
4645 if (ret != ERR_OK) {
4646 APP_LOGW("SetApplicationEnabled failed, err %{public}d", ret);
4647 return ret;
4648 }
4649
4650 InnerBundleUserInfo innerBundleUserInfo;
4651 if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4652 APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
4653 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4654 }
4655
4656 if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4657 bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
4658 } else {
4659 bundleStateStorage_->SaveBundleStateStorage(
4660 bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4661 }
4662 return ERR_OK;
4663 }
4664
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)4665 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
4666 {
4667 if (bundleName.empty() || moduleName.empty()) {
4668 APP_LOGW("bundleName or moduleName is empty");
4669 return false;
4670 }
4671 int32_t userId = AccountHelper::GetCurrentActiveUserId();
4672 if (userId == Constants::INVALID_USERID) {
4673 APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4674 return false;
4675 }
4676 APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4677 bundleName.c_str(), moduleName.c_str(), userId);
4678 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4679 auto infoItem = bundleInfos_.find(bundleName);
4680 if (infoItem == bundleInfos_.end()) {
4681 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4682 return false;
4683 }
4684 InnerBundleInfo newInfo = infoItem->second;
4685 bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
4686 if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
4687 ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
4688 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
4689 if (isEnable) {
4690 // call clean task
4691 APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
4692 bundleName.c_str(), isEnable, ret);
4693 DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
4694 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
4695 }
4696 #endif
4697 return ret;
4698 } else {
4699 APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
4700 return false;
4701 }
4702 }
4703
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable) const4704 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
4705 bool &isRemovable) const
4706 {
4707 if (bundleName.empty() || moduleName.empty()) {
4708 APP_LOGW("bundleName or moduleName is empty");
4709 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4710 }
4711 int32_t userId = AccountHelper::GetCurrentActiveUserId();
4712 if (userId == Constants::INVALID_USERID) {
4713 APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4714 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4715 }
4716 APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4717 bundleName.c_str(), moduleName.c_str(), userId);
4718 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4719 auto infoItem = bundleInfos_.find(bundleName);
4720 if (infoItem == bundleInfos_.end()) {
4721 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4722 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4723 }
4724 InnerBundleInfo newInfo = infoItem->second;
4725 return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
4726 }
4727
IsAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool & isEnable) const4728 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const
4729 {
4730 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4731 auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4732 if (infoItem == bundleInfos_.end()) {
4733 APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4734 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4735 }
4736 std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(abilityInfo.bundleName, Constants::ALL_USERID);
4737 if ((appIndex != 0) && (std::find(appIndexVec.begin(), appIndexVec.end(), appIndex) == appIndexVec.end())) {
4738 APP_LOGE("appIndex %{public}d is invalid", appIndex);
4739 return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4740 }
4741 InnerBundleInfo innerBundleInfo = infoItem->second;
4742 auto ability = innerBundleInfo.FindAbilityInfoV9(
4743 abilityInfo.moduleName, abilityInfo.name);
4744 if (!ability) {
4745 APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
4746 abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
4747 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4748 }
4749 int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
4750 return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable, appIndex);
4751 }
4752
SetAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool isEnabled,int32_t userId)4753 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex,
4754 bool isEnabled, int32_t userId)
4755 {
4756 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4757 int32_t requestUserId = GetUserId(userId);
4758 if (requestUserId == Constants::INVALID_USERID) {
4759 APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
4760 abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4761 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4762 }
4763 auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4764 if (infoItem == bundleInfos_.end()) {
4765 APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4766 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4767 }
4768 InnerBundleInfo& newInfo = infoItem->second;
4769 if (appIndex != 0) {
4770 auto ret = newInfo.SetCloneAbilityEnabled(
4771 abilityInfo.moduleName, abilityInfo.name, isEnabled, userId, appIndex);
4772 if (ret != ERR_OK) {
4773 APP_LOGW("SetCloneAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4774 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4775 return ret;
4776 }
4777 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4778 APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", newInfo.GetBundleName().c_str());
4779 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4780 }
4781 return ERR_OK;
4782 }
4783 ErrCode ret = newInfo.SetAbilityEnabled(
4784 abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
4785 if (ret != ERR_OK) {
4786 APP_LOGW("SetAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4787 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4788 return ret;
4789 }
4790 InnerBundleUserInfo innerBundleUserInfo;
4791 if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4792 APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4793 requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4794 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4795 }
4796 if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4797 bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
4798 } else {
4799 bundleStateStorage_->SaveBundleStateStorage(
4800 abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4801 }
4802 return ERR_OK;
4803 }
4804
GetSandboxAppHelper() const4805 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
4806 {
4807 return sandboxAppHelper_;
4808 }
4809
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)4810 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4811 {
4812 APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4813 std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4814 callbackList_.emplace_back(bundleStatusCallback);
4815 if (bundleStatusCallback->AsObject() != nullptr) {
4816 sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
4817 new (std::nothrow) BundleStatusCallbackDeathRecipient();
4818 if (deathRecipient == nullptr) {
4819 APP_LOGW("deathRecipient is null");
4820 return false;
4821 }
4822 bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
4823 }
4824 return true;
4825 }
4826
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)4827 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4828 {
4829 if (bundleEventCallback == nullptr) {
4830 APP_LOGW("bundleEventCallback is null");
4831 return false;
4832 }
4833 std::lock_guard lock(eventCallbackMutex_);
4834 if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
4835 APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
4836 return false;
4837 }
4838 if (bundleEventCallback->AsObject() != nullptr) {
4839 sptr<BundleEventCallbackDeathRecipient> deathRecipient =
4840 new (std::nothrow) BundleEventCallbackDeathRecipient();
4841 if (deathRecipient == nullptr) {
4842 APP_LOGW("deathRecipient is null");
4843 return false;
4844 }
4845 bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
4846 }
4847 eventCallbackList_.emplace_back(bundleEventCallback);
4848 return true;
4849 }
4850
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)4851 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4852 {
4853 APP_LOGD("begin to UnregisterBundleEventCallback");
4854 if (bundleEventCallback == nullptr) {
4855 APP_LOGW("bundleEventCallback is null");
4856 return false;
4857 }
4858 std::lock_guard lock(eventCallbackMutex_);
4859 eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
4860 [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
4861 return callback->AsObject() == bundleEventCallback->AsObject();
4862 }), eventCallbackList_.end());
4863 return true;
4864 }
4865
NotifyBundleEventCallback(const EventFwk::CommonEventData & eventData) const4866 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
4867 {
4868 APP_LOGD("begin to NotifyBundleEventCallback");
4869 std::lock_guard lock(eventCallbackMutex_);
4870 for (const auto &callback : eventCallbackList_) {
4871 callback->OnReceiveEvent(eventData);
4872 }
4873 APP_LOGD("finish to NotifyBundleEventCallback");
4874 }
4875
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)4876 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4877 {
4878 APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4879 std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4880 callbackList_.erase(std::remove_if(callbackList_.begin(),
4881 callbackList_.end(),
4882 [&](const sptr<IBundleStatusCallback> &callback) {
4883 return callback->AsObject() == bundleStatusCallback->AsObject();
4884 }),
4885 callbackList_.end());
4886 return true;
4887 }
4888
UnregisterBundleStatusCallback()4889 bool BundleDataMgr::UnregisterBundleStatusCallback()
4890 {
4891 std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4892 callbackList_.clear();
4893 return true;
4894 }
4895
GenerateUidAndGid(InnerBundleUserInfo & innerBundleUserInfo)4896 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
4897 {
4898 if (innerBundleUserInfo.bundleName.empty()) {
4899 APP_LOGW("bundleName is null");
4900 return false;
4901 }
4902
4903 int32_t bundleId = INVALID_BUNDLEID;
4904 if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
4905 APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
4906 return false;
4907 }
4908
4909 innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
4910 + bundleId % Constants::BASE_USER_RANGE;
4911 innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
4912 return true;
4913 }
4914
GenerateBundleId(const std::string & bundleName,int32_t & bundleId)4915 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
4916 {
4917 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4918 if (bundleIdMap_.empty()) {
4919 APP_LOGD("first app install");
4920 bundleId = baseAppUid_;
4921 bundleIdMap_.emplace(bundleId, bundleName);
4922 return true;
4923 }
4924
4925 for (const auto &innerBundleId : bundleIdMap_) {
4926 if (innerBundleId.second == bundleName) {
4927 bundleId = innerBundleId.first;
4928 return true;
4929 }
4930 }
4931
4932 for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
4933 if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
4934 APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
4935 bundleId = i;
4936 bundleIdMap_.emplace(bundleId, bundleName);
4937 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4938 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4939 return true;
4940 }
4941 }
4942
4943 if (bundleIdMap_.rbegin()->first == MAX_APP_UID) {
4944 APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
4945 return false;
4946 }
4947
4948 bundleId = bundleIdMap_.rbegin()->first + 1;
4949 bundleIdMap_.emplace(bundleId, bundleName);
4950 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4951 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4952 return true;
4953 }
4954
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,const int32_t upgradeFlag)4955 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
4956 const std::string &moduleName, const int32_t upgradeFlag)
4957 {
4958 APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
4959 if (bundleName.empty() || moduleName.empty()) {
4960 APP_LOGW("bundleName or moduleName is empty");
4961 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4962 }
4963 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4964 auto infoItem = bundleInfos_.find(bundleName);
4965 if (infoItem == bundleInfos_.end()) {
4966 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4967 }
4968 InnerBundleInfo &newInfo = infoItem->second;
4969 ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
4970 if (setFlag == ERR_OK) {
4971 if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
4972 return ERR_OK;
4973 }
4974 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
4975 }
4976 APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
4977 return setFlag;
4978 }
4979
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName) const4980 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
4981 {
4982 APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
4983 if (bundleName.empty() || moduleName.empty()) {
4984 APP_LOGW("bundleName or moduleName is empty");
4985 return false;
4986 }
4987 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4988 auto infoItem = bundleInfos_.find(bundleName);
4989 if (infoItem == bundleInfos_.end()) {
4990 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4991 return false;
4992 }
4993 InnerBundleInfo newInfo = infoItem->second;
4994 return newInfo.GetModuleUpgradeFlag(moduleName);
4995 }
4996
RecycleUidAndGid(const InnerBundleInfo & info)4997 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
4998 {
4999 auto userInfos = info.GetInnerBundleUserInfos();
5000 if (userInfos.empty()) {
5001 APP_LOGE("user infos is empty");
5002 return;
5003 }
5004
5005 auto innerBundleUserInfo = userInfos.begin()->second;
5006 int32_t bundleId = innerBundleUserInfo.uid -
5007 innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5008 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5009 auto infoItem = bundleIdMap_.find(bundleId);
5010 if (infoItem == bundleIdMap_.end()) {
5011 return;
5012 }
5013
5014 UninstallBundleInfo uninstallBundleInfo;
5015 if (GetUninstallBundleInfo(info.GetBundleName(), uninstallBundleInfo)) {
5016 return;
5017 }
5018 bundleIdMap_.erase(bundleId);
5019 BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH);
5020 BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::SHAREFS_CONFIG_PATH);
5021 }
5022
RestoreUidAndGid()5023 bool BundleDataMgr::RestoreUidAndGid()
5024 {
5025 for (const auto &info : bundleInfos_) {
5026 bool onlyInsertOne = false;
5027 for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
5028 auto innerBundleUserInfo = infoItem.second;
5029 AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
5030 if (!onlyInsertOne) {
5031 onlyInsertOne = true;
5032 int32_t bundleId = innerBundleUserInfo.uid -
5033 innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5034 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5035 auto item = bundleIdMap_.find(bundleId);
5036 if (item == bundleIdMap_.end()) {
5037 bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
5038 } else {
5039 bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
5040 }
5041 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5042 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId,
5043 ServiceConstants::SHAREFS_CONFIG_PATH);
5044 }
5045 // appClone
5046 std::string bundleName = info.second.GetBundleName();
5047 std::map<std::string, InnerBundleCloneInfo> &clones = innerBundleUserInfo.cloneInfos;
5048 for (auto iter = clones.begin(); iter != clones.end(); iter++) {
5049 auto &cloneInfo = iter->second;
5050 int32_t bundleId = cloneInfo.uid - cloneInfo.userId * Constants::BASE_USER_RANGE;
5051 std::string cloneBundleName =
5052 BundleCloneCommonHelper::GetCloneBundleIdKey(bundleName, cloneInfo.appIndex);
5053 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5054 auto item = bundleIdMap_.find(bundleId);
5055 if (item == bundleIdMap_.end()) {
5056 bundleIdMap_.emplace(bundleId, cloneBundleName);
5057 } else {
5058 bundleIdMap_[bundleId] = cloneBundleName;
5059 }
5060 BundleUtil::MakeFsConfig(cloneBundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5061 BundleUtil::MakeFsConfig(cloneBundleName, bundleId,
5062 ServiceConstants::SHAREFS_CONFIG_PATH);
5063 }
5064 }
5065 }
5066 RestoreUidAndGidFromUninstallInfo();
5067 return true;
5068 }
5069
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)5070 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
5071 {
5072 if (sandboxAppHelper_ != nullptr) {
5073 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5074 sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
5075 }
5076 }
5077
GetBundleMutex(const std::string & bundleName)5078 std::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
5079 {
5080 bundleMutex_.lock_shared();
5081 auto it = bundleMutexMap_.find(bundleName);
5082 if (it == bundleMutexMap_.end()) {
5083 bundleMutex_.unlock_shared();
5084 std::unique_lock lock {bundleMutex_};
5085 return bundleMutexMap_[bundleName];
5086 }
5087 bundleMutex_.unlock_shared();
5088 return it->second;
5089 }
5090
GetProvisionId(const std::string & bundleName,std::string & provisionId) const5091 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
5092 {
5093 APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
5094 if (bundleName.empty()) {
5095 APP_LOGW("bundleName empty");
5096 return false;
5097 }
5098 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5099 auto infoItem = bundleInfos_.find(bundleName);
5100 if (infoItem == bundleInfos_.end()) {
5101 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5102 return false;
5103 }
5104 provisionId = infoItem->second.GetProvisionId();
5105 return true;
5106 }
5107
GetAppFeature(const std::string & bundleName,std::string & appFeature) const5108 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
5109 {
5110 APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
5111 if (bundleName.empty()) {
5112 APP_LOGW("bundleName empty");
5113 return false;
5114 }
5115 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5116 auto infoItem = bundleInfos_.find(bundleName);
5117 if (infoItem == bundleInfos_.end()) {
5118 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5119 return false;
5120 }
5121 appFeature = infoItem->second.GetAppFeature();
5122 return true;
5123 }
5124
SetInitialUserFlag(bool flag)5125 void BundleDataMgr::SetInitialUserFlag(bool flag)
5126 {
5127 APP_LOGD("SetInitialUserFlag %{public}d", flag);
5128 if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
5129 bundlePromise_->NotifyAllTasksExecuteFinished();
5130 }
5131
5132 initialUserFlag_ = flag;
5133 }
5134
GetDataStorage() const5135 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
5136 {
5137 return dataStorage_;
5138 }
5139
GetAllFormsInfo(std::vector<FormInfo> & formInfos) const5140 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
5141 {
5142 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5143 if (bundleInfos_.empty()) {
5144 APP_LOGW("bundleInfos_ data is empty");
5145 return false;
5146 }
5147 auto result = false;
5148 for (const auto &item : bundleInfos_) {
5149 if (item.second.IsDisabled()) {
5150 APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
5151 continue;
5152 }
5153 item.second.GetFormsInfoByApp(formInfos);
5154 result = true;
5155 }
5156 APP_LOGD("all the form infos find success");
5157 return result;
5158 }
5159
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos) const5160 bool BundleDataMgr::GetFormsInfoByModule(
5161 const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
5162 {
5163 if (bundleName.empty()) {
5164 APP_LOGW("bundle name is empty");
5165 return false;
5166 }
5167 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5168 if (bundleInfos_.empty()) {
5169 APP_LOGW("bundleInfos_ data is empty");
5170 return false;
5171 }
5172 auto infoItem = bundleInfos_.find(bundleName);
5173 if (infoItem == bundleInfos_.end()) {
5174 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5175 return false;
5176 }
5177 if (infoItem->second.IsDisabled()) {
5178 APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5179 return false;
5180 }
5181 infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
5182 if (formInfos.empty()) {
5183 return false;
5184 }
5185 APP_LOGD("module forminfo find success");
5186 return true;
5187 }
5188
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos) const5189 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
5190 {
5191 if (bundleName.empty()) {
5192 APP_LOGW("bundle name is empty");
5193 return false;
5194 }
5195 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5196 if (bundleInfos_.empty()) {
5197 APP_LOGW("bundleInfos_ data is empty");
5198 return false;
5199 }
5200 auto infoItem = bundleInfos_.find(bundleName);
5201 if (infoItem == bundleInfos_.end()) {
5202 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5203 return false;
5204 }
5205 if (infoItem->second.IsDisabled()) {
5206 APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5207 return false;
5208 }
5209 infoItem->second.GetFormsInfoByApp(formInfos);
5210 APP_LOGD("App forminfo find success");
5211 return true;
5212 }
5213
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5214 bool BundleDataMgr::GetShortcutInfos(
5215 const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5216 {
5217 int32_t requestUserId = GetUserId(userId);
5218 if (requestUserId == Constants::INVALID_USERID) {
5219 APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5220 return false;
5221 }
5222
5223 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5224 InnerBundleInfo innerBundleInfo;
5225 if (!GetInnerBundleInfoWithFlags(
5226 bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
5227 APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
5228 bundleName.c_str(), requestUserId);
5229 return false;
5230 }
5231 GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5232 return true;
5233 }
5234
TryGetRawDataByExtractor(const std::string & hapPath,const std::string & profileName,const AbilityInfo & abilityInfo) const5235 std::string BundleDataMgr::TryGetRawDataByExtractor(const std::string &hapPath, const std::string &profileName,
5236 const AbilityInfo &abilityInfo) const
5237 {
5238 std::string rawData;
5239 GetJsonProfileByExtractor(hapPath, profileName, rawData);
5240 if (rawData.empty()) { // if get failed ,try get from resmgr
5241 BundleMgrClient bundleMgrClient;
5242 std::vector<std::string> rawJson;
5243 if (!bundleMgrClient.GetResConfigFile(abilityInfo, META_DATA_SHORTCUTS_NAME, rawJson)) {
5244 APP_LOGD("GetResConfigFile return false");
5245 return "";
5246 }
5247 return rawJson.empty() ? "" : rawJson[0];
5248 }
5249 return rawData;
5250 }
5251
GetShortcutInfosByInnerBundleInfo(const InnerBundleInfo & info,std::vector<ShortcutInfo> & shortcutInfos) const5252 bool BundleDataMgr::GetShortcutInfosByInnerBundleInfo(
5253 const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const
5254 {
5255 if (!info.GetIsNewVersion()) {
5256 info.GetShortcutInfos(shortcutInfos);
5257 return true;
5258 }
5259 AbilityInfo abilityInfo;
5260 info.GetMainAbilityInfo(abilityInfo);
5261 if (abilityInfo.hapPath.empty() || abilityInfo.metadata.size() <= 0) {
5262 return false;
5263 }
5264 std::string rawData;
5265 for (const auto &meta : abilityInfo.metadata) {
5266 if (meta.name.compare(META_DATA_SHORTCUTS_NAME) == 0) {
5267 std::string resName = meta.resource;
5268 std::string hapPath = abilityInfo.hapPath;
5269 size_t pos = resName.rfind(PROFILE_PREFIX);
5270 bool posValid = (pos != std::string::npos) && (pos != resName.length() - strlen(PROFILE_PREFIX));
5271 if (!posValid) {
5272 APP_LOGE("resName invalid %{public}s", resName.c_str());
5273 return false;
5274 }
5275 std::string profileName = PROFILE_PATH + resName.substr(pos + strlen(PROFILE_PREFIX)) + JSON_SUFFIX;
5276 rawData = TryGetRawDataByExtractor(hapPath, profileName, abilityInfo);
5277 break;
5278 }
5279 }
5280 if (rawData.empty()) {
5281 APP_LOGE("shortcutinfo is empty");
5282 return false;
5283 }
5284 nlohmann::json jsonObject = nlohmann::json::parse(rawData, nullptr, false);
5285 if (jsonObject.is_discarded()) {
5286 APP_LOGE("shortcuts json invalid");
5287 return false;
5288 }
5289 ShortcutJson shortcutJson = jsonObject.get<ShortcutJson>();
5290 for (const Shortcut &item : shortcutJson.shortcuts) {
5291 ShortcutInfo shortcutInfo;
5292 shortcutInfo.bundleName = abilityInfo.bundleName;
5293 shortcutInfo.moduleName = abilityInfo.moduleName;
5294 info.InnerProcessShortcut(item, shortcutInfo);
5295 shortcutInfo.sourceType = 1;
5296 APP_LOGI("shortcutInfo: -n %{public}s, id %{public}s, iconId %{public}d, labelId %{public}d",
5297 shortcutInfo.bundleName.c_str(), shortcutInfo.id.c_str(), shortcutInfo.iconId, shortcutInfo.labelId);
5298 shortcutInfos.emplace_back(shortcutInfo);
5299 }
5300 (void)InnerProcessShortcutId(abilityInfo.hapPath, shortcutInfos);
5301 return true;
5302 }
5303
5304 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & hapPath) const5305 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(const std::string &hapPath) const
5306 {
5307 if (hapPath.empty()) {
5308 APP_LOGE("hapPath is empty");
5309 return nullptr;
5310 }
5311 std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
5312 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
5313 if (!resConfig) {
5314 APP_LOGE("resConfig is nullptr");
5315 return nullptr;
5316 }
5317 #ifdef GLOBAL_I18_ENABLE
5318 std::map<std::string, std::string> configs;
5319 OHOS::Global::I18n::LocaleInfo locale(Global::I18n::LocaleConfig::GetEffectiveLanguage(), configs);
5320 resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
5321 #endif
5322 resourceManager->UpdateResConfig(*resConfig);
5323 if (!resourceManager->AddResource(hapPath.c_str(), Global::Resource::SELECT_STRING)) {
5324 APP_LOGW("AddResource failed");
5325 }
5326 return resourceManager;
5327 }
5328 #endif
5329
InnerProcessShortcutId(const std::string & hapPath,std::vector<ShortcutInfo> & shortcutInfos) const5330 bool BundleDataMgr::InnerProcessShortcutId(const std::string &hapPath, std::vector<ShortcutInfo> &shortcutInfos) const
5331 {
5332 #ifdef GLOBAL_RESMGR_ENABLE
5333 bool needToParseShortcutId = false;
5334 for (const auto &info : shortcutInfos) {
5335 if (info.id.find(RESOURCE_STRING_PREFIX) == 0) {
5336 needToParseShortcutId = true;
5337 break;
5338 }
5339 }
5340 if (!needToParseShortcutId) {
5341 return false;
5342 }
5343 APP_LOGI("shortcut id conatins $string:");
5344 auto resourceManager = GetResourceManager(hapPath);
5345 if (resourceManager == nullptr) {
5346 APP_LOGI("create resource mgr failed");
5347 return false;
5348 }
5349
5350 for (auto &info : shortcutInfos) {
5351 if (info.id.find(RESOURCE_STRING_PREFIX) != 0) {
5352 continue;
5353 }
5354 int32_t id = static_cast<uint32_t>(atoi(info.id.substr(std::string(RESOURCE_STRING_PREFIX).size()).c_str()));
5355 if (id <= 0) {
5356 APP_LOGE("shortcut id is less than 0");
5357 continue;
5358 }
5359 std::string shortcutId;
5360 OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(id, shortcutId);
5361 if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
5362 APP_LOGE("GetStringById failed, id:%{public}d", id);
5363 continue;
5364 }
5365 info.id = shortcutId;
5366 }
5367 return true;
5368
5369 #else
5370 return true;
5371 #endif
5372 }
5373
GetShortcutInfoV9(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5374 ErrCode BundleDataMgr::GetShortcutInfoV9(
5375 const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5376 {
5377 int32_t requestUserId = GetUserId(userId);
5378 if (requestUserId == Constants::INVALID_USERID) {
5379 APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5380 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5381 }
5382 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5383 InnerBundleInfo innerBundleInfo;
5384 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
5385 BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
5386 if (ret != ERR_OK) {
5387 APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5388 bundleName.c_str(), requestUserId);
5389 return ret;
5390 }
5391
5392 GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5393 return ERR_OK;
5394 }
5395
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos) const5396 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
5397 std::vector<CommonEventInfo> &commonEventInfos) const
5398 {
5399 if (eventKey.empty()) {
5400 APP_LOGW("event key is empty");
5401 return false;
5402 }
5403 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5404 if (bundleInfos_.empty()) {
5405 APP_LOGW("bundleInfos_ data is empty");
5406 return false;
5407 }
5408 for (const auto &item : bundleInfos_) {
5409 const InnerBundleInfo &info = item.second;
5410 if (info.IsDisabled()) {
5411 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
5412 continue;
5413 }
5414 info.GetCommonEvents(eventKey, commonEventInfos);
5415 }
5416 if (commonEventInfos.size() == 0) {
5417 APP_LOGW("commonEventInfos is empty");
5418 return false;
5419 }
5420 APP_LOGE("commonEventInfos find success");
5421 return true;
5422 }
5423
SavePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5424 bool BundleDataMgr::SavePreInstallBundleInfo(
5425 const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5426 {
5427 if (preInstallDataStorage_ == nullptr) {
5428 APP_LOGW("preInstallDataStorage_ is nullptr");
5429 return false;
5430 }
5431
5432 if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5433 APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
5434 return true;
5435 }
5436
5437 return false;
5438 }
5439
DeletePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5440 bool BundleDataMgr::DeletePreInstallBundleInfo(
5441 const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5442 {
5443 if (preInstallDataStorage_ == nullptr) {
5444 APP_LOGW("preInstallDataStorage_ is nullptr");
5445 return false;
5446 }
5447
5448 if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5449 APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
5450 return true;
5451 }
5452
5453 return false;
5454 }
5455
GetPreInstallBundleInfo(const std::string & bundleName,PreInstallBundleInfo & preInstallBundleInfo)5456 bool BundleDataMgr::GetPreInstallBundleInfo(
5457 const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
5458 {
5459 if (bundleName.empty()) {
5460 APP_LOGW("bundleName is empty");
5461 return false;
5462 }
5463 if (preInstallDataStorage_ == nullptr) {
5464 return false;
5465 }
5466 if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
5467 APP_LOGW_NOFUNC("get preInstall bundleInfo failed -n: %{public}s", bundleName.c_str());
5468 return false;
5469 }
5470 return true;
5471 }
5472
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> & preInstallBundleInfos)5473 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
5474 {
5475 if (preInstallDataStorage_ == nullptr) {
5476 APP_LOGW("preInstallDataStorage_ is nullptr");
5477 return false;
5478 }
5479
5480 if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
5481 APP_LOGD("load all storage success");
5482 return true;
5483 }
5484
5485 return false;
5486 }
5487
SaveInnerBundleInfo(const InnerBundleInfo & info) const5488 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
5489 {
5490 APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
5491 if (dataStorage_->SaveStorageBundleInfo(info)) {
5492 APP_LOGD("save install InnerBundleInfo successfully");
5493 return true;
5494 }
5495 APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
5496 return false;
5497 }
5498
GetInnerBundleUserInfoByUserId(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo) const5499 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
5500 int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
5501 {
5502 APP_LOGD("get user info start: bundleName: (%{public}s) userId: (%{public}d) ",
5503 bundleName.c_str(), userId);
5504 int32_t requestUserId = GetUserId(userId);
5505 if (requestUserId == Constants::INVALID_USERID) {
5506 return false;
5507 }
5508
5509 if (bundleName.empty()) {
5510 APP_LOGW("bundle name is empty");
5511 return false;
5512 }
5513
5514 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5515 if (bundleInfos_.empty()) {
5516 APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5517 return false;
5518 }
5519
5520 auto infoItem = bundleInfos_.find(bundleName);
5521 if (infoItem == bundleInfos_.end()) {
5522 APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5523 return false;
5524 }
5525
5526 return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
5527 }
5528
GetUserId(int32_t userId) const5529 int32_t BundleDataMgr::GetUserId(int32_t userId) const
5530 {
5531 if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
5532 return userId;
5533 }
5534
5535 if (userId == Constants::UNSPECIFIED_USERID) {
5536 userId = GetUserIdByCallingUid();
5537 }
5538
5539 if (!HasUserId(userId)) {
5540 APP_LOGD("user is not existed");
5541 userId = Constants::INVALID_USERID;
5542 }
5543
5544 return userId;
5545 }
5546
GetUserIdByUid(int32_t uid) const5547 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
5548 {
5549 return BundleUtil::GetUserIdByUid(uid);
5550 }
5551
AddUserId(int32_t userId)5552 void BundleDataMgr::AddUserId(int32_t userId)
5553 {
5554 std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5555 auto item = multiUserIdsSet_.find(userId);
5556 if (item != multiUserIdsSet_.end()) {
5557 return;
5558 }
5559
5560 multiUserIdsSet_.insert(userId);
5561 }
5562
RemoveUserId(int32_t userId)5563 void BundleDataMgr::RemoveUserId(int32_t userId)
5564 {
5565 std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5566 auto item = multiUserIdsSet_.find(userId);
5567 if (item == multiUserIdsSet_.end()) {
5568 return;
5569 }
5570
5571 multiUserIdsSet_.erase(item);
5572 }
5573
HasUserId(int32_t userId) const5574 bool BundleDataMgr::HasUserId(int32_t userId) const
5575 {
5576 std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5577 return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
5578 }
5579
GetUserIdByCallingUid() const5580 int32_t BundleDataMgr::GetUserIdByCallingUid() const
5581 {
5582 return BundleUtil::GetUserIdByCallingUid();
5583 }
5584
GetAllUser() const5585 std::set<int32_t> BundleDataMgr::GetAllUser() const
5586 {
5587 std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5588 return multiUserIdsSet_;
5589 }
5590
CreateAppInstallDir(int32_t userId)5591 void BundleDataMgr::CreateAppInstallDir(int32_t userId)
5592 {
5593 std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5594 ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5595 ErrCode ret = InstalldClient::GetInstance()->Mkdir(path,
5596 S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5597 Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5598 if (ret != ERR_OK) {
5599 APP_LOGE("create app install %{public}d failed", userId);
5600 }
5601 }
5602
RemoveAppInstallDir(int32_t userId)5603 void BundleDataMgr::RemoveAppInstallDir(int32_t userId)
5604 {
5605 std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5606 ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5607 ErrCode ret = InstalldClient::GetInstance()->RemoveDir(path);
5608 if (ret != ERR_OK) {
5609 APP_LOGE("remove app install %{public}d failed", userId);
5610 }
5611 }
5612
GetInnerBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos) const5613 bool BundleDataMgr::GetInnerBundleUserInfos(
5614 const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
5615 {
5616 APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
5617 if (bundleName.empty()) {
5618 APP_LOGW("bundle name is empty");
5619 return false;
5620 }
5621
5622 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5623 if (bundleInfos_.empty()) {
5624 APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5625 return false;
5626 }
5627
5628 auto infoItem = bundleInfos_.find(bundleName);
5629 if (infoItem == bundleInfos_.end()) {
5630 APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
5631 return false;
5632 }
5633
5634 for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
5635 innerBundleUserInfos.emplace_back(userInfo.second);
5636 }
5637
5638 return !innerBundleUserInfos.empty();
5639 }
5640
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)5641 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
5642 {
5643 APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5644 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5645 InnerBundleInfo info;
5646 if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
5647 return Constants::EMPTY_STRING;
5648 }
5649
5650 return info.GetAppPrivilegeLevel();
5651 }
5652
QueryExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5653 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
5654 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5655 {
5656 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5657 int32_t requestUserId = GetUserId(userId);
5658 if (requestUserId == Constants::INVALID_USERID) {
5659 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5660 return false;
5661 }
5662
5663 ElementName element = want.GetElement();
5664 std::string bundleName = element.GetBundleName();
5665 std::string extensionName = element.GetAbilityName();
5666 LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s extensionName:%{public}s",
5667 bundleName.c_str(), extensionName.c_str());
5668 // explicit query
5669 if (!bundleName.empty() && !extensionName.empty()) {
5670 ExtensionAbilityInfo info;
5671 bool ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
5672 if (!ret) {
5673 LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension error -n %{public}s -e %{public}s -u %{public}d"
5674 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5675 return false;
5676 }
5677 extensionInfos.emplace_back(info);
5678 return true;
5679 }
5680
5681 bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
5682 if (!ret) {
5683 LOG_D(BMS_TAG_QUERY,
5684 "implicit queryExtension error action:%{public}s uri:%{private}s type:%{public}s"
5685 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5686 requestUserId);
5687 return false;
5688 }
5689 if (extensionInfos.size() == 0) {
5690 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5691 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5692 requestUserId);
5693 return false;
5694 }
5695 LOG_D(BMS_TAG_QUERY, "query extensionAbilityInfo successfully");
5696 return true;
5697 }
5698
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5699 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
5700 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5701 {
5702 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5703 int32_t requestUserId = GetUserId(userId);
5704 if (requestUserId == Constants::INVALID_USERID) {
5705 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5706 }
5707
5708 ElementName element = want.GetElement();
5709 std::string bundleName = element.GetBundleName();
5710 std::string extensionName = element.GetAbilityName();
5711 LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
5712 bundleName.c_str(), extensionName.c_str());
5713 // explicit query
5714 if (!bundleName.empty() && !extensionName.empty()) {
5715 ExtensionAbilityInfo info;
5716 ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
5717 if (ret != ERR_OK) {
5718 LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension V9 error -n %{public}s -e %{public}s -u %{public}d"
5719 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5720 return ret;
5721 }
5722 extensionInfos.emplace_back(info);
5723 return ERR_OK;
5724 }
5725 ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5726 if (ret != ERR_OK) {
5727 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionInfosV9 error");
5728 return ret;
5729 }
5730 if (extensionInfos.empty()) {
5731 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5732 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5733 requestUserId);
5734 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5735 }
5736 LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 success");
5737 return ERR_OK;
5738 }
5739
QueryExtensionAbilityInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5740 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
5741 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5742 {
5743 int32_t requestUserId = GetUserId(userId);
5744 if (requestUserId == Constants::INVALID_USERID) {
5745 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5746 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5747 }
5748
5749 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5750 ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
5751 if (ret != ERR_OK) {
5752 LOG_D(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
5753 return ret;
5754 }
5755 if (extensionInfos.empty()) {
5756 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5757 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5758 }
5759 LOG_D(BMS_TAG_QUERY, "success");
5760 return ERR_OK;
5761 }
5762
QueryExtensionAbilityInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5763 ErrCode BundleDataMgr::QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName,
5764 uint32_t flags, int32_t userId,
5765 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5766 {
5767 LOG_I(BMS_TAG_QUERY, "query failed %{public}s %{public}d", typeName.c_str(), userId);
5768 int32_t requestUserId = GetUserId(userId);
5769 if (requestUserId == Constants::INVALID_USERID) {
5770 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5771 }
5772 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5773 ErrCode ret = ImplicitQueryAllExtensionInfos(
5774 flags, requestUserId, extensionInfos, appIndex, typeName);
5775 if (ret != ERR_OK) {
5776 LOG_W(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
5777 return ret;
5778 }
5779 if (extensionInfos.empty()) {
5780 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5781 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5782 }
5783 LOG_D(BMS_TAG_QUERY, "success");
5784 return ERR_OK;
5785 }
5786
GetOneExtensionInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5787 void BundleDataMgr::GetOneExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId,
5788 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5789 {
5790 auto extensionInfos = info.GetInnerExtensionInfos();
5791 for (const auto &extensionAbilityInfo : extensionInfos) {
5792 if (typeName != extensionAbilityInfo.second.extensionTypeName) {
5793 continue;
5794 }
5795 infos.emplace_back(extensionAbilityInfo.second);
5796 return;
5797 }
5798 }
5799
ExplicitQueryExtensionInfo(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const5800 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
5801 ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5802 {
5803 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5804 ElementName element = want.GetElement();
5805 std::string bundleName = element.GetBundleName();
5806 std::string moduleName = element.GetModuleName();
5807 std::string extensionName = element.GetAbilityName();
5808 int32_t requestUserId = GetUserId(userId);
5809 if (requestUserId == Constants::INVALID_USERID) {
5810 return false;
5811 }
5812 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5813 InnerBundleInfo innerBundleInfo;
5814 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
5815 LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5816 return false;
5817 }
5818 if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5819 if (sandboxAppHelper_ == nullptr) {
5820 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5821 return false;
5822 }
5823 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5824 if (ret != ERR_OK) {
5825 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5826 return false;
5827 }
5828 }
5829 if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5830 bool res = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5831 if (!res) {
5832 LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5833 return false;
5834 }
5835 }
5836 auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5837 if (!extension) {
5838 LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5839 return false;
5840 }
5841 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
5842 extension->permissions.clear();
5843 }
5844 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
5845 extension->metadata.clear();
5846 }
5847 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
5848 extension->skills.clear();
5849 }
5850 extensionInfo = (*extension);
5851 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
5852 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5853 innerBundleInfo.GetApplicationInfo(ApplicationFlag::GET_BASIC_APPLICATION_INFO |
5854 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
5855 extensionInfo.applicationInfo, appIndex);
5856 }
5857 // set uid for NAPI cache use
5858 InnerBundleUserInfo innerBundleUserInfo;
5859 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5860 extensionInfo.uid = innerBundleUserInfo.uid;
5861 if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5862 std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5863 if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5864 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5865 extensionInfo.uid = cloneInfo.uid;
5866 }
5867 }
5868 }
5869 extensionInfo.appIndex = appIndex;
5870 return true;
5871 }
5872
ExplicitQueryExtensionInfoV9(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const5873 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
5874 ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5875 {
5876 ElementName element = want.GetElement();
5877 std::string bundleName = element.GetBundleName();
5878 std::string moduleName = element.GetModuleName();
5879 std::string extensionName = element.GetAbilityName();
5880 LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
5881 bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
5882 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d, appIndex:%{public}d",
5883 flags, userId, appIndex);
5884 int32_t requestUserId = GetUserId(userId);
5885 if (requestUserId == Constants::INVALID_USERID) {
5886 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5887 }
5888 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5889 InnerBundleInfo innerBundleInfo;
5890 if (appIndex == 0) {
5891 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
5892 if (ret != ERR_OK) {
5893 LOG_D(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5894 return ret;
5895 }
5896 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5897 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5898 if (ret != ERR_OK) {
5899 LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5900 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5901 }
5902 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5903 if (sandboxAppHelper_ == nullptr) {
5904 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5905 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5906 }
5907 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5908 if (ret != ERR_OK) {
5909 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5910 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5911 }
5912 }
5913 auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5914 if (!extension) {
5915 LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5916 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5917 }
5918 if ((static_cast<uint32_t>(flags) &
5919 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
5920 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
5921 extension->permissions.clear();
5922 }
5923 if ((static_cast<uint32_t>(flags) &
5924 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
5925 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
5926 extension->metadata.clear();
5927 }
5928 if ((static_cast<uint32_t>(flags) &
5929 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
5930 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
5931 extension->skills.clear();
5932 }
5933 extensionInfo = (*extension);
5934 if ((static_cast<uint32_t>(flags) &
5935 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5936 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5937 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5938 innerBundleInfo.GetApplicationInfoV9(
5939 static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
5940 responseUserId, extensionInfo.applicationInfo, appIndex);
5941 }
5942 // set uid for NAPI cache use
5943 InnerBundleUserInfo innerBundleUserInfo;
5944 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5945 extensionInfo.uid = innerBundleUserInfo.uid;
5946 if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5947 std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5948 if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5949 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5950 extensionInfo.uid = cloneInfo.uid;
5951 }
5952 }
5953 }
5954 extensionInfo.appIndex = appIndex;
5955 return ERR_OK;
5956 }
5957
FilterExtensionAbilityInfosByModuleName(const std::string & moduleName,std::vector<ExtensionAbilityInfo> & extensionInfos) const5958 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
5959 std::vector<ExtensionAbilityInfo> &extensionInfos) const
5960 {
5961 LOG_D(BMS_TAG_QUERY, "FilterExtensionAbilityInfos moduleName: %{public}s", moduleName.c_str());
5962 if (moduleName.empty()) {
5963 return;
5964 }
5965 for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
5966 if (iter->moduleName != moduleName) {
5967 iter = extensionInfos.erase(iter);
5968 } else {
5969 ++iter;
5970 }
5971 }
5972 }
5973
ImplicitQueryExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5974 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5975 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5976 {
5977 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5978 if (want.GetAction().empty() && want.GetEntities().empty()
5979 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
5980 LOG_W(BMS_TAG_QUERY, "param invalid");
5981 return false;
5982 }
5983 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
5984 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
5985 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
5986
5987 int32_t requestUserId = GetUserId(userId);
5988 if (requestUserId == Constants::INVALID_USERID) {
5989 return false;
5990 }
5991 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5992 std::string bundleName = want.GetElement().GetBundleName();
5993 if (!bundleName.empty()) {
5994 // query in current bundle
5995 if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
5996 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtension failed, bundleName:%{public}s",
5997 bundleName.c_str());
5998 return false;
5999 }
6000 } else {
6001 // query all
6002 ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
6003 }
6004 // sort by priority, descending order.
6005 if (extensionInfos.size() > 1) {
6006 std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6007 [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6008 }
6009 return true;
6010 }
6011
ImplicitQueryExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6012 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6013 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6014 {
6015 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6016 if (want.GetAction().empty() && want.GetEntities().empty()
6017 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
6018 LOG_W(BMS_TAG_QUERY, "param invalid");
6019 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6020 }
6021 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
6022 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6023 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
6024
6025 int32_t requestUserId = GetUserId(userId);
6026 if (requestUserId == Constants::INVALID_USERID) {
6027 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6028 }
6029 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6030 std::string bundleName = want.GetElement().GetBundleName();
6031 if (!bundleName.empty()) {
6032 // query in current bundle
6033 ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6034 if (ret != ERR_OK) {
6035 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s",
6036 bundleName.c_str());
6037 return ret;
6038 }
6039 } else {
6040 // query all
6041 ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6042 }
6043 // sort by priority, descending order.
6044 if (extensionInfos.size() > 1) {
6045 std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6046 [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6047 }
6048 return ERR_OK;
6049 }
6050
ImplicitQueryCurExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6051 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6052 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6053 {
6054 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6055 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfos");
6056 std::string bundleName = want.GetElement().GetBundleName();
6057 InnerBundleInfo innerBundleInfo;
6058 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
6059 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6060 bundleName.c_str());
6061 return false;
6062 }
6063 if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6064 if (sandboxAppHelper_ == nullptr) {
6065 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6066 return false;
6067 }
6068 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6069 if (ret != ERR_OK) {
6070 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6071 return false;
6072 }
6073 }
6074 if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6075 bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex);
6076 if (!ret) {
6077 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed errCode %{public}d", ret);
6078 return false;
6079 }
6080 }
6081 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6082 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6083 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6084 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfos");
6085 return true;
6086 }
6087
ImplicitQueryCurExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6088 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6089 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6090 {
6091 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6092 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfosV9");
6093 std::string bundleName = want.GetElement().GetBundleName();
6094 InnerBundleInfo innerBundleInfo;
6095 if (appIndex == 0) {
6096 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
6097 if (ret != ERR_OK) {
6098 LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6099 bundleName.c_str());
6100 return ret;
6101 }
6102 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6103 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
6104 if (ret != ERR_OK) {
6105 LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6106 bundleName.c_str());
6107 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6108 }
6109 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6110 if (sandboxAppHelper_ == nullptr) {
6111 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6112 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6113 }
6114 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6115 if (ret != ERR_OK) {
6116 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6117 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6118 }
6119 }
6120 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6121 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6122 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6123 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfosV9");
6124 return ERR_OK;
6125 }
6126
ImplicitQueryAllExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6127 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6128 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6129 {
6130 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6131 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6132 int32_t requestUserId = GetUserId(userId);
6133 if (requestUserId == Constants::INVALID_USERID) {
6134 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
6135 return;
6136 }
6137
6138 // query from bundleInfos_
6139 if (appIndex == 0) {
6140 for (const auto &item : bundleInfos_) {
6141 const InnerBundleInfo &innerBundleInfo = item.second;
6142 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6143 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
6144 continue;
6145 }
6146 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
6147 }
6148 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6149 // query from sandbox manager for sandbox bundle
6150 if (sandboxAppHelper_ == nullptr) {
6151 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6152 return;
6153 }
6154 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6155 for (const auto &item : sandboxMap) {
6156 InnerBundleInfo info;
6157 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6158 if (pos == std::string::npos) {
6159 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6160 continue;
6161 }
6162 std::string innerBundleName = item.first.substr(pos + 1);
6163 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6164 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6165 continue;
6166 }
6167
6168 int32_t responseUserId = info.GetResponseUserId(userId);
6169 GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
6170 }
6171 } else if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6172 LOG_D(BMS_TAG_QUERY, "start to query extensionAbility in appClone");
6173 for (const auto &item : bundleInfos_) {
6174 int32_t responseUserId = item.second.GetResponseUserId(requestUserId);
6175 const InnerBundleInfo &innerBundleInfo = item.second;
6176 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6177 LOG_D(BMS_TAG_QUERY,
6178 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6179 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6180 continue;
6181 }
6182 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6183 }
6184 }
6185 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6186 }
6187
ImplicitQueryAllExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6188 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6189 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6190 {
6191 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6192 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfosV9");
6193 // query from bundleInfos_
6194 if (appIndex == 0) {
6195 for (const auto &item : bundleInfos_) {
6196 const InnerBundleInfo &innerBundleInfo = item.second;
6197 ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
6198 if (ret != ERR_OK) {
6199 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6200 item.first.c_str());
6201 continue;
6202 }
6203 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6204 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
6205 }
6206 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6207 for (const auto &item : bundleInfos_) {
6208 const InnerBundleInfo &innerBundleInfo = item.second;
6209 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6210 if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6211 LOG_D(BMS_TAG_QUERY,
6212 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6213 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6214 continue;
6215 }
6216 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6217 }
6218 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6219 // query from sandbox manager for sandbox bundle
6220 if (sandboxAppHelper_ == nullptr) {
6221 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6222 return;
6223 }
6224 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6225 for (const auto &item : sandboxMap) {
6226 InnerBundleInfo info;
6227 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6228 if (pos == std::string::npos) {
6229 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6230 continue;
6231 }
6232 std::string innerBundleName = item.first.substr(pos + 1);
6233 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6234 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6235 continue;
6236 }
6237
6238 int32_t responseUserId = info.GetResponseUserId(userId);
6239 GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
6240 }
6241 }
6242 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfosV9");
6243 }
6244
GetExtensionAbilityInfoByTypeName(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,const std::string & typeName) const6245 void BundleDataMgr::GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId,
6246 std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const
6247 {
6248 for (const auto &item : bundleInfos_) {
6249 if ((flags &
6250 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
6251 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
6252 if (item.second.GetInnerExtensionInfos().empty() || !item.second.IsSystemApp()) {
6253 continue;
6254 }
6255 bool ret = GetInnerBundleInfoWithFlags(item.first, flags, userId);
6256 if (!ret) {
6257 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6258 item.first.c_str());
6259 continue;
6260 }
6261 int32_t responseUserId = item.second.GetResponseUserId(userId);
6262 GetOneExtensionInfosByExtensionTypeName(typeName, flags, responseUserId, item.second, infos);
6263 if (infos.size() > 0) {
6264 return;
6265 }
6266 } else {
6267 InnerBundleInfo innerBundleInfo;
6268 bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId);
6269 if (!ret) {
6270 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6271 item.first.c_str());
6272 continue;
6273 }
6274 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6275 GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
6276 }
6277 }
6278 }
6279
ImplicitQueryAllExtensionInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex,const std::string & typeName) const6280 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
6281 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const
6282 {
6283 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6284 // query from bundleInfos_
6285 if (appIndex == 0) {
6286 GetExtensionAbilityInfoByTypeName(flags, userId, infos, typeName);
6287 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6288 // query from sandbox manager for sandbox bundle
6289 if (sandboxAppHelper_ == nullptr) {
6290 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6291 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6292 }
6293 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6294 for (const auto &item : sandboxMap) {
6295 InnerBundleInfo info;
6296 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6297 if (pos == std::string::npos) {
6298 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6299 continue;
6300 }
6301 std::string innerBundleName = item.first.substr(pos + 1);
6302 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6303 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6304 continue;
6305 }
6306 int32_t responseUserId = info.GetResponseUserId(userId);
6307 GetAllExtensionInfos(flags, responseUserId, info, infos, appIndex);
6308 }
6309 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6310 for (const auto &item : bundleInfos_) {
6311 InnerBundleInfo innerBundleInfo;
6312 bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId, appIndex);
6313 if (!ret) {
6314 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6315 item.first.c_str());
6316 continue;
6317 }
6318 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6319 GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos, appIndex);
6320 }
6321 }
6322 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6323 return ERR_OK;
6324 }
6325
GetMatchExtensionInfos(const Want & want,int32_t flags,const int32_t & userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6326 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
6327 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6328 {
6329 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6330 auto extensionSkillInfos = info.GetExtensionSkillInfos();
6331 auto extensionInfos = info.GetInnerExtensionInfos();
6332 for (const auto &skillInfos : extensionSkillInfos) {
6333 for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6334 const Skill &skill = skillInfos.second[skillIndex];
6335 size_t matchUriIndex = 0;
6336 if (!skill.Match(want, matchUriIndex)) {
6337 continue;
6338 }
6339 if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6340 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6341 skillInfos.first.c_str());
6342 break;
6343 }
6344 ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6345 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_APPLICATION) ==
6346 GET_EXTENSION_INFO_WITH_APPLICATION) {
6347 info.GetApplicationInfo(
6348 ApplicationFlag::GET_BASIC_APPLICATION_INFO |
6349 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
6350 extensionInfo.applicationInfo);
6351 }
6352 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_PERMISSION) !=
6353 GET_EXTENSION_INFO_WITH_PERMISSION) {
6354 extensionInfo.permissions.clear();
6355 }
6356 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_METADATA) != GET_EXTENSION_INFO_WITH_METADATA) {
6357 extensionInfo.metadata.clear();
6358 }
6359 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_SKILL) != GET_EXTENSION_INFO_WITH_SKILL) {
6360 extensionInfo.skills.clear();
6361 }
6362 if ((static_cast<uint32_t>(flags) &
6363 GET_EXTENSION_INFO_WITH_SKILL_URI) == GET_EXTENSION_INFO_WITH_SKILL_URI) {
6364 AddSkillUrisInfo(skillInfos.second, extensionInfo.skillUri, skillIndex, matchUriIndex);
6365 }
6366 extensionInfo.appIndex = appIndex;
6367 infos.emplace_back(extensionInfo);
6368 break;
6369 }
6370 }
6371 }
6372
EmplaceExtensionInfo(const InnerBundleInfo & info,const std::vector<Skill> & skills,ExtensionAbilityInfo & extensionInfo,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex,int32_t appIndex) const6373 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
6374 ExtensionAbilityInfo &extensionInfo, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos,
6375 std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
6376 {
6377 if ((static_cast<uint32_t>(flags) &
6378 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6379 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6380 info.GetApplicationInfoV9(static_cast<int32_t>(
6381 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6382 }
6383 if ((static_cast<uint32_t>(flags) &
6384 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6385 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6386 extensionInfo.permissions.clear();
6387 }
6388 if ((static_cast<uint32_t>(flags) &
6389 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6390 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6391 extensionInfo.metadata.clear();
6392 }
6393 if ((static_cast<uint32_t>(flags) &
6394 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6395 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6396 extensionInfo.skills.clear();
6397 }
6398 if ((static_cast<uint32_t>(flags) &
6399 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) ==
6400 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) {
6401 AddSkillUrisInfo(skills, extensionInfo.skillUri, matchSkillIndex, matchUriIndex);
6402 }
6403 extensionInfo.appIndex = appIndex;
6404 infos.emplace_back(extensionInfo);
6405 }
6406
GetMatchExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6407 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6408 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6409 {
6410 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6411 auto extensionSkillInfos = info.GetExtensionSkillInfos();
6412 auto extensionInfos = info.GetInnerExtensionInfos();
6413 for (const auto &skillInfos : extensionSkillInfos) {
6414 if (want.GetAction() == SHARE_ACTION) {
6415 if (!MatchShare(want, skillInfos.second)) {
6416 continue;
6417 }
6418 if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6419 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6420 skillInfos.first.c_str());
6421 continue;
6422 }
6423 ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6424 EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6425 std::nullopt, std::nullopt, appIndex);
6426 continue;
6427 }
6428 for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6429 const Skill &skill = skillInfos.second[skillIndex];
6430 size_t matchUriIndex = 0;
6431 if (!skill.Match(want, matchUriIndex)) {
6432 continue;
6433 }
6434 if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6435 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6436 skillInfos.first.c_str());
6437 break;
6438 }
6439 ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6440 EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6441 skillIndex, matchUriIndex, appIndex);
6442 break;
6443 }
6444 }
6445 }
6446
GetAllExtensionInfos(uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6447 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
6448 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6449 {
6450 auto extensionInfos = info.GetInnerExtensionInfos();
6451 for (const auto &extensionAbilityInfo : extensionInfos) {
6452 ExtensionAbilityInfo extensionInfo = extensionAbilityInfo.second;
6453 if ((flags &
6454 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6455 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6456 info.GetApplicationInfoV9(static_cast<int32_t>(
6457 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6458 }
6459 if ((flags &
6460 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6461 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6462 extensionInfo.permissions.clear();
6463 }
6464 if ((flags &
6465 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6466 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6467 extensionInfo.metadata.clear();
6468 }
6469 if ((flags &
6470 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6471 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6472 extensionInfo.skills.clear();
6473 }
6474 extensionInfo.appIndex = appIndex;
6475 infos.emplace_back(extensionInfo);
6476 }
6477 }
6478
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos) const6479 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
6480 std::vector<ExtensionAbilityInfo> &extensionInfos) const
6481 {
6482 int32_t requestUserId = GetUserId(userId);
6483 if (requestUserId == Constants::INVALID_USERID) {
6484 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", requestUserId);
6485 return false;
6486 }
6487 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6488 for (const auto &item : bundleInfos_) {
6489 const InnerBundleInfo &innerBundleInfo = item.second;
6490 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6491 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
6492 continue;
6493 }
6494 auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
6495 for (const auto &info : innerExtensionInfos) {
6496 if (info.second.type == extensionType) {
6497 ExtensionAbilityInfo extensionAbilityInfo = info.second;
6498 innerBundleInfo.GetApplicationInfo(
6499 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6500 extensionAbilityInfo.applicationInfo);
6501 extensionInfos.emplace_back(extensionAbilityInfo);
6502 }
6503 }
6504 }
6505 return true;
6506 }
6507
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo) const6508 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
6509 ExtensionAbilityInfo &extensionAbilityInfo) const
6510 {
6511 int32_t requestUserId = GetUserId(userId);
6512 if (requestUserId == Constants::INVALID_USERID) {
6513 LOG_W(BMS_TAG_QUERY, "invalid userId -1");
6514 return false;
6515 }
6516 if (uri.empty()) {
6517 LOG_W(BMS_TAG_QUERY, "uri empty");
6518 return false;
6519 }
6520 std::string convertUri = uri;
6521 // example of valid param uri : fileShare:///com.example.FileShare/person/10
6522 // example of convertUri : fileShare://com.example.FileShare
6523 size_t schemePos = uri.find(PARAM_URI_SEPARATOR);
6524 if (schemePos != uri.npos) {
6525 // 1. cut string
6526 size_t cutPos = uri.find(ServiceConstants::PATH_SEPARATOR, schemePos + PARAM_URI_SEPARATOR_LEN);
6527 if (cutPos != uri.npos) {
6528 convertUri = uri.substr(0, cutPos);
6529 }
6530 // 2. replace :/// with ://
6531 convertUri.replace(schemePos, PARAM_URI_SEPARATOR_LEN, URI_SEPARATOR);
6532 } else {
6533 if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
6534 LOG_W(BMS_TAG_QUERY, "invalid uri : %{private}s", uri.c_str());
6535 return false;
6536 }
6537 }
6538 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6539 if (bundleInfos_.empty()) {
6540 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
6541 return false;
6542 }
6543 for (const auto &item : bundleInfos_) {
6544 const InnerBundleInfo &info = item.second;
6545 if (info.IsDisabled()) {
6546 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
6547 continue;
6548 }
6549
6550 int32_t responseUserId = info.GetResponseUserId(requestUserId);
6551 if (!info.GetApplicationEnabled(responseUserId)) {
6552 continue;
6553 }
6554
6555 bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
6556 if (!ret) {
6557 continue;
6558 }
6559 info.GetApplicationInfo(
6560 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6561 extensionAbilityInfo.applicationInfo);
6562 return true;
6563 }
6564 LOG_NOFUNC_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfoByUri (%{public}s) failed", convertUri.c_str());
6565 return false;
6566 }
6567
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)6568 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
6569 uint32_t resId, int32_t userId, const std::string &localeInfo)
6570 {
6571 APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
6572 #ifdef GLOBAL_RESMGR_ENABLE
6573 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6574 std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6575 GetResourceManager(bundleName, moduleName, userId);
6576 if (resourceManager == nullptr) {
6577 APP_LOGW("InitResourceManager failed");
6578 return Constants::EMPTY_STRING;
6579 }
6580 std::string label;
6581 OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
6582 if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6583 APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6584 return Constants::EMPTY_STRING;
6585 }
6586 return label;
6587 #else
6588 APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6589 return Constants::EMPTY_STRING;
6590 #endif
6591 }
6592
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)6593 std::string BundleDataMgr::GetIconById(
6594 const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
6595 {
6596 APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
6597 bundleName.c_str(), moduleName.c_str(), resId, density);
6598 #ifdef GLOBAL_RESMGR_ENABLE
6599 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6600 std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6601 GetResourceManager(bundleName, moduleName, userId);
6602 if (resourceManager == nullptr) {
6603 APP_LOGW("InitResourceManager failed");
6604 return Constants::EMPTY_STRING;
6605 }
6606 std::string base64;
6607 OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
6608 if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6609 APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6610 return Constants::EMPTY_STRING;
6611 }
6612 return base64;
6613 #else
6614 APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6615 return Constants::EMPTY_STRING;
6616 #endif
6617 }
6618
6619 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & bundleName,const std::string & moduleName,int32_t userId,const std::string & localeInfo) const6620 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
6621 const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
6622 {
6623 InnerBundleInfo innerBundleInfo;
6624 if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
6625 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6626 return nullptr;
6627 }
6628 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6629 BundleInfo bundleInfo;
6630 innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
6631 std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
6632
6633 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
6634 if (!resConfig) {
6635 APP_LOGE("resConfig is nullptr");
6636 return nullptr;
6637 }
6638 #ifdef GLOBAL_I18_ENABLE
6639 std::map<std::string, std::string> configs;
6640 OHOS::Global::I18n::LocaleInfo locale(
6641 localeInfo.empty() ? Global::I18n::LocaleConfig::GetEffectiveLanguage() : localeInfo, configs);
6642 resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
6643 #endif
6644 resourceManager->UpdateResConfig(*resConfig);
6645
6646 for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
6647 std::string moduleResPath;
6648 if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
6649 moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
6650 }
6651 if (!moduleResPath.empty()) {
6652 APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
6653 if (!resourceManager->AddResource(moduleResPath.c_str(), Global::Resource::SELECT_STRING
6654 | Global::Resource::SELECT_MEDIA)) {
6655 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
6656 }
6657 }
6658 }
6659 return resourceManager;
6660 }
6661 #endif
6662
GetAllPreInstallBundleInfos()6663 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
6664 {
6665 std::vector<PreInstallBundleInfo> preInstallBundleInfos;
6666 LoadAllPreInstallBundleInfos(preInstallBundleInfos);
6667 return preInstallBundleInfos;
6668 }
6669
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo) const6670 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
6671 AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
6672 {
6673 int32_t requestUserId = GetUserId(userId);
6674 if (requestUserId == Constants::INVALID_USERID) {
6675 APP_LOGW("invalid userId: %{public}d", userId);
6676 return false;
6677 }
6678 std::vector<AbilityInfo> abilityInfos;
6679 bool abilityValid =
6680 ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
6681 std::vector<ExtensionAbilityInfo> extensionInfos;
6682 bool extensionValid =
6683 ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
6684 if (!abilityValid && !extensionValid) {
6685 // both invalid
6686 APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
6687 return false;
6688 }
6689 if (abilityValid && extensionValid) {
6690 // both valid
6691 if (abilityInfos[0].priority >= extensionInfos[0].priority) {
6692 APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
6693 abilityInfo = abilityInfos[0];
6694 } else {
6695 APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
6696 extensionInfos[0].name.c_str());
6697 extensionInfo = extensionInfos[0];
6698 }
6699 } else if (abilityValid) {
6700 // only ability valid
6701 APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
6702 abilityInfo = abilityInfos[0];
6703 } else {
6704 // only extension valid
6705 APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
6706 extensionInfo = extensionInfos[0];
6707 }
6708 return true;
6709 }
6710
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos,bool & findDefaultApp)6711 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
6712 std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
6713 {
6714 APP_LOGI_NOFUNC("ImplicitQueryInfos action:%{public}s uri:%{private}s type:%{public}s flags:%{public}d "
6715 "userId:%{public}d withDefault:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(),
6716 want.GetType().c_str(), flags, userId, withDefault);
6717 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
6718 // step1 : find default infos
6719 if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
6720 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6721 if (!abilityInfos.empty() || !extensionInfos.empty()) {
6722 APP_LOGI("find target default application");
6723 findDefaultApp = true;
6724 if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6725 return true;
6726 }
6727 for (auto &info : abilityInfos) {
6728 info.linkType = LinkType::DEFAULT_APP;
6729 }
6730 }
6731 }
6732 // step2 : find backup default infos
6733 if (withDefault &&
6734 DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
6735 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6736 if (!abilityInfos.empty() || !extensionInfos.empty()) {
6737 APP_LOGI("find target backup default application");
6738 findDefaultApp = true;
6739 if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6740 return true;
6741 }
6742 for (auto &info : abilityInfos) {
6743 info.linkType = LinkType::DEFAULT_APP;
6744 }
6745 }
6746 }
6747 #endif
6748 // step3 : implicit query infos
6749 bool abilityRet =
6750 ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
6751 APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
6752
6753 bool extensionRet =
6754 ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
6755 APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
6756
6757 ImplicitQueryCloneAbilityInfos(want, flags, userId, abilityInfos);
6758 return abilityRet || extensionRet || abilityInfos.size() > 0;
6759 }
6760
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)6761 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
6762 std::vector<std::string> &dependentModuleNames)
6763 {
6764 APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
6765 bundleName.c_str(), moduleName.c_str());
6766 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6767 auto item = bundleInfos_.find(bundleName);
6768 if (item == bundleInfos_.end()) {
6769 APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
6770 return false;
6771 }
6772 const InnerBundleInfo &innerBundleInfo = item->second;
6773 return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
6774 }
6775
UpdateRemovable(const std::string & bundleName,bool removable)6776 void BundleDataMgr::UpdateRemovable(
6777 const std::string &bundleName, bool removable)
6778 {
6779 APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
6780 if (bundleName.empty()) {
6781 APP_LOGW("bundleName is empty");
6782 return;
6783 }
6784
6785 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6786 auto infoItem = bundleInfos_.find(bundleName);
6787 if (infoItem == bundleInfos_.end()) {
6788 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6789 return;
6790 }
6791
6792 if (infoItem->second.IsRemovable() != removable) {
6793 infoItem->second.UpdateRemovable(true, removable);
6794 SaveInnerBundleInfo(infoItem->second);
6795 }
6796 }
6797
UpdatePrivilegeCapability(const std::string & bundleName,const ApplicationInfo & appInfo)6798 void BundleDataMgr::UpdatePrivilegeCapability(
6799 const std::string &bundleName, const ApplicationInfo &appInfo)
6800 {
6801 APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
6802 if (bundleName.empty()) {
6803 APP_LOGW("bundleName is empty");
6804 return;
6805 }
6806
6807 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6808 auto infoItem = bundleInfos_.find(bundleName);
6809 if (infoItem == bundleInfos_.end()) {
6810 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6811 return;
6812 }
6813
6814 infoItem->second.UpdatePrivilegeCapability(appInfo);
6815 }
6816
FetchInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)6817 bool BundleDataMgr::FetchInnerBundleInfo(
6818 const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
6819 {
6820 APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
6821 if (bundleName.empty()) {
6822 APP_LOGW("bundleName is empty");
6823 return false;
6824 }
6825
6826 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6827 auto infoItem = bundleInfos_.find(bundleName);
6828 if (infoItem == bundleInfos_.end()) {
6829 APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
6830 return false;
6831 }
6832
6833 innerBundleInfo = infoItem->second;
6834 return true;
6835 }
6836
GetInnerBundleInfoUsers(const std::string & bundleName,std::set<int32_t> & userIds)6837 bool BundleDataMgr::GetInnerBundleInfoUsers(const std::string &bundleName, std::set<int32_t> &userIds)
6838 {
6839 InnerBundleInfo info;
6840 if (!FetchInnerBundleInfo(bundleName, info)) {
6841 APP_LOGW("FetchInnerBundleInfo failed");
6842 return false;
6843 }
6844 std::map<std::string, InnerBundleUserInfo> userInfos = info.GetInnerBundleUserInfos();
6845 for (const auto &userInfo : userInfos) {
6846 userIds.insert(userInfo.second.bundleUserInfo.userId);
6847 }
6848 return true;
6849 }
6850
IsSystemHsp(const std::string & bundleName)6851 bool BundleDataMgr::IsSystemHsp(const std::string &bundleName)
6852 {
6853 InnerBundleInfo info;
6854 if (!FetchInnerBundleInfo(bundleName, info)) {
6855 APP_LOGW("FetchInnerBundleInfo %{public}s failed", bundleName.c_str());
6856 return false;
6857 }
6858 return info.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK;
6859 }
6860
6861 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId,const Element & element,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo,std::vector<Skill> & skills) const6862 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
6863 AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
6864 {
6865 APP_LOGD("begin to QueryInfoAndSkillsByElement");
6866 const std::string& bundleName = element.bundleName;
6867 const std::string& moduleName = element.moduleName;
6868 const std::string& abilityName = element.abilityName;
6869 const std::string& extensionName = element.extensionName;
6870 Want want;
6871 ElementName elementName("", bundleName, abilityName, moduleName);
6872 want.SetElement(elementName);
6873 bool isAbility = !element.abilityName.empty();
6874 bool ret = false;
6875 if (isAbility) {
6876 // get ability info
6877 ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6878 if (!ret) {
6879 APP_LOGD("ExplicitQueryAbilityInfo failed, abilityName:%{public}s", element.abilityName.c_str());
6880 return false;
6881 }
6882 } else {
6883 // get extension info
6884 elementName.SetAbilityName(extensionName);
6885 want.SetElement(elementName);
6886 ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6887 if (!ret) {
6888 APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
6889 return false;
6890 }
6891 }
6892
6893 // get skills info
6894 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6895 if (bundleInfos_.empty()) {
6896 APP_LOGW("bundleInfos_ is empty");
6897 return false;
6898 }
6899 auto item = bundleInfos_.find(bundleName);
6900 if (item == bundleInfos_.end()) {
6901 APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
6902 return false;
6903 }
6904 const InnerBundleInfo& innerBundleInfo = item->second;
6905 if (isAbility) {
6906 std::string key;
6907 key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
6908 APP_LOGD("begin to find ability skills, key : %{public}s", key.c_str());
6909 for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
6910 if (infoItem.first == key) {
6911 skills = infoItem.second;
6912 APP_LOGD("find ability skills success");
6913 break;
6914 }
6915 }
6916 } else {
6917 std::string key;
6918 key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
6919 APP_LOGD("begin to find extension skills, key : %{public}s", key.c_str());
6920 for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
6921 if (infoItem.first == key) {
6922 skills = infoItem.second;
6923 APP_LOGD("find extension skills success");
6924 break;
6925 }
6926 }
6927 }
6928 APP_LOGD("QueryInfoAndSkillsByElement success");
6929 return true;
6930 }
6931
GetElement(int32_t userId,const ElementName & elementName,Element & element) const6932 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
6933 {
6934 APP_LOGD("begin to GetElement");
6935 const std::string& bundleName = elementName.GetBundleName();
6936 const std::string& moduleName = elementName.GetModuleName();
6937 const std::string& abilityName = elementName.GetAbilityName();
6938 if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
6939 APP_LOGW("bundleName or moduleName or abilityName is empty");
6940 return false;
6941 }
6942 Want want;
6943 want.SetElement(elementName);
6944 AbilityInfo abilityInfo;
6945 bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6946 if (ret) {
6947 APP_LOGD("ElementName is ability");
6948 element.bundleName = bundleName;
6949 element.moduleName = moduleName;
6950 element.abilityName = abilityName;
6951 return true;
6952 }
6953
6954 ExtensionAbilityInfo extensionInfo;
6955 ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6956 if (ret) {
6957 APP_LOGD("ElementName is extension");
6958 element.bundleName = bundleName;
6959 element.moduleName = moduleName;
6960 element.extensionName = abilityName;
6961 return true;
6962 }
6963
6964 if (DelayedSingleton<BundleMgrService>::GetInstance()->IsBrokerServiceStarted()) {
6965 APP_LOGI("query ability from broker");
6966 AbilityInfo brokerAbilityInfo;
6967 auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
6968 ErrCode resultCode = bmsExtensionClient->QueryAbilityInfo(want, 0, userId, brokerAbilityInfo, true);
6969 if (resultCode == ERR_OK) {
6970 APP_LOGI("ElementName is brokerAbility");
6971 element.bundleName = bundleName;
6972 element.moduleName = moduleName;
6973 element.abilityName = abilityName;
6974 return true;
6975 }
6976 }
6977
6978 APP_LOGW("ElementName doesn't exist");
6979 return false;
6980 }
6981 #endif
6982
GetMediaData(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::unique_ptr<uint8_t[]> & mediaDataPtr,size_t & len,int32_t userId) const6983 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
6984 const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
6985 {
6986 APP_LOGI("begin");
6987 #ifdef GLOBAL_RESMGR_ENABLE
6988 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6989 int32_t requestUserId = GetUserId(userId);
6990 if (requestUserId == Constants::INVALID_USERID) {
6991 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6992 }
6993 InnerBundleInfo innerBundleInfo;
6994 ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
6995 bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
6996 if (errCode != ERR_OK) {
6997 return errCode;
6998 }
6999 AbilityInfo abilityInfo;
7000 errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
7001 if (errCode != ERR_OK) {
7002 return errCode;
7003 }
7004 bool isEnable = false;
7005 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
7006 errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
7007 if (errCode != ERR_OK) {
7008 return errCode;
7009 }
7010 if (!isEnable) {
7011 APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
7012 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
7013 }
7014 std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
7015 GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
7016 if (resourceManager == nullptr) {
7017 APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
7018 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7019 }
7020 OHOS::Global::Resource::RState ret =
7021 resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
7022 if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
7023 APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
7024 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7025 }
7026 return ERR_OK;
7027 #else
7028 return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
7029 #endif
7030 }
7031
GetStatusCallbackMutex()7032 std::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
7033 {
7034 return callbackMutex_;
7035 }
7036
GetCallBackList() const7037 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
7038 {
7039 return callbackList_;
7040 }
7041
UpdateQuickFixInnerBundleInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)7042 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
7043 const InnerBundleInfo &innerBundleInfo)
7044 {
7045 APP_LOGD("to update info:%{public}s", bundleName.c_str());
7046 if (bundleName.empty()) {
7047 APP_LOGW("update info fail, empty bundle name");
7048 return false;
7049 }
7050
7051 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7052 auto infoItem = bundleInfos_.find(bundleName);
7053 if (infoItem == bundleInfos_.end()) {
7054 APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7055 return false;
7056 }
7057
7058 if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7059 bundleInfos_.at(bundleName) = innerBundleInfo;
7060 return true;
7061 }
7062 APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
7063 return false;
7064 }
7065
UpdateInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,bool needSaveStorage)7066 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo, bool needSaveStorage)
7067 {
7068 std::string bundleName = innerBundleInfo.GetBundleName();
7069 if (bundleName.empty()) {
7070 APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
7071 return false;
7072 }
7073 APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
7074 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7075 auto infoItem = bundleInfos_.find(bundleName);
7076 if (infoItem == bundleInfos_.end()) {
7077 APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7078 return false;
7079 }
7080
7081 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7082 APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
7083 return false;
7084 }
7085 bundleInfos_.at(bundleName) = innerBundleInfo;
7086 return true;
7087 }
7088
QueryOverlayInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)7089 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
7090 {
7091 APP_LOGD("start to query overlay innerBundleInfo");
7092 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7093 if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
7094 info = bundleInfos_.at(bundleName);
7095 return true;
7096 }
7097
7098 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7099 return false;
7100 }
7101
SaveOverlayInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)7102 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
7103 {
7104 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7105 innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
7106 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7107 APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
7108 return;
7109 }
7110 bundleInfos_.at(bundleName) = innerBundleInfo;
7111 }
7112
GetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)7113 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
7114 AppProvisionInfo &appProvisionInfo)
7115 {
7116 if (!HasUserId(userId)) {
7117 APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
7118 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7119 }
7120 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7121 auto infoItem = bundleInfos_.find(bundleName);
7122 if (infoItem == bundleInfos_.end()) {
7123 APP_LOGW_NOFUNC("-n %{public}s not exist", bundleName.c_str());
7124 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7125 }
7126 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7127 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7128 if (responseUserId == Constants::INVALID_USERID) {
7129 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7130 }
7131 }
7132 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
7133 APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
7134 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7135 }
7136 return ERR_OK;
7137 }
7138
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas) const7139 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
7140 std::vector<Metadata> &provisionMetadatas) const
7141 {
7142 // Reserved interface
7143 return ERR_OK;
7144 }
7145
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles) const7146 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
7147 {
7148 APP_LOGD("GetAllSharedBundleInfo");
7149 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7150
7151 for (const auto& [key, innerBundleInfo] : bundleInfos_) {
7152 if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7153 continue;
7154 }
7155 SharedBundleInfo sharedBundleInfo;
7156 innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7157 sharedBundles.emplace_back(sharedBundleInfo);
7158 }
7159
7160 return ERR_OK;
7161 }
7162
GetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)7163 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
7164 std::vector<SharedBundleInfo> &sharedBundles)
7165 {
7166 APP_LOGD("GetSharedBundleInfo");
7167 if (bundleName.empty() || moduleName.empty()) {
7168 APP_LOGW("bundleName or moduleName is empty");
7169 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7170 }
7171
7172 std::vector<Dependency> dependencies;
7173 ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
7174 if (errCode != ERR_OK) {
7175 APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
7176 errCode, bundleName.c_str());
7177 return errCode;
7178 }
7179
7180 for (const auto& dep : dependencies) {
7181 SharedBundleInfo sharedBundleInfo;
7182 errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
7183 if (errCode != ERR_OK) {
7184 APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
7185 errCode, bundleName.c_str());
7186 return errCode;
7187 }
7188 sharedBundles.emplace_back(sharedBundleInfo);
7189 }
7190
7191 return ERR_OK;
7192 }
7193
GetSharedBundleInfoBySelf(const std::string & bundleName,SharedBundleInfo & sharedBundleInfo)7194 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
7195 {
7196 APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
7197 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7198 auto infoItem = bundleInfos_.find(bundleName);
7199 if (infoItem == bundleInfos_.end()) {
7200 APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
7201 bundleName.c_str());
7202 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7203 }
7204 const InnerBundleInfo &innerBundleInfo = infoItem->second;
7205 if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7206 APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
7207 bundleName.c_str());
7208 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7209 }
7210 innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7211 APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
7212 return ERR_OK;
7213 }
7214
GetSharedDependencies(const std::string & bundleName,const std::string & moduleName,std::vector<Dependency> & dependencies)7215 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
7216 std::vector<Dependency> &dependencies)
7217 {
7218 APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
7219 bundleName.c_str(), moduleName.c_str());
7220 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7221 auto item = bundleInfos_.find(bundleName);
7222 if (item == bundleInfos_.end()) {
7223 APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
7224 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7225 }
7226 const InnerBundleInfo &innerBundleInfo = item->second;
7227 if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
7228 APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
7229 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7230 }
7231 APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
7232 bundleName.c_str(), moduleName.c_str());
7233 return ERR_OK;
7234 }
7235
CheckHspVersionIsRelied(int32_t versionCode,const InnerBundleInfo & info) const7236 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
7237 {
7238 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7239 std::string hspBundleName = info.GetBundleName();
7240 if (versionCode == Constants::ALL_VERSIONCODE) {
7241 // uninstall hsp bundle, check other bundle denpendency
7242 return CheckHspBundleIsRelied(hspBundleName);
7243 }
7244 std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
7245 // check whether has higher version
7246 std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
7247 for (const auto &item : versionCodes) {
7248 if (item > static_cast<uint32_t>(versionCode)) {
7249 return false;
7250 }
7251 }
7252 // check other bundle denpendency
7253 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7254 if (bundleName == hspBundleName) {
7255 continue;
7256 }
7257 std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7258 for (const auto &dependencyItem : dependencyList) {
7259 if (dependencyItem.bundleName == hspBundleName &&
7260 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
7261 return true;
7262 }
7263 }
7264 }
7265 return false;
7266 }
7267
CheckHspBundleIsRelied(const std::string & hspBundleName) const7268 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
7269 {
7270 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7271 if (bundleName == hspBundleName) {
7272 continue;
7273 }
7274 std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7275 for (const auto &dependencyItem : dependencyList) {
7276 if (dependencyItem.bundleName == hspBundleName) {
7277 return true;
7278 }
7279 }
7280 }
7281 return false;
7282 }
7283
GetSharedBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo)7284 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
7285 {
7286 if (bundleName.empty()) {
7287 APP_LOGW("bundleName is empty");
7288 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7289 }
7290
7291 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7292 auto infoItem = bundleInfos_.find(bundleName);
7293 if (infoItem == bundleInfos_.end()) {
7294 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7295 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7296 }
7297 const InnerBundleInfo &innerBundleInfo = infoItem->second;
7298 innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
7299 return ERR_OK;
7300 }
7301
IsPreInstallApp(const std::string & bundleName)7302 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
7303 {
7304 APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
7305 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7306 auto item = bundleInfos_.find(bundleName);
7307 if (item == bundleInfos_.end()) {
7308 APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
7309 bundleName.c_str());
7310 return false;
7311 }
7312 return item->second.IsPreInstallApp();
7313 }
7314
GetProxyDataInfos(const std::string & bundleName,const std::string & moduleName,int32_t userId,std::vector<ProxyData> & proxyDatas) const7315 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
7316 int32_t userId, std::vector<ProxyData> &proxyDatas) const
7317 {
7318 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7319 InnerBundleInfo info;
7320 auto ret = GetInnerBundleInfoWithBundleFlagsV9(
7321 bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
7322 if (ret != ERR_OK) {
7323 APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7324 return ret;
7325 }
7326 return info.GetProxyDataInfos(moduleName, proxyDatas);
7327 }
7328
GetAllProxyDataInfos(int32_t userId,std::vector<ProxyData> & proxyDatas) const7329 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
7330 {
7331 std::vector<BundleInfo> bundleInfos;
7332 auto ret = GetBundleInfosV9(
7333 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
7334 if (ret != ERR_OK) {
7335 APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
7336 return ret;
7337 }
7338 for (const auto &bundleInfo : bundleInfos) {
7339 for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
7340 proxyDatas.insert(
7341 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
7342 }
7343 }
7344 return ERR_OK;
7345 }
7346
GetBundleNameByAppId(const std::string & appId) const7347 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
7348 {
7349 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7350 auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
7351 return appId == pair.second.GetAppId();
7352 });
7353 if (it == bundleInfos_.cend()) {
7354 APP_LOGW("invalid appId, can't find bundleName");
7355 return Constants::EMPTY_STRING;
7356 }
7357 return it->second.GetBundleName();
7358 }
7359
SetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,AOTCompileStatus aotCompileStatus,uint32_t versionCode)7360 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7361 AOTCompileStatus aotCompileStatus, uint32_t versionCode)
7362 {
7363 APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
7364 bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
7365 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7366 auto item = bundleInfos_.find(bundleName);
7367 if (item == bundleInfos_.end()) {
7368 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7369 (void)InstalldClient::GetInstance()->RemoveDir(ServiceConstants::ARK_CACHE_PATH + bundleName);
7370 return;
7371 }
7372 if (item->second.GetVersionCode() != versionCode) {
7373 APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
7374 versionCode, item->second.GetVersionCode(), bundleName.c_str());
7375 return;
7376 }
7377 item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
7378 std::string abi;
7379 std::string path;
7380 if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
7381 abi = ServiceConstants::ARM64_V8A;
7382 path = std::string(ServiceConstants::ARM64) + ServiceConstants::PATH_SEPARATOR;
7383 }
7384 item->second.SetArkNativeFileAbi(abi);
7385 item->second.SetArkNativeFilePath(path);
7386 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7387 APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
7388 }
7389 }
7390
ResetAOTFlags()7391 void BundleDataMgr::ResetAOTFlags()
7392 {
7393 APP_LOGI("ResetAOTFlags begin");
7394 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7395 std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
7396 item.second.ResetAOTFlags();
7397 if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
7398 APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
7399 }
7400 });
7401 APP_LOGI("ResetAOTFlags end");
7402 }
7403
ResetAOTFlagsCommand(const std::string & bundleName)7404 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
7405 {
7406 APP_LOGI("ResetAOTFlagsCommand begin");
7407 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7408 auto item = bundleInfos_.find(bundleName);
7409 if (item == bundleInfos_.end()) {
7410 APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7411 return;
7412 }
7413 item->second.ResetAOTFlags();
7414 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7415 APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7416 return;
7417 }
7418 APP_LOGI("ResetAOTFlagsCommand end");
7419 }
7420
ResetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,int32_t triggerMode)7421 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7422 int32_t triggerMode)
7423 {
7424 APP_LOGI("ResetAOTCompileStatus begin");
7425 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7426 auto item = bundleInfos_.find(bundleName);
7427 if (item == bundleInfos_.end()) {
7428 APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7429 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7430 }
7431 ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
7432 if (ret != ERR_OK) {
7433 return ret;
7434 }
7435 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7436 APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7437 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7438 }
7439 APP_LOGI("ResetAOTCompileStatus end");
7440 return ERR_OK;
7441 }
7442
GetAllBundleName() const7443 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
7444 {
7445 APP_LOGD("GetAllBundleName begin");
7446 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7447 std::vector<std::string> bundleNames;
7448 bundleNames.reserve(bundleInfos_.size());
7449 std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
7450 return item.first;
7451 });
7452 return bundleNames;
7453 }
7454
GetAllLiteBundleInfo(const int32_t userId) const7455 std::vector<std::tuple<std::string, int32_t, int32_t>> BundleDataMgr::GetAllLiteBundleInfo(const int32_t userId) const
7456 {
7457 std::set<int32_t> userIds = GetAllUser();
7458 if (userIds.find(userId) == userIds.end()) {
7459 APP_LOGW("invalid userId");
7460 return {};
7461 }
7462 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7463 std::vector<std::tuple<std::string, int32_t, int32_t>> bundles;
7464 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7465 auto installedUsers = innerBundleInfo.GetUsers();
7466 if (installedUsers.find(userId) == installedUsers.end()) {
7467 continue;
7468 }
7469 bundles.emplace_back(bundleName, innerBundleInfo.GetUid(userId), innerBundleInfo.GetGid(userId));
7470 }
7471 return bundles;
7472 }
7473
GetBundleNamesForNewUser() const7474 std::vector<std::string> BundleDataMgr::GetBundleNamesForNewUser() const
7475 {
7476 APP_LOGD("begin");
7477 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7478 std::vector<std::string> bundleNames;
7479 for (const auto &item : bundleInfos_) {
7480 if (item.second.GetApplicationBundleType() == BundleType::SHARED ||
7481 item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
7482 APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
7483 item.second.GetBundleName().c_str());
7484 continue;
7485 }
7486 // this function is used to install additional bundle in new user, so ignore pre-install app
7487 if (item.second.IsPreInstallApp()) {
7488 APP_LOGD("app %{public}s is pre-install app, ignore", item.second.GetBundleName().c_str());
7489 continue;
7490 }
7491 if (item.second.IsInstalledForAllUser() &&
7492 OHOS::system::GetBoolParameter(ServiceConstants::IS_ENTERPRISE_DEVICE, false)) {
7493 APP_LOGI("%{public}s is installed for all user", item.second.GetBundleName().c_str());
7494 bundleNames.emplace_back(item.second.GetBundleName());
7495 continue;
7496 }
7497 const auto extensions = item.second.GetInnerExtensionInfos();
7498 for (const auto &extensionItem : extensions) {
7499 if (extensionItem.second.type == ExtensionAbilityType::DRIVER) {
7500 bundleNames.emplace_back(extensionItem.second.bundleName);
7501 APP_LOGI("driver bundle found: %{public}s", extensionItem.second.bundleName.c_str());
7502 break;
7503 }
7504 }
7505 }
7506 return bundleNames;
7507 }
7508
QueryInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info) const7509 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
7510 {
7511 APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
7512 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7513 auto item = bundleInfos_.find(bundleName);
7514 if (item == bundleInfos_.end()) {
7515 APP_LOGW_NOFUNC("QueryInnerBundleInfo not find %{public}s", bundleName.c_str());
7516 return false;
7517 }
7518 info = item->second;
7519 return true;
7520 }
7521
GetUserIds(const std::string & bundleName) const7522 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
7523 {
7524 APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
7525 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7526 std::vector<int32_t> userIds;
7527 auto infoItem = bundleInfos_.find(bundleName);
7528 if (infoItem == bundleInfos_.end()) {
7529 APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7530 return userIds;
7531 }
7532 auto userInfos = infoItem->second.GetInnerBundleUserInfos();
7533 std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
7534 return item.second.bundleUserInfo.userId;
7535 });
7536 return userIds;
7537 }
7538
CreateAppEl5GroupDir(const std::string & bundleName,int32_t userId)7539 void BundleDataMgr::CreateAppEl5GroupDir(const std::string &bundleName, int32_t userId)
7540 {
7541 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7542 auto bundleInfoItem = bundleInfos_.find(bundleName);
7543 if (bundleInfoItem == bundleInfos_.end()) {
7544 APP_LOGW("%{public}s not found", bundleName.c_str());
7545 return;
7546 }
7547 bool needCreateEl5Dir = bundleInfoItem->second.NeedCreateEl5Dir();
7548 if (!needCreateEl5Dir) {
7549 return;
7550 }
7551 auto dataGroupInfoMap = bundleInfoItem->second.GetDataGroupInfos();
7552 if (dataGroupInfoMap.empty()) {
7553 return;
7554 }
7555 std::vector<DataGroupInfo> dataGroupInfos;
7556 for (const auto &groupItem : dataGroupInfoMap) {
7557 for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7558 if (dataGroupInfo.userId == userId) {
7559 dataGroupInfos.emplace_back(dataGroupInfo);
7560 }
7561 }
7562 }
7563 if (CreateEl5GroupDirs(dataGroupInfos, userId) != ERR_OK) {
7564 APP_LOGW("create el5 group dirs for %{public}s %{public}d failed", bundleName.c_str(), userId);
7565 }
7566 }
7567
CreateAppGroupDir(const InnerBundleInfo & info,int32_t userId)7568 bool BundleDataMgr::CreateAppGroupDir(const InnerBundleInfo &info, int32_t userId)
7569 {
7570 auto dataGroupInfoMap = info.GetDataGroupInfos();
7571 if (dataGroupInfoMap.empty()) {
7572 return true;
7573 }
7574 std::vector<DataGroupInfo> dataGroupInfos;
7575 for (const auto &groupItem : dataGroupInfoMap) {
7576 for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7577 if (dataGroupInfo.userId == userId) {
7578 dataGroupInfos.emplace_back(dataGroupInfo);
7579 }
7580 }
7581 }
7582 bool needCreateEl5Dir = info.NeedCreateEl5Dir();
7583 return CreateGroupDirs(dataGroupInfos, userId, needCreateEl5Dir) == ERR_OK;
7584 }
7585
CreateAppGroupDir(const std::string & bundleName,int32_t userId)7586 bool BundleDataMgr::CreateAppGroupDir(const std::string &bundleName, int32_t userId)
7587 {
7588 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7589 auto bundleInfoItem = bundleInfos_.find(bundleName);
7590 if (bundleInfoItem == bundleInfos_.end()) {
7591 APP_LOGW("%{public}s not found", bundleName.c_str());
7592 return false;
7593 }
7594 return CreateAppGroupDir(bundleInfoItem->second, userId);
7595 }
7596
CreateGroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId,bool needCreateEl5Dir)7597 ErrCode BundleDataMgr::CreateGroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId,
7598 bool needCreateEl5Dir)
7599 {
7600 if (dataGroupInfos.empty()) {
7601 return ERR_OK;
7602 }
7603 std::vector<CreateDirParam> params;
7604 for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
7605 CreateDirParam param;
7606 param.uuid = dataGroupInfo.uuid;
7607 param.uid = dataGroupInfo.uid;
7608 param.gid = dataGroupInfo.gid;
7609 param.userId = dataGroupInfo.userId;
7610 params.emplace_back(param);
7611 }
7612 ErrCode res = ERR_OK;
7613 auto nonEl5Res = InstalldClient::GetInstance()->CreateDataGroupDirs(params);
7614 if (nonEl5Res != ERR_OK) {
7615 APP_LOGE("mkdir group dir failed %{public}d", nonEl5Res);
7616 res = nonEl5Res;
7617 }
7618 if (!needCreateEl5Dir) {
7619 return res;
7620 }
7621 auto el5Res = CreateEl5GroupDirs(dataGroupInfos, userId);
7622 if (el5Res != ERR_OK) {
7623 APP_LOGE("el5Res %{public}d", el5Res);
7624 res = el5Res;
7625 }
7626 return res;
7627 }
7628
CreateEl5GroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId)7629 ErrCode BundleDataMgr::CreateEl5GroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId)
7630 {
7631 if (dataGroupInfos.empty()) {
7632 return ERR_OK;
7633 }
7634 std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
7635 ServiceConstants::PATH_SEPARATOR + std::to_string(userId);
7636 if (!BundleUtil::IsExistDir(parentDir)) {
7637 APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
7638 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7639 }
7640 ErrCode res = ERR_OK;
7641 for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
7642 // create el5 group dirs
7643 std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
7644 auto result = InstalldClient::GetInstance()->Mkdir(dir,
7645 ServiceConstants::DATA_GROUP_DIR_MODE, dataGroupInfo.uid, dataGroupInfo.gid);
7646 if (result != ERR_OK) {
7647 APP_LOGW("id %{public}s group dir %{private}s userId %{public}d failed",
7648 dataGroupInfo.dataGroupId.c_str(), dataGroupInfo.uuid.c_str(), userId);
7649 res = result;
7650 }
7651 // set el5 group dirs encryption policy
7652 EncryptionParam encryptionParam("", dataGroupInfo.uuid, dataGroupInfo.uid, userId, EncryptionDirType::GROUP);
7653 std::string keyId = "";
7654 auto setPolicyRes = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
7655 if (setPolicyRes != ERR_OK) {
7656 LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
7657 res = setPolicyRes;
7658 }
7659 }
7660 return res;
7661 }
7662
GetSpecifiedDistributionType(const std::string & bundleName,std::string & specifiedDistributionType)7663 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
7664 const std::string &bundleName, std::string &specifiedDistributionType)
7665 {
7666 APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
7667 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7668 auto infoItem = bundleInfos_.find(bundleName);
7669 if (infoItem == bundleInfos_.end()) {
7670 APP_LOGW_NOFUNC("-n %{public}s does not exist", bundleName.c_str());
7671 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7672 }
7673 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7674 int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7675 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7676 if (responseUserId == Constants::INVALID_USERID) {
7677 APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7678 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7679 }
7680 }
7681 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
7682 specifiedDistributionType)) {
7683 APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed", bundleName.c_str());
7684 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7685 }
7686 return ERR_OK;
7687 }
7688
GetAdditionalInfo(const std::string & bundleName,std::string & additionalInfo)7689 ErrCode BundleDataMgr::GetAdditionalInfo(
7690 const std::string &bundleName, std::string &additionalInfo)
7691 {
7692 APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
7693 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7694 auto infoItem = bundleInfos_.find(bundleName);
7695 if (infoItem == bundleInfos_.end()) {
7696 APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
7697 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7698 }
7699 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7700 int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7701 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7702 if (responseUserId == Constants::INVALID_USERID) {
7703 APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7704 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7705 }
7706 }
7707 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
7708 additionalInfo)) {
7709 APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
7710 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7711 }
7712 return ERR_OK;
7713 }
7714
GetAdditionalInfoForAllUser(const std::string & bundleName,std::string & additionalInfo)7715 ErrCode BundleDataMgr::GetAdditionalInfoForAllUser(
7716 const std::string &bundleName, std::string &additionalInfo)
7717 {
7718 APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
7719 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7720 auto infoItem = bundleInfos_.find(bundleName);
7721 if (infoItem == bundleInfos_.end()) {
7722 APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
7723 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7724 }
7725 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
7726 additionalInfo)) {
7727 APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
7728 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7729 }
7730 return ERR_OK;
7731 }
7732
SetExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)7733 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7734 const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7735 {
7736 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7737 auto item = bundleInfos_.find(bundleName);
7738 if (item == bundleInfos_.end()) {
7739 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7740 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7741 }
7742 ErrCode ret;
7743 if (!extName.empty()) {
7744 ret = item->second.SetExtName(moduleName, abilityName, extName);
7745 if (ret != ERR_OK) {
7746 APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7747 return ret;
7748 }
7749 }
7750 if (!mimeType.empty()) {
7751 ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
7752 if (ret != ERR_OK) {
7753 APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7754 return ret;
7755 }
7756 }
7757 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7758 APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7759 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7760 }
7761 return ERR_OK;
7762 }
7763
DelExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)7764 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7765 const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7766 {
7767 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7768 auto item = bundleInfos_.find(bundleName);
7769 if (item == bundleInfos_.end()) {
7770 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7771 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7772 }
7773 ErrCode ret;
7774 if (!extName.empty()) {
7775 ret = item->second.DelExtName(moduleName, abilityName, extName);
7776 if (ret != ERR_OK) {
7777 APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7778 return ret;
7779 }
7780 }
7781 if (!mimeType.empty()) {
7782 ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
7783 if (ret != ERR_OK) {
7784 APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7785 return ret;
7786 }
7787 }
7788 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7789 APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7790 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7791 }
7792 return ERR_OK;
7793 }
7794
MatchPrivateType(const Want & want,const std::vector<std::string> & supportExtNames,const std::vector<std::string> & supportMimeTypes,const std::vector<std::string> & paramMimeTypes) const7795 bool BundleDataMgr::MatchPrivateType(const Want &want,
7796 const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes,
7797 const std::vector<std::string> ¶mMimeTypes) const
7798 {
7799 std::string uri = want.GetUriString();
7800 APP_LOGD("MatchPrivateType, uri is %{private}s", uri.c_str());
7801 auto suffixIndex = uri.rfind('.');
7802 if (suffixIndex == std::string::npos) {
7803 return false;
7804 }
7805 std::string suffix = uri.substr(suffixIndex + 1);
7806 bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
7807 return extName == suffix;
7808 });
7809 if (supportPrivateType) {
7810 APP_LOGI("uri is a supported private-type file");
7811 return true;
7812 }
7813
7814 if (!paramMimeTypes.empty()) {
7815 auto iter = std::find_first_of(
7816 paramMimeTypes.begin(), paramMimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
7817 if (iter != paramMimeTypes.end()) {
7818 APP_LOGI("uri is a supported mime-type file");
7819 return true;
7820 }
7821 }
7822 return false;
7823 }
7824
QueryAppGalleryAbilityName(std::string & bundleName,std::string & abilityName)7825 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
7826 {
7827 APP_LOGD("QueryAppGalleryAbilityName called");
7828 AbilityInfo abilityInfo;
7829 ExtensionAbilityInfo extensionInfo;
7830 Want want;
7831 want.SetAction(FREE_INSTALL_ACTION);
7832 if (!ImplicitQueryInfoByPriority(
7833 want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
7834 APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
7835 return false;
7836 }
7837 if (!abilityInfo.name.empty()) {
7838 bundleName = abilityInfo.bundleName;
7839 abilityName = abilityInfo.name;
7840 } else {
7841 bundleName = extensionInfo.bundleName;
7842 abilityName = extensionInfo.name;
7843 }
7844
7845 if (bundleName.empty() || abilityName.empty()) {
7846 APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
7847 bundleName.c_str(), abilityName.c_str());
7848 return false;
7849 }
7850 bool isSystemApp = false;
7851 if (IsSystemApp(bundleName, isSystemApp) != ERR_OK || !isSystemApp) {
7852 APP_LOGW("%{public}s is not systemApp", bundleName.c_str());
7853 bundleName.clear();
7854 abilityName.clear();
7855 return false;
7856 }
7857 APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
7858 bundleName.c_str(), abilityName.c_str());
7859 return true;
7860 }
7861
GetJsonProfile(ProfileType profileType,const std::string & bundleName,const std::string & moduleName,std::string & profile,int32_t userId) const7862 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
7863 const std::string &moduleName, std::string &profile, int32_t userId) const
7864 {
7865 APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
7866 profileType, bundleName.c_str(), moduleName.c_str());
7867 int32_t requestUserId = GetUserId(userId);
7868 if (requestUserId == Constants::INVALID_USERID) {
7869 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7870 }
7871 auto mapItem = PROFILE_TYPE_MAP.find(profileType);
7872 if (mapItem == PROFILE_TYPE_MAP.end()) {
7873 APP_LOGE("profileType: %{public}d is invalid", profileType);
7874 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7875 }
7876 std::string profilePath = mapItem->second;
7877 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7878 const auto &item = bundleInfos_.find(bundleName);
7879 if (item == bundleInfos_.end()) {
7880 APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
7881 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7882 }
7883 const InnerBundleInfo &bundleInfo = item->second;
7884 bool isEnabled = false;
7885 int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
7886 ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
7887 if (res != ERR_OK) {
7888 APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
7889 return res;
7890 }
7891 if (!isEnabled) {
7892 APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
7893 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
7894 }
7895 std::string moduleNameTmp = moduleName;
7896 if (moduleName.empty()) {
7897 APP_LOGW("moduleName is empty, try to get profile from entry module");
7898 std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
7899 for (const auto &info : moduleInfos) {
7900 if (info.second.isEntry) {
7901 moduleNameTmp = info.second.moduleName;
7902 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
7903 break;
7904 }
7905 }
7906 }
7907 auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
7908 if (!moduleInfo) {
7909 APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
7910 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7911 }
7912 return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
7913 }
7914
GetJsonProfileByExtractor(const std::string & hapPath,const std::string & profilePath,std::string & profile) const7915 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
7916 const std::string &profilePath, std::string &profile) const
7917 {
7918 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
7919 APP_LOGD("GetJsonProfileByExtractor with hapPath %{private}s and profilePath %{private}s",
7920 hapPath.c_str(), profilePath.c_str());
7921 BundleExtractor bundleExtractor(hapPath);
7922 if (!bundleExtractor.Init()) {
7923 APP_LOGE("bundle extractor init failed");
7924 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7925 }
7926 if (!bundleExtractor.HasEntry(profilePath)) {
7927 APP_LOGD("profile not exist");
7928 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7929 }
7930 std::stringstream profileStream;
7931 if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
7932 APP_LOGE("extract profile failed");
7933 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7934 }
7935 profile = profileStream.str();
7936 return ERR_OK;
7937 }
7938
QueryDataGroupInfos(const std::string & bundleName,int32_t userId,std::vector<DataGroupInfo> & infos) const7939 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
7940 std::vector<DataGroupInfo> &infos) const
7941 {
7942 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7943 auto infoItem = bundleInfos_.find(bundleName);
7944 if (infoItem == bundleInfos_.end()) {
7945 APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
7946 return false;
7947 }
7948 auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
7949 for (const auto &item : dataGroupInfos) {
7950 auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
7951 [userId](const DataGroupInfo &info) {
7952 return info.userId == userId;
7953 });
7954 if (dataGroupIter != std::end(item.second)) {
7955 infos.push_back(*dataGroupIter);
7956 }
7957 }
7958 return true;
7959 }
7960
GetGroupDir(const std::string & dataGroupId,std::string & dir,int32_t userId) const7961 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
7962 {
7963 if (userId == Constants::UNSPECIFIED_USERID) {
7964 userId = AccountHelper::GetCurrentActiveUserId();
7965 }
7966 std::string uuid;
7967 if (BundlePermissionMgr::IsSystemApp() &&
7968 BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
7969 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7970 for (const auto &item : bundleInfos_) {
7971 const auto &dataGroupInfos = item.second.GetDataGroupInfos();
7972 auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7973 if (dataGroupInfosIter == dataGroupInfos.end()) {
7974 continue;
7975 }
7976 auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
7977 std::end(dataGroupInfosIter->second),
7978 [userId](const DataGroupInfo &info) { return info.userId == userId; });
7979 if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
7980 uuid = dataInUserIter->uuid;
7981 break;
7982 }
7983 }
7984 } else {
7985 int32_t callingUid = IPCSkeleton::GetCallingUid();
7986 InnerBundleInfo innerBundleInfo;
7987 if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
7988 APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
7989 return false;
7990 }
7991 const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
7992 auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7993 if (dataGroupInfosIter == dataGroupInfos.end()) {
7994 APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
7995 return false;
7996 }
7997 auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
7998 [userId](const DataGroupInfo &info) {
7999 return info.userId == userId;
8000 });
8001 if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
8002 uuid = dataGroupIter->uuid;
8003 }
8004 }
8005 if (uuid.empty()) {
8006 APP_LOGW("get uuid by data group id failed");
8007 return false;
8008 }
8009 dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR + std::to_string(userId)
8010 + ServiceConstants::DATA_GROUP_PATH + uuid;
8011 APP_LOGD("groupDir: %{private}s", dir.c_str());
8012 return true;
8013 }
8014
CreateNewDataGroupInfo(const std::string & groupId,const int32_t userId,const DataGroupInfo & oldDataGroupInfo,DataGroupInfo & newDataGroupInfo)8015 void BundleDataMgr::CreateNewDataGroupInfo(const std::string &groupId, const int32_t userId,
8016 const DataGroupInfo &oldDataGroupInfo, DataGroupInfo &newDataGroupInfo)
8017 {
8018 newDataGroupInfo.dataGroupId = groupId;
8019 newDataGroupInfo.userId = userId;
8020
8021 newDataGroupInfo.uuid = oldDataGroupInfo.uuid;
8022 int32_t uniqueId = oldDataGroupInfo.uid - oldDataGroupInfo.userId * Constants::BASE_USER_RANGE -
8023 DATA_GROUP_UID_OFFSET;
8024 int32_t uid = uniqueId + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8025 newDataGroupInfo.uid = uid;
8026 newDataGroupInfo.gid = uid;
8027 }
8028
ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo & innerBundleInfo)8029 void BundleDataMgr::ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo &innerBundleInfo)
8030 {
8031 auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8032 if (dataGroupInfos.empty()) {
8033 return;
8034 }
8035 for (int32_t userId : innerBundleInfo.GetUsers()) {
8036 for (const auto &dataItem : dataGroupInfos) {
8037 std::string groupId = dataItem.first;
8038 if (dataItem.second.empty()) {
8039 APP_LOGW("id infos %{public}s empty in -n %{public}s", groupId.c_str(),
8040 innerBundleInfo.GetBundleName().c_str());
8041 continue;
8042 }
8043 DataGroupInfo dataGroupInfo;
8044 CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8045 innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
8046 // user path can not access, need create group dir when user unlocked
8047 }
8048 }
8049 }
8050
GenerateDataGroupUuidAndUid(DataGroupInfo & dataGroupInfo,int32_t userId,std::unordered_set<int32_t> & uniqueIdSet) const8051 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
8052 std::unordered_set<int32_t> &uniqueIdSet) const
8053 {
8054 int32_t uniqueId = DATA_GROUP_INDEX_START;
8055 for (int32_t i = DATA_GROUP_INDEX_START; i < DATA_GROUP_UID_OFFSET; i++) {
8056 if (uniqueIdSet.find(i) == uniqueIdSet.end()) {
8057 uniqueId = i;
8058 break;
8059 }
8060 }
8061
8062 int32_t uid = userId * Constants::BASE_USER_RANGE + uniqueId + DATA_GROUP_UID_OFFSET;
8063 dataGroupInfo.uid = uid;
8064 dataGroupInfo.gid = uid;
8065
8066 std::string str = BundleUtil::GenerateUuidByKey(dataGroupInfo.dataGroupId);
8067 dataGroupInfo.uuid = str;
8068 uniqueIdSet.insert(uniqueId);
8069 }
8070
GenerateDataGroupInfos(const std::string & bundleName,const std::unordered_set<std::string> & dataGroupIdList,int32_t userId,bool needSaveStorage)8071 void BundleDataMgr::GenerateDataGroupInfos(const std::string &bundleName,
8072 const std::unordered_set<std::string> &dataGroupIdList, int32_t userId, bool needSaveStorage)
8073 {
8074 APP_LOGD("called for user: %{public}d", userId);
8075 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8076 auto bundleInfoItem = bundleInfos_.find(bundleName);
8077 if (bundleInfoItem == bundleInfos_.end()) {
8078 APP_LOGW("%{public}s not found", bundleName.c_str());
8079 return;
8080 }
8081 auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8082 for (const auto &dataItem : dataGroupInfos) {
8083 std::string oldGroupId = dataItem.first;
8084 if (dataGroupIdList.find(oldGroupId) == dataGroupIdList.end()) {
8085 bundleInfoItem->second.DeleteDataGroupInfo(oldGroupId);
8086 }
8087 }
8088 if (dataGroupIdList.empty()) {
8089 APP_LOGD("dataGroupIdList is empty");
8090 return;
8091 }
8092 std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
8093 std::unordered_set<int32_t> uniqueIdSet;
8094 GetDataGroupIndexMap(dataGroupIndexMap, uniqueIdSet);
8095 for (const std::string &groupId : dataGroupIdList) {
8096 DataGroupInfo dataGroupInfo;
8097 dataGroupInfo.dataGroupId = groupId;
8098 dataGroupInfo.userId = userId;
8099 auto iter = dataGroupIndexMap.find(groupId);
8100 if (iter != dataGroupIndexMap.end()) {
8101 dataGroupInfo.uuid = iter->second.second;
8102 int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8103 dataGroupInfo.uid = uid;
8104 dataGroupInfo.gid = uid;
8105 } else {
8106 // need to generate a valid uniqueId
8107 GenerateDataGroupUuidAndUid(dataGroupInfo, userId, uniqueIdSet);
8108 }
8109 bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8110 }
8111 (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8112 ProcessAllUserDataGroupInfosWhenBundleUpdate(bundleInfoItem->second);
8113 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8114 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8115 }
8116 }
8117
GenerateNewUserDataGroupInfos(const std::string & bundleName,int32_t userId)8118 void BundleDataMgr::GenerateNewUserDataGroupInfos(const std::string &bundleName, int32_t userId)
8119 {
8120 APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8121 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8122 auto bundleInfoItem = bundleInfos_.find(bundleName);
8123 if (bundleInfoItem == bundleInfos_.end()) {
8124 APP_LOGW("%{public}s not found", bundleName.c_str());
8125 return;
8126 }
8127 auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8128 if (dataGroupInfos.empty()) {
8129 return;
8130 }
8131 for (const auto &dataItem : dataGroupInfos) {
8132 std::string groupId = dataItem.first;
8133 if (dataItem.second.empty()) {
8134 APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8135 continue;
8136 }
8137 DataGroupInfo dataGroupInfo;
8138 CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8139 bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8140 //need create group dir
8141 (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8142 }
8143 if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8144 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8145 }
8146 }
8147
DeleteUserDataGroupInfos(const std::string & bundleName,int32_t userId,bool keepData)8148 void BundleDataMgr::DeleteUserDataGroupInfos(const std::string &bundleName, int32_t userId, bool keepData)
8149 {
8150 APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8151 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8152 auto bundleInfoItem = bundleInfos_.find(bundleName);
8153 if (bundleInfoItem == bundleInfos_.end()) {
8154 APP_LOGW("%{public}s not found", bundleName.c_str());
8155 return;
8156 }
8157 auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8158 if (dataGroupInfos.empty()) {
8159 return;
8160 }
8161 std::vector<std::string> uuidList;
8162 for (const auto &dataItem : dataGroupInfos) {
8163 std::string groupId = dataItem.first;
8164 if (dataItem.second.empty()) {
8165 APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8166 continue;
8167 }
8168 bundleInfoItem->second.RemoveGroupInfos(userId, groupId);
8169 if (!keepData && !IsDataGroupIdExistNoLock(groupId, userId)) {
8170 uuidList.emplace_back(dataItem.second[0].uuid);
8171 }
8172 }
8173 auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8174 if (result != ERR_OK) {
8175 APP_LOGE("delete group dir failed, err %{public}d", result);
8176 }
8177 if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8178 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8179 }
8180 }
8181
GetDataGroupIndexMap(std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap,std::unordered_set<int32_t> & uniqueIdSet) const8182 void BundleDataMgr::GetDataGroupIndexMap(std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap,
8183 std::unordered_set<int32_t> &uniqueIdSet) const
8184 {
8185 for (const auto &bundleInfo : bundleInfos_) {
8186 for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
8187 for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
8188 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
8189 - DATA_GROUP_UID_OFFSET;
8190 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
8191 std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
8192 uniqueIdSet.insert(index);
8193 });
8194 }
8195 }
8196 }
8197
IsShareDataGroupIdNoLock(const std::string & dataGroupId,int32_t userId) const8198 bool BundleDataMgr::IsShareDataGroupIdNoLock(const std::string &dataGroupId, int32_t userId) const
8199 {
8200 APP_LOGD("IsShareDataGroupIdNoLock, dataGroupId is %{public}s", dataGroupId.c_str());
8201 int32_t count = 0;
8202 for (const auto &info : bundleInfos_) {
8203 auto dataGroupInfos = info.second.GetDataGroupInfos();
8204 auto iter = dataGroupInfos.find(dataGroupId);
8205 if (iter == dataGroupInfos.end()) {
8206 continue;
8207 }
8208
8209 auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8210 [userId](const DataGroupInfo &dataGroupInfo) {
8211 return dataGroupInfo.userId == userId;
8212 });
8213 if (dataGroupIter == std::end(iter->second)) {
8214 continue;
8215 }
8216 count++;
8217 if (count > 1) {
8218 APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
8219 return true;
8220 }
8221 }
8222 return false;
8223 }
8224
IsDataGroupIdExistNoLock(const std::string & dataGroupId,int32_t userId) const8225 bool BundleDataMgr::IsDataGroupIdExistNoLock(const std::string &dataGroupId, int32_t userId) const
8226 {
8227 APP_LOGD("dataGroupId is %{public}s, user %{public}d", dataGroupId.c_str(), userId);
8228 for (const auto &info : bundleInfos_) {
8229 auto dataGroupInfos = info.second.GetDataGroupInfos();
8230 auto iter = dataGroupInfos.find(dataGroupId);
8231 if (iter == dataGroupInfos.end()) {
8232 continue;
8233 }
8234
8235 auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8236 [userId](const DataGroupInfo &dataGroupInfo) {
8237 return dataGroupInfo.userId == userId;
8238 });
8239 if (dataGroupIter == std::end(iter->second)) {
8240 continue;
8241 }
8242 return true;
8243 }
8244 return false;
8245 }
8246
DeleteGroupDirsForException(const InnerBundleInfo & oldInfo,int32_t userId) const8247 void BundleDataMgr::DeleteGroupDirsForException(const InnerBundleInfo &oldInfo, int32_t userId) const
8248 {
8249 //find ids existed in newInfo, but not in oldInfo when there is no others share this id
8250 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8251 const auto bundleInfoItem = bundleInfos_.find(oldInfo.GetBundleName());
8252 if (bundleInfoItem == bundleInfos_.end()) {
8253 APP_LOGE("find bundle %{public}s failed", oldInfo.GetBundleName().c_str());
8254 return;
8255 }
8256 auto newDataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8257 if (newDataGroupInfos.empty()) {
8258 return;
8259 }
8260 auto oldDatagroupInfos = oldInfo.GetDataGroupInfos();
8261 std::vector<std::string> uuidList;
8262 for (const auto &newDataItem : newDataGroupInfos) {
8263 std::string newGroupId = newDataItem.first;
8264 if (newDataItem.second.empty()) {
8265 APP_LOGE("infos empty in %{public}s %{public}s", oldInfo.GetBundleName().c_str(), newGroupId.c_str());
8266 continue;
8267 }
8268 if (oldDatagroupInfos.find(newGroupId) != oldDatagroupInfos.end() ||
8269 IsShareDataGroupIdNoLock(newGroupId, userId)) {
8270 continue;
8271 }
8272 uuidList.emplace_back(newDataItem.second[0].uuid);
8273 }
8274 auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8275 if (result != ERR_OK) {
8276 APP_LOGE("delete group dir failed, err %{public}d", result);
8277 }
8278 }
8279
FindAbilityInfoInBundleInfo(const InnerBundleInfo & innerBundleInfo,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo) const8280 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
8281 const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
8282 {
8283 if (moduleName.empty()) {
8284 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8285 if (!ability) {
8286 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8287 }
8288 abilityInfo = *ability;
8289 return ERR_OK;
8290 }
8291
8292 ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
8293 if (ret != ERR_OK) {
8294 APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
8295 }
8296 return ret;
8297 }
8298
ScanAllBundleGroupInfo()8299 void BundleDataMgr::ScanAllBundleGroupInfo()
8300 {
8301 // valid info, key: index, value: dataGroupId
8302 std::map<int32_t, std::string> indexMap;
8303 // valid info, key: dataGroupId, value: index
8304 std::map<std::string, int32_t> groupIdMap;
8305 // invalid infos, key: bundleNames, value: dataGroupId
8306 std::map<std::string, std::set<std::string>> needProcessGroupInfoBundleNames;
8307 // invalid GroupId
8308 std::set<std::string> errorGroupIds;
8309 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8310 for (const auto &info : bundleInfos_) {
8311 std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos = info.second.GetDataGroupInfos();
8312 if (dataGroupInfos.empty()) {
8313 continue;
8314 }
8315 for (const auto &dataGroupItem : dataGroupInfos) {
8316 std::string dataGroupId = dataGroupItem.first;
8317 if (dataGroupItem.second.empty()) {
8318 APP_LOGW("dataGroupInfos is empty in %{public}s", dataGroupId.c_str());
8319 continue;
8320 }
8321 int32_t groupUidIndex = dataGroupItem.second[0].uid -
8322 dataGroupItem.second[0].userId * Constants::BASE_USER_RANGE - DATA_GROUP_UID_OFFSET;
8323 bool hasIndex = indexMap.find(groupUidIndex) != indexMap.end();
8324 if (!hasIndex && groupIdMap.find(dataGroupId) == groupIdMap.end()) {
8325 indexMap[groupUidIndex] = dataGroupId;
8326 groupIdMap[dataGroupId] = groupUidIndex;
8327 continue;
8328 }
8329 if (!hasIndex && groupIdMap.find(dataGroupId) != groupIdMap.end()) {
8330 APP_LOGW("id %{public}s has invalid index %{public}d, not index %{public}d",
8331 dataGroupId.c_str(), groupIdMap[dataGroupId], groupUidIndex);
8332 }
8333 if (hasIndex && indexMap[groupUidIndex] == dataGroupId) {
8334 continue;
8335 }
8336 if (hasIndex && indexMap[groupUidIndex] != dataGroupId) {
8337 APP_LOGW("id %{public}s has invalid index %{public}d", dataGroupId.c_str(), groupUidIndex);
8338 }
8339 errorGroupIds.insert(dataGroupId);
8340 // invalid index or groupId
8341 APP_LOGW("error index %{public}d groudId %{public}s -n %{public}s",
8342 groupUidIndex, dataGroupId.c_str(), info.first.c_str());
8343 needProcessGroupInfoBundleNames[info.first].insert(dataGroupId);
8344 }
8345 }
8346 HandleGroupIdAndIndex(errorGroupIds, indexMap, groupIdMap);
8347 if (!HandleErrorDataGroupInfos(groupIdMap, needProcessGroupInfoBundleNames)) {
8348 APP_LOGE("process bundle data group failed");
8349 }
8350 }
8351
HandleGroupIdAndIndex(const std::set<std::string> errorGroupIds,std::map<int32_t,std::string> & indexMap,std::map<std::string,int32_t> & groupIdMap)8352 void BundleDataMgr::HandleGroupIdAndIndex(
8353 const std::set<std::string> errorGroupIds,
8354 std::map<int32_t, std::string> &indexMap,
8355 std::map<std::string, int32_t> &groupIdMap)
8356 {
8357 if (errorGroupIds.empty() || indexMap.empty() || groupIdMap.empty()) {
8358 return;
8359 }
8360 for (const auto &groupId : errorGroupIds) {
8361 if (groupIdMap.find(groupId) != groupIdMap.end()) {
8362 continue;
8363 }
8364 int32_t groupIndex = DATA_GROUP_INDEX_START;
8365 for (int32_t index = DATA_GROUP_INDEX_START; index < DATA_GROUP_UID_OFFSET; ++index) {
8366 if (indexMap.find(index) == indexMap.end()) {
8367 groupIndex = index;
8368 break;
8369 }
8370 }
8371 groupIdMap[groupId] = groupIndex;
8372 indexMap[groupIndex] = groupId;
8373 }
8374 }
8375
HandleErrorDataGroupInfos(const std::map<std::string,int32_t> & groupIdMap,const std::map<std::string,std::set<std::string>> & needProcessGroupInfoBundleNames)8376 bool BundleDataMgr::HandleErrorDataGroupInfos(
8377 const std::map<std::string, int32_t> &groupIdMap,
8378 const std::map<std::string, std::set<std::string>> &needProcessGroupInfoBundleNames)
8379 {
8380 if (groupIdMap.empty() || needProcessGroupInfoBundleNames.empty()) {
8381 return true;
8382 }
8383 bool ret = true;
8384 for (const auto &item : needProcessGroupInfoBundleNames) {
8385 auto bundleInfoIter = bundleInfos_.find(item.first);
8386 if (bundleInfoIter == bundleInfos_.end()) {
8387 ret = false;
8388 continue;
8389 }
8390 std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos =
8391 bundleInfoIter->second.GetDataGroupInfos();
8392 if (dataGroupInfos.empty()) {
8393 continue;
8394 }
8395 auto userIds = bundleInfoIter->second.GetUsers();
8396 for (const auto &groudId : item.second) {
8397 auto groupIndexIter = groupIdMap.find(groudId);
8398 if (groupIndexIter == groupIdMap.end()) {
8399 APP_LOGW("id map not found group %{public}s", groudId.c_str());
8400 ret = false;
8401 continue;
8402 }
8403 auto dataGroupInfoIter = dataGroupInfos.find(groudId);
8404 if ((dataGroupInfoIter == dataGroupInfos.end()) || dataGroupInfoIter->second.empty()) {
8405 continue;
8406 }
8407 for (int32_t userId : userIds) {
8408 DataGroupInfo dataGroupInfo;
8409 dataGroupInfo.dataGroupId = groudId;
8410 dataGroupInfo.userId = userId;
8411 dataGroupInfo.uuid = dataGroupInfoIter->second[0].uuid;
8412 int32_t uid = userId * Constants::BASE_USER_RANGE + groupIndexIter->second + DATA_GROUP_UID_OFFSET;
8413 dataGroupInfo.uid = uid;
8414 dataGroupInfo.gid = uid;
8415 bundleInfoIter->second.AddDataGroupInfo(groudId, dataGroupInfo);
8416 }
8417 }
8418 if (!dataStorage_->SaveStorageBundleInfo(bundleInfoIter->second)) {
8419 APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", item.first.c_str());
8420 ret = false;
8421 }
8422 }
8423 return ret;
8424 }
8425
8426 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)8427 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
8428 {
8429 InnerBundleInfo targetInnerBundleInfo;
8430 std::string targetBundleName = newInfo.GetTargetBundleName();
8431 auto targetInfoItem = bundleInfos_.find(targetBundleName);
8432 if (targetInfoItem != bundleInfos_.end()) {
8433 targetInnerBundleInfo = targetInfoItem->second;
8434 }
8435
8436 if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
8437 APP_LOGW("update overlay info failed");
8438 return false;
8439 }
8440 // storage target bundle info
8441 if (!targetInnerBundleInfo.GetBundleName().empty() &&
8442 dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8443 bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
8444 }
8445 // build overlay connection for external overlay
8446 if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8447 const auto &moduleInfos = newInfo.GetInnerModuleInfos();
8448 std::string moduleName = (moduleInfos.begin()->second).moduleName;
8449 BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
8450 }
8451 return true;
8452 }
8453
ResetExternalOverlayModuleState(const std::string & bundleName,const std::string & modulePackage)8454 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
8455 {
8456 for (auto &info : bundleInfos_) {
8457 if (info.second.GetTargetBundleName() != bundleName) {
8458 continue;
8459 }
8460 const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8461 for (const auto &moduleInfo : innerModuleInfos) {
8462 if (moduleInfo.second.targetModuleName == modulePackage) {
8463 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8464 break;
8465 }
8466 }
8467 if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
8468 APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
8469 }
8470 }
8471 }
8472
BuildExternalOverlayConnection(const std::string & moduleName,InnerBundleInfo & oldInfo,int32_t userId)8473 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
8474 int32_t userId)
8475 {
8476 APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
8477 moduleName.c_str(), userId);
8478 for (auto &info : bundleInfos_) {
8479 if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
8480 continue;
8481 }
8482 // check target bundle is preInstall application
8483 if (!oldInfo.IsPreInstallApp()) {
8484 APP_LOGW("target bundle is not preInstall application");
8485 return;
8486 }
8487
8488 // check fingerprint of current bundle with target bundle
8489 if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
8490 APP_LOGW("target bundle has different fingerprint with current bundle");
8491 return;
8492 }
8493 // external overlay does not support FA model
8494 if (!oldInfo.GetIsNewVersion()) {
8495 APP_LOGW("target bundle is not stage model");
8496 return;
8497 }
8498 // external overlay does not support service
8499 if (oldInfo.GetEntryInstallationFree()) {
8500 APP_LOGW("target bundle is service");
8501 return;
8502 }
8503
8504 const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8505 std::vector<std::string> overlayModuleVec;
8506 for (const auto &moduleInfo : innerModuleInfos) {
8507 if (moduleInfo.second.targetModuleName != moduleName) {
8508 continue;
8509 }
8510 OverlayModuleInfo overlayModuleInfo;
8511 overlayModuleInfo.bundleName = info.second.GetBundleName();
8512 overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
8513 overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
8514 overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
8515 overlayModuleInfo.priority = moduleInfo.second.targetPriority;
8516 oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
8517 overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
8518 }
8519 std::string bundleDir;
8520 const std::string &moduleHapPath =
8521 info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
8522 OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
8523 OverlayBundleInfo overlayBundleInfo;
8524 overlayBundleInfo.bundleName = info.second.GetBundleName();
8525 overlayBundleInfo.bundleDir = bundleDir;
8526 overlayBundleInfo.state = info.second.GetOverlayState();
8527 overlayBundleInfo.priority = info.second.GetTargetPriority();
8528 oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
8529 auto userSet = GetAllUser();
8530 for (const auto &innerUserId : userSet) {
8531 for (const auto &overlayModule : overlayModuleVec) {
8532 int32_t state = OverlayState::OVERLAY_INVALID;
8533 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
8534 if (state == OverlayState::OVERLAY_INVALID) {
8535 info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
8536 }
8537 }
8538 }
8539 }
8540 }
8541
RemoveOverlayInfoAndConnection(const InnerBundleInfo & innerBundleInfo,const std::string & bundleName)8542 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
8543 const std::string &bundleName)
8544 {
8545 if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
8546 std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
8547 auto targetInfoItem = bundleInfos_.find(targetBundleName);
8548 if (targetInfoItem == bundleInfos_.end()) {
8549 APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
8550 } else {
8551 InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
8552 OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
8553 if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8554 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
8555 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
8556 }
8557 }
8558 }
8559
8560 if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8561 for (auto &info : bundleInfos_) {
8562 if (info.second.GetTargetBundleName() != bundleName) {
8563 continue;
8564 }
8565 const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8566 for (const auto &moduleInfo : innerModuleInfos) {
8567 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8568 }
8569 dataStorage_->SaveStorageBundleInfo(info.second);
8570 }
8571 }
8572 }
8573 #endif
8574
GetOldAppIds(const std::string & bundleName,std::vector<std::string> & appIds) const8575 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
8576 {
8577 if (bundleName.empty()) {
8578 APP_LOGE("bundleName is empty");
8579 return false;
8580 }
8581 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8582 auto innerBundleInfo = bundleInfos_.find(bundleName);
8583 if (innerBundleInfo == bundleInfos_.end()) {
8584 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8585 return false;
8586 }
8587 appIds = innerBundleInfo->second.GetOldAppIds();
8588 return true;
8589 }
8590
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo & oldInfo,const InnerBundleInfo & newInfo) const8591 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
8592 const InnerBundleInfo &newInfo) const
8593 {
8594 return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
8595 !oldInfo.HasEntry() || newInfo.HasEntry() ||
8596 (oldInfo.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE &&
8597 oldInfo.GetVersionCode() < newInfo.GetVersionCode());
8598 }
8599
GetModuleNameByBundleAndAbility(const std::string & bundleName,const std::string & abilityName)8600 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
8601 const std::string& bundleName, const std::string& abilityName)
8602 {
8603 if (bundleName.empty() || abilityName.empty()) {
8604 APP_LOGE("bundleName or abilityName is empty");
8605 return std::string();
8606 }
8607 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8608 auto innerBundleInfo = bundleInfos_.find(bundleName);
8609 if (innerBundleInfo == bundleInfos_.end()) {
8610 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8611 return std::string();
8612 }
8613 auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
8614 if (!abilityInfo) {
8615 APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
8616 bundleName.c_str(), abilityName.c_str());
8617 return std::string();
8618 }
8619 return abilityInfo->moduleName;
8620 }
8621
SetAdditionalInfo(const std::string & bundleName,const std::string & additionalInfo) const8622 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
8623 {
8624 APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
8625 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8626 auto infoItem = bundleInfos_.find(bundleName);
8627 if (infoItem == bundleInfos_.end()) {
8628 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8629 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8630 }
8631
8632 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8633 int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8634 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8635 if (responseUserId == Constants::INVALID_USERID) {
8636 APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
8637 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8638 }
8639 }
8640
8641 auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
8642 if (appProvisionInfoManager == nullptr) {
8643 APP_LOGE("Failed, appProvisionInfoManager is nullptr");
8644 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8645 }
8646
8647 if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
8648 APP_LOGE("BundleName: %{public}s set additional info failed", bundleName.c_str());
8649 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8650 }
8651
8652 ElementName element;
8653 element.SetBundleName(bundleName);
8654 OHOS::AAFwk::Want want;
8655 want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
8656 want.SetElement(element);
8657 EventFwk::CommonEventData commonData { want };
8658 NotifyBundleEventCallback(commonData);
8659 return ERR_OK;
8660 }
8661
GetAppServiceHspBundleInfo(const std::string & bundleName,BundleInfo & bundleInfo)8662 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
8663 {
8664 APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
8665 if (bundleName.empty()) {
8666 APP_LOGE("bundleName is empty");
8667 return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
8668 }
8669
8670 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8671 auto infoItem = bundleInfos_.find(bundleName);
8672 if (infoItem == bundleInfos_.end()) {
8673 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8674 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8675 }
8676 const InnerBundleInfo &innerBundleInfo = infoItem->second;
8677 auto res = innerBundleInfo.GetAppServiceHspInfo(bundleInfo);
8678 if (res != ERR_OK) {
8679 APP_LOGW("get hspInfo %{public}s fail", bundleName.c_str());
8680 return res;
8681 }
8682 return ERR_OK;
8683 }
8684
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo & innerBundleInfo,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos) const8685 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
8686 std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
8687 {
8688 APP_LOGD("start");
8689 BundleInfo bundleInfo;
8690 if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
8691 APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
8692 for (const auto &hapModule : bundleInfo.hapModuleInfos) {
8693 BaseSharedBundleInfo baseSharedBundleInfo;
8694 baseSharedBundleInfo.bundleName = bundleInfo.name;
8695 baseSharedBundleInfo.moduleName = hapModule.moduleName;
8696 baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
8697 baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
8698 baseSharedBundleInfo.hapPath = hapModule.hapPath;
8699 baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
8700 baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
8701 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
8702 }
8703 return;
8704 }
8705 APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
8706 }
8707
AddAppHspBundleName(const BundleType type,const std::string & bundleName)8708 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
8709 {
8710 if (type == BundleType::APP_SERVICE_FWK) {
8711 APP_LOGD("add app hsp bundleName:%{public}s", bundleName.c_str());
8712 std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
8713 appServiceHspBundleName_.insert(bundleName);
8714 }
8715 }
8716
CreateBundleDataDir(int32_t userId)8717 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId)
8718 {
8719 APP_LOGI("with -u %{public}d begin", userId);
8720 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8721 std::vector<CreateDirParam> createDirParams;
8722 std::vector<CreateDirParam> el5Params;
8723 for (const auto &item : bundleInfos_) {
8724 const InnerBundleInfo &info = item.second;
8725 int32_t responseUserId = info.GetResponseUserId(userId);
8726 if (responseUserId == Constants::INVALID_USERID) {
8727 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
8728 info.GetBundleName().c_str(), userId);
8729 continue;
8730 }
8731 CreateDirParam createDirParam;
8732 createDirParam.bundleName = info.GetBundleName();
8733 createDirParam.userId = responseUserId;
8734 createDirParam.uid = info.GetUid(responseUserId);
8735 createDirParam.gid = info.GetGid(responseUserId);
8736 createDirParam.apl = info.GetAppPrivilegeLevel();
8737 createDirParam.isPreInstallApp = info.IsPreInstallApp();
8738 createDirParam.debug = info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
8739 createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
8740 createDirParam.extensionDirs = info.GetAllExtensionDirs();
8741 createDirParams.emplace_back(createDirParam);
8742
8743 std::vector<RequestPermission> reqPermissions = info.GetAllRequestPermissions();
8744 auto it = std::find_if(reqPermissions.begin(), reqPermissions.end(), [](const RequestPermission& permission) {
8745 return permission.name == ServiceConstants::PERMISSION_PROTECT_SCREEN_LOCK_DATA;
8746 });
8747 if (it != reqPermissions.end()) {
8748 el5Params.emplace_back(createDirParam);
8749 }
8750 CreateAppGroupDir(info, responseUserId);
8751 }
8752 lock.unlock();
8753 APP_LOGI("begin create dirs");
8754 auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
8755 APP_LOGI("end, res %{public}d", res);
8756 CreateEl5Dir(el5Params, true);
8757 return res;
8758 }
8759
CreateBundleDataDirWithEl(int32_t userId,DataDirEl dirEl)8760 ErrCode BundleDataMgr::CreateBundleDataDirWithEl(int32_t userId, DataDirEl dirEl)
8761 {
8762 APP_LOGI("with -u %{public}d -el %{public}d begin", userId, static_cast<uint8_t>(dirEl));
8763 std::vector<CreateDirParam> createDirParams;
8764 {
8765 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8766 for (const auto &item : bundleInfos_) {
8767 const InnerBundleInfo &info = item.second;
8768 if (!info.HasInnerBundleUserInfo(userId)) {
8769 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
8770 info.GetBundleName().c_str(), userId);
8771 continue;
8772 }
8773 if (dirEl == DataDirEl::EL5 && !info.NeedCreateEl5Dir()) {
8774 continue;
8775 }
8776 CreateDirParam createDirParam;
8777 createDirParam.bundleName = info.GetBundleName();
8778 createDirParam.userId = userId;
8779 createDirParam.uid = info.GetUid(userId);
8780 createDirParam.gid = info.GetGid(userId);
8781 createDirParam.apl = info.GetAppPrivilegeLevel();
8782 createDirParam.isPreInstallApp = info.IsPreInstallApp();
8783 createDirParam.debug =
8784 info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
8785 createDirParam.extensionDirs = info.GetAllExtensionDirs();
8786 createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
8787 createDirParam.dataDirEl = dirEl;
8788 createDirParams.emplace_back(createDirParam);
8789 CreateAppGroupDir(info, userId);
8790 }
8791 }
8792 ErrCode res = ERR_OK;
8793 if (dirEl != DataDirEl::EL5) {
8794 res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
8795 } else {
8796 CreateEl5Dir(createDirParams, true);
8797 }
8798 APP_LOGI("with -u %{public}d -el %{public}d end", userId, static_cast<uint8_t>(dirEl));
8799 return res;
8800 }
8801
CreateEl5Dir(const std::vector<CreateDirParam> & el5Params,bool needSaveStorage)8802 void BundleDataMgr::CreateEl5Dir(const std::vector<CreateDirParam> &el5Params, bool needSaveStorage)
8803 {
8804 for (const auto &el5Param : el5Params) {
8805 APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
8806 el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
8807 InnerCreateEl5Dir(el5Param);
8808 SetEl5DirPolicy(el5Param, needSaveStorage);
8809 }
8810 }
8811
CreateEl5DirNoCache(const std::vector<CreateDirParam> & el5Params,InnerBundleInfo & info)8812 void BundleDataMgr::CreateEl5DirNoCache(const std::vector<CreateDirParam> &el5Params, InnerBundleInfo &info)
8813 {
8814 for (const auto &el5Param : el5Params) {
8815 APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
8816 el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
8817 InnerCreateEl5Dir(el5Param);
8818 SetEl5DirPolicy(el5Param, info);
8819 }
8820 }
8821
GetUidByBundleName(const std::string & bundleName,int32_t userId,int32_t appIndex) const8822 int32_t BundleDataMgr::GetUidByBundleName(const std::string &bundleName, int32_t userId, int32_t appIndex) const
8823 {
8824 if (bundleName.empty()) {
8825 APP_LOGW("bundleName is empty");
8826 return Constants::INVALID_UID;
8827 }
8828
8829 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8830 auto infoItem = bundleInfos_.find(bundleName);
8831 if (infoItem == bundleInfos_.end()) {
8832 APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
8833 return Constants::INVALID_UID;
8834 }
8835 const InnerBundleInfo &innerBundleInfo = infoItem->second;
8836 if (userId == Constants::UNSPECIFIED_USERID) {
8837 userId = GetUserIdByCallingUid();
8838 }
8839 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8840 return innerBundleInfo.GetUid(responseUserId, appIndex);
8841 }
8842
InnerCreateEl5Dir(const CreateDirParam & el5Param)8843 void BundleDataMgr::InnerCreateEl5Dir(const CreateDirParam &el5Param)
8844 {
8845 std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
8846 ServiceConstants::PATH_SEPARATOR + std::to_string(el5Param.userId);
8847 if (!BundleUtil::IsExistDir(parentDir)) {
8848 APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
8849 return;
8850 }
8851 std::vector<std::string> dirs;
8852 std::string bundleNameDir = el5Param.bundleName;
8853 if (el5Param.appIndex > 0) {
8854 bundleNameDir = BundleCloneCommonHelper::GetCloneDataDir(el5Param.bundleName, el5Param.appIndex);
8855 }
8856 dirs.emplace_back(parentDir + ServiceConstants::BASE + bundleNameDir);
8857 dirs.emplace_back(parentDir + ServiceConstants::DATABASE + bundleNameDir);
8858 for (const std::string &dir : dirs) {
8859 uint32_t mode = S_IRWXU;
8860 int32_t gid = el5Param.uid;
8861 if (dir.find(ServiceConstants::DATABASE) != std::string::npos) {
8862 mode = S_IRWXU | S_IRWXG | S_ISGID;
8863 gid = ServiceConstants::DATABASE_DIR_GID;
8864 }
8865 if (InstalldClient::GetInstance()->Mkdir(dir, mode, el5Param.uid, gid) != ERR_OK) {
8866 LOG_W(BMS_TAG_INSTALLER, "create el5 dir %{public}s failed", dir.c_str());
8867 }
8868 ErrCode result = InstalldClient::GetInstance()->SetDirApl(
8869 dir, el5Param.bundleName, el5Param.apl, el5Param.isPreInstallApp, el5Param.debug);
8870 if (result != ERR_OK) {
8871 LOG_W(BMS_TAG_INSTALLER, "fail to SetDirApl dir %{public}s, error is %{public}d", dir.c_str(), result);
8872 }
8873 }
8874 }
8875
SetEl5DirPolicy(const CreateDirParam & el5Param,bool needSaveStorage)8876 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, bool needSaveStorage)
8877 {
8878 InnerBundleInfo info;
8879 if (!FetchInnerBundleInfo(el5Param.bundleName, info)) {
8880 LOG_E(BMS_TAG_INSTALLER, "get bundle %{public}s failed", el5Param.bundleName.c_str());
8881 return;
8882 }
8883 SetEl5DirPolicy(el5Param, info);
8884 if (!UpdateInnerBundleInfo(info, needSaveStorage)) {
8885 LOG_E(BMS_TAG_INSTALLER, "save keyId failed");
8886 }
8887 }
8888
SetEl5DirPolicy(const CreateDirParam & el5Param,InnerBundleInfo & info)8889 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, InnerBundleInfo &info)
8890 {
8891 int32_t uid = el5Param.uid;
8892 std::string bundleName = info.GetBundleName();
8893 std::string keyId = "";
8894 if (el5Param.appIndex > 0) {
8895 bundleName = BundleCloneCommonHelper::GetCloneDataDir(bundleName, el5Param.appIndex);
8896 }
8897 EncryptionParam encryptionParam(bundleName, "", uid, el5Param.userId, EncryptionDirType::APP);
8898 auto result = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
8899 if (result != ERR_OK) {
8900 LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
8901 }
8902 LOG_D(BMS_TAG_INSTALLER, "%{public}s, keyId: %{public}s", bundleName.c_str(), keyId.c_str());
8903 info.SetkeyId(el5Param.userId, keyId, el5Param.appIndex);
8904 }
8905
CanOpenLink(const std::string & link,bool & canOpen) const8906 ErrCode BundleDataMgr::CanOpenLink(
8907 const std::string &link, bool &canOpen) const
8908 {
8909 APP_LOGI("link: %{public}s", link.c_str());
8910 auto uid = IPCSkeleton::GetCallingUid();
8911 InnerBundleInfo innerBundleInfo;
8912 if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
8913 APP_LOGE("get innerBundleInfo by uid :%{public}d failed", uid);
8914 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8915 }
8916 auto querySchemes = innerBundleInfo.GetQuerySchemes();
8917 if (querySchemes.empty()) {
8918 APP_LOGI("querySchemes is empty");
8919 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8920 }
8921
8922 size_t pos = link.find(SCHEME_END);
8923 if (pos == std::string::npos) {
8924 APP_LOGE("parse link : %{public}s failed", link.c_str());
8925 return ERR_BUNDLE_MANAGER_INVALID_SCHEME;
8926 }
8927 std::string scheme = link.substr(0, pos);
8928 transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
8929 if (std::find(querySchemes.begin(), querySchemes.end(), scheme) == querySchemes.end()) {
8930 APP_LOGI("scheme :%{public}s is not in the querySchemes", scheme.c_str());
8931 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8932 }
8933
8934 Want want;
8935 want.SetUri(link);
8936 std::vector<AbilityInfo> abilityInfos;
8937 // implicit query
8938 ErrCode ret = ImplicitQueryAbilityInfosV9(
8939 want, static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), GetUserIdByUid(uid), abilityInfos);
8940 if (ret != ERR_OK) {
8941 APP_LOGD("implicit queryAbilityInfosV9 error");
8942 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8943 }
8944
8945 canOpen = !abilityInfos.empty();
8946 APP_LOGI("canOpen : %{public}d", canOpen);
8947 return ERR_OK;
8948 }
8949
GenerateOdid(const std::string & developerId,std::string & odid) const8950 void BundleDataMgr::GenerateOdid(const std::string &developerId, std::string &odid) const
8951 {
8952 APP_LOGD("start, developerId:%{public}s", developerId.c_str());
8953 if (developerId.empty()) {
8954 APP_LOGE("developerId is empty");
8955 return;
8956 }
8957 std::string groupId = BundleUtil::ExtractGroupIdByDevelopId(developerId);
8958 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8959 for (const auto &item : bundleInfos_) {
8960 std::string developerIdExist;
8961 std::string odidExist;
8962 item.second.GetDeveloperidAndOdid(developerIdExist, odidExist);
8963 std::string groupIdExist = BundleUtil::ExtractGroupIdByDevelopId(developerIdExist);
8964 if (groupId == groupIdExist) {
8965 odid = odidExist;
8966 return;
8967 }
8968 }
8969 odid = BundleUtil::GenerateUuid();
8970 APP_LOGI_NOFUNC("developerId:%{public}s not existed generate odid %{private}s",
8971 developerId.c_str(), odid.c_str());
8972 }
8973
GetOdid(std::string & odid) const8974 ErrCode BundleDataMgr::GetOdid(std::string &odid) const
8975 {
8976 int32_t callingUid = IPCSkeleton::GetCallingUid();
8977 InnerBundleInfo innerBundleInfo;
8978 if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8979 if (sandboxAppHelper_ == nullptr) {
8980 APP_LOGE("sandboxAppHelper_ is nullptr");
8981 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8982 }
8983 if (sandboxAppHelper_->GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8984 APP_LOGW("app that corresponds to the callingUid %{public}d could not be found", callingUid);
8985 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8986 }
8987 }
8988 std::string developerId;
8989 innerBundleInfo.GetDeveloperidAndOdid(developerId, odid);
8990 return ERR_OK;
8991 }
8992
GetOdidByBundleName(const std::string & bundleName,std::string & odid) const8993 ErrCode BundleDataMgr::GetOdidByBundleName(const std::string &bundleName, std::string &odid) const
8994 {
8995 APP_LOGI_NOFUNC("start GetOdidByBundleName -n %{public}s", bundleName.c_str());
8996 InnerBundleInfo innerBundleInfo;
8997 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8998 const auto &item = bundleInfos_.find(bundleName);
8999 if (item == bundleInfos_.end()) {
9000 APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
9001 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9002 }
9003 const InnerBundleInfo &bundleInfo = item->second;
9004 bundleInfo.GetOdid(odid);
9005 return ERR_OK;
9006 }
9007
HandleOTACodeEncryption()9008 void BundleDataMgr::HandleOTACodeEncryption()
9009 {
9010 int32_t timerId =
9011 XCollieHelper::SetRecoveryTimer(FUNCATION_HANDLE_OTA_CODE_ENCRYPTION, OTA_CODE_ENCRYPTION_TIMEOUT);
9012 ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
9013 APP_LOGI("begin");
9014 std::vector<std::string> withoutKeyBundles;
9015 std::vector<std::string> withKeyBundles;
9016 {
9017 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9018 for (const auto &item : bundleInfos_) {
9019 item.second.HandleOTACodeEncryption(withoutKeyBundles, withKeyBundles);
9020 }
9021 }
9022 for (const std::string &bundleName : withKeyBundles) {
9023 UpdateAppEncryptedStatus(bundleName, true, 0, true);
9024 }
9025 for (const std::string &bundleName : withoutKeyBundles) {
9026 UpdateAppEncryptedStatus(bundleName, false, 0, true);
9027 }
9028 APP_LOGI("end");
9029 }
9030
ProcessAllowedAcls(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo) const9031 void BundleDataMgr::ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const
9032 {
9033 if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
9034 oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
9035 return;
9036 }
9037 oldInfo.AddAllowedAcls(newInfo.GetAllowedAcls());
9038 }
9039
GetAllBundleInfoByDeveloperId(const std::string & developerId,std::vector<BundleInfo> & bundleInfos,int32_t userId)9040 ErrCode BundleDataMgr::GetAllBundleInfoByDeveloperId(const std::string &developerId,
9041 std::vector<BundleInfo> &bundleInfos, int32_t userId)
9042 {
9043 int32_t requestUserId = GetUserId(userId);
9044 APP_LOGI("requestUserId: %{public}d", requestUserId);
9045 if (requestUserId == Constants::INVALID_USERID) {
9046 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9047 }
9048
9049 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9050 if (bundleInfos_.empty()) {
9051 APP_LOGW("bundleInfos_ data is empty");
9052 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9053 }
9054 for (const auto &item : bundleInfos_) {
9055 const InnerBundleInfo &innerBundleInfo = item.second;
9056 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9057 innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9058 APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9059 innerBundleInfo.GetBundleName().c_str());
9060 continue;
9061 }
9062
9063 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9064 auto flag = GET_BASIC_APPLICATION_INFO;
9065 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9066 continue;
9067 }
9068 // check developerId
9069 std::string developerIdExist;
9070 std::string odidExist;
9071 innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9072 if (developerIdExist != developerId) {
9073 continue;
9074 }
9075
9076 BundleInfo bundleInfo;
9077
9078 if (innerBundleInfo.GetBundleInfoV9(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION),
9079 bundleInfo, responseUserId) != ERR_OK) {
9080 continue;
9081 }
9082 bundleInfos.emplace_back(bundleInfo);
9083 }
9084 if (bundleInfos.empty()) {
9085 APP_LOGW("bundleInfos is empty");
9086 return ERR_BUNDLE_MANAGER_INVALID_DEVELOPERID;
9087 }
9088 APP_LOGI("have %{public}d applications, their developerId is %{public}s", requestUserId, developerId.c_str());
9089 return ERR_OK;
9090 }
9091
GetDeveloperIds(const std::string & appDistributionType,std::vector<std::string> & developerIdList,int32_t userId)9092 ErrCode BundleDataMgr::GetDeveloperIds(const std::string &appDistributionType,
9093 std::vector<std::string> &developerIdList, int32_t userId)
9094 {
9095 int32_t requestUserId = GetUserId(userId);
9096 APP_LOGI("requestUserId: %{public}d", requestUserId);
9097 if (requestUserId == Constants::INVALID_USERID) {
9098 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9099 }
9100
9101 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9102 if (bundleInfos_.empty()) {
9103 APP_LOGW("bundleInfos_ data is empty");
9104 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9105 }
9106 std::set<std::string> developerIdSet;
9107 for (const auto &item : bundleInfos_) {
9108 const InnerBundleInfo &innerBundleInfo = item.second;
9109 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9110 innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9111 APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9112 innerBundleInfo.GetBundleName().c_str());
9113 continue;
9114 }
9115
9116 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9117 auto flag = GET_BASIC_APPLICATION_INFO;
9118 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9119 continue;
9120 }
9121 // check appDistributionType
9122 if (!appDistributionType.empty() && innerBundleInfo.GetAppDistributionType() != appDistributionType) {
9123 continue;
9124 }
9125
9126 std::string developerIdExist;
9127 std::string odidExist;
9128 innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9129 developerIdSet.emplace(developerIdExist);
9130 }
9131 for (const std::string &developerId : developerIdSet) {
9132 developerIdList.emplace_back(developerId);
9133 }
9134 APP_LOGI("have %{public}d developers, their appDistributionType is %{public}s",
9135 static_cast<int32_t>(developerIdList.size()), appDistributionType.c_str());
9136 return ERR_OK;
9137 }
9138
SwitchUninstallState(const std::string & bundleName,const bool & state,const bool isNeedSendNotify,bool & stateChange)9139 ErrCode BundleDataMgr::SwitchUninstallState(const std::string &bundleName, const bool &state,
9140 const bool isNeedSendNotify, bool &stateChange)
9141 {
9142 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9143 auto infoItem = bundleInfos_.find(bundleName);
9144 if (infoItem == bundleInfos_.end()) {
9145 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9146 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9147 }
9148 InnerBundleInfo &innerBundleInfo = infoItem->second;
9149 if (!innerBundleInfo.IsRemovable() && state) {
9150 APP_LOGW("the bundle : %{public}s is not removable", bundleName.c_str());
9151 return ERR_BUNDLE_MANAGER_BUNDLE_CAN_NOT_BE_UNINSTALLED;
9152 }
9153 if (innerBundleInfo.GetUninstallState() == state) {
9154 stateChange = false;
9155 return ERR_OK;
9156 }
9157 innerBundleInfo.SetUninstallState(state);
9158 innerBundleInfo.SetNeedSendNotify(isNeedSendNotify);
9159 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9160 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9161 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9162 }
9163 stateChange = true;
9164 return ERR_OK;
9165 }
9166
AddCloneBundle(const std::string & bundleName,const InnerBundleCloneInfo & attr)9167 ErrCode BundleDataMgr::AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)
9168 {
9169 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9170 auto infoItem = bundleInfos_.find(bundleName);
9171 if (infoItem == bundleInfos_.end()) {
9172 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9173 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9174 }
9175 InnerBundleInfo &innerBundleInfo = infoItem->second;
9176 ErrCode res = innerBundleInfo.AddCloneBundle(attr);
9177 if (res != ERR_OK) {
9178 APP_LOGE("innerBundleInfo addCloneBundleInfo fail");
9179 return res;
9180 }
9181 APP_LOGD("update bundle info in memory for add clone, userId: %{public}d, appIndex: %{public}d",
9182 attr.userId, attr.appIndex);
9183 auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9184 innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9185 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9186 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9187 innerBundleInfo.RemoveCloneBundle(attr.userId, attr.appIndex);
9188 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9189 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9190 }
9191 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9192 APP_LOGD("update bundle info in storage for add clone, userId: %{public}d, appIndex: %{public}d",
9193 attr.userId, attr.appIndex);
9194 return ERR_OK;
9195 }
9196
FilterAbilityInfosByAppLinking(const Want & want,int32_t flags,std::vector<AbilityInfo> & abilityInfos) const9197 void BundleDataMgr::FilterAbilityInfosByAppLinking(const Want &want, int32_t flags,
9198 std::vector<AbilityInfo> &abilityInfos) const
9199 {
9200 #ifdef APP_DOMAIN_VERIFY_ENABLED
9201 APP_LOGD("FilterAbility start");
9202 if (abilityInfos.empty()) {
9203 APP_LOGD("abilityInfos is empty");
9204 return;
9205 }
9206 if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
9207 APP_LOGD("scheme is not https");
9208 if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9209 APP_LOGI("using app linking flag and scheme is not https, return empty list");
9210 abilityInfos.clear();
9211 }
9212 return;
9213 }
9214 std::vector<AbilityInfo> filteredAbilityInfos;
9215 // call FiltedAbilityInfos
9216 APP_LOGI("call FilterAbilities");
9217 std::string identity = IPCSkeleton::ResetCallingIdentity();
9218 if (!DelayedSingleton<AppDomainVerify::AppDomainVerifyMgrClient>::GetInstance()->FilterAbilities(
9219 want, abilityInfos, filteredAbilityInfos)) {
9220 APP_LOGE("FilterAbilities failed");
9221 }
9222 IPCSkeleton::SetCallingIdentity(identity);
9223 if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9224 APP_LOGD("return filteredAbilityInfos");
9225 abilityInfos = filteredAbilityInfos;
9226 for (auto &abilityInfo : abilityInfos) {
9227 abilityInfo.linkType = LinkType::APP_LINK;
9228 }
9229 return;
9230 }
9231 for (auto &filteredAbilityInfo : filteredAbilityInfos) {
9232 for (auto &abilityInfo : abilityInfos) {
9233 if (filteredAbilityInfo.bundleName == abilityInfo.bundleName &&
9234 filteredAbilityInfo.name == abilityInfo.name) {
9235 abilityInfo.linkType = LinkType::APP_LINK;
9236 break;
9237 }
9238 }
9239 }
9240 return;
9241 #else
9242 APP_LOGI("AppDomainVerify is not enabled");
9243 if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9244 APP_LOGI("has flag and return empty list");
9245 abilityInfos.clear();
9246 }
9247 return;
9248 #endif
9249 }
9250
HasAppLinkingFlag(uint32_t flags)9251 bool BundleDataMgr::HasAppLinkingFlag(uint32_t flags)
9252 {
9253 return (flags & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
9254 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING);
9255 }
9256
RemoveCloneBundle(const std::string & bundleName,const int32_t userId,int32_t appIndex)9257 ErrCode BundleDataMgr::RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)
9258 {
9259 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9260 auto infoItem = bundleInfos_.find(bundleName);
9261 if (infoItem == bundleInfos_.end()) {
9262 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9263 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9264 }
9265 InnerBundleInfo &innerBundleInfo = infoItem->second;
9266 ErrCode res = innerBundleInfo.RemoveCloneBundle(userId, appIndex);
9267 if (res != ERR_OK) {
9268 APP_LOGE("innerBundleInfo RemoveCloneBundle fail");
9269 return res;
9270 }
9271 auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9272 innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9273 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9274 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9275 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9276 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9277 }
9278 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9279 DeleteDesktopShortcutInfo(bundleName, userId, appIndex);
9280 return ERR_OK;
9281 }
9282
QueryAbilityInfoByContinueType(const std::string & bundleName,const std::string & continueType,AbilityInfo & abilityInfo,int32_t userId,int32_t appIndex) const9283 ErrCode BundleDataMgr::QueryAbilityInfoByContinueType(const std::string &bundleName,
9284 const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const
9285 {
9286 int32_t requestUserId = GetUserId(userId);
9287 APP_LOGI("requestUserId: %{public}d", requestUserId);
9288 if (requestUserId == Constants::INVALID_USERID) {
9289 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9290 }
9291
9292 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9293 if (bundleInfos_.empty()) {
9294 APP_LOGW("bundleInfos_ data is empty");
9295 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9296 }
9297 InnerBundleInfo innerBundleInfo;
9298 if (appIndex == 0) {
9299 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, 0, innerBundleInfo, requestUserId);
9300 if (ret != ERR_OK) {
9301 APP_LOGD("QueryAbilityInfoByContinueType failed, bundleName:%{public}s", bundleName.c_str());
9302 return ret;
9303 }
9304 }
9305 if (appIndex > 0) {
9306 if (sandboxAppHelper_ == nullptr) {
9307 APP_LOGW("sandboxAppHelper_ is nullptr");
9308 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9309 }
9310 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
9311 if (ret != ERR_OK) {
9312 APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
9313 ret, bundleName.c_str());
9314 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9315 }
9316 }
9317 auto ability = innerBundleInfo.FindAbilityInfo(continueType, requestUserId);
9318 if (!ability) {
9319 APP_LOGW("ability not found, bundleName:%{public}s, coutinueType:%{public}s",
9320 bundleName.c_str(), continueType.c_str());
9321 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9322 }
9323 abilityInfo = (*ability);
9324 InnerBundleUserInfo innerBundleUserInfo;
9325 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
9326 abilityInfo.uid = innerBundleUserInfo.uid;
9327 }
9328 return ERR_OK;
9329 }
9330
QueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9331 ErrCode BundleDataMgr::QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9332 int32_t appIndex, AbilityInfo &abilityInfo) const
9333 {
9334 std::string bundleName = element.GetBundleName();
9335 std::string abilityName = element.GetAbilityName();
9336 std::string moduleName = element.GetModuleName();
9337 LOG_D(BMS_TAG_QUERY,
9338 "QueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9339 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9340 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9341 int32_t requestUserId = GetUserId(userId);
9342 if (requestUserId == Constants::INVALID_USERID) {
9343 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9344 }
9345
9346 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9347 InnerBundleInfo innerBundleInfo;
9348
9349 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9350 if (ret != ERR_OK) {
9351 LOG_D(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9352 return ret;
9353 }
9354
9355 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9356 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9357 if (!ability) {
9358 LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9359 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9360 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9361 }
9362 return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9363 }
9364
ExplicitQueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9365 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9366 int32_t appIndex, AbilityInfo &abilityInfo) const
9367 {
9368 std::string bundleName = element.GetBundleName();
9369 std::string abilityName = element.GetAbilityName();
9370 std::string moduleName = element.GetModuleName();
9371 LOG_D(BMS_TAG_QUERY,
9372 "ExplicitQueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9373 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9374 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9375 int32_t requestUserId = GetUserId(userId);
9376 if (requestUserId == Constants::INVALID_USERID) {
9377 return false;
9378 }
9379 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9380 InnerBundleInfo innerBundleInfo;
9381
9382 bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9383 if (!ret) {
9384 LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9385 return false;
9386 }
9387
9388 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9389 auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
9390 if (!ability) {
9391 LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9392 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9393 return false;
9394 }
9395 return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9396 }
9397
ExplicitQueryCloneAbilityInfoV9(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9398 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId,
9399 int32_t appIndex, AbilityInfo &abilityInfo) const
9400 {
9401 std::string bundleName = element.GetBundleName();
9402 std::string abilityName = element.GetAbilityName();
9403 std::string moduleName = element.GetModuleName();
9404 LOG_D(BMS_TAG_QUERY,
9405 "ExplicitQueryCloneAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9406 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9407 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9408 int32_t requestUserId = GetUserId(userId);
9409 if (requestUserId == Constants::INVALID_USERID) {
9410 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9411 }
9412 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9413 InnerBundleInfo innerBundleInfo;
9414
9415 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9416 if (ret != ERR_OK) {
9417 LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
9418 return ret;
9419 }
9420
9421 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9422 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9423 if (!ability) {
9424 LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9425 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9426 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9427 }
9428 return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9429 }
9430
GetCloneBundleInfo(const std::string & bundleName,int32_t flags,int32_t appIndex,BundleInfo & bundleInfo,int32_t userId) const9431 ErrCode BundleDataMgr::GetCloneBundleInfo(
9432 const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const
9433 {
9434 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
9435 if (userId == Constants::ANY_USERID) {
9436 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
9437 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
9438 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9439 }
9440 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
9441 }
9442
9443 int32_t requestUserId = GetUserId(userId);
9444 if (requestUserId == Constants::INVALID_USERID) {
9445 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9446 }
9447 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9448 InnerBundleInfo innerBundleInfo;
9449
9450 auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9451 if (ret != ERR_OK) {
9452 LOG_D(BMS_TAG_QUERY, "GetCloneBundleInfo failed, error code: %{public}d, bundleName:%{public}s",
9453 ret, bundleName.c_str());
9454 return ret;
9455 }
9456
9457 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9458 innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
9459
9460 ProcessBundleMenu(bundleInfo, flags, true);
9461 ProcessBundleRouterMap(bundleInfo, flags);
9462 LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
9463 bundleName.c_str(), userId);
9464 return ERR_OK;
9465 }
9466
QueryAllCloneExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9467 void BundleDataMgr::QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId,
9468 std::vector<ExtensionAbilityInfo> &infos) const
9469 {
9470 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9471 int32_t requestUserId = GetUserId(userId);
9472 if (requestUserId == Constants::INVALID_USERID) {
9473 LOG_D(BMS_TAG_QUERY, "invalid user");
9474 return;
9475 }
9476
9477 ElementName element = want.GetElement();
9478 std::string bundleName = element.GetBundleName();
9479 std::string extensionName = element.GetAbilityName();
9480 LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9481 bundleName.c_str(), extensionName.c_str());
9482
9483 if (!bundleName.empty() && !extensionName.empty()) {
9484 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9485 if (cloneAppIndexes.empty()) {
9486 LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9487 return;
9488 }
9489 for (int32_t appIndex: cloneAppIndexes) {
9490 ExtensionAbilityInfo info;
9491 ErrCode ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
9492 if (ret != ERR_OK) {
9493 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9494 continue;
9495 }
9496 infos.emplace_back(info);
9497 }
9498 return;
9499 } else if (!bundleName.empty()) {
9500 ImplicitQueryCurCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9501 } else {
9502 ImplicitQueryAllCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9503 }
9504 }
9505
QueryAllCloneExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9506 void BundleDataMgr::QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
9507 std::vector<ExtensionAbilityInfo> &infos) const
9508 {
9509 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9510 int32_t requestUserId = GetUserId(userId);
9511 if (requestUserId == Constants::INVALID_USERID) {
9512 LOG_D(BMS_TAG_QUERY, "invalid user");
9513 return;
9514 }
9515
9516 ElementName element = want.GetElement();
9517 std::string bundleName = element.GetBundleName();
9518 std::string extensionName = element.GetAbilityName();
9519 LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9520 bundleName.c_str(), extensionName.c_str());
9521
9522 if (!bundleName.empty() && !extensionName.empty()) {
9523 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9524 if (cloneAppIndexes.empty()) {
9525 LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9526 return;
9527 }
9528 for (int32_t appIndex: cloneAppIndexes) {
9529 ExtensionAbilityInfo info;
9530 ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
9531 if (ret != ERR_OK) {
9532 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9533 continue;
9534 }
9535 infos.emplace_back(info);
9536 }
9537 return;
9538 } else if (!bundleName.empty()) {
9539 ImplicitQueryCurCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9540 } else {
9541 ImplicitQueryAllCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9542 }
9543 }
9544
ImplicitQueryCurCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9545 bool BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9546 std::vector<ExtensionAbilityInfo> &abilityInfos) const
9547 {
9548 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfos");
9549 std::string bundleName = want.GetElement().GetBundleName();
9550
9551 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9552 InnerBundleInfo innerBundleInfo;
9553 bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId);
9554 if (!ret) {
9555 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfos failed");
9556 return false;
9557 }
9558 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
9559 if (cloneAppIndexes.empty()) {
9560 LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfos empty");
9561 return true;
9562 }
9563 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9564 for (int32_t appIndex: cloneAppIndexes) {
9565 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9566 LOG_D(BMS_TAG_QUERY,
9567 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9568 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9569 continue;
9570 }
9571 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
9572 }
9573 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfos");
9574 return true;
9575 }
9576
ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9577 ErrCode BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
9578 std::vector<ExtensionAbilityInfo> &abilityInfos) const
9579 {
9580 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfosV9");
9581 std::string bundleName = want.GetElement().GetBundleName();
9582
9583 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9584 InnerBundleInfo innerBundleInfo;
9585 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
9586 if (ret != ERR_OK) {
9587 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfosV9 failed");
9588 return ret;
9589 }
9590 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
9591 if (cloneAppIndexes.empty()) {
9592 LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfosV9 empty");
9593 return ERR_OK;
9594 }
9595 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9596 for (int32_t appIndex: cloneAppIndexes) {
9597 if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9598 LOG_D(BMS_TAG_QUERY,
9599 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9600 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9601 continue;
9602 }
9603 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
9604 }
9605 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfosV9");
9606 return ERR_OK;
9607 }
9608
ImplicitQueryAllCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9609 bool BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9610 std::vector<ExtensionAbilityInfo> &infos) const
9611 {
9612 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9613 for (const auto &item : bundleInfos_) {
9614 const InnerBundleInfo &innerBundleInfo = item.second;
9615 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
9616 if (cloneAppIndexes.empty()) {
9617 continue;
9618 }
9619 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9620 for (int32_t appIndex: cloneAppIndexes) {
9621 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9622 LOG_D(BMS_TAG_QUERY,
9623 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9624 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9625 continue;
9626 }
9627 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9628 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
9629 }
9630 }
9631 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
9632 return true;
9633 }
9634
ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9635 ErrCode BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
9636 std::vector<ExtensionAbilityInfo> &infos) const
9637 {
9638 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9639 for (const auto &item : bundleInfos_) {
9640 const InnerBundleInfo &innerBundleInfo = item.second;
9641 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
9642 if (cloneAppIndexes.empty()) {
9643 continue;
9644 }
9645 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9646 for (int32_t appIndex: cloneAppIndexes) {
9647 if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9648 LOG_D(BMS_TAG_QUERY,
9649 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9650 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9651 continue;
9652 }
9653 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9654 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
9655 }
9656 }
9657 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
9658 return ERR_OK;
9659 }
9660
GetAppIdByBundleName(const std::string & bundleName,std::string & appId) const9661 ErrCode BundleDataMgr::GetAppIdByBundleName(
9662 const std::string &bundleName, std::string &appId) const
9663 {
9664 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
9665 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9666 auto item = bundleInfos_.find(bundleName);
9667 if (item == bundleInfos_.end()) {
9668 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9669 }
9670
9671 appId = item->second.GetBaseBundleInfo().appId;
9672 return ERR_OK;
9673 }
9674
GetSignatureInfoByBundleName(const std::string & bundleName,SignatureInfo & signatureInfo) const9675 ErrCode BundleDataMgr::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const
9676 {
9677 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9678 auto item = bundleInfos_.find(bundleName);
9679 if (item == bundleInfos_.end()) {
9680 LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
9681 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9682 }
9683 const InnerBundleInfo &innerBundleInfo = item->second;
9684 signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
9685 signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
9686 signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
9687 return ERR_OK;
9688 }
9689
GetSignatureInfoByUid(const int32_t uid,SignatureInfo & signatureInfo) const9690 ErrCode BundleDataMgr::GetSignatureInfoByUid(const int32_t uid, SignatureInfo &signatureInfo) const
9691 {
9692 InnerBundleInfo innerBundleInfo;
9693 ErrCode errCode = GetInnerBundleInfoWithSandboxByUid(uid, innerBundleInfo);
9694 if (errCode != ERR_OK) {
9695 APP_LOGE("Get innerBundleInfo failed, uid:%{public}d", uid);
9696 return errCode;
9697 }
9698 signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
9699 signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
9700 signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
9701 signatureInfo.certificate = innerBundleInfo.GetCertificate();
9702 return ERR_OK;
9703 }
9704
UpdateAppEncryptedStatus(const std::string & bundleName,bool isExisted,int32_t appIndex,bool needSaveStorage)9705 ErrCode BundleDataMgr::UpdateAppEncryptedStatus(
9706 const std::string &bundleName, bool isExisted, int32_t appIndex, bool needSaveStorage)
9707 {
9708 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9709 auto item = bundleInfos_.find(bundleName);
9710 if (item == bundleInfos_.end()) {
9711 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9712 }
9713 auto res = item->second.UpdateAppEncryptedStatus(bundleName, isExisted, appIndex);
9714 if (res != ERR_OK) {
9715 LOG_E(BMS_TAG_DEFAULT, "UpdateAppEncryptedStatus failed %{public}s %{public}d", bundleName.c_str(), res);
9716 return res;
9717 }
9718 if (dataStorage_ == nullptr) {
9719 LOG_E(BMS_TAG_DEFAULT, "dataStorage_ nullptr");
9720 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9721 }
9722 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(item->second)) {
9723 APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", bundleName.c_str());
9724 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9725 }
9726 return ERR_OK;
9727 }
9728
AddDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)9729 ErrCode BundleDataMgr::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
9730 {
9731 int32_t requestUserId = GetUserId(userId);
9732 if (requestUserId == Constants::INVALID_USERID) {
9733 APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9734 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9735 }
9736 bool isEnabled = false;
9737 ErrCode ret = IsApplicationEnabled(shortcutInfo.bundleName, shortcutInfo.appIndex, isEnabled, userId);
9738 if (ret != ERR_OK) {
9739 APP_LOGD("IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
9740 ret, shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
9741 return ret;
9742 }
9743 if (!isEnabled) {
9744 APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
9745 shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
9746 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
9747 }
9748 bool isIdIllegal = false;
9749 if (!shortcutStorage_->AddDesktopShortcutInfo(shortcutInfo, userId, isIdIllegal)) {
9750 if (isIdIllegal) {
9751 return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
9752 }
9753 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9754 }
9755 return ERR_OK;
9756 }
9757
DeleteDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)9758 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
9759 {
9760 int32_t requestUserId = GetUserId(userId);
9761 if (requestUserId == Constants::INVALID_USERID) {
9762 APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9763 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9764 }
9765 if (!shortcutStorage_->DeleteDesktopShortcutInfo(shortcutInfo, userId)) {
9766 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9767 }
9768 return ERR_OK;
9769 }
9770
GetAllDesktopShortcutInfo(int32_t userId,std::vector<ShortcutInfo> & shortcutInfos)9771 ErrCode BundleDataMgr::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
9772 {
9773 int32_t requestUserId = GetUserId(userId);
9774 if (requestUserId == Constants::INVALID_USERID) {
9775 APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9776 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9777 }
9778 std::vector<ShortcutInfo> datas;
9779 shortcutStorage_->GetAllDesktopShortcutInfo(userId, datas);
9780 for (const auto &data : datas) {
9781 bool isEnabled = false;
9782 ErrCode ret = IsApplicationEnabled(data.bundleName, data.appIndex, isEnabled, userId);
9783 if (ret != ERR_OK) {
9784 APP_LOGD(
9785 "IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
9786 ret, data.bundleName.c_str(), data.appIndex, userId);
9787 continue;
9788 }
9789 if (!isEnabled) {
9790 APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
9791 data.bundleName.c_str(), data.appIndex, userId);
9792 continue;
9793 }
9794 shortcutInfos.emplace_back(data);
9795 }
9796 return ERR_OK;
9797 }
9798
DeleteDesktopShortcutInfo(const std::string & bundleName)9799 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName)
9800 {
9801 APP_LOGD("DeleteDesktopShortcutInfo by uninstall, bundleName:%{public}s", bundleName.c_str());
9802 if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName)) {
9803 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9804 }
9805 return ERR_OK;
9806 }
9807
DeleteDesktopShortcutInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)9808 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
9809 {
9810 APP_LOGD(
9811 "DeleteDesktopShortcutInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
9812 bundleName.c_str(), userId, appIndex);
9813 if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName, userId, appIndex)) {
9814 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9815 }
9816 return ERR_OK;
9817 }
9818
GetBundleInfosForContinuation(std::vector<BundleInfo> & bundleInfos) const9819 void BundleDataMgr::GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const
9820 {
9821 if (bundleInfos.empty()) {
9822 APP_LOGD("bundleInfos is empty");
9823 return;
9824 }
9825 bundleInfos.erase(std::remove_if(bundleInfos.begin(), bundleInfos.end(), [](BundleInfo bundleInfo) {
9826 for (auto abilityInfo : bundleInfo.abilityInfos) {
9827 if (abilityInfo.continuable) {
9828 return false;
9829 }
9830 }
9831 return true;
9832 }), bundleInfos.end());
9833 }
9834
GetContinueBundleNames(const std::string & continueBundleName,std::vector<std::string> & bundleNames,int32_t userId)9835 ErrCode BundleDataMgr::GetContinueBundleNames(
9836 const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
9837 {
9838 auto requestUserId = GetUserId(userId);
9839 if (requestUserId == Constants::INVALID_USERID) {
9840 APP_LOGE("Input invalid userid, userId:%{public}d", userId);
9841 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9842 }
9843 if (continueBundleName.empty()) {
9844 return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
9845 }
9846
9847 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9848 for (const auto &[key, innerInfo] : bundleInfos_) {
9849 if (CheckInnerBundleInfoWithFlags(
9850 innerInfo, BundleFlag::GET_BUNDLE_WITH_ABILITIES, innerInfo.GetResponseUserId(requestUserId)) != ERR_OK) {
9851 continue;
9852 }
9853 for (const auto &[key, abilityInfo] : innerInfo.GetInnerAbilityInfos()) {
9854 if (abilityInfo.continueBundleNames.find(continueBundleName) != abilityInfo.continueBundleNames.end()) {
9855 bundleNames.emplace_back(abilityInfo.bundleName);
9856 break;
9857 }
9858 }
9859 }
9860
9861 APP_LOGD("The number of found continue packs, size:[%{public}d]", static_cast<int32_t>(bundleNames.size()));
9862 return ERR_OK;
9863 }
9864
IsBundleInstalled(const std::string & bundleName,int32_t userId,int32_t appIndex,bool & isInstalled)9865 ErrCode BundleDataMgr::IsBundleInstalled(const std::string &bundleName, int32_t userId,
9866 int32_t appIndex, bool &isInstalled)
9867 {
9868 int32_t requestUserId = GetUserId(userId);
9869 if (requestUserId == Constants::INVALID_USERID) {
9870 APP_LOGE("name %{public}s invalid userid :%{public}d", bundleName.c_str(), userId);
9871 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9872 }
9873 if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
9874 APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
9875 return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX;
9876 }
9877 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9878 auto item = bundleInfos_.find(bundleName);
9879 if (item == bundleInfos_.end()) {
9880 isInstalled = false;
9881 return ERR_OK;
9882 }
9883 if (item->second.GetInstallMark().status == InstallExceptionStatus::INSTALL_START) {
9884 APP_LOGW("name %{public}s is installing", bundleName.c_str());
9885 isInstalled = false;
9886 return ERR_OK;
9887 }
9888 if ((item->second.GetApplicationBundleType() == BundleType::SHARED) ||
9889 ((item->second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) &&
9890 item->second.GetInnerBundleUserInfos().empty())) {
9891 isInstalled = true;
9892 return ERR_OK;
9893 }
9894 int32_t responseUserId = item->second.GetResponseUserId(requestUserId);
9895 if (responseUserId == Constants::INVALID_USERID) {
9896 isInstalled = false;
9897 return ERR_OK;
9898 }
9899 if (appIndex == 0) {
9900 isInstalled = true;
9901 return ERR_OK;
9902 }
9903 InnerBundleUserInfo innerBundleUserInfo;
9904 if (item->second.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
9905 if (innerBundleUserInfo.cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) !=
9906 innerBundleUserInfo.cloneInfos.end()) {
9907 isInstalled = true;
9908 return ERR_OK;
9909 }
9910 }
9911 isInstalled = false;
9912 return ERR_OK;
9913 }
9914
UpdateIsPreInstallApp(const std::string & bundleName,bool isPreInstallApp)9915 void BundleDataMgr::UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)
9916 {
9917 APP_LOGD("UpdateIsPreInstallApp %{public}s", bundleName.c_str());
9918 if (bundleName.empty()) {
9919 APP_LOGW("bundleName is empty");
9920 return;
9921 }
9922
9923 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9924 auto infoItem = bundleInfos_.find(bundleName);
9925 if (infoItem == bundleInfos_.end()) {
9926 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
9927 return;
9928 }
9929
9930 if (infoItem->second.IsPreInstallApp() != isPreInstallApp) {
9931 infoItem->second.SetIsPreInstallApp(isPreInstallApp);
9932 SaveInnerBundleInfo(infoItem->second);
9933 }
9934 }
9935
GetBundleNameByAppId(const std::string & appId,std::string & bundleName)9936 ErrCode BundleDataMgr::GetBundleNameByAppId(const std::string &appId, std::string &bundleName)
9937 {
9938 APP_LOGD("start GetBundleNameByAppId %{private}s", appId.c_str());
9939 if (appId.empty()) {
9940 APP_LOGW("appId is empty");
9941 return ERR_APPEXECFWK_INSTALL_PARAM_ERROR;
9942 }
9943 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9944 for (const auto &[key, innerInfo] : bundleInfos_) {
9945 if (innerInfo.GetAppId() == appId || innerInfo.GetAppIdentifier() == appId) {
9946 bundleName = key;
9947 return ERR_OK;
9948 }
9949 }
9950 APP_LOGI("get bundleName failed %{private}s", appId.c_str());
9951 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9952 }
9953
GetDirForAtomicService(const std::string & bundleName,std::string & dataDir) const9954 ErrCode BundleDataMgr::GetDirForAtomicService(const std::string &bundleName, std::string &dataDir) const
9955 {
9956 APP_LOGD("start GetDirForAtomicService name: %{public}s", bundleName.c_str());
9957 AccountSA::OhosAccountInfo accountInfo;
9958 auto ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfo(accountInfo);
9959 if (ret != ERR_OK) {
9960 APP_LOGE("GetOhosAccountInfo failed, errCode: %{public}d", ret);
9961 return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
9962 }
9963 dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
9964 return ERR_OK;
9965 }
9966
GetDirForAtomicServiceByUserId(const std::string & bundleName,int32_t userId,AccountSA::OhosAccountInfo & accountInfo,std::string & dataDir) const9967 ErrCode BundleDataMgr::GetDirForAtomicServiceByUserId(const std::string &bundleName, int32_t userId,
9968 AccountSA::OhosAccountInfo &accountInfo, std::string &dataDir) const
9969 {
9970 APP_LOGD("start GetDirForAtomicServiceByUserId name: %{public}s userId: %{public}d", bundleName.c_str(), userId);
9971 if (accountInfo.uid_.empty()) {
9972 auto ret = AccountSA::OhosAccountKits::GetInstance().GetOsAccountDistributedInfo(userId, accountInfo);
9973 if (ret != ERR_OK) {
9974 APP_LOGE("GetOsAccountDistributedInfo failed, errCode: %{public}d", ret);
9975 return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
9976 }
9977 }
9978 dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
9979 return ERR_OK;
9980 }
9981
GetDirForApp(const std::string & bundleName,const int32_t appIndex) const9982 std::string BundleDataMgr::GetDirForApp(const std::string &bundleName, const int32_t appIndex) const
9983 {
9984 APP_LOGD("start GetDirForApp name: %{public}s appIndex: %{public}d", bundleName.c_str(), appIndex);
9985 if (appIndex == 0) {
9986 return bundleName;
9987 } else {
9988 return CLONE_APP_DIR_PREFIX + std::to_string(appIndex) + PLUS + bundleName;
9989 }
9990 }
9991
GetDirByBundleNameAndAppIndex(const std::string & bundleName,const int32_t appIndex,std::string & dataDir) const9992 ErrCode BundleDataMgr::GetDirByBundleNameAndAppIndex(const std::string &bundleName, const int32_t appIndex,
9993 std::string &dataDir) const
9994 {
9995 APP_LOGD("start GetDir bundleName : %{public}s appIndex : %{public}d", bundleName.c_str(), appIndex);
9996 if (appIndex < 0) {
9997 return ERR_BUNDLE_MANAGER_GET_DIR_INVALID_APP_INDEX;
9998 }
9999 BundleType type = BundleType::APP;
10000 GetBundleType(bundleName, type);
10001 if (type == BundleType::ATOMIC_SERVICE) {
10002 return GetDirForAtomicService(bundleName, dataDir);
10003 }
10004 dataDir = GetDirForApp(bundleName, appIndex);
10005 return ERR_OK;
10006 }
10007
GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,int32_t userId) const10008 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo &innerBundleInfo,
10009 int32_t userId) const
10010 {
10011 std::vector<int32_t> cloneAppIndexes;
10012 InnerBundleUserInfo innerBundleUserInfo;
10013 if (!innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10014 return cloneAppIndexes;
10015 }
10016 const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
10017 if (cloneInfos.empty()) {
10018 return cloneAppIndexes;
10019 }
10020 for (const auto &cloneInfo : cloneInfos) {
10021 LOG_D(BMS_TAG_QUERY, "get cloneAppIndexes by inner bundle info: %{public}d", cloneInfo.second.appIndex);
10022 cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
10023 }
10024 return cloneAppIndexes;
10025 }
10026
GetBundleDir(int32_t userId,BundleType type,AccountSA::OhosAccountInfo & accountInfo,BundleDir & bundleDir) const10027 ErrCode BundleDataMgr::GetBundleDir(int32_t userId, BundleType type, AccountSA::OhosAccountInfo &accountInfo,
10028 BundleDir &bundleDir) const
10029 {
10030 APP_LOGD("start GetBundleDir");
10031 if (type == BundleType::ATOMIC_SERVICE) {
10032 std::string dataDir;
10033 auto ret = GetDirForAtomicServiceByUserId(bundleDir.bundleName, userId, accountInfo, dataDir);
10034 if (ret != ERR_OK) {
10035 return ret;
10036 }
10037 bundleDir.dir = dataDir;
10038 } else {
10039 bundleDir.dir = GetDirForApp(bundleDir.bundleName, bundleDir.appIndex);
10040 }
10041 return ERR_OK;
10042 }
10043
GetAllBundleDirs(int32_t userId,std::vector<BundleDir> & bundleDirs) const10044 ErrCode BundleDataMgr::GetAllBundleDirs(int32_t userId, std::vector<BundleDir> &bundleDirs) const
10045 {
10046 APP_LOGD("start GetAllBundleDirs");
10047 int32_t requestUserId = GetUserId(userId);
10048 if (requestUserId == Constants::INVALID_USERID) {
10049 APP_LOGE("invalid userid :%{public}d", userId);
10050 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10051 }
10052 AccountSA::OhosAccountInfo accountInfo;
10053 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10054 for (const auto &item : bundleInfos_) {
10055 const InnerBundleInfo &info = item.second;
10056 std::string bundleName = info.GetBundleName();
10057 int32_t responseUserId = info.GetResponseUserId(requestUserId);
10058 if (responseUserId == Constants::INVALID_USERID) {
10059 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
10060 continue;
10061 }
10062 BundleType type = info.GetApplicationBundleType();
10063 if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
10064 continue;
10065 }
10066
10067 std::vector<int32_t> allAppIndexes = {0};
10068 if (type == BundleType::APP) {
10069 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
10070 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
10071 }
10072 for (int32_t appIndex: allAppIndexes) {
10073 BundleDir bundleDir;
10074 bundleDir.bundleName = bundleName;
10075 bundleDir.appIndex = appIndex;
10076 auto ret = GetBundleDir(responseUserId, type, accountInfo, bundleDir);
10077 if (ret != ERR_OK) {
10078 return ret;
10079 }
10080 bundleDirs.emplace_back(bundleDir);
10081 }
10082 }
10083 return ERR_OK;
10084 }
10085
RestoreUidAndGidFromUninstallInfo()10086 void BundleDataMgr::RestoreUidAndGidFromUninstallInfo()
10087 {
10088 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
10089 std::map<std::string, UninstallBundleInfo> uninstallBundleInfos;
10090 if (!GetAllUninstallBundleInfo(uninstallBundleInfos)) {
10091 return;
10092 }
10093 std::map<int32_t, std::string> uninstallBundleIdMap;
10094 for (const auto &info : uninstallBundleInfos) {
10095 if (info.second.userInfos.empty()) {
10096 continue;
10097 }
10098 int32_t userId = -1;
10099 if (!OHOS::StrToInt(info.second.userInfos.begin()->first, userId)) {
10100 APP_LOGW("strToInt fail");
10101 continue;
10102 }
10103 int32_t bundleId = info.second.userInfos.begin()->second.uid
10104 - userId * Constants::BASE_USER_RANGE;
10105 if (bundleId < Constants::BASE_APP_UID || bundleId >= MAX_APP_UID) {
10106 APP_LOGW("invalid bundleId");
10107 continue;
10108 }
10109 auto item = bundleIdMap_.find(bundleId);
10110 if (item == bundleIdMap_.end()) {
10111 uninstallBundleIdMap.emplace(bundleId, info.first);
10112 }
10113 }
10114 for (const auto &item : uninstallBundleIdMap) {
10115 bundleIdMap_.emplace(item.first, item.second);
10116 }
10117 }
10118
GetAssetAccessGroups(const std::string & bundleName,std::vector<std::string> & assetAccessGroups) const10119 ErrCode BundleDataMgr::GetAssetAccessGroups(const std::string &bundleName,
10120 std::vector<std::string> &assetAccessGroups) const
10121 {
10122 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10123 auto item = bundleInfos_.find(bundleName);
10124 if (item == bundleInfos_.end()) {
10125 APP_LOGE("%{public}s not exist", bundleName.c_str());
10126 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10127 }
10128 assetAccessGroups = item->second.GetAssetAccessGroups();
10129 return ERR_OK;
10130 }
10131
GetDeveloperId(const std::string & bundleName,std::string & developerId) const10132 ErrCode BundleDataMgr::GetDeveloperId(const std::string &bundleName, std::string &developerId) const
10133 {
10134 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10135 auto item = bundleInfos_.find(bundleName);
10136 if (item == bundleInfos_.end()) {
10137 APP_LOGE("%{public}s not exist", bundleName.c_str());
10138 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10139 }
10140 developerId = item->second.GetDeveloperId();
10141 return ERR_OK;
10142 }
10143
IsObtainAbilityInfo(const Want & want,int32_t userId,AbilityInfo & abilityInfo)10144 bool BundleDataMgr::IsObtainAbilityInfo(const Want &want, int32_t userId, AbilityInfo &abilityInfo)
10145 {
10146 APP_LOGI("IsObtainAbilityInfo");
10147 std::string bundleName = want.GetElement().GetBundleName();
10148 std::string abilityName = want.GetElement().GetAbilityName();
10149 std::string moduleName = want.GetElement().GetModuleName();
10150 if (bundleName.empty()) {
10151 APP_LOGE("bundle name empty");
10152 return false;
10153 }
10154 {
10155 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10156 const auto infoItem = bundleInfos_.find(bundleName);
10157 if (infoItem == bundleInfos_.end()) {
10158 APP_LOGE("%{public}s not found", bundleName.c_str());
10159 return false;
10160 }
10161 if (abilityName.empty()) {
10162 return true;
10163 }
10164 }
10165 int32_t flags = static_cast<int32_t>(GET_ABILITY_INFO_DEFAULT);
10166 return ExplicitQueryAbilityInfo(want, flags, userId, abilityInfo);
10167 }
10168
AddPluginInfo(const InnerBundleInfo & innerBundleInfo,const PluginBundleInfo & pluginBundleInfo,const int32_t userId)10169 ErrCode BundleDataMgr::AddPluginInfo(const InnerBundleInfo &innerBundleInfo,
10170 const PluginBundleInfo &pluginBundleInfo, const int32_t userId)
10171 {
10172 APP_LOGD("start AddPluginInfo");
10173 std::string bundleName = innerBundleInfo.GetBundleName();
10174 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
10175 auto item = bundleInfos_.find(bundleName);
10176 if (item == bundleInfos_.end()) {
10177 APP_LOGE("%{public}s not exist", bundleName.c_str());
10178 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10179 }
10180 InnerBundleInfo newInfo = item->second;
10181 if (!newInfo.AddPluginBundleInfo(pluginBundleInfo, userId)) {
10182 APP_LOGE("%{public}s add plugin info failed", bundleName.c_str());
10183 return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10184 }
10185 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10186 APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10187 return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10188 }
10189 bundleInfos_.at(bundleName) = newInfo;
10190 return ERR_OK;
10191 }
10192
RemovePluginInfo(const InnerBundleInfo & innerBundleInfo,const std::string & pluginBundleName,const int32_t userId)10193 ErrCode BundleDataMgr::RemovePluginInfo(const InnerBundleInfo &innerBundleInfo,
10194 const std::string &pluginBundleName, const int32_t userId)
10195 {
10196 APP_LOGD("start RemovePluginInfo");
10197 std::string bundleName = innerBundleInfo.GetBundleName();
10198 std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
10199 auto item = bundleInfos_.find(bundleName);
10200 if (item == bundleInfos_.end()) {
10201 APP_LOGE("%{public}s not exist", bundleName.c_str());
10202 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10203 }
10204 InnerBundleInfo newInfo = item->second;
10205 if (!newInfo.RemovePluginBundleInfo(pluginBundleName, userId)) {
10206 APP_LOGE("%{public}s remove plugin info failed", bundleName.c_str());
10207 return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10208 }
10209 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10210 APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10211 return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10212 }
10213 bundleInfos_.at(bundleName) = newInfo;
10214 return ERR_OK;
10215 }
10216
GetPluginBundleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,PluginBundleInfo & pluginBundleInfo,const int32_t userId)10217 bool BundleDataMgr::GetPluginBundleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10218 PluginBundleInfo &pluginBundleInfo, const int32_t userId)
10219 {
10220 APP_LOGD("bundleName:%{public}s start GetPluginBundleInfo", hostBundleName.c_str());
10221 if (hostBundleName.empty() || pluginBundleName.empty()) {
10222 APP_LOGW("bundleName is empty");
10223 return false;
10224 }
10225
10226 std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10227 auto infoItem = bundleInfos_.find(hostBundleName);
10228 if (infoItem == bundleInfos_.end()) {
10229 APP_LOGW_NOFUNC("%{public}s GetPluginBundleInfo not found %{public}s", hostBundleName.c_str(),
10230 pluginBundleName.c_str());
10231 return false;
10232 }
10233
10234 if (userId == Constants::ALL_USERID) {
10235 auto &infos = infoItem->second.GetInnerBundleUserInfos();
10236 for (auto &info : infos) {
10237 if (info.second.GetPluginBundleInfo(pluginBundleName, pluginBundleInfo)) {
10238 APP_LOGD("%{public}s GetPluginBundleInfo success %{public}s", hostBundleName.c_str(),
10239 pluginBundleName.c_str());
10240 return true;
10241 }
10242 }
10243 } else {
10244 InnerBundleUserInfo innerBundleUserInfo;
10245 if (!infoItem->second.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10246 APP_LOGE("GetInnerBundleUserInfo failed");
10247 return false;
10248 }
10249 return innerBundleUserInfo.GetPluginBundleInfo(pluginBundleName, pluginBundleInfo);
10250 }
10251 return false;
10252 }
10253 } // namespace AppExecFwk
10254 } // namespace OHOS
10255