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 "ability_manager_helper.h"
27 #include "accesstoken_kit.h"
28 #include "account_helper.h"
29 #include "app_log_tag_wrapper.h"
30 #include "app_provision_info_manager.h"
31 #include "bms_extension_client.h"
32 #include "bundle_common_event_mgr.h"
33 #include "bundle_data_storage_rdb.h"
34 #include "preinstall_data_storage_rdb.h"
35 #include "hap_token_info.h"
36 #include "bundle_event_callback_death_recipient.h"
37 #include "bundle_mgr_service.h"
38 #include "bundle_mgr_client.h"
39 #include "bundle_parser.h"
40 #include "bundle_permission_mgr.h"
41 #include "bundle_status_callback_death_recipient.h"
42 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
43 #include "default_app_mgr.h"
44 #endif
45 #include "hitrace_meter.h"
46 #include "inner_bundle_clone_common.h"
47 #include "installd_client.h"
48 #include "interfaces/hap_verify.h"
49 #include "ipc_skeleton.h"
50 #ifdef GLOBAL_I18_ENABLE
51 #include "locale_config.h"
52 #include "locale_info.h"
53 #endif
54 #include "mime_type_mgr.h"
55 #include "parameters.h"
56 #include "router_map_helper.h"
57 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
58 #include "bundle_overlay_data_manager.h"
59 #endif
60 #include "bundle_extractor.h"
61 #include "parameter.h"
62 #include "scope_guard.h"
63 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
64 #include "type_descriptor.h"
65 #include "utd_client.h"
66 #endif
67
68 #ifdef APP_DOMAIN_VERIFY_ENABLED
69 #include "app_domain_verify_mgr_client.h"
70 #endif
71
72 #include "router_data_storage_rdb.h"
73 #include "shortcut_data_storage_rdb.h"
74 #include "system_ability_helper.h"
75 #include "ohos_account_kits.h"
76 #include "xcollie_helper.h"
77
78 namespace OHOS {
79 namespace AppExecFwk {
80 namespace {
81 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
82 constexpr int8_t DATA_GROUP_INDEX_START = 1;
83 constexpr int8_t UUID_LENGTH = 36;
84 constexpr int8_t PROFILE_PREFIX_LENGTH = 9;
85 constexpr uint16_t UUID_LENGTH_MAX = 512;
86 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
87 // freeInstall action
88 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
89 // share action
90 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
91 constexpr const char* WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
92 constexpr const char* SUMMARY_TOTAL_COUNT = "totalCount";
93 constexpr const char* WANT_PARAM_SUMMARY = "summary";
94 constexpr int8_t DEFAULT_SUMMARY_COUNT = 0;
95 // data share
96 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
97 constexpr int8_t DATA_PROXY_URI_PREFIX_LEN = 17;
98 // profile path
99 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
100 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
101 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
102 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
103 constexpr const char* PKG_CONTEXT_PROFILE_PATH = "pkgContextInfo.json";
104 constexpr const char* FILE_ICON_PROFILE_PATH = "resources/base/profile/file_icon.json";
105 constexpr const char* INSIGHT_INTENT_PROFILE_PATH = "resources/base/profile/extract_insight_intent.json";
106 constexpr const char* PROFILE_PATH = "resources/base/profile/";
107 constexpr const char* PROFILE_PREFIX = "$profile:";
108 constexpr const char* JSON_SUFFIX = ".json";
109 constexpr const char* SCHEME_HTTPS = "https";
110 constexpr const char* META_DATA_SHORTCUTS_NAME = "ohos.ability.shortcuts";
111 constexpr const char* BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
112 constexpr const char* ENTRY = "entry";
113 constexpr const char* CLONE_BUNDLE_PREFIX = "clone_";
114 constexpr const char* RESOURCE_STRING_PREFIX = "$string:";
115
116 const std::map<ProfileType, const char*> PROFILE_TYPE_MAP = {
117 { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
118 { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
119 { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
120 { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH },
121 { ProfileType::PKG_CONTEXT_PROFILE, PKG_CONTEXT_PROFILE_PATH },
122 { ProfileType::FILE_ICON_PROFILE, FILE_ICON_PROFILE_PATH },
123 { ProfileType::INSIGHT_INTENT_PROFILE, INSIGHT_INTENT_PROFILE_PATH },
124 { ProfileType::CLOUD_PROFILE, ServiceConstants::CLOUD_PROFILE_PATH}
125 };
126 const std::string SCHEME_END = "://";
127 const std::string LINK_FEATURE = "linkFeature";
128 const std::string ATOMIC_SERVICE_DIR_PREFIX = "+auid-";
129 const std::string CLONE_APP_DIR_PREFIX = "+clone-";
130 const std::string PLUS = "+";
131 constexpr const char* PARAM_URI_SEPARATOR = ":///";
132 constexpr const char* URI_SEPARATOR = "://";
133 constexpr uint8_t PARAM_URI_SEPARATOR_LEN = 4;
134 constexpr int8_t INVALID_BUNDLEID = -1;
135 constexpr int32_t DATA_GROUP_UID_OFFSET = 100000;
136 constexpr int32_t MAX_APP_UID = 65535;
137 constexpr int8_t ONLY_ONE_USER = 1;
138 constexpr unsigned int OTA_CODE_ENCRYPTION_TIMEOUT = 4 * 60;
139 const std::string FUNCATION_HANDLE_OTA_CODE_ENCRYPTION = "BundleDataMgr::HandleOTACodeEncryption()";
140 const std::string BUNDLE_NAME = "BUNDLE_NAME";
141 const std::string USER_ID = "USER_ID";
142 const std::string APP_INDEX = "APP_INDEX";
143 #ifndef BUNDLE_FRAMEWORK_FREE_INSTALL
144 constexpr int APP_MGR_SERVICE_ID = 501;
145 #endif
146 }
147
BundleDataMgr()148 BundleDataMgr::BundleDataMgr()
149 {
150 InitStateTransferMap();
151 dataStorage_ = std::make_shared<BundleDataStorageRdb>();
152 preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
153 sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
154 bundleStateStorage_ = std::make_shared<BundleStateStorage>();
155 shortcutStorage_ = std::make_shared<ShortcutDataStorageRdb>();
156 shortcutVisibleStorage_ = std::make_shared<ShortcutVisibleDataStorageRdb>();
157 routerStorage_ = std::make_shared<RouterDataStorageRdb>();
158 uninstallDataMgr_ = std::make_shared<UninstallDataMgrStorageRdb>();
159 firstInstallDataMgr_ = std::make_shared<FirstInstallDataMgrStorageRdb>();
160 baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
161 if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) {
162 baseAppUid_ = Constants::BASE_APP_UID;
163 }
164 APP_LOGI("BundleDataMgr instance is created");
165 }
166
~BundleDataMgr()167 BundleDataMgr::~BundleDataMgr()
168 {
169 APP_LOGI("BundleDataMgr instance is destroyed");
170 installStates_.clear();
171 transferStates_.clear();
172 bundleInfos_.clear();
173 }
174
LoadDataFromPersistentStorage()175 bool BundleDataMgr::LoadDataFromPersistentStorage()
176 {
177 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
178 // Judge whether bundleState json db exists.
179 // If it does not exist, create it and return the judgment result.
180 bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
181 if (!dataStorage_->LoadAllData(bundleInfos_)) {
182 APP_LOGW("LoadAllData failed");
183 return false;
184 }
185
186 if (bundleInfos_.empty()) {
187 APP_LOGW("persistent data is empty");
188 return false;
189 }
190
191 for (const auto &item : bundleInfos_) {
192 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
193 installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
194 AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
195 }
196
197 RestoreUidAndGid();
198 if (!bundleStateDbExist) {
199 // Compatible old bundle status in kV db
200 CompatibleOldBundleStateInKvDb();
201 } else {
202 ResetBundleStateData();
203 // Load all bundle status from json db.
204 LoadAllBundleStateDataFromJsonDb();
205 }
206
207 SetInitialUserFlag(true);
208
209 RestoreSandboxUidAndGid(bundleIdMap_);
210 return true;
211 }
212
CompatibleOldBundleStateInKvDb()213 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
214 {
215 for (const auto& bundleInfoItem : bundleInfos_) {
216 for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
217 auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
218 if (bundleUserInfo.IsInitialState()) {
219 continue;
220 }
221
222 // save old bundle state to json db
223 bundleStateStorage_->SaveBundleStateStorage(
224 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
225 }
226 }
227 }
228
LoadAllBundleStateDataFromJsonDb()229 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
230 {
231 APP_LOGD("Load all bundle state start");
232 std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
233 if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
234 APP_LOGW("Load all bundle state failed");
235 return;
236 }
237
238 for (const auto& bundleState : bundleStateInfos) {
239 auto infoItem = bundleInfos_.find(bundleState.first);
240 if (infoItem == bundleInfos_.end()) {
241 APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
242 continue;
243 }
244
245 InnerBundleInfo& newInfo = infoItem->second;
246 for (auto& bundleUserState : bundleState.second) {
247 auto& tempUserInfo = bundleUserState.second;
248 newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.second.setEnabledCaller,
249 bundleUserState.first);
250 for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
251 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
252 }
253 }
254 }
255
256 APP_LOGD("Load all bundle state end");
257 }
258
ResetBundleStateData()259 void BundleDataMgr::ResetBundleStateData()
260 {
261 for (auto& bundleInfoItem : bundleInfos_) {
262 bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
263 }
264 }
265
UpdateBundleInstallState(const std::string & bundleName,const InstallState state,const bool isKeepData)266 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName,
267 const InstallState state, const bool isKeepData)
268 {
269 if (bundleName.empty()) {
270 APP_LOGW("update failed: bundle name is empty");
271 return false;
272 }
273
274 // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
275 std::unique_lock<ffrt::shared_mutex> lck(bundleInfoMutex_);
276 std::lock_guard<ffrt::mutex> lock(stateMutex_);
277 auto item = installStates_.find(bundleName);
278 if (item == installStates_.end()) {
279 if (state == InstallState::INSTALL_START) {
280 installStates_.emplace(bundleName, state);
281 APP_LOGD("update succeed");
282 return true;
283 }
284 APP_LOGW("update failed: incorrect state, -n: %{public}s", bundleName.c_str());
285 return false;
286 }
287
288 auto stateRange = transferStates_.equal_range(state);
289 for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
290 if (item->second == previousState->second) {
291 APP_LOGD("update succeed, current:%{public}d, state:%{public}d",
292 static_cast<int32_t>(previousState->second), static_cast<int32_t>(state));
293 if (IsDeleteDataState(state)) {
294 installStates_.erase(item);
295 DeleteBundleInfo(bundleName, state, isKeepData);
296 return true;
297 }
298 item->second = state;
299 return true;
300 }
301 }
302 APP_LOGW_NOFUNC("UpdateBundleInstallState -n %{public}s fail current:%{public}d state:%{public}d",
303 bundleName.c_str(), static_cast<int32_t>(item->second), static_cast<int32_t>(state));
304 return false;
305 }
306
AddInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info,bool checkStatus)307 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info, bool checkStatus)
308 {
309 APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
310 if (bundleName.empty()) {
311 APP_LOGW("save info fail, empty bundle name");
312 return false;
313 }
314
315 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
316 auto infoItem = bundleInfos_.find(bundleName);
317 if (infoItem != bundleInfos_.end()) {
318 APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
319 return false;
320 }
321 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
322 auto statusItem = installStates_.find(bundleName);
323 if (statusItem == installStates_.end()) {
324 APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
325 return false;
326 }
327 if (!checkStatus || statusItem->second == InstallState::INSTALL_START) {
328 APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
329 if (info.GetBaseApplicationInfo().needAppDetail) {
330 AddAppDetailAbilityInfo(info);
331 }
332 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
333 if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
334 InnerBundleInfo newInfo = info;
335 std::string targetBundleName = newInfo.GetTargetBundleName();
336 auto targetInfoItem = bundleInfos_.find(targetBundleName);
337 if (targetInfoItem != bundleInfos_.end()) {
338 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
339 // storage target bundle info
340 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
341 }
342 }
343 if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
344 int32_t overlayModuleState = OverlayState::OVERLAY_INVALID;
345 (void)info.GetOverlayModuleState(info.GetCurrentModulePackage(), info.GetUserId(), overlayModuleState);
346 info.SetOverlayModuleState(info.GetCurrentModulePackage(), overlayModuleState, info.GetUserId());
347 }
348 if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
349 // build overlay connection for external overlay
350 BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
351 }
352 #endif
353 bundleInfos_.emplace(bundleName, info);
354 AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
355 return true;
356 }
357 return false;
358 }
359
AddNewModuleInfo(const std::string & bundleName,const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)360 bool BundleDataMgr::AddNewModuleInfo(
361 const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
362 {
363 LOG_I(BMS_TAG_DEFAULT, "addInfo:%{public}s", newInfo.GetCurrentModulePackage().c_str());
364 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
365 auto infoItem = bundleInfos_.find(bundleName);
366 if (infoItem == bundleInfos_.end()) {
367 APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
368 return false;
369 }
370 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
371 auto statusItem = installStates_.find(bundleName);
372 if (statusItem == installStates_.end()) {
373 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
374 return false;
375 }
376 if (statusItem->second == InstallState::UPDATING_SUCCESS) {
377 if (AddNewModuleInfo(newInfo, oldInfo)) {
378 bundleInfos_.at(bundleName) = oldInfo;
379 return true;
380 }
381 }
382 return false;
383 }
384
UpdateBaseBundleInfoIntoOld(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)385 void BundleDataMgr::UpdateBaseBundleInfoIntoOld(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
386 {
387 oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
388 oldInfo.UpdateBaseApplicationInfo(newInfo);
389 oldInfo.UpdateRemovable(newInfo.IsPreInstallApp(), newInfo.IsRemovable());
390 oldInfo.UpdateMultiAppMode(newInfo);
391 oldInfo.UpdateReleaseType(newInfo);
392 oldInfo.SetAppType(newInfo.GetAppType());
393 oldInfo.SetAppFeature(newInfo.GetAppFeature());
394 }
395
AddNewModuleInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)396 bool BundleDataMgr::AddNewModuleInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
397 {
398 APP_LOGD("save bundle:%{public}s info", oldInfo.GetBundleName().c_str());
399 ProcessAllowedAcls(newInfo, oldInfo);
400 if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
401 UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
402 }
403 if (oldInfo.GetOldAppIds().empty()) {
404 oldInfo.AddOldAppId(oldInfo.GetAppId());
405 }
406 oldInfo.SetProvisionId(newInfo.GetProvisionId());
407 oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
408 oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
409 oldInfo.AddOldAppId(newInfo.GetAppId());
410 oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
411 oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
412 oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
413 oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
414 oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
415 oldInfo.AddModuleInfo(newInfo);
416 oldInfo.UpdateAppDetailAbilityAttrs();
417 if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
418 AddAppDetailAbilityInfo(oldInfo);
419 }
420 oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
421 oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
422 oldInfo.UpdateOdidByBundleInfo(newInfo);
423 oldInfo.SetDFXParamStatus();
424 oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
425 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
426 if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
427 oldInfo.SetOverlayType(newInfo.GetOverlayType());
428 }
429 if (!UpdateOverlayInfo(newInfo, oldInfo)) {
430 APP_LOGD("bundleName: %{public}s : update overlay info failed", oldInfo.GetBundleName().c_str());
431 return false;
432 }
433 #endif
434 APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
435 return true;
436 }
437
RemoveModuleInfo(const std::string & bundleName,const std::string & modulePackage,InnerBundleInfo & oldInfo,bool needSaveStorage)438 bool BundleDataMgr::RemoveModuleInfo(
439 const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo, bool needSaveStorage)
440 {
441 APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
442 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
443 auto infoItem = bundleInfos_.find(bundleName);
444 if (infoItem == bundleInfos_.end()) {
445 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
446 return false;
447 }
448 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
449 auto statusItem = installStates_.find(bundleName);
450 if (statusItem == installStates_.end()) {
451 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
452 return false;
453 }
454 if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
455 APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
456 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
457 std::string targetBundleName = oldInfo.GetTargetBundleName();
458 InnerBundleInfo targetInnerBundleInfo;
459 if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
460 targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
461 }
462 OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
463 targetInnerBundleInfo);
464 if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
465 // save target innerBundleInfo
466 if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
467 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
468 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
469 }
470 }
471 // remove target module and overlay module state will change to OVERLAY_INVALID
472 if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
473 ResetExternalOverlayModuleState(bundleName, modulePackage);
474 }
475 #endif
476 oldInfo.RemoveModuleInfo(modulePackage);
477 oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
478 if (!oldInfo.isExistedOverlayModule()) {
479 oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
480 }
481 oldInfo.SetDFXParamStatus();
482 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(oldInfo)) {
483 APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
484 return false;
485 }
486 DeleteRouterInfo(bundleName, modulePackage);
487 bundleInfos_.at(bundleName) = oldInfo;
488 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
489 }
490 return true;
491 }
492
UpdateUninstallBundleInfo(const std::string & bundleName,const UninstallBundleInfo & uninstallBundleInfo)493 bool BundleDataMgr::UpdateUninstallBundleInfo(const std::string &bundleName,
494 const UninstallBundleInfo &uninstallBundleInfo)
495 {
496 if (uninstallDataMgr_ == nullptr) {
497 APP_LOGE("rdbDataManager is null");
498 return false;
499 }
500 if (bundleName.empty() || uninstallBundleInfo.userInfos.empty()) {
501 APP_LOGE("param error");
502 return false;
503 }
504 UninstallBundleInfo oldUninstallBundleInfo;
505 if (uninstallDataMgr_->GetUninstallBundleInfo(bundleName, oldUninstallBundleInfo)) {
506 std::string newUser = uninstallBundleInfo.userInfos.begin()->first;
507 if (oldUninstallBundleInfo.userInfos.find(newUser) != oldUninstallBundleInfo.userInfos.end()) {
508 APP_LOGE("u %{public}s has been saved", newUser.c_str());
509 return false;
510 }
511 oldUninstallBundleInfo.userInfos[newUser] = uninstallBundleInfo.userInfos.begin()->second;
512 return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, oldUninstallBundleInfo);
513 }
514 return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
515 }
516
GetUninstallBundleInfo(const std::string & bundleName,UninstallBundleInfo & uninstallBundleInfo)517 bool BundleDataMgr::GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)
518 {
519 if (uninstallDataMgr_ == nullptr) {
520 APP_LOGE("rdbDataManager is null");
521 return false;
522 }
523 if (bundleName.empty()) {
524 APP_LOGE("param error");
525 return false;
526 }
527 return uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo);
528 }
529
GetAllUninstallBundleInfo(std::map<std::string,UninstallBundleInfo> & uninstallBundleInfos)530 bool BundleDataMgr::GetAllUninstallBundleInfo(
531 std::map<std::string, UninstallBundleInfo> &uninstallBundleInfos)
532 {
533 if (uninstallDataMgr_ == nullptr) {
534 APP_LOGE("rdbDataManager is null");
535 return false;
536 }
537 return uninstallDataMgr_->GetAllUninstallBundleInfo(uninstallBundleInfos);
538 }
539
DeleteUninstallBundleInfo(const std::string & bundleName,int32_t userId)540 bool BundleDataMgr::DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)
541 {
542 if (uninstallDataMgr_ == nullptr) {
543 APP_LOGE("rdbDataManager is null");
544 return false;
545 }
546 if (bundleName.empty()) {
547 APP_LOGE("param error");
548 return false;
549 }
550 UninstallBundleInfo uninstallBundleInfo;
551 if (!uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo)) {
552 APP_LOGE("bundle %{public}s is not found", bundleName.c_str());
553 return false;
554 }
555 auto it = uninstallBundleInfo.userInfos.find(std::to_string(userId));
556 if (it == uninstallBundleInfo.userInfos.end()) {
557 APP_LOGE("user %{public}d is not found", userId);
558 return false;
559 }
560 uninstallBundleInfo.userInfos.erase(std::to_string(userId));
561 if (uninstallBundleInfo.userInfos.empty()) {
562 return uninstallDataMgr_->DeleteUninstallBundleInfo(bundleName);
563 }
564 return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
565 }
566
AddFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,const FirstInstallBundleInfo & firstInstallBundleInfo)567 bool BundleDataMgr::AddFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
568 const FirstInstallBundleInfo &firstInstallBundleInfo)
569 {
570 if (bundleName.empty()) {
571 APP_LOGE("bundleName is empty");
572 return false;
573 }
574 if (firstInstallDataMgr_ == nullptr) {
575 APP_LOGE("firstInstallDataMgr_ is null");
576 return false;
577 }
578
579 if (firstInstallDataMgr_->IsExistFirstInstallBundleInfo(bundleName, userId)) {
580 APP_LOGW("bundleName %{public}s, user %{public}d has been saved", bundleName.c_str(), userId);
581 return true;
582 }
583 return firstInstallDataMgr_->AddFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
584 }
585
GetFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,FirstInstallBundleInfo & firstInstallBundleInfo)586 bool BundleDataMgr::GetFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
587 FirstInstallBundleInfo &firstInstallBundleInfo)
588 {
589 if (bundleName.empty()) {
590 APP_LOGE("bundleName is empty");
591 return false;
592 }
593 if (firstInstallDataMgr_ == nullptr) {
594 APP_LOGE("firstInstallDataMgr_ is null");
595 return false;
596 }
597 return firstInstallDataMgr_->GetFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
598 }
599
DeleteFirstInstallBundleInfo(int32_t userId)600 bool BundleDataMgr::DeleteFirstInstallBundleInfo(int32_t userId)
601 {
602 if (firstInstallDataMgr_ == nullptr) {
603 APP_LOGE("firstInstallDataMgr_ is null");
604 return false;
605 }
606 return firstInstallDataMgr_->DeleteFirstInstallBundleInfo(userId);
607 }
608
RemoveHspModuleByVersionCode(int32_t versionCode,InnerBundleInfo & info)609 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
610 {
611 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
612 std::string bundleName = info.GetBundleName();
613 auto infoItem = bundleInfos_.find(bundleName);
614 if (infoItem == bundleInfos_.end()) {
615 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
616 return false;
617 }
618 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
619 auto statusItem = installStates_.find(bundleName);
620 if (statusItem == installStates_.end()) {
621 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
622 return false;
623 }
624 if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
625 info.DeleteHspModuleByVersion(versionCode);
626 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
627 if (dataStorage_->SaveStorageBundleInfo(info)) {
628 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
629 bundleInfos_.at(bundleName) = info;
630 return true;
631 }
632 }
633 return true;
634 }
635
AddInnerBundleUserInfo(const std::string & bundleName,const InnerBundleUserInfo & newUserInfo)636 ErrCode BundleDataMgr::AddInnerBundleUserInfo(
637 const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
638 {
639 APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
640 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
641 auto infoItem = bundleInfos_.find(bundleName);
642 if (infoItem == bundleInfos_.end()) {
643 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
644 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
645 }
646
647 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
648 auto& info = bundleInfos_.at(bundleName);
649 info.AddInnerBundleUserInfo(newUserInfo);
650 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
651 ErrCode ret = dataStorage_->SaveStorageBundleInfoWithCode(info);
652 if (ret != ERR_OK) {
653 APP_LOGW("update storage failed bundle:%{public}s, errcode:%{public}d", bundleName.c_str(), ret);
654 return ret;
655 }
656 return ERR_OK;
657 }
658
RemoveInnerBundleUserInfo(const std::string & bundleName,int32_t userId)659 bool BundleDataMgr::RemoveInnerBundleUserInfo(
660 const std::string &bundleName, int32_t userId)
661 {
662 APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
663 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
664 auto infoItem = bundleInfos_.find(bundleName);
665 if (infoItem == bundleInfos_.end()) {
666 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
667 return false;
668 }
669
670 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
671 auto& info = bundleInfos_.at(bundleName);
672 info.RemoveInnerBundleUserInfo(userId);
673 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
674 if (!dataStorage_->SaveStorageBundleInfo(info)) {
675 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
676 return false;
677 }
678
679 bundleStateStorage_->DeleteBundleState(bundleName, userId);
680 return true;
681 }
682
UpdateInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)683 bool BundleDataMgr::UpdateInnerBundleInfo(
684 const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
685 {
686 LOG_I(BMS_TAG_DEFAULT, "updateInfo:%{public}s", bundleName.c_str());
687 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
688 auto infoItem = bundleInfos_.find(bundleName);
689 if (infoItem == bundleInfos_.end()) {
690 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
691 return false;
692 }
693 std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
694 auto statusItem = installStates_.find(bundleName);
695 if (statusItem == installStates_.end()) {
696 APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
697 return false;
698 }
699 // ROLL_BACK and USER_CHANGE should not be here
700 if (statusItem->second == InstallState::UPDATING_SUCCESS
701 || statusItem->second == InstallState::ROLL_BACK
702 || statusItem->second == InstallState::USER_CHANGE) {
703 APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
704 oldInfo.GetBundleName().c_str(), newInfo.GetCurrentModulePackage().c_str());
705 if (UpdateInnerBundleInfo(newInfo, oldInfo)) {
706 bundleInfos_.at(bundleName) = oldInfo;
707 APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
708 return true;
709 }
710 }
711 return false;
712 }
713
UpdateInnerBundleInfo(InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)714 bool BundleDataMgr::UpdateInnerBundleInfo(InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
715 {
716 if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
717 oldInfo.KeepOldOverlayConnection(newInfo);
718 }
719 ProcessAllowedAcls(newInfo, oldInfo);
720 oldInfo.UpdateModuleInfo(newInfo);
721 oldInfo.SetDFXParamStatus();
722 // 1.exist entry, update entry.
723 // 2.only exist feature, update feature.
724 if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
725 UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
726 }
727 oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
728 if (oldInfo.GetOldAppIds().empty()) {
729 oldInfo.AddOldAppId(oldInfo.GetAppId());
730 }
731 oldInfo.AddOldAppId(newInfo.GetAppId());
732 oldInfo.SetProvisionId(newInfo.GetProvisionId());
733 oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
734 oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
735 oldInfo.UpdateAppDetailAbilityAttrs();
736 oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
737 if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
738 AddAppDetailAbilityInfo(oldInfo);
739 }
740 oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
741 oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
742 oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
743 if (newInfo.GetAppCrowdtestDeadline() != Constants::INHERIT_CROWDTEST_DEADLINE) {
744 oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
745 }
746 oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
747 // clear apply quick fix frequency
748 oldInfo.ResetApplyQuickFixFrequency();
749 oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
750 oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
751 oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
752 oldInfo.UpdateOdidByBundleInfo(newInfo);
753 oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
754 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
755 if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
756 if (!UpdateOverlayInfo(newInfo, oldInfo)) {
757 APP_LOGD("update overlay info failed");
758 return false;
759 }
760 }
761 if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
762 APP_LOGD("update overlay info failed");
763 return false;
764 }
765 #endif
766 return true;
767 }
768
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const769 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
770 int32_t appIndex) const
771 {
772 int32_t requestUserId = GetUserId(userId);
773 if (requestUserId == Constants::INVALID_USERID) {
774 APP_LOGE("request user id is invalid");
775 return false;
776 }
777
778 ElementName element = want.GetElement();
779 std::string bundleName = element.GetBundleName();
780 std::string abilityName = element.GetAbilityName();
781 LOG_D(BMS_TAG_QUERY, "QueryAbilityInfo bundleName:%{public}s abilityName:%{public}s",
782 bundleName.c_str(), abilityName.c_str());
783 // explicit query
784 if (!bundleName.empty() && !abilityName.empty()) {
785 bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
786 if (!ret) {
787 LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryAbility no match -n %{public}s -a %{public}s -u %{public}d"
788 " -i %{public}d", bundleName.c_str(), abilityName.c_str(), userId, appIndex);
789 return false;
790 }
791 return true;
792 }
793 std::vector<AbilityInfo> abilityInfos;
794 bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
795 if (!ret) {
796 LOG_D(BMS_TAG_QUERY,
797 "implicit queryAbilityInfos error action:%{public}s uri:%{private}s type:%{public}s",
798 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
799 return false;
800 }
801 if (abilityInfos.size() == 0) {
802 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s",
803 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
804 return false;
805 }
806 abilityInfo = abilityInfos[0];
807 return true;
808 }
809
GetCloneAbilityInfos(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const810 void BundleDataMgr::GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos,
811 const ElementName &element, int32_t flags, int32_t userId) const
812 {
813 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
814 if (cloneAppIndexes.empty()) {
815 APP_LOGI("clone app index is empty");
816 return;
817 }
818 for (int32_t appIndex: cloneAppIndexes) {
819 AbilityInfo cloneAbilityInfo;
820 bool ret = ExplicitQueryCloneAbilityInfo(element, flags, userId, appIndex, cloneAbilityInfo);
821 if (ret) {
822 abilityInfos.emplace_back(cloneAbilityInfo);
823 }
824 }
825 }
826
GetCloneAbilityInfosV9(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const827 void BundleDataMgr::GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos,
828 const ElementName &element, int32_t flags, int32_t userId) const
829 {
830 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
831 if (cloneAppIndexes.empty()) {
832 APP_LOGI("clone app index is empty");
833 return;
834 }
835 for (int32_t appIndex: cloneAppIndexes) {
836 AbilityInfo cloneAbilityInfo;
837 ErrCode ret = ExplicitQueryCloneAbilityInfoV9(element, flags, userId, appIndex, cloneAbilityInfo);
838 if (ret == ERR_OK) {
839 abilityInfos.emplace_back(cloneAbilityInfo);
840 }
841 }
842 }
843
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const844 bool BundleDataMgr::QueryAbilityInfos(
845 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
846 {
847 int32_t requestUserId = GetUserId(userId);
848 if (requestUserId == Constants::INVALID_USERID) {
849 APP_LOGE("request user id is invalid");
850 return false;
851 }
852
853 ElementName element = want.GetElement();
854 std::string bundleName = element.GetBundleName();
855 std::string abilityName = element.GetAbilityName();
856 LOG_D(BMS_TAG_QUERY, "QueryAbilityInfos bundleName:%{public}s abilityName:%{public}s",
857 bundleName.c_str(), abilityName.c_str());
858 // explicit query
859 if (!bundleName.empty() && !abilityName.empty()) {
860 AbilityInfo abilityInfo;
861 bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
862 LOG_D(BMS_TAG_QUERY, "explicit query ret:%{public}d bundleName:%{public}s abilityName:%{public}s",
863 ret, bundleName.c_str(), abilityName.c_str());
864 if (ret) {
865 abilityInfos.emplace_back(abilityInfo);
866 }
867 // get cloneApp's abilityInfos
868 GetCloneAbilityInfos(abilityInfos, element, flags, userId);
869 LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryAbility size:%{public}zu -n %{public}s -a %{public}s -u %{public}d",
870 abilityInfos.size(), bundleName.c_str(), abilityName.c_str(), userId);
871 return !abilityInfos.empty();
872 }
873 // implicit query
874 (void)ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
875 ImplicitQueryCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
876 if (abilityInfos.size() == 0) {
877 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
878 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
879 requestUserId);
880 return false;
881 }
882 return true;
883 }
884
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const885 ErrCode BundleDataMgr::QueryAbilityInfosV9(
886 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
887 {
888 int32_t requestUserId = GetUserId(userId);
889 if (requestUserId == Constants::INVALID_USERID) {
890 APP_LOGE("request user id is invalid");
891 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
892 }
893
894 ElementName element = want.GetElement();
895 std::string bundleName = element.GetBundleName();
896 std::string abilityName = element.GetAbilityName();
897 LOG_D(BMS_TAG_QUERY, "QueryAbilityInfosV9 bundleName:%{public}s abilityName:%{public}s",
898 bundleName.c_str(), abilityName.c_str());
899 // explicit query
900 if (!bundleName.empty() && !abilityName.empty()) {
901 AbilityInfo abilityInfo;
902 ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
903 LOG_D(BMS_TAG_QUERY, "explicit queryV9 ret:%{public}d, bundleName:%{public}s abilityName:%{public}s",
904 ret, bundleName.c_str(), abilityName.c_str());
905 if (ret == ERR_OK) {
906 abilityInfos.emplace_back(abilityInfo);
907 }
908 // get cloneApp's abilityInfos
909 GetCloneAbilityInfosV9(abilityInfos, element, flags, userId);
910 LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryAbility V9 size:%{public}zu -n %{public}s -a %{public}s -u %{public}d",
911 abilityInfos.size(), bundleName.c_str(), abilityName.c_str(), userId);
912 if (abilityInfos.empty()) {
913 return ret;
914 }
915 return ERR_OK;
916 }
917 // implicit query
918 ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
919 ImplicitQueryCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
920 if (abilityInfos.empty()) {
921 if (ret != ERR_OK) {
922 return ret;
923 }
924 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
925 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
926 requestUserId);
927 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
928 }
929 return ERR_OK;
930 }
931
BatchQueryAbilityInfos(const std::vector<Want> & wants,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const932 ErrCode BundleDataMgr::BatchQueryAbilityInfos(
933 const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
934 {
935 int32_t requestUserId = GetUserId(userId);
936 if (requestUserId == Constants::INVALID_USERID) {
937 APP_LOGE("request user id is invalid");
938 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
939 }
940
941 for (size_t i = 0; i < wants.size(); i++) {
942 std::vector<AbilityInfo> tmpAbilityInfos;
943 ElementName element = wants[i].GetElement();
944 std::string bundleName = element.GetBundleName();
945 std::string abilityName = element.GetAbilityName();
946 APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
947 bundleName.c_str(), abilityName.c_str());
948 // explicit query
949 if (!bundleName.empty() && !abilityName.empty()) {
950 AbilityInfo abilityInfo;
951 ErrCode ret = ExplicitQueryAbilityInfoV9(wants[i], flags, requestUserId, abilityInfo);
952 if (ret != ERR_OK) {
953 APP_LOGE("explicit queryAbilityInfoV9 error:%{public}d, bundleName:%{public}s, abilityName:%{public}s",
954 ret, bundleName.c_str(), abilityName.c_str());
955 return ret;
956 }
957 tmpAbilityInfos.emplace_back(abilityInfo);
958 } else {
959 // implicit query
960 ErrCode ret = ImplicitQueryAbilityInfosV9(wants[i], flags, requestUserId, tmpAbilityInfos);
961 if (ret != ERR_OK) {
962 APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
963 wants[i].GetAction().c_str(), wants[i].GetUriString().c_str(), wants[i].GetType().c_str());
964 return ret;
965 }
966 }
967 for (size_t j = 0; j < tmpAbilityInfos.size(); j++) {
968 auto it = std::find_if(abilityInfos.begin(), abilityInfos.end(),
969 [&](const AbilityInfo& info) {
970 return tmpAbilityInfos[j].bundleName == info.bundleName &&
971 tmpAbilityInfos[j].moduleName == info.moduleName &&
972 tmpAbilityInfos[j].name == info.name;
973 });
974 if (it == abilityInfos.end()) {
975 abilityInfos.push_back(tmpAbilityInfos[j]);
976 }
977 }
978 }
979
980 if (abilityInfos.empty()) {
981 APP_LOGW("no matching abilityInfo");
982 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
983 }
984
985 return ERR_OK;
986 }
987
ExplicitQueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const988 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
989 AbilityInfo &abilityInfo, int32_t appIndex) const
990 {
991 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
992 ElementName element = want.GetElement();
993 std::string bundleName = element.GetBundleName();
994 std::string abilityName = element.GetAbilityName();
995 std::string moduleName = element.GetModuleName();
996 LOG_D(BMS_TAG_QUERY,
997 "ExplicitQueryAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
998 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
999 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1000
1001 int32_t requestUserId = GetUserId(userId);
1002 if (requestUserId == Constants::INVALID_USERID) {
1003 APP_LOGE("request user id is invalid");
1004 return false;
1005 }
1006
1007 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1008 InnerBundleInfo innerBundleInfo;
1009 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
1010 LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
1011 return false;
1012 }
1013 // explict query from sandbox manager
1014 if (appIndex > 0) {
1015 if (sandboxAppHelper_ == nullptr) {
1016 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1017 return false;
1018 }
1019 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1020 if (ret != ERR_OK) {
1021 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1022 ret, bundleName.c_str());
1023 return false;
1024 }
1025 }
1026
1027 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1028 auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
1029 if (!ability) {
1030 LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbility not found UIAbility -n %{public}s -m %{public}s -a %{public}s"
1031 " -u %{public}d", bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), responseUserId);
1032 return false;
1033 }
1034 return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1035 }
1036
ExplicitQueryAbilityInfoV9(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const1037 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
1038 AbilityInfo &abilityInfo, int32_t appIndex) const
1039 {
1040 ElementName element = want.GetElement();
1041 std::string bundleName = element.GetBundleName();
1042 std::string abilityName = element.GetAbilityName();
1043 std::string moduleName = element.GetModuleName();
1044 LOG_D(BMS_TAG_QUERY,
1045 "ExplicitQueryAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
1046 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1047 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1048 int32_t requestUserId = GetUserId(userId);
1049 if (requestUserId == Constants::INVALID_USERID) {
1050 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1051 }
1052 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1053 InnerBundleInfo innerBundleInfo;
1054 if (appIndex == 0) {
1055 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
1056 if (ret != ERR_OK) {
1057 LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
1058 return ret;
1059 }
1060 }
1061 // explict query from sandbox manager
1062 if (appIndex > 0) {
1063 if (sandboxAppHelper_ == nullptr) {
1064 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1065 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1066 }
1067 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1068 if (ret != ERR_OK) {
1069 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1070 ret, bundleName.c_str());
1071 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1072 }
1073 }
1074
1075 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1076 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
1077 if (!ability) {
1078 LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 not found UIAbility -n %{public}s -m %{public}s "
1079 "-a %{public}s", bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1080 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1081 }
1082
1083 return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1084 }
1085
FilterAbilityInfosByModuleName(const std::string & moduleName,std::vector<AbilityInfo> & abilityInfos) const1086 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
1087 std::vector<AbilityInfo> &abilityInfos) const
1088 {
1089 LOG_D(BMS_TAG_QUERY, "FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
1090 if (moduleName.empty()) {
1091 return;
1092 }
1093 for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
1094 if (iter->moduleName != moduleName) {
1095 iter = abilityInfos.erase(iter);
1096 } else {
1097 ++iter;
1098 }
1099 }
1100 }
1101
ImplicitQueryCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1102 void BundleDataMgr::ImplicitQueryCloneAbilityInfos(
1103 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1104 {
1105 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfos");
1106 int32_t requestUserId = GetUserId(userId);
1107 if (requestUserId == Constants::INVALID_USERID) {
1108 return;
1109 }
1110
1111 if (want.GetAction().empty() && want.GetEntities().empty()
1112 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1113 LOG_E(BMS_TAG_QUERY, "param invalid");
1114 return;
1115 }
1116 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1117 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1118 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1119 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1120 if (bundleInfos_.empty()) {
1121 LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1122 return;
1123 }
1124 std::string bundleName = want.GetElement().GetBundleName();
1125 if (!bundleName.empty()) {
1126 // query in current bundleName
1127 if (!ImplicitQueryCurCloneAbilityInfos(want, flags, requestUserId, abilityInfos)) {
1128 return;
1129 }
1130 } else {
1131 // query all
1132 ImplicitQueryAllCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
1133 }
1134 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1135 // sort by priority, descending order.
1136 if (abilityInfos.size() > 1) {
1137 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1138 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1139 }
1140 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfos");
1141 }
1142
ImplicitQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1143 bool BundleDataMgr::ImplicitQueryAbilityInfos(
1144 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1145 {
1146 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1147 int32_t requestUserId = GetUserId(userId);
1148 if (requestUserId == Constants::INVALID_USERID) {
1149 return false;
1150 }
1151
1152 if (want.GetAction().empty() && want.GetEntities().empty()
1153 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1154 LOG_W(BMS_TAG_QUERY, "param invalid");
1155 return false;
1156 }
1157 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1158 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1159 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1160 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1161 if (bundleInfos_.empty()) {
1162 LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1163 return false;
1164 }
1165 std::string bundleName = want.GetElement().GetBundleName();
1166 if (!bundleName.empty()) {
1167 // query in current bundleName
1168 if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
1169 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s",
1170 bundleName.c_str());
1171 return false;
1172 }
1173 } else {
1174 // query all
1175 ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
1176 }
1177 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1178 // sort by priority, descending order.
1179 if (abilityInfos.size() > 1) {
1180 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1181 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1182 }
1183 return true;
1184 }
1185
ImplicitQueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1186 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
1187 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1188 {
1189 int32_t requestUserId = GetUserId(userId);
1190 if (requestUserId == Constants::INVALID_USERID) {
1191 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1192 }
1193
1194 if (want.GetAction().empty() && want.GetEntities().empty()
1195 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1196 LOG_E(BMS_TAG_QUERY, "param invalid");
1197 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1198 }
1199 LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1200 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1201 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1202 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1203 if (bundleInfos_.empty()) {
1204 APP_LOGW("bundleInfos_ is empty");
1205 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1206 }
1207 std::string bundleName = want.GetElement().GetBundleName();
1208 if (!bundleName.empty()) {
1209 // query in current bundleName
1210 ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1211 if (ret != ERR_OK) {
1212 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed bundleName:%{public}s",
1213 bundleName.c_str());
1214 return ret;
1215 }
1216 } else {
1217 // query all
1218 ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1219 }
1220 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1221 // sort by priority, descending order.
1222 if (abilityInfos.size() > 1) {
1223 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1224 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1225 }
1226 return ERR_OK;
1227 }
1228
ImplicitQueryCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1229 void BundleDataMgr::ImplicitQueryCloneAbilityInfosV9(
1230 const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1231 {
1232 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfosV9");
1233 int32_t requestUserId = GetUserId(userId);
1234 if (requestUserId == Constants::INVALID_USERID) {
1235 return;
1236 }
1237 if (want.GetAction().empty() && want.GetEntities().empty()
1238 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1239 LOG_E(BMS_TAG_QUERY, "param invalid");
1240 return;
1241 }
1242 LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1243 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1244 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1245
1246 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1247 if (bundleInfos_.empty()) {
1248 APP_LOGW("bundleInfos_ is empty");
1249 return;
1250 }
1251 std::string bundleName = want.GetElement().GetBundleName();
1252 if (!bundleName.empty()) {
1253 // query in current bundleName
1254 if (!ImplicitQueryCurCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos)) {
1255 return;
1256 }
1257 } else {
1258 // query all
1259 ImplicitQueryAllCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
1260 }
1261 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1262 // sort by priority, descending order.
1263 if (abilityInfos.size() > 1) {
1264 std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1265 [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1266 }
1267 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfosV9");
1268 }
1269
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1270 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
1271 const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const
1272 {
1273 LOG_D(BMS_TAG_QUERY,
1274 "begin to QueryAbilityInfoWithFlags flags=%{public}d,userId=%{public}d,appIndex=%{public}d",
1275 flags, userId, appIndex);
1276 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1277 !innerBundleInfo.IsSystemApp()) {
1278 LOG_W(BMS_TAG_QUERY, "no system app ability info for this calling");
1279 return false;
1280 }
1281 if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1282 if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1283 LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1284 option->bundleName.c_str(), option->name.c_str());
1285 return false;
1286 }
1287 }
1288 info = (*option);
1289 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
1290 info.permissions.clear();
1291 }
1292 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1293 info.metaData.customizeData.clear();
1294 info.metadata.clear();
1295 }
1296 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
1297 info.skills.clear();
1298 }
1299 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
1300 innerBundleInfo.GetApplicationInfo(
1301 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
1302 }
1303 // set uid for NAPI cache use
1304 InnerBundleUserInfo innerBundleUserInfo;
1305 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1306 if (appIndex == 0) {
1307 info.uid = innerBundleUserInfo.uid;
1308 } else {
1309 std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1310 if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1311 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1312 info.uid = cloneInfo.uid;
1313 info.appIndex = cloneInfo.appIndex;
1314 } else {
1315 LOG_W(BMS_TAG_QUERY, "can't find cloneInfos");
1316 return false;
1317 }
1318 }
1319 }
1320 return true;
1321 }
1322
IsSystemApp(const std::string & bundleName,bool & isSystemApp)1323 ErrCode BundleDataMgr::IsSystemApp(const std::string &bundleName, bool &isSystemApp)
1324 {
1325 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1326 auto bundleInfoItem = bundleInfos_.find(bundleName);
1327 if (bundleInfoItem == bundleInfos_.end()) {
1328 APP_LOGW("%{public}s not found", bundleName.c_str());
1329 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1330 }
1331 isSystemApp = bundleInfoItem->second.IsSystemApp();
1332 return ERR_OK;
1333 }
1334
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1335 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
1336 int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info,
1337 int32_t appIndex) const
1338 {
1339 LOG_D(BMS_TAG_QUERY, "begin to QueryAbilityInfoWithFlagsV9");
1340 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1341 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
1342 !innerBundleInfo.IsSystemApp()) {
1343 LOG_W(BMS_TAG_QUERY, "target not system app");
1344 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1345 }
1346 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1347 if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1348 LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1349 option->bundleName.c_str(), option->name.c_str());
1350 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1351 }
1352 }
1353 info = (*option);
1354 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1355 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1356 info.permissions.clear();
1357 }
1358 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1359 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1360 info.metaData.customizeData.clear();
1361 info.metadata.clear();
1362 }
1363 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1364 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1365 info.skills.clear();
1366 }
1367 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1368 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1369 innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1370 userId, info.applicationInfo, appIndex);
1371 }
1372 // set uid for NAPI cache use
1373 InnerBundleUserInfo innerBundleUserInfo;
1374 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1375 if (appIndex == 0) {
1376 info.uid = innerBundleUserInfo.uid;
1377 } else {
1378 std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1379 if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1380 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1381 info.uid = cloneInfo.uid;
1382 info.appIndex = cloneInfo.appIndex;
1383 } else {
1384 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1385 }
1386 }
1387 }
1388 return ERR_OK;
1389 }
1390
ImplicitQueryCurAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1391 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1392 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1393 {
1394 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfos");
1395 std::string bundleName = want.GetElement().GetBundleName();
1396 InnerBundleInfo innerBundleInfo;
1397 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
1398 LOG_W(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s", bundleName.c_str());
1399 return false;
1400 }
1401 if (appIndex > 0) {
1402 if (sandboxAppHelper_ == nullptr) {
1403 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1404 return false;
1405 }
1406 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1407 if (ret != ERR_OK) {
1408 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode:%{public}d bundleName:%{public}s",
1409 ret, bundleName.c_str());
1410 return false;
1411 }
1412 }
1413 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1414 std::vector<std::string> mimeTypes;
1415 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1416 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1417 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1418 return true;
1419 }
1420
ImplicitQueryCurCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1421 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1422 std::vector<AbilityInfo> &abilityInfos) const
1423 {
1424 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfos");
1425 std::string bundleName = want.GetElement().GetBundleName();
1426 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1427 if (cloneAppIndexes.empty()) {
1428 return false;
1429 }
1430 std::vector<std::string> mimeTypes;
1431 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1432 for (int32_t appIndex: cloneAppIndexes) {
1433 InnerBundleInfo innerBundleInfo;
1434 if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex)) {
1435 continue;
1436 }
1437 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1438
1439 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1440 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1441 }
1442 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfos");
1443 return true;
1444 }
1445
ImplicitQueryCurAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1446 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1447 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1448 {
1449 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1450 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfosV9");
1451 std::string bundleName = want.GetElement().GetBundleName();
1452 InnerBundleInfo innerBundleInfo;
1453 if (appIndex == 0) {
1454 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1455 if (ret != ERR_OK) {
1456 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s",
1457 bundleName.c_str());
1458 return ret;
1459 }
1460 }
1461 if (appIndex > 0) {
1462 if (sandboxAppHelper_ == nullptr) {
1463 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1464 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1465 }
1466 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1467 if (ret != ERR_OK) {
1468 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d bundleName:%{public}s",
1469 ret, bundleName.c_str());
1470 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1471 }
1472 }
1473 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1474 std::vector<std::string> mimeTypes;
1475 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1476 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1477 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1478 return ERR_OK;
1479 }
1480
ImplicitQueryCurCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1481 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1482 std::vector<AbilityInfo> &abilityInfos) const
1483 {
1484 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfosV9");
1485 std::string bundleName = want.GetElement().GetBundleName();
1486
1487 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1488 if (cloneAppIndexes.empty()) {
1489 return false;
1490 }
1491 std::vector<std::string> mimeTypes;
1492 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1493 for (int32_t appIndex: cloneAppIndexes) {
1494 InnerBundleInfo innerBundleInfo;
1495 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
1496 if (ret != ERR_OK) {
1497 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1498 bundleName.c_str(), appIndex);
1499 continue;
1500 }
1501 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1502 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1503 FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1504 }
1505 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfosV9");
1506 return true;
1507 }
1508
ImplicitQueryAllAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1509 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1510 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1511 {
1512 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfos");
1513 int32_t requestUserId = GetUserId(userId);
1514 if (requestUserId == Constants::INVALID_USERID) {
1515 LOG_W(BMS_TAG_QUERY, "invalid userId");
1516 return;
1517 }
1518 std::vector<std::string> mimeTypes;
1519 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1520 // query from bundleInfos_
1521 if (appIndex == 0) {
1522 for (const auto &item : bundleInfos_) {
1523 const InnerBundleInfo &innerBundleInfo = item.second;
1524 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1525 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1526 LOG_D(BMS_TAG_QUERY,
1527 "ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1528 innerBundleInfo.GetBundleName().c_str(), responseUserId);
1529 continue;
1530 }
1531 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1532 }
1533 } else {
1534 // query from sandbox manager for sandbox bundle
1535 if (sandboxAppHelper_ == nullptr) {
1536 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1537 return;
1538 }
1539 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1540 for (const auto &item : sandboxMap) {
1541 InnerBundleInfo info;
1542 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1543 if (pos == std::string::npos) {
1544 LOG_D(BMS_TAG_QUERY, "sandbox map contains invalid element");
1545 continue;
1546 }
1547 std::string innerBundleName = item.first.substr(pos + 1);
1548 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1549 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1550 continue;
1551 }
1552 int32_t responseUserId = info.GetResponseUserId(userId);
1553 GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1554 }
1555 }
1556 APP_LOGD("finish to ImplicitQueryAllAbilityInfos");
1557 }
1558
ImplicitQueryAllCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1559 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1560 std::vector<AbilityInfo> &abilityInfos) const
1561 {
1562 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfos");
1563 int32_t requestUserId = GetUserId(userId);
1564 if (requestUserId == Constants::INVALID_USERID) {
1565 LOG_W(BMS_TAG_QUERY, "invalid userId");
1566 return;
1567 }
1568 std::vector<std::string> mimeTypes;
1569 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1570 for (const auto &item : bundleInfos_) {
1571 const InnerBundleInfo &innerBundleInfo = item.second;
1572 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
1573 if (cloneAppIndexes.empty()) {
1574 continue;
1575 }
1576 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1577 for (int32_t appIndex: cloneAppIndexes) {
1578 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
1579 LOG_D(BMS_TAG_QUERY,
1580 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
1581 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
1582 continue;
1583 }
1584 GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1585 }
1586 }
1587 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfos");
1588 }
1589
ImplicitQueryAllAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1590 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1591 std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1592 {
1593 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1594 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfosV9");
1595 // query from bundleInfos_
1596 std::vector<std::string> mimeTypes;
1597 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1598 if (appIndex == 0) {
1599 for (const auto &item : bundleInfos_) {
1600 const InnerBundleInfo &innerBundleInfo = item.second;
1601 ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
1602 if (ret != ERR_OK) {
1603 continue;
1604 }
1605
1606 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1607 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1608 }
1609 } else {
1610 // query from sandbox manager for sandbox bundle
1611 if (sandboxAppHelper_ == nullptr) {
1612 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1613 return;
1614 }
1615 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1616 for (const auto &item : sandboxMap) {
1617 InnerBundleInfo info;
1618 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1619 if (pos == std::string::npos) {
1620 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
1621 continue;
1622 }
1623 std::string innerBundleName = item.first.substr(pos + 1);
1624 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1625 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1626 continue;
1627 }
1628
1629 int32_t responseUserId = info.GetResponseUserId(userId);
1630 GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1631 }
1632 }
1633 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllAbilityInfosV9");
1634 }
1635
ImplicitQueryAllCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1636 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1637 std::vector<AbilityInfo> &abilityInfos) const
1638 {
1639 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfosV9");
1640 std::vector<std::string> mimeTypes;
1641 MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1642 for (const auto &item : bundleInfos_) {
1643 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(item.second.GetBundleName(), userId);
1644 if (cloneAppIndexes.empty()) {
1645 continue;
1646 }
1647 for (int32_t appIndex: cloneAppIndexes) {
1648 InnerBundleInfo innerBundleInfo;
1649 ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId, appIndex);
1650 if (ret != ERR_OK) {
1651 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1652 item.first.c_str(), appIndex);
1653 continue;
1654 }
1655
1656 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1657 GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1658 }
1659 }
1660 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfosV9");
1661 }
1662
CheckAbilityInfoFlagExist(int32_t flags,AbilityInfoFlag abilityInfoFlag) const1663 bool BundleDataMgr::CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const
1664 {
1665 return (static_cast<uint32_t>(flags) & static_cast<uint32_t>(abilityInfoFlag)) == abilityInfoFlag;
1666 }
1667
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) const1668 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags, const InnerBundleInfo &info,
1669 int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1670 const std::vector<std::string> ¶mMimeTypes, int32_t appIndex) const
1671 {
1672 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1673 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_SYSTEMAPP_ONLY) && !info.IsSystemApp()) {
1674 return;
1675 }
1676 const std::map<std::string, std::vector<Skill>> &skillInfos = info.GetInnerSkillInfos();
1677 for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1678 bool isPrivateType = MatchPrivateType(
1679 want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1680 auto skillsPair = skillInfos.find(abilityInfoPair.first);
1681 if (skillsPair == skillInfos.end()) {
1682 continue;
1683 }
1684 for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1685 const Skill &skill = skillsPair->second[skillIndex];
1686 size_t matchUriIndex = 0;
1687 if (isPrivateType || skill.Match(want, matchUriIndex)) {
1688 AbilityInfo abilityinfo = InnerAbilityInfo::ConvertToAbilityInfo(abilityInfoPair.second);
1689 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1690 continue;
1691 }
1692 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_DISABLE) &&
1693 !info.IsAbilityEnabled(abilityinfo, GetUserId(userId), appIndex)) {
1694 LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityinfo.name.c_str());
1695 continue;
1696 }
1697 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_APPLICATION)) {
1698 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1699 userId, abilityinfo.applicationInfo, appIndex);
1700 }
1701 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_PERMISSION)) {
1702 abilityinfo.permissions.clear();
1703 }
1704 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_METADATA)) {
1705 abilityinfo.metaData.customizeData.clear();
1706 abilityinfo.metadata.clear();
1707 }
1708 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL)) {
1709 abilityinfo.skills.clear();
1710 }
1711 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL_URI)) {
1712 AddSkillUrisInfo(skillsPair->second, abilityinfo.skillUri, skillIndex, matchUriIndex);
1713 }
1714 abilityinfo.appIndex = appIndex;
1715 abilityInfos.emplace_back(abilityinfo);
1716 break;
1717 }
1718 }
1719 }
1720 }
1721
AddSkillUrisInfo(const std::vector<Skill> & skills,std::vector<SkillUriForAbilityAndExtension> & skillUris,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex) const1722 void BundleDataMgr::AddSkillUrisInfo(const std::vector<Skill> &skills,
1723 std::vector<SkillUriForAbilityAndExtension> &skillUris,
1724 std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const
1725 {
1726 for (size_t skillIndex = 0; skillIndex < skills.size(); ++skillIndex) {
1727 const Skill &skill = skills[skillIndex];
1728 for (size_t uriIndex = 0; uriIndex < skill.uris.size(); ++uriIndex) {
1729 const SkillUri &uri = skill.uris[uriIndex];
1730 SkillUriForAbilityAndExtension skillinfo;
1731 skillinfo.scheme = uri.scheme;
1732 skillinfo.host = uri.host;
1733 skillinfo.port = uri.port;
1734 skillinfo.path = uri.path;
1735 skillinfo.pathStartWith = uri.pathStartWith;
1736 skillinfo.pathRegex = uri.pathRegex;
1737 skillinfo.type = uri.type;
1738 skillinfo.utd = uri.utd;
1739 skillinfo.maxFileSupported = uri.maxFileSupported;
1740 skillinfo.linkFeature = uri.linkFeature;
1741 if (matchSkillIndex.has_value() && matchUriIndex.has_value() &&
1742 skillIndex == matchSkillIndex.value() && uriIndex == matchUriIndex.value()) {
1743 skillinfo.isMatch = true;
1744 }
1745 skillUris.emplace_back(skillinfo);
1746 }
1747 }
1748 }
1749
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) const1750 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
1751 AbilityInfo &abilityInfo, int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos,
1752 std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
1753 {
1754 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1755 GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1756 if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId), appIndex)) {
1757 LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityInfo.name.c_str());
1758 return;
1759 }
1760 }
1761 if ((static_cast<uint32_t>(flags) &
1762 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1763 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1764 info.GetApplicationInfoV9(static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1765 userId, abilityInfo.applicationInfo, appIndex);
1766 }
1767 if ((static_cast<uint32_t>(flags) &
1768 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1769 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1770 abilityInfo.permissions.clear();
1771 }
1772 if ((static_cast<uint32_t>(flags) &
1773 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1774 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1775 abilityInfo.metaData.customizeData.clear();
1776 abilityInfo.metadata.clear();
1777 }
1778 if ((static_cast<uint32_t>(flags) &
1779 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1780 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1781 abilityInfo.skills.clear();
1782 }
1783 if ((static_cast<uint32_t>(flags) &
1784 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) ==
1785 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) {
1786 AddSkillUrisInfo(skills, abilityInfo.skillUri, matchSkillIndex, matchUriIndex);
1787 }
1788 if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
1789 // set uid for NAPI cache use
1790 InnerBundleUserInfo innerBundleUserInfo;
1791 if (info.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1792 std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1793 if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1794 abilityInfo.uid = innerBundleUserInfo.cloneInfos.at(appIndexKey).uid;
1795 abilityInfo.appIndex = innerBundleUserInfo.cloneInfos.at(appIndexKey).appIndex;
1796 }
1797 }
1798 }
1799 infos.emplace_back(abilityInfo);
1800 }
1801
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) const1802 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags, const InnerBundleInfo &info,
1803 int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1804 const std::vector<std::string> ¶mMimeTypes, int32_t appIndex) const
1805 {
1806 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1807 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1808 static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1809 LOG_W(BMS_TAG_QUERY, "target not system app");
1810 return;
1811 }
1812 const std::map<std::string, std::vector<Skill>> &skillInfos = info.GetInnerSkillInfos();
1813 for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1814 AbilityInfo abilityinfo = InnerAbilityInfo::ConvertToAbilityInfo(abilityInfoPair.second);
1815 auto skillsPair = skillInfos.find(abilityInfoPair.first);
1816 if (skillsPair == skillInfos.end()) {
1817 continue;
1818 }
1819 bool isPrivateType = MatchPrivateType(
1820 want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1821 if (isPrivateType) {
1822 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1823 std::nullopt, std::nullopt, appIndex);
1824 continue;
1825 }
1826 if (want.GetAction() == SHARE_ACTION) {
1827 if (!MatchShare(want, skillsPair->second)) {
1828 continue;
1829 }
1830 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1831 std::nullopt, std::nullopt, appIndex);
1832 continue;
1833 }
1834 for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1835 const Skill &skill = skillsPair->second[skillIndex];
1836 size_t matchUriIndex = 0;
1837 if (skill.Match(want, matchUriIndex)) {
1838 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1839 continue;
1840 }
1841 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1842 skillIndex, matchUriIndex, appIndex);
1843 break;
1844 }
1845 }
1846 }
1847 }
1848
MatchShare(const Want & want,const std::vector<Skill> & skills) const1849 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1850 {
1851 if (want.GetAction() != SHARE_ACTION) {
1852 LOG_E(BMS_TAG_QUERY, "action not action");
1853 return false;
1854 }
1855 std::vector<Skill> shareActionSkills = FindSkillsContainShareAction(skills);
1856 if (shareActionSkills.empty()) {
1857 LOG_D(BMS_TAG_QUERY, "shareActionSkills is empty");
1858 return false;
1859 }
1860 auto wantParams = want.GetParams();
1861 auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1862 int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1863 if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1864 LOG_W(BMS_TAG_QUERY, "Invalid total count");
1865 }
1866 auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1867 auto utds = shareSummary.KeySet();
1868 for (auto &skill : shareActionSkills) {
1869 bool match = true;
1870 for (const auto &utd : utds) {
1871 int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1872 if (!MatchUtd(skill, utd, count)) {
1873 match = false;
1874 break;
1875 }
1876 }
1877 if (match) {
1878 return true;
1879 }
1880 }
1881 return false;
1882 }
1883
MatchUtd(Skill & skill,const std::string & utd,int32_t count) const1884 bool BundleDataMgr::MatchUtd(Skill &skill, const std::string &utd, int32_t count) const
1885 {
1886 if (skill.uris.empty() || count <= DEFAULT_SUMMARY_COUNT) {
1887 LOG_W(BMS_TAG_QUERY, "skill.uris is empty or invalid utd count");
1888 return false;
1889 }
1890 bool isMatch = false;
1891 for (SkillUri &skillUri : skill.uris) {
1892 if (!skillUri.utd.empty()) {
1893 if (MatchUtd(skillUri.utd, utd)) {
1894 skillUri.maxFileSupported -= count;
1895 isMatch = true;
1896 if (skillUri.maxFileSupported < 0) {
1897 return false;
1898 }
1899 }
1900 } else {
1901 if (MatchTypeWithUtd(skillUri.type, utd)) {
1902 skillUri.maxFileSupported -= count;
1903 isMatch = true;
1904 if (skillUri.maxFileSupported < 0) {
1905 return false;
1906 }
1907 }
1908 }
1909 }
1910 return isMatch;
1911 }
1912
MatchUtd(const std::string & skillUtd,const std::string & wantUtd) const1913 bool BundleDataMgr::MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const
1914 {
1915 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1916 LOG_D(BMS_TAG_QUERY, "skillUtd %{public}s, wantUtd %{public}s", skillUtd.c_str(), wantUtd.c_str());
1917 std::shared_ptr<UDMF::TypeDescriptor> wantTypeDescriptor;
1918 auto ret = UDMF::UtdClient::GetInstance().GetTypeDescriptor(wantUtd, wantTypeDescriptor);
1919 if (ret != ERR_OK || wantTypeDescriptor == nullptr) {
1920 LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1921 return false;
1922 }
1923 bool matchRet = false;
1924 ret = wantTypeDescriptor->BelongsTo(skillUtd, matchRet);
1925 if (ret != ERR_OK) {
1926 LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1927 return false;
1928 }
1929 return matchRet;
1930 #endif
1931 return false;
1932 }
1933
MatchTypeWithUtd(const std::string & mimeType,const std::string & wantUtd) const1934 bool BundleDataMgr::MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const
1935 {
1936 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1937 LOG_D(BMS_TAG_QUERY, "mimeType %{public}s, wantUtd %{public}s", mimeType.c_str(), wantUtd.c_str());
1938 std::vector<std::string> typeUtdVector = BundleUtil::GetUtdVectorByMimeType(mimeType);
1939 for (const std::string &typeUtd : typeUtdVector) {
1940 if (MatchUtd(typeUtd, wantUtd)) {
1941 return true;
1942 }
1943 }
1944 return false;
1945 #endif
1946 return false;
1947 }
1948
FindSkillsContainShareAction(const std::vector<Skill> & skills) const1949 std::vector<Skill> BundleDataMgr::FindSkillsContainShareAction(const std::vector<Skill> &skills) const
1950 {
1951 std::vector<Skill> shareActionSkills;
1952 for (const auto &skill : skills) {
1953 auto &actions = skill.actions;
1954 auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1955 return SHARE_ACTION == action;
1956 });
1957 if (matchAction == actions.end()) {
1958 continue;
1959 }
1960 shareActionSkills.emplace_back(skill);
1961 }
1962 return shareActionSkills;
1963 }
1964
ModifyLauncherAbilityInfo(bool isStage,AbilityInfo & abilityInfo) const1965 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1966 {
1967 if (abilityInfo.labelId == 0) {
1968 if (isStage) {
1969 abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1970 abilityInfo.label = abilityInfo.applicationInfo.label;
1971 } else {
1972 abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1973 abilityInfo.label = abilityInfo.bundleName;
1974 }
1975 }
1976
1977 if (abilityInfo.iconId == 0) {
1978 abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1979 }
1980 }
1981
GetMatchLauncherAbilityInfos(const Want & want,const InnerBundleInfo & info,std::vector<AbilityInfo> & abilityInfos,int64_t installTime,int32_t userId) const1982 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1983 const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1984 int64_t installTime, int32_t userId) const
1985 {
1986 int32_t requestUserId = GetUserId(userId);
1987 if (requestUserId == Constants::INVALID_USERID) {
1988 APP_LOGD("request user id is invalid");
1989 return;
1990 }
1991 int32_t responseUserId = info.GetResponseUserId(requestUserId);
1992 if (responseUserId == Constants::INVALID_USERID) {
1993 APP_LOGD("response user id is invalid");
1994 return;
1995 }
1996 // get clone bundle info
1997 InnerBundleUserInfo bundleUserInfo;
1998 (void)info.GetInnerBundleUserInfo(responseUserId, bundleUserInfo);
1999 if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(info.GetBundleName()) !=
2000 ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) {
2001 GetMultiLauncherAbilityInfo(want, info, bundleUserInfo, installTime, abilityInfos);
2002 return;
2003 }
2004 AbilityInfo mainAbilityInfo;
2005 info.GetMainAbilityInfo(mainAbilityInfo);
2006 if (!mainAbilityInfo.name.empty() && (mainAbilityInfo.type == AbilityType::PAGE)) {
2007 APP_LOGD("bundleName %{public}s exist mainAbility", info.GetBundleName().c_str());
2008 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2009 responseUserId, mainAbilityInfo.applicationInfo);
2010 BmsExtensionDataMgr bmsExtensionDataMgr;
2011 if (mainAbilityInfo.applicationInfo.removable &&
2012 !bmsExtensionDataMgr.IsTargetApp(info.GetBundleName(), info.GetAppIdentifier())) {
2013 mainAbilityInfo.applicationInfo.removable = info.GetUninstallState();
2014 }
2015 mainAbilityInfo.installTime = installTime;
2016 // fix labelId or iconId is equal 0
2017 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), mainAbilityInfo);
2018 abilityInfos.emplace_back(mainAbilityInfo);
2019 GetMatchLauncherAbilityInfosForCloneInfos(info, mainAbilityInfo, bundleUserInfo,
2020 abilityInfos);
2021 return;
2022 }
2023 // add app detail ability
2024 if (info.GetBaseApplicationInfo().needAppDetail) {
2025 LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s add detail ability info", info.GetBundleName().c_str());
2026 std::string moduleName = "";
2027 auto ability = info.FindAbilityInfo(moduleName, ServiceConstants::APP_DETAIL_ABILITY, responseUserId);
2028 if (!ability) {
2029 LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s cant find ability", info.GetBundleName().c_str());
2030 return;
2031 }
2032 if (!info.GetIsNewVersion()) {
2033 ability->applicationInfo.label = info.GetBundleName();
2034 }
2035 ability->installTime = installTime;
2036 abilityInfos.emplace_back(*ability);
2037 GetMatchLauncherAbilityInfosForCloneInfos(info, *ability, bundleUserInfo, abilityInfos);
2038 }
2039 }
2040
GetMultiLauncherAbilityInfo(const Want & want,const InnerBundleInfo & info,const InnerBundleUserInfo & bundleUserInfo,int64_t installTime,std::vector<AbilityInfo> & abilityInfos) const2041 void BundleDataMgr::GetMultiLauncherAbilityInfo(const Want& want,
2042 const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo,
2043 int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const
2044 {
2045 int32_t count = 0;
2046 const std::map<std::string, std::vector<Skill>> &skillInfos = info.GetInnerSkillInfos();
2047 for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
2048 auto skillsPair = skillInfos.find(abilityInfoPair.first);
2049 if (skillsPair == skillInfos.end()) {
2050 continue;
2051 }
2052 for (const Skill& skill : skillsPair->second) {
2053 if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
2054 count++;
2055 AbilityInfo abilityInfo = InnerAbilityInfo::ConvertToAbilityInfo(abilityInfoPair.second);
2056 AbilityInfo tmpInfo = abilityInfo;
2057 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2058 bundleUserInfo.bundleUserInfo.userId, abilityInfo.applicationInfo);
2059 abilityInfo.installTime = installTime;
2060 // fix labelId or iconId is equal 0
2061 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), abilityInfo);
2062 abilityInfos.emplace_back(abilityInfo);
2063 GetMatchLauncherAbilityInfosForCloneInfos(info, tmpInfo, bundleUserInfo, abilityInfos);
2064 break;
2065 }
2066 }
2067 }
2068 APP_LOGI_NOFUNC("GetMultiLauncherAbilityInfo -n %{public}s has %{public}d launcher ability",
2069 info.GetBundleName().c_str(), count);
2070 }
2071
GetMatchLauncherAbilityInfosForCloneInfos(const InnerBundleInfo & info,const AbilityInfo & abilityInfo,const InnerBundleUserInfo & bundleUserInfo,std::vector<AbilityInfo> & abilityInfos) const2072 void BundleDataMgr::GetMatchLauncherAbilityInfosForCloneInfos(
2073 const InnerBundleInfo& info,
2074 const AbilityInfo &abilityInfo,
2075 const InnerBundleUserInfo &bundleUserInfo,
2076 std::vector<AbilityInfo>& abilityInfos) const
2077 {
2078 for (const auto &item : bundleUserInfo.cloneInfos) {
2079 APP_LOGD("bundleName:%{public}s appIndex:%{public}d start", info.GetBundleName().c_str(), item.second.appIndex);
2080 AbilityInfo cloneAbilityInfo = abilityInfo;
2081 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2082 bundleUserInfo.bundleUserInfo.userId, cloneAbilityInfo.applicationInfo, item.second.appIndex);
2083 cloneAbilityInfo.installTime = item.second.installTime;
2084 cloneAbilityInfo.uid = item.second.uid;
2085 cloneAbilityInfo.appIndex = item.second.appIndex;
2086 // fix labelId or iconId is equal 0
2087 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), cloneAbilityInfo);
2088 abilityInfos.emplace_back(cloneAbilityInfo);
2089 }
2090 }
2091
ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,ApplicationInfo & applicationInfo) const2092 void BundleDataMgr::ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2093 ApplicationInfo &applicationInfo) const
2094 {
2095 applicationInfo.accessTokenId = cloneInfo.accessTokenId;
2096 applicationInfo.accessTokenIdEx = cloneInfo.accessTokenIdEx;
2097 applicationInfo.enabled = cloneInfo.enabled;
2098 applicationInfo.uid = cloneInfo.uid;
2099 applicationInfo.appIndex = cloneInfo.appIndex;
2100 }
2101
ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,BundleInfo & bundleInfo) const2102 void BundleDataMgr::ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2103 BundleInfo &bundleInfo) const
2104 {
2105 bundleInfo.uid = cloneInfo.uid;
2106 bundleInfo.gid = cloneInfo.uid; // no gids, need add
2107 bundleInfo.installTime = cloneInfo.installTime;
2108 bundleInfo.appIndex = cloneInfo.appIndex;
2109 if (!bundleInfo.applicationInfo.bundleName.empty()) {
2110 ModifyApplicationInfoByCloneInfo(cloneInfo, bundleInfo.applicationInfo);
2111 }
2112 }
2113
GetCloneBundleInfos(const InnerBundleInfo & info,int32_t flags,int32_t userId,BundleInfo & bundleInfo,std::vector<BundleInfo> & bundleInfos) const2114 void BundleDataMgr::GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId,
2115 BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const
2116 {
2117 // get clone bundle info
2118 InnerBundleUserInfo bundleUserInfo;
2119 (void)info.GetInnerBundleUserInfo(userId, bundleUserInfo);
2120 if (bundleUserInfo.cloneInfos.empty()) {
2121 return;
2122 }
2123 LOG_D(BMS_TAG_QUERY, "app %{public}s start get bundle clone info",
2124 info.GetBundleName().c_str());
2125 for (const auto &item : bundleUserInfo.cloneInfos) {
2126 BundleInfo cloneBundleInfo;
2127 ErrCode ret = info.GetBundleInfoV9(flags, cloneBundleInfo, userId, item.second.appIndex);
2128 if (ret == ERR_OK) {
2129 ProcessCertificate(cloneBundleInfo, info.GetBundleName(), flags);
2130 ProcessBundleMenu(cloneBundleInfo, flags, true);
2131 ProcessBundleRouterMap(cloneBundleInfo, flags);
2132 bundleInfos.emplace_back(cloneBundleInfo);
2133 }
2134 }
2135 }
2136
GetBundleNameAndIndexByName(const std::string & keyName,std::string & bundleName,int32_t & appIndex) const2137 void BundleDataMgr::GetBundleNameAndIndexByName(
2138 const std::string &keyName, std::string &bundleName, int32_t &appIndex) const
2139 {
2140 bundleName = keyName;
2141 appIndex = 0;
2142 // for clone bundle name
2143 auto pos = keyName.find(CLONE_BUNDLE_PREFIX);
2144 if ((pos == std::string::npos) || (pos == 0)) {
2145 return;
2146 }
2147 std::string index = keyName.substr(0, pos);
2148 if (!OHOS::StrToInt(index, appIndex)) {
2149 appIndex = 0;
2150 return;
2151 }
2152 bundleName = keyName.substr(pos + strlen(CLONE_BUNDLE_PREFIX));
2153 }
2154
GetCloneAppIndexes(const std::string & bundleName,int32_t userId) const2155 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const
2156 {
2157 std::vector<int32_t> cloneAppIndexes;
2158 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2159 if (userId == Constants::ANY_USERID) {
2160 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2161 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2162 return cloneAppIndexes;
2163 }
2164 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2165 }
2166 int32_t requestUserId = GetUserId(userId);
2167 if (requestUserId == Constants::INVALID_USERID) {
2168 return cloneAppIndexes;
2169 }
2170 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2171 auto infoItem = bundleInfos_.find(bundleName);
2172 if (infoItem == bundleInfos_.end()) {
2173 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2174 return cloneAppIndexes;
2175 }
2176 const InnerBundleInfo &bundleInfo = infoItem->second;
2177 InnerBundleUserInfo innerBundleUserInfo;
2178 if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2179 return cloneAppIndexes;
2180 }
2181 const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2182 if (cloneInfos.empty()) {
2183 return cloneAppIndexes;
2184 }
2185 for (const auto &cloneInfo : cloneInfos) {
2186 LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes: %{public}d", cloneInfo.second.appIndex);
2187 cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2188 }
2189 return cloneAppIndexes;
2190 }
2191
GetCloneAppIndexes(const std::string & bundleName) const2192 std::set<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName) const
2193 {
2194 std::set<int32_t> cloneAppIndexes;
2195 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2196 auto infoItem = bundleInfos_.find(bundleName);
2197 if (infoItem == bundleInfos_.end()) {
2198 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2199 return cloneAppIndexes;
2200 }
2201 return infoItem->second.GetCloneBundleAppIndexes();
2202 }
2203
GetCloneAppIndexesNoLock(const std::string & bundleName,int32_t userId) const2204 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const
2205 {
2206 std::vector<int32_t> cloneAppIndexes;
2207 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2208 if (userId == Constants::ANY_USERID) {
2209 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2210 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2211 return cloneAppIndexes;
2212 }
2213 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2214 }
2215 int32_t requestUserId = GetUserId(userId);
2216 if (requestUserId == Constants::INVALID_USERID) {
2217 return cloneAppIndexes;
2218 }
2219 auto infoItem = bundleInfos_.find(bundleName);
2220 if (infoItem == bundleInfos_.end()) {
2221 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2222 return cloneAppIndexes;
2223 }
2224 const InnerBundleInfo &bundleInfo = infoItem->second;
2225 InnerBundleUserInfo innerBundleUserInfo;
2226 if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2227 return cloneAppIndexes;
2228 }
2229 const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2230 if (cloneInfos.empty()) {
2231 return cloneAppIndexes;
2232 }
2233 for (const auto &cloneInfo : cloneInfos) {
2234 LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes unLock: %{public}d", cloneInfo.second.appIndex);
2235 cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2236 }
2237 return cloneAppIndexes;
2238 }
2239
AddAppDetailAbilityInfo(InnerBundleInfo & info) const2240 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
2241 {
2242 InnerAbilityInfo appDetailAbility;
2243 appDetailAbility.name = ServiceConstants::APP_DETAIL_ABILITY;
2244 appDetailAbility.bundleName = info.GetBundleName();
2245 appDetailAbility.enabled = true;
2246 appDetailAbility.type = AbilityType::PAGE;
2247 appDetailAbility.isNativeAbility = true;
2248
2249 ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
2250 appDetailAbility.applicationName = applicationInfo.name;
2251 appDetailAbility.labelId = applicationInfo.labelResource.id;
2252 if (!info.GetIsNewVersion()) {
2253 appDetailAbility.labelId = 0;
2254 appDetailAbility.label = info.GetBundleName();
2255 }
2256 appDetailAbility.iconId = applicationInfo.iconResource.id;
2257 appDetailAbility.moduleName = applicationInfo.iconResource.moduleName;
2258
2259 if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
2260 LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo appDetailAbility.iconId is 0");
2261 // get system resource icon Id
2262 auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
2263 if (iter != bundleInfos_.end()) {
2264 LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo get system resource iconId");
2265 appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
2266 } else {
2267 LOG_W(BMS_TAG_QUERY, "AddAppDetailAbilityInfo error: ohos.global.systemres does not exist");
2268 }
2269 }
2270 // not show in the mission list
2271 appDetailAbility.removeMissionAfterTerminate = true;
2272 // set hapPath, for label resource
2273 auto innerModuleInfo = info.GetInnerModuleInfoByModuleName(appDetailAbility.moduleName);
2274 if (innerModuleInfo) {
2275 appDetailAbility.package = innerModuleInfo->modulePackage;
2276 appDetailAbility.hapPath = innerModuleInfo->hapPath;
2277 }
2278 appDetailAbility.visible = true;
2279 std::string keyName;
2280 keyName.append(appDetailAbility.bundleName).append(".")
2281 .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
2282 info.InsertAbilitiesInfo(keyName, appDetailAbility);
2283 }
2284
GetAllLauncherAbility(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2285 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2286 const int32_t userId, const int32_t requestUserId) const
2287 {
2288 for (const auto &item : bundleInfos_) {
2289 const InnerBundleInfo &info = item.second;
2290 if (info.IsDisabled()) {
2291 LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2292 continue;
2293 }
2294 if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2295 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
2296 continue;
2297 }
2298 if (info.GetBaseBundleInfo().entryInstallationFree) {
2299 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon",
2300 info.GetBundleName().c_str());
2301 continue;
2302 }
2303
2304 // get installTime from innerBundleUserInfo
2305 int64_t installTime = 0;
2306 std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2307 std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2308 std::string userOneKey = info.GetBundleName() + "_" + std::to_string(1);
2309 auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2310 [&userIdKey, &userZeroKey, &userOneKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2311 return (infoMap.first == userIdKey || infoMap.first == userZeroKey || infoMap.first == userOneKey);
2312 });
2313 if (iter != info.GetInnerBundleUserInfos().end()) {
2314 installTime = iter->second.installTime;
2315 }
2316 GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
2317 }
2318 }
2319
GetLauncherAbilityByBundleName(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2320 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2321 const int32_t userId, const int32_t requestUserId) const
2322 {
2323 ElementName element = want.GetElement();
2324 std::string bundleName = element.GetBundleName();
2325 const auto &item = bundleInfos_.find(bundleName);
2326 if (item == bundleInfos_.end()) {
2327 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2328 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2329 }
2330 const InnerBundleInfo &info = item->second;
2331 if (info.IsDisabled()) {
2332 LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2333 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
2334 }
2335 if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2336 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2337 return ERR_OK;
2338 }
2339 if (info.GetBaseBundleInfo().entryInstallationFree) {
2340 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2341 return ERR_OK;
2342 }
2343 // get installTime from innerBundleUserInfo
2344 int64_t installTime = 0;
2345 std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2346 std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2347 std::string userOneKey = info.GetBundleName() + "_" + std::to_string(1);
2348 auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2349 [&userIdKey, &userZeroKey, &userOneKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2350 return (infoMap.first == userIdKey || infoMap.first == userZeroKey || infoMap.first == userOneKey);
2351 });
2352 if (iter != info.GetInnerBundleUserInfos().end()) {
2353 installTime = iter->second.installTime;
2354 }
2355 GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2356 FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2357 return ERR_OK;
2358 }
2359
QueryLauncherAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2360 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
2361 const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
2362 {
2363 int32_t requestUserId = GetUserId(userId);
2364 if (requestUserId == Constants::INVALID_USERID) {
2365 LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2366 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2367 }
2368 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2369 if (bundleInfos_.empty()) {
2370 LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
2371 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2372 }
2373
2374 ElementName element = want.GetElement();
2375 std::string bundleName = element.GetBundleName();
2376 if (bundleName.empty()) {
2377 // query all launcher ability
2378 GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
2379 return ERR_OK;
2380 }
2381 // query definite abilities by bundle name
2382 ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
2383 if (ret == ERR_OK) {
2384 LOG_D(BMS_TAG_QUERY, "ability infos have been found");
2385 }
2386 return ret;
2387 }
2388
GetLauncherAbilityInfoSync(const Want & want,const int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2389 ErrCode BundleDataMgr::GetLauncherAbilityInfoSync(const Want &want, const int32_t userId,
2390 std::vector<AbilityInfo> &abilityInfos) const
2391 {
2392 int32_t requestUserId = GetUserId(userId);
2393 if (requestUserId == Constants::INVALID_USERID) {
2394 LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2395 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2396 }
2397 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2398 ElementName element = want.GetElement();
2399 std::string bundleName = element.GetBundleName();
2400 const auto &item = bundleInfos_.find(bundleName);
2401 if (item == bundleInfos_.end()) {
2402 LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2403 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2404 }
2405 const InnerBundleInfo &info = item->second;
2406 if(!BundlePermissionMgr::IsSystemApp()){
2407 int32_t responseUserId = info.GetResponseUserId(userId);
2408 if (responseUserId == Constants::INVALID_USERID) {
2409 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2410 }
2411 }
2412 if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2413 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2414 return ERR_OK;
2415 }
2416 if (info.GetBaseBundleInfo().entryInstallationFree) {
2417 LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2418 return ERR_OK;
2419 }
2420 // get installTime from innerBundleUserInfo
2421 int64_t installTime = 0;
2422 std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2423 std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2424 std::string userOneKey = info.GetBundleName() + "_" + std::to_string(1);
2425 auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2426 [&userIdKey, &userZeroKey, &userOneKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2427 return (infoMap.first == userIdKey || infoMap.first == userZeroKey || infoMap.first == userOneKey);
2428 });
2429 if (iter != info.GetInnerBundleUserInfos().end()) {
2430 installTime = iter->second.installTime;
2431 }
2432 GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2433 FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2434 return ERR_OK;
2435 }
2436
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo) const2437 bool BundleDataMgr::QueryAbilityInfoByUri(
2438 const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
2439 {
2440 LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2441 int32_t requestUserId = GetUserId(userId);
2442 if (requestUserId == Constants::INVALID_USERID) {
2443 return false;
2444 }
2445
2446 if (abilityUri.empty()) {
2447 return false;
2448 }
2449 if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2450 return false;
2451 }
2452 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2453 if (bundleInfos_.empty()) {
2454 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2455 return false;
2456 }
2457 std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2458 auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2459 if (posFirstSeparator == std::string::npos) {
2460 return false;
2461 }
2462 auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2463 std::string uri;
2464 if (posSecondSeparator == std::string::npos) {
2465 uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2466 } else {
2467 uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2468 }
2469 for (const auto &item : bundleInfos_) {
2470 const InnerBundleInfo &info = item.second;
2471 if (info.IsDisabled()) {
2472 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2473 continue;
2474 }
2475
2476 int32_t responseUserId = info.GetResponseUserId(requestUserId);
2477 if (!info.GetApplicationEnabled(responseUserId)) {
2478 continue;
2479 }
2480
2481 auto ability = info.FindAbilityInfoByUri(uri);
2482 if (!ability) {
2483 continue;
2484 }
2485
2486 abilityInfo = (*ability);
2487 info.GetApplicationInfo(
2488 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
2489 abilityInfo.applicationInfo);
2490 return true;
2491 }
2492
2493 LOG_W(BMS_TAG_QUERY, "query abilityUri(%{private}s) failed", abilityUri.c_str());
2494 return false;
2495 }
2496
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)2497 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
2498 {
2499 LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2500 if (abilityUri.empty()) {
2501 return false;
2502 }
2503 if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2504 return false;
2505 }
2506 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2507 if (bundleInfos_.empty()) {
2508 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2509 return false;
2510 }
2511 std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2512 auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2513 if (posFirstSeparator == std::string::npos) {
2514 return false;
2515 }
2516 auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2517 std::string uri;
2518 if (posSecondSeparator == std::string::npos) {
2519 uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2520 } else {
2521 uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2522 }
2523
2524 for (auto &item : bundleInfos_) {
2525 InnerBundleInfo &info = item.second;
2526 if (info.IsDisabled()) {
2527 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2528 continue;
2529 }
2530 info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
2531 }
2532 if (abilityInfos.size() == 0) {
2533 return false;
2534 }
2535
2536 return true;
2537 }
2538
GetApplicationInfo(const std::string & appName,int32_t flags,const int userId,ApplicationInfo & appInfo) const2539 bool BundleDataMgr::GetApplicationInfo(
2540 const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
2541 {
2542 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2543 int32_t requestUserId = GetUserId(userId);
2544 if (requestUserId == Constants::INVALID_USERID) {
2545 return false;
2546 }
2547
2548 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2549 InnerBundleInfo innerBundleInfo;
2550 if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
2551 LOG_D(BMS_TAG_QUERY, "GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
2552 return false;
2553 }
2554
2555 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2556 innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
2557 return true;
2558 }
2559
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo,const int32_t appIndex) const2560 ErrCode BundleDataMgr::GetApplicationInfoV9(
2561 const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const
2562 {
2563 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2564 int32_t requestUserId = GetUserId(userId);
2565 if (requestUserId == Constants::INVALID_USERID) {
2566 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2567 }
2568
2569 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2570 InnerBundleInfo innerBundleInfo;
2571 int32_t flag = 0;
2572 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2573 == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2574 flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2575 }
2576 auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId, appIndex);
2577 if (ret != ERR_OK) {
2578 LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2579 appName.c_str(), requestUserId, appIndex);
2580 return ret;
2581 }
2582
2583 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2584 ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo, appIndex);
2585 if (ret != ERR_OK) {
2586 LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2587 appName.c_str(), responseUserId, appIndex);
2588 return ret;
2589 }
2590 return ret;
2591 }
2592
GetApplicationInfoWithResponseId(const std::string & appName,int32_t flags,int32_t & userId,ApplicationInfo & appInfo) const2593 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
2594 const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
2595 {
2596 int32_t requestUserId = GetUserId(userId);
2597 if (requestUserId == Constants::INVALID_USERID) {
2598 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2599 }
2600
2601 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2602 InnerBundleInfo innerBundleInfo;
2603 int32_t flag = 0;
2604 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2605 == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2606 flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2607 }
2608 auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
2609 if (ret != ERR_OK) {
2610 LOG_D(BMS_TAG_QUERY,
2611 "GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
2612 appName.c_str(), requestUserId);
2613 return ret;
2614 }
2615
2616 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2617 ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
2618 if (ret != ERR_OK) {
2619 LOG_D(BMS_TAG_QUERY,
2620 "GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
2621 appName.c_str(), responseUserId);
2622 return ret;
2623 }
2624 userId = responseUserId;
2625 return ret;
2626 }
2627
GetCloneAppInfo(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2628 void BundleDataMgr::GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2629 std::vector<ApplicationInfo> &appInfos) const
2630 {
2631 std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2632 for (int32_t appIndex : appIndexVec) {
2633 bool isEnabled = false;
2634 ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2635 if (ret != ERR_OK) {
2636 continue;
2637 }
2638 if (isEnabled || (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2639 ApplicationInfo cloneAppInfo;
2640 info.GetApplicationInfo(flags, userId, cloneAppInfo, appIndex);
2641 if (cloneAppInfo.appIndex == appIndex) {
2642 appInfos.emplace_back(cloneAppInfo);
2643 }
2644 }
2645 }
2646 }
2647
GetApplicationInfos(int32_t flags,const int userId,std::vector<ApplicationInfo> & appInfos) const2648 bool BundleDataMgr::GetApplicationInfos(
2649 int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
2650 {
2651 int32_t requestUserId = GetUserId(userId);
2652 if (requestUserId == Constants::INVALID_USERID) {
2653 return false;
2654 }
2655
2656 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2657 if (bundleInfos_.empty()) {
2658 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2659 return false;
2660 }
2661
2662 for (const auto &item : bundleInfos_) {
2663 const InnerBundleInfo &info = item.second;
2664 if (info.IsDisabled()) {
2665 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2666 continue;
2667 }
2668 int32_t responseUserId = info.GetResponseUserId(requestUserId);
2669 if (info.GetApplicationEnabled(responseUserId) ||
2670 (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2671 ApplicationInfo appInfo;
2672 info.GetApplicationInfo(flags, responseUserId, appInfo);
2673 appInfos.emplace_back(appInfo);
2674 }
2675 GetCloneAppInfo(info, responseUserId, flags, appInfos);
2676 }
2677 LOG_D(BMS_TAG_QUERY, "get installed bundles success");
2678 return !appInfos.empty();
2679 }
2680
UpateExtResources(const std::string & bundleName,const std::vector<ExtendResourceInfo> & extendResourceInfos)2681 bool BundleDataMgr::UpateExtResources(const std::string &bundleName,
2682 const std::vector<ExtendResourceInfo> &extendResourceInfos)
2683 {
2684 if (bundleName.empty()) {
2685 APP_LOGW("bundleName is empty");
2686 return false;
2687 }
2688
2689 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2690 auto infoItem = bundleInfos_.find(bundleName);
2691 if (infoItem == bundleInfos_.end()) {
2692 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2693 return false;
2694 }
2695
2696 auto info = infoItem->second;
2697 info.AddExtendResourceInfos(extendResourceInfos);
2698 if (!dataStorage_->SaveStorageBundleInfo(info)) {
2699 APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2700 return false;
2701 }
2702
2703 bundleInfos_.at(bundleName) = info;
2704 return true;
2705 }
2706
RemoveExtResources(const std::string & bundleName,const std::vector<std::string> & moduleNames)2707 bool BundleDataMgr::RemoveExtResources(const std::string &bundleName,
2708 const std::vector<std::string> &moduleNames)
2709 {
2710 if (bundleName.empty()) {
2711 APP_LOGW("bundleName is empty");
2712 return false;
2713 }
2714
2715 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2716 auto infoItem = bundleInfos_.find(bundleName);
2717 if (infoItem == bundleInfos_.end()) {
2718 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2719 return false;
2720 }
2721
2722 auto info = infoItem->second;
2723 info.RemoveExtendResourceInfos(moduleNames);
2724 if (!dataStorage_->SaveStorageBundleInfo(info)) {
2725 APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2726 return false;
2727 }
2728
2729 bundleInfos_.at(bundleName) = info;
2730 return true;
2731 }
2732
GetExtendResourceInfo(const std::string & bundleName,const std::string & moduleName,ExtendResourceInfo & extendResourceInfo)2733 ErrCode BundleDataMgr::GetExtendResourceInfo(
2734 const std::string &bundleName, const std::string &moduleName,
2735 ExtendResourceInfo &extendResourceInfo)
2736 {
2737 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2738 auto infoItem = bundleInfos_.find(bundleName);
2739 if (infoItem == bundleInfos_.end()) {
2740 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
2741 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2742 }
2743 auto extendResourceInfos = infoItem->second.GetExtendResourceInfos();
2744 auto iter = extendResourceInfos.find(moduleName);
2745 if (iter == extendResourceInfos.end()) {
2746 APP_LOGE("can not find module %{public}s", moduleName.c_str());
2747 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
2748 }
2749 extendResourceInfo = iter->second;
2750 return ERR_OK;
2751 }
2752
UpateCurDynamicIconModule(const std::string & bundleName,const std::string & moduleName,const int32_t userId,const int32_t appIndex)2753 bool BundleDataMgr::UpateCurDynamicIconModule(
2754 const std::string &bundleName, const std::string &moduleName, const int32_t userId, const int32_t appIndex)
2755 {
2756 if (bundleName.empty()) {
2757 APP_LOGW("bundleName is empty");
2758 return false;
2759 }
2760
2761 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2762 auto infoItem = bundleInfos_.find(bundleName);
2763 if (infoItem == bundleInfos_.end()) {
2764 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2765 return false;
2766 }
2767
2768 auto info = infoItem->second;
2769 info.SetCurDynamicIconModule(moduleName, userId, appIndex);
2770 if (!dataStorage_->SaveStorageBundleInfo(info)) {
2771 APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2772 return false;
2773 }
2774
2775 bundleInfos_.at(bundleName) = info;
2776 return true;
2777 }
2778
GetCloneAppInfoV9(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2779 void BundleDataMgr::GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2780 std::vector<ApplicationInfo> &appInfos) const
2781 {
2782 std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2783 for (int32_t appIndex : appIndexVec) {
2784 bool isEnabled = false;
2785 ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2786 if (ret != ERR_OK) {
2787 continue;
2788 }
2789 if (isEnabled || (static_cast<uint32_t>(flags) &
2790 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2791 ApplicationInfo cloneAppInfo;
2792 ret = info.GetApplicationInfoV9(flags, userId, cloneAppInfo, appIndex);
2793 if (ret == ERR_OK) {
2794 appInfos.emplace_back(cloneAppInfo);
2795 }
2796 }
2797 }
2798 }
2799
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos) const2800 ErrCode BundleDataMgr::GetApplicationInfosV9(
2801 int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
2802 {
2803 int32_t requestUserId = GetUserId(userId);
2804 if (requestUserId == Constants::INVALID_USERID) {
2805 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2806 }
2807
2808 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2809 if (bundleInfos_.empty()) {
2810 APP_LOGW("bundleInfos_ data is empty");
2811 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2812 }
2813 for (const auto &item : bundleInfos_) {
2814 const InnerBundleInfo &info = item.second;
2815 if (info.IsDisabled()) {
2816 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2817 continue;
2818 }
2819 int32_t responseUserId = info.GetResponseUserId(requestUserId);
2820 if (info.GetApplicationEnabled(responseUserId) ||
2821 (static_cast<uint32_t>(flags) &
2822 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2823 ApplicationInfo appInfo;
2824 if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) == ERR_OK) {
2825 appInfos.emplace_back(appInfo);
2826 }
2827 }
2828 GetCloneAppInfoV9(info, responseUserId, flags, appInfos);
2829 }
2830 APP_LOGD("get installed bundles success");
2831 return ERR_OK;
2832 }
2833
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const2834 bool BundleDataMgr::GetBundleInfo(
2835 const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
2836 {
2837 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2838 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2839 if (userId == Constants::ANY_USERID) {
2840 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2841 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2842 return false;
2843 }
2844 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2845 }
2846
2847 int32_t requestUserId = GetUserId(userId);
2848 if (requestUserId == Constants::INVALID_USERID) {
2849 return false;
2850 }
2851 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2852 InnerBundleInfo innerBundleInfo;
2853 if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
2854 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d",
2855 bundleName.c_str(), requestUserId);
2856 return false;
2857 }
2858 // for only one user, bundle info can not be obtained during installation
2859 if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2860 (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2861 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2862 bundleName.c_str(), requestUserId);
2863 return false;
2864 }
2865
2866 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2867 innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
2868
2869 if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
2870 ProcessBundleMenu(bundleInfo, flags, false);
2871 }
2872 if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) ==
2873 BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) {
2874 ProcessBundleRouterMap(bundleInfo, static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
2875 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP));
2876 }
2877 LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2878 bundleName.c_str(), userId);
2879 return true;
2880 }
2881
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId,int32_t appIndex) const2882 ErrCode BundleDataMgr::GetBundleInfoV9(
2883 const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const
2884 {
2885 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2886
2887 if (userId == Constants::ANY_USERID) {
2888 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2889 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2890 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2891 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2892 }
2893 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2894 }
2895
2896 int32_t requestUserId = GetUserId(userId);
2897 if (requestUserId == Constants::INVALID_USERID) {
2898 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2899 }
2900
2901 int32_t originalUserId = requestUserId;
2902 PreProcessAnyUserFlag(bundleName, flags, requestUserId);
2903 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2904 InnerBundleInfo innerBundleInfo;
2905
2906 auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
2907 if (ret != ERR_OK) {
2908 LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s",
2909 ret, bundleName.c_str());
2910 return ret;
2911 }
2912 // for only one user, bundle info can not be obtained during installation
2913 if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2914 (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2915 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2916 bundleName.c_str(), requestUserId);
2917 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2918 }
2919
2920 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2921 innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
2922 PostProcessAnyUserFlags(flags, responseUserId, originalUserId, bundleInfo, innerBundleInfo);
2923
2924 ProcessCertificate(bundleInfo, bundleName, flags);
2925 ProcessBundleMenu(bundleInfo, flags, true);
2926 ProcessBundleRouterMap(bundleInfo, flags);
2927 LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2928 bundleName.c_str(), userId);
2929 return ERR_OK;
2930 }
2931
BatchGetBundleInfo(const std::vector<std::string> & bundleNames,int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2932 void BundleDataMgr::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
2933 std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2934 {
2935 for (const auto &bundleName : bundleNames) {
2936 BundleInfo bundleInfo;
2937 ErrCode ret = GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2938 if (ret != ERR_OK) {
2939 continue;
2940 }
2941 bundleInfos.push_back(bundleInfo);
2942 }
2943 }
2944
GetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2945 ErrCode BundleDataMgr::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2946 {
2947 int32_t uid = IPCSkeleton::GetCallingUid();
2948 int32_t appIndex = 0;
2949 InnerBundleInfo innerBundleInfo;
2950 if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
2951 if (sandboxAppHelper_ == nullptr) {
2952 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfoForSelf failed uid:%{public}d", uid);
2953 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2954 }
2955 if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2956 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfoForSelf failed uid:%{public}d", uid);
2957 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2958 }
2959 }
2960 int32_t userId = uid / Constants::BASE_USER_RANGE;
2961 innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, userId, appIndex);
2962 ProcessCertificate(bundleInfo, innerBundleInfo.GetBundleName(), flags);
2963 ProcessBundleMenu(bundleInfo, flags, true);
2964 ProcessBundleRouterMap(bundleInfo, flags);
2965 LOG_D(BMS_TAG_QUERY, "get bundleInfoForSelf %{public}s successfully in user %{public}d",
2966 innerBundleInfo.GetBundleName().c_str(), userId);
2967 return ERR_OK;
2968 }
2969
ProcessBundleMenu(BundleInfo & bundleInfo,int32_t flags,bool clearData) const2970 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
2971 {
2972 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2973 if (clearData) {
2974 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2975 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2976 return ERR_OK;
2977 }
2978 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
2979 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
2980 APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
2981 std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
2982 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
2983 });
2984 return ERR_OK;
2985 }
2986 }
2987 for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2988 std::string menuProfile = hapModuleInfo.fileContextMenu;
2989 auto pos = menuProfile.find(PROFILE_PREFIX);
2990 if (pos == std::string::npos) {
2991 APP_LOGD("invalid menu profile");
2992 continue;
2993 }
2994 std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
2995 std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
2996
2997 std::string menuProfileContent;
2998 GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
2999 hapModuleInfo.fileContextMenu = menuProfileContent;
3000 }
3001 return ERR_OK;
3002 }
3003
ProcessBundleRouterMap(BundleInfo & bundleInfo,int32_t flag) const3004 void BundleDataMgr::ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const
3005 {
3006 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
3007 if (routerStorage_ == nullptr) {
3008 APP_LOGE("routerStorage_ is null");
3009 return;
3010 }
3011 APP_LOGD("ProcessBundleRouterMap with flags: %{public}d", flag);
3012 if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
3013 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
3014 return;
3015 }
3016 if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP))
3017 != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP)) {
3018 return;
3019 }
3020 for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
3021 std::string routerPath = hapModuleInfo.routerMap;
3022 auto pos = routerPath.find(PROFILE_PREFIX);
3023 if (pos == std::string::npos) {
3024 APP_LOGD("invalid router profile");
3025 continue;
3026 }
3027 if (!routerStorage_->GetRouterInfo(bundleInfo.name, hapModuleInfo.moduleName, hapModuleInfo.routerArray)) {
3028 APP_LOGE("get failed for %{public}s", hapModuleInfo.moduleName.c_str());
3029 continue;
3030 }
3031 }
3032 RouterMapHelper::MergeRouter(bundleInfo);
3033 }
3034
ProcessCertificate(BundleInfo & bundleInfo,const std::string & bundleName,int32_t flags) const3035 void BundleDataMgr::ProcessCertificate(BundleInfo& bundleInfo, const std::string &bundleName, int32_t flags) const
3036 {
3037 if ((static_cast<uint32_t>(flags) &
3038 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO))
3039 == static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) {
3040 AppProvisionInfo appProvisionInfo;
3041 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->
3042 GetAppProvisionInfo(bundleName, appProvisionInfo)) {
3043 APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
3044 return;
3045 }
3046 bundleInfo.signatureInfo.certificate = appProvisionInfo.certificate;
3047 }
3048 }
3049
DeleteRouterInfo(const std::string & bundleName,const std::string & moduleName)3050 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName, const std::string &moduleName)
3051 {
3052 if (routerStorage_ == nullptr) {
3053 APP_LOGE("routerStorage_ is null");
3054 return false;
3055 }
3056 return routerStorage_->DeleteRouterInfo(bundleName, moduleName);
3057 }
3058
DeleteRouterInfo(const std::string & bundleName)3059 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName)
3060 {
3061 if (routerStorage_ == nullptr) {
3062 APP_LOGE("routerStorage_ is null");
3063 return false;
3064 }
3065 return routerStorage_->DeleteRouterInfo(bundleName);
3066 }
3067
UpdateRouterInfo(const std::string & bundleName)3068 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName)
3069 {
3070 if (routerStorage_ == nullptr) {
3071 APP_LOGE("routerStorage_ is null");
3072 return;
3073 }
3074 std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
3075 {
3076 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3077 const auto infoItem = bundleInfos_.find(bundleName);
3078 if (infoItem == bundleInfos_.end()) {
3079 APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
3080 return;
3081 }
3082 FindRouterHapPath(infoItem->second, hapPathMap);
3083 }
3084 UpdateRouterInfo(bundleName, hapPathMap);
3085 }
3086
FindRouterHapPath(const InnerBundleInfo & innerBundleInfo,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)3087 void BundleDataMgr::FindRouterHapPath(const InnerBundleInfo &innerBundleInfo,
3088 std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
3089 {
3090 auto moduleMap = innerBundleInfo.GetInnerModuleInfos();
3091 for (auto it = moduleMap.begin(); it != moduleMap.end(); it++) {
3092 std::string routerPath = it->second.routerMap;
3093 auto pos = routerPath.find(PROFILE_PREFIX);
3094 if (pos == std::string::npos) {
3095 continue;
3096 }
3097 std::string routerJsonName = routerPath.substr(pos + PROFILE_PREFIX_LENGTH);
3098 std::string routerJsonPath = PROFILE_PATH + routerJsonName + JSON_SUFFIX;
3099 hapPathMap[it->second.moduleName] = std::make_pair(it->second.hapPath, routerJsonPath);
3100 }
3101 }
3102
UpdateRouterInfo(InnerBundleInfo & innerBundleInfo)3103 void BundleDataMgr::UpdateRouterInfo(InnerBundleInfo &innerBundleInfo)
3104 {
3105 std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
3106 FindRouterHapPath(innerBundleInfo, hapPathMap);
3107 UpdateRouterInfo(innerBundleInfo.GetBundleName(), hapPathMap);
3108 }
3109
UpdateRouterInfo(const std::string & bundleName,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)3110 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName,
3111 std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
3112 {
3113 std::map<std::string, std::string> routerInfoMap;
3114 for (auto hapIter = hapPathMap.begin(); hapIter != hapPathMap.end(); hapIter++) {
3115 std::string routerMapString;
3116 if (GetJsonProfileByExtractor(hapIter->second.first, hapIter->second.second, routerMapString) != ERR_OK) {
3117 APP_LOGW("get json string from %{public}s failed", hapIter->second.second.c_str());
3118 continue;
3119 }
3120 routerInfoMap[hapIter->first] = routerMapString;
3121 }
3122 if (!routerStorage_->UpdateRouterInfo(bundleName, routerInfoMap)) {
3123 APP_LOGW("add router for %{public}s failed", bundleName.c_str());
3124 }
3125 }
3126
GetAllBundleNames(std::set<std::string> & bundleNames)3127 void BundleDataMgr::GetAllBundleNames(std::set<std::string> &bundleNames)
3128 {
3129 if (routerStorage_ == nullptr) {
3130 APP_LOGE("routerStorage_ is null");
3131 return;
3132 }
3133 return routerStorage_->GetAllBundleNames(bundleNames);
3134 }
3135
PreProcessAnyUserFlag(const std::string & bundleName,int32_t & flags,int32_t & userId) const3136 void BundleDataMgr::PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const
3137 {
3138 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0) {
3139 flags = static_cast<uint32_t>(
3140 static_cast<uint32_t>(flags) | static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE));
3141 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
3142 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
3143 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
3144 return;
3145 }
3146 if (innerBundleUserInfos.empty()) {
3147 return;
3148 }
3149 for (auto &bundleUserInfo: innerBundleUserInfos) {
3150 if (bundleUserInfo.bundleUserInfo.userId == userId) {
3151 return;
3152 }
3153 if (bundleUserInfo.bundleUserInfo.userId < Constants::START_USERID) {
3154 return;
3155 }
3156 }
3157 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
3158 }
3159 }
3160
PostProcessAnyUserFlags(int32_t flags,int32_t userId,int32_t originalUserId,BundleInfo & bundleInfo,const InnerBundleInfo & innerBundleInfo) const3161 void BundleDataMgr::PostProcessAnyUserFlags(
3162 int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo,
3163 const InnerBundleInfo &innerBundleInfo) const
3164 {
3165 bool withApplicationFlag =
3166 (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION))
3167 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
3168 if (withApplicationFlag) {
3169 if (userId >= Constants::START_USERID && userId != originalUserId) {
3170 uint32_t flagInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_INSTALLED);
3171 uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3172 if ((applicationFlags & flagInstalled) != 0) {
3173 bundleInfo.applicationInfo.applicationFlags = static_cast<int32_t>(applicationFlags ^ flagInstalled);
3174 }
3175 }
3176
3177 bool withAnyUser =
3178 (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER))
3179 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER);
3180 if (withAnyUser) {
3181 const std::map<std::string, InnerBundleUserInfo>& innerUserInfos
3182 = innerBundleInfo.GetInnerBundleUserInfos();
3183 uint32_t flagOtherInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_OTHER_INSTALLED);
3184 uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3185 if (!innerBundleInfo.HasInnerBundleUserInfo(originalUserId)) {
3186 bundleInfo.applicationInfo.applicationFlags =
3187 static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3188 } else if (innerUserInfos.size() > 1) {
3189 bundleInfo.applicationInfo.applicationFlags =
3190 static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3191 }
3192 }
3193 }
3194 }
3195
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,GetDependentBundleInfoFlag flag) const3196 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
3197 std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
3198 {
3199 APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
3200 if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
3201 (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
3202 // for app service hsp
3203 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3204 std::lock_guard<ffrt::mutex> hspLock(hspBundleNameMutex_);
3205 for (const std::string &hspName : appServiceHspBundleName_) {
3206 APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
3207 auto infoItem = bundleInfos_.find(hspName);
3208 if (infoItem == bundleInfos_.end()) {
3209 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
3210 continue;
3211 }
3212 ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
3213 }
3214 }
3215 if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
3216 flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
3217 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3218 auto infoItem = bundleInfos_.find(bundleName);
3219 if (infoItem == bundleInfos_.end()) {
3220 APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
3221 return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
3222 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
3223 }
3224 const InnerBundleInfo &innerBundleInfo = infoItem->second;
3225 std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
3226 for (const auto &item : dependencies) {
3227 BaseSharedBundleInfo baseSharedBundleInfo;
3228 if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
3229 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
3230 }
3231 }
3232 }
3233 APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
3234 return ERR_OK;
3235 }
3236
GetBundleType(const std::string & bundleName,BundleType & bundleType) const3237 bool BundleDataMgr::GetBundleType(const std::string &bundleName, BundleType &bundleType)const
3238 {
3239 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3240 auto item = bundleInfos_.find(bundleName);
3241 if (item == bundleInfos_.end()) {
3242 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3243 return false;
3244 }
3245 bundleType = item->second.GetApplicationBundleType();
3246 APP_LOGI("bundle %{public}s Type is %{public}d", bundleName.c_str(), bundleType);
3247 return true;
3248 }
3249
GetBaseSharedBundleInfo(const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const3250 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
3251 BaseSharedBundleInfo &baseSharedBundleInfo) const
3252 {
3253 auto infoItem = bundleInfos_.find(dependency.bundleName);
3254 if (infoItem == bundleInfos_.end()) {
3255 APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
3256 dependency.bundleName.c_str());
3257 return false;
3258 }
3259 const InnerBundleInfo &innerBundleInfo = infoItem->second;
3260 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3261 (void)GetAdaptBaseShareBundleInfo(innerBundleInfo, dependency, baseSharedBundleInfo);
3262 } else {
3263 APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
3264 innerBundleInfo.GetApplicationBundleType());
3265 return false;
3266 }
3267 APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
3268 return true;
3269 }
3270
GetAdaptBaseShareBundleInfo(const InnerBundleInfo & innerBundleInfo,const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const3271 bool BundleDataMgr::GetAdaptBaseShareBundleInfo(
3272 const InnerBundleInfo &innerBundleInfo,
3273 const Dependency &dependency,
3274 BaseSharedBundleInfo &baseSharedBundleInfo) const
3275 {
3276 // check cross hsp size and calling token
3277 if ((innerBundleInfo.GetAllHspVersion().size() <= 1) || (BundlePermissionMgr::IsNativeTokenType())) {
3278 return innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3279 }
3280 // get running app hsp versionCode
3281 std::map<std::string, uint32_t> shareBundles;
3282 if ((AbilityManagerHelper::QueryRunningSharedBundles(IPCSkeleton::GetCallingPid(), shareBundles) == ERR_OK)) {
3283 auto item = shareBundles.find(dependency.bundleName);
3284 if ((item != shareBundles.end()) && innerBundleInfo.GetBaseSharedBundleInfo(dependency.moduleName,
3285 item->second, baseSharedBundleInfo)) {
3286 APP_LOGI("get share bundle by pid -n %{public}s -v %{public}u succeed",
3287 dependency.bundleName.c_str(), item->second);
3288 return true;
3289 }
3290 }
3291 return innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3292 }
3293
DeleteSharedBundleInfo(const std::string & bundleName)3294 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
3295 {
3296 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3297 auto infoItem = bundleInfos_.find(bundleName);
3298 if (infoItem != bundleInfos_.end()) {
3299 APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
3300 const InnerBundleInfo &innerBundleInfo = infoItem->second;
3301 bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
3302 if (!ret) {
3303 APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
3304 }
3305 bundleInfos_.erase(bundleName);
3306 return ret;
3307 }
3308 return false;
3309 }
3310
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId) const3311 ErrCode BundleDataMgr::GetBundlePackInfo(
3312 const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
3313 {
3314 APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
3315 int32_t requestUserId;
3316 if (userId == Constants::UNSPECIFIED_USERID) {
3317 requestUserId = GetUserIdByCallingUid();
3318 } else {
3319 requestUserId = userId;
3320 }
3321
3322 if (requestUserId == Constants::INVALID_USERID) {
3323 APP_LOGW("getBundlePackInfo userId is invalid");
3324 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3325 }
3326 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3327 InnerBundleInfo innerBundleInfo;
3328 if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
3329 APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
3330 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3331 }
3332 BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
3333 if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
3334 bundlePackInfo.packages = innerBundlePackInfo.packages;
3335 return ERR_OK;
3336 }
3337 if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
3338 bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
3339 bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3340 return ERR_OK;
3341 }
3342 if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
3343 bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3344 return ERR_OK;
3345 }
3346 bundlePackInfo = innerBundlePackInfo;
3347 return ERR_OK;
3348 }
3349
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos) const3350 bool BundleDataMgr::GetBundleInfosByMetaData(
3351 const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
3352 {
3353 if (metaData.empty()) {
3354 APP_LOGW("bundle name is empty");
3355 return false;
3356 }
3357
3358 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3359 if (bundleInfos_.empty()) {
3360 APP_LOGW("bundleInfos_ data is empty");
3361 return false;
3362 }
3363
3364 bool find = false;
3365 int32_t requestUserId = GetUserId();
3366 for (const auto &item : bundleInfos_) {
3367 const InnerBundleInfo &info = item.second;
3368 if (info.IsDisabled()) {
3369 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3370 continue;
3371 }
3372 if (info.CheckSpecialMetaData(metaData)) {
3373 BundleInfo bundleInfo;
3374 int32_t responseUserId = info.GetResponseUserId(requestUserId);
3375 info.GetBundleInfo(
3376 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3377 bundleInfos.emplace_back(bundleInfo);
3378 find = true;
3379 }
3380 }
3381 return find;
3382 }
3383
GetBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3384 bool BundleDataMgr::GetBundleList(
3385 std::vector<std::string> &bundleNames, int32_t userId) const
3386 {
3387 int32_t requestUserId = GetUserId(userId);
3388 if (requestUserId == Constants::INVALID_USERID) {
3389 return false;
3390 }
3391
3392 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3393 if (bundleInfos_.empty()) {
3394 APP_LOGW("bundleInfos_ data is empty");
3395 return false;
3396 }
3397
3398 bool find = false;
3399 for (const auto &infoItem : bundleInfos_) {
3400 const InnerBundleInfo &innerBundleInfo = infoItem.second;
3401 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3402 if (CheckInnerBundleInfoWithFlags(
3403 innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3404 continue;
3405 }
3406
3407 bundleNames.emplace_back(infoItem.first);
3408 find = true;
3409 }
3410 APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
3411 return find;
3412 }
3413
GetDebugBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3414 bool BundleDataMgr::GetDebugBundleList(std::vector<std::string> &bundleNames, int32_t userId) const
3415 {
3416 int32_t requestUserId = GetUserId(userId);
3417 if (requestUserId == Constants::INVALID_USERID) {
3418 APP_LOGE("UserId is invalid");
3419 return false;
3420 }
3421
3422 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3423 if (bundleInfos_.empty()) {
3424 APP_LOGE("bundleInfos_ data is empty");
3425 return false;
3426 }
3427
3428 for (const auto &infoItem : bundleInfos_) {
3429 const InnerBundleInfo &innerBundleInfo = infoItem.second;
3430 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3431 if (CheckInnerBundleInfoWithFlags(
3432 innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3433 continue;
3434 }
3435
3436 ApplicationInfo appInfo = innerBundleInfo.GetBaseApplicationInfo();
3437 if (appInfo.appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG) {
3438 bundleNames.emplace_back(infoItem.first);
3439 }
3440 }
3441
3442 bool find = !bundleNames.empty();
3443 APP_LOGD("user(%{public}d) get installed debug bundles list result(%{public}d)", userId, find);
3444 return find;
3445 }
3446
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3447 bool BundleDataMgr::GetBundleInfos(
3448 int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3449 {
3450 if (userId == Constants::ALL_USERID) {
3451 return GetAllBundleInfos(flags, bundleInfos);
3452 }
3453
3454 int32_t requestUserId = GetUserId(userId);
3455 if (requestUserId == Constants::INVALID_USERID) {
3456 return false;
3457 }
3458
3459 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3460 if (bundleInfos_.empty()) {
3461 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3462 return false;
3463 }
3464
3465 bool find = false;
3466 for (const auto &item : bundleInfos_) {
3467 const InnerBundleInfo &innerBundleInfo = item.second;
3468 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3469 LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3470 innerBundleInfo.GetBundleName().c_str());
3471 continue;
3472 }
3473
3474 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3475 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
3476 continue;
3477 }
3478
3479 BundleInfo bundleInfo;
3480 if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
3481 continue;
3482 }
3483
3484 bundleInfos.emplace_back(bundleInfo);
3485 find = true;
3486 // add clone bundle info
3487 // flags convert
3488 GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3489 }
3490
3491 LOG_D(BMS_TAG_QUERY, "get bundleInfos result(%{public}d) in user(%{public}d)", find, userId);
3492 return find;
3493 }
3494
CheckInnerBundleInfoWithFlags(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3495 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
3496 const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3497 {
3498 if (userId == Constants::INVALID_USERID) {
3499 APP_LOGD("userId is invalid");
3500 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3501 }
3502 if (innerBundleInfo.IsDisabled()) {
3503 APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3504 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3505 }
3506
3507 if (appIndex == 0) {
3508 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
3509 && !innerBundleInfo.GetApplicationEnabled(userId)) {
3510 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3511 innerBundleInfo.GetBundleName().c_str(), userId);
3512 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3513 }
3514 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3515 int32_t requestUserId = GetUserId(userId);
3516 if (requestUserId == Constants::INVALID_USERID) {
3517 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3518 }
3519 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3520 bool isEnabled = false;
3521 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3522 if (ret != ERR_OK) {
3523 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3524 }
3525 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
3526 APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3527 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3528 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3529 }
3530 } else {
3531 return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3532 }
3533 return ERR_OK;
3534 }
3535
CheckInnerBundleInfoWithFlagsV9(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3536 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlagsV9(
3537 const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3538 {
3539 if (userId == Constants::INVALID_USERID) {
3540 APP_LOGD("userId is invalid");
3541 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3542 }
3543 if (innerBundleInfo.IsDisabled()) {
3544 APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3545 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3546 }
3547
3548 if (appIndex == 0) {
3549 if (!(static_cast<uint32_t>(flags) &
3550 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
3551 bool isEnabled = false;
3552 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(userId, isEnabled, appIndex);
3553 if (ret != ERR_OK) {
3554 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3555 innerBundleInfo.GetBundleName().c_str(), userId);
3556 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3557 }
3558 if (!isEnabled) {
3559 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3560 innerBundleInfo.GetBundleName().c_str(), userId);
3561 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3562 }
3563 }
3564 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3565 int32_t requestUserId = GetUserId(userId);
3566 if (requestUserId == Constants::INVALID_USERID) {
3567 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3568 }
3569 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3570 bool isEnabled = false;
3571 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3572 if (ret != ERR_OK) {
3573 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3574 }
3575 if (!(static_cast<uint32_t>(flags) &
3576 static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
3577 && !isEnabled) {
3578 APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3579 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3580 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3581 }
3582 } else {
3583 return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3584 }
3585 return ERR_OK;
3586 }
3587
CheckBundleAndAbilityDisabled(const InnerBundleInfo & info,int32_t flags,int32_t userId) const3588 ErrCode BundleDataMgr::CheckBundleAndAbilityDisabled(
3589 const InnerBundleInfo &info, int32_t flags, int32_t userId) const
3590 {
3591 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
3592 int32_t requestUserId = GetUserId(userId);
3593 if (requestUserId == Constants::INVALID_USERID) {
3594 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3595 }
3596
3597 if (info.IsDisabled()) {
3598 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -f %{public}d",
3599 info.GetBundleName().c_str(), userId, flags);
3600 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3601 }
3602
3603 int32_t responseUserId = info.GetResponseUserId(requestUserId);
3604 bool isEnabled = false;
3605 auto ret = info.GetApplicationEnabledV9(responseUserId, isEnabled);
3606 if (ret != ERR_OK) {
3607 LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle %{public}s not install in user %{public}d ret:%{public}d",
3608 info.GetBundleName().c_str(), responseUserId, ret);
3609 return ret;
3610 }
3611 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
3612 && !isEnabled) {
3613 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -f %{public}d",
3614 info.GetBundleName().c_str(), responseUserId, flags);
3615 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3616 }
3617 return ERR_OK;
3618 }
3619
GetAllBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3620 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3621 {
3622 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3623 if (bundleInfos_.empty()) {
3624 APP_LOGW("bundleInfos_ data is empty");
3625 return false;
3626 }
3627
3628 bool find = false;
3629 for (const auto &item : bundleInfos_) {
3630 const InnerBundleInfo &info = item.second;
3631 if (info.IsDisabled()) {
3632 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3633 continue;
3634 }
3635 if (info.GetApplicationBundleType() == BundleType::SHARED) {
3636 APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3637 continue;
3638 }
3639 BundleInfo bundleInfo;
3640 info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
3641 bundleInfos.emplace_back(bundleInfo);
3642 find = true;
3643 // add clone bundle info
3644 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3645 }
3646
3647 APP_LOGD("get all bundleInfos result(%{public}d)", find);
3648 return find;
3649 }
3650
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3651 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3652 {
3653 if (userId == Constants::ALL_USERID) {
3654 return GetAllBundleInfosV9(flags, bundleInfos);
3655 }
3656 int32_t requestUserId = GetUserId(userId);
3657 if (requestUserId == Constants::INVALID_USERID) {
3658 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3659 }
3660 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3661 if (bundleInfos_.empty()) {
3662 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3663 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3664 }
3665 bool ofAnyUserFlag =
3666 (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0;
3667 for (const auto &item : bundleInfos_) {
3668 const InnerBundleInfo &innerBundleInfo = item.second;
3669 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3670 LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3671 innerBundleInfo.GetBundleName().c_str());
3672 continue;
3673 }
3674 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3675 auto flag = GET_BASIC_APPLICATION_INFO;
3676 if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
3677 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
3678 flag = GET_APPLICATION_INFO_WITH_DISABLE;
3679 }
3680 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
3681 auto &hp = innerBundleInfo.GetInnerBundleUserInfos();
3682 if (ofAnyUserFlag && hp.size() > 0) {
3683 responseUserId = hp.begin()->second.bundleUserInfo.userId;
3684 } else {
3685 continue;
3686 }
3687 }
3688 uint32_t launchFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY);
3689 if (((static_cast<uint32_t>(flags) & launchFlag) == launchFlag) && (innerBundleInfo.IsHideDesktopIcon())) {
3690 LOG_D(BMS_TAG_QUERY, "bundleName %{public}s is hide desktopIcon",
3691 innerBundleInfo.GetBundleName().c_str());
3692 continue;
3693 }
3694 uint32_t cloudFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_CLOUD_KIT);
3695 if (((static_cast<uint32_t>(flags) & cloudFlag) == cloudFlag) &&
3696 !innerBundleInfo.GetCloudFileSyncEnabled() &&
3697 !innerBundleInfo.GetCloudStructuredDataSyncEnabled()) {
3698 APP_LOGD("getAllBundleInfosV9 bundleName %{public}s does not enable cloud sync",
3699 innerBundleInfo.GetBundleName().c_str());
3700 continue;
3701 }
3702 BundleInfo bundleInfo;
3703 if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
3704 continue;
3705 }
3706 ProcessCertificate(bundleInfo, innerBundleInfo.GetBundleName(), flags);
3707 ProcessBundleMenu(bundleInfo, flags, true);
3708 ProcessBundleRouterMap(bundleInfo, flags);
3709 PostProcessAnyUserFlags(flags, responseUserId, requestUserId, bundleInfo, innerBundleInfo);
3710 bundleInfos.emplace_back(bundleInfo);
3711 if (!ofAnyUserFlag && ((static_cast<uint32_t>(flags) &
3712 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3713 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3714 // add clone bundle info
3715 GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3716 }
3717 }
3718 if (bundleInfos.empty()) {
3719 LOG_W(BMS_TAG_QUERY, "bundleInfos is empty");
3720 }
3721 return ERR_OK;
3722 }
3723
GetAllBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3724 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3725 {
3726 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3727 if (bundleInfos_.empty()) {
3728 APP_LOGW("bundleInfos_ data is empty");
3729 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3730 }
3731
3732 for (const auto &item : bundleInfos_) {
3733 const InnerBundleInfo &info = item.second;
3734 if (info.IsDisabled()) {
3735 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3736 continue;
3737 }
3738 if (info.GetApplicationBundleType() == BundleType::SHARED) {
3739 APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3740 continue;
3741 }
3742 if (((static_cast<uint32_t>(flags) &
3743 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) ==
3744 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) &&
3745 (info.IsHideDesktopIcon())) {
3746 APP_LOGD("getAllBundleInfosV9 bundleName %{public}s is hide desktopIcon",
3747 info.GetBundleName().c_str());
3748 continue;
3749 }
3750 uint32_t cloudFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_CLOUD_KIT);
3751 if (((static_cast<uint32_t>(flags) & cloudFlag) == cloudFlag) &&
3752 !info.GetCloudFileSyncEnabled() &&
3753 !info.GetCloudStructuredDataSyncEnabled()) {
3754 APP_LOGD("getAllBundleInfosV9 bundleName %{public}s does not enable cloud sync",
3755 info.GetBundleName().c_str());
3756 continue;
3757 }
3758 BundleInfo bundleInfo;
3759 info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
3760 ProcessCertificate(bundleInfo, info.GetBundleName(), flags);
3761 auto ret = ProcessBundleMenu(bundleInfo, flags, true);
3762 if (ret == ERR_OK) {
3763 bundleInfos.emplace_back(bundleInfo);
3764 if (((static_cast<uint32_t>(flags) &
3765 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3766 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3767 // add clone bundle info
3768 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3769 }
3770 }
3771 }
3772 if (bundleInfos.empty()) {
3773 APP_LOGW("bundleInfos is empty");
3774 }
3775 return ERR_OK;
3776 }
3777
GetBundleNameForUid(const int32_t uid,std::string & bundleName) const3778 bool BundleDataMgr::GetBundleNameForUid(const int32_t uid, std::string &bundleName) const
3779 {
3780 int32_t appIndex = 0;
3781 return GetBundleNameAndIndexForUid(uid, bundleName, appIndex) == ERR_OK;
3782 }
3783
GetBundleNameAndIndexForUid(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3784 ErrCode BundleDataMgr::GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName,
3785 int32_t &appIndex) const
3786 {
3787 InnerBundleInfo innerBundleInfo;
3788 if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
3789 if (sandboxAppHelper_ == nullptr) {
3790 return ERR_BUNDLE_MANAGER_INVALID_UID;
3791 }
3792 if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3793 return ERR_BUNDLE_MANAGER_INVALID_UID;
3794 }
3795 }
3796
3797 bundleName = innerBundleInfo.GetBundleName();
3798 APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
3799 uid, bundleName.c_str(), appIndex);
3800 return ERR_OK;
3801 }
3802
GetBundleNameAndIndex(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3803 ErrCode BundleDataMgr::GetBundleNameAndIndex(const int32_t uid, std::string &bundleName,
3804 int32_t &appIndex) const
3805 {
3806 if (uid < Constants::BASE_APP_UID) {
3807 APP_LOGD("the uid(%{public}d) is not an application", uid);
3808 return ERR_BUNDLE_MANAGER_INVALID_UID;
3809 }
3810 int32_t userId = GetUserIdByUid(uid);
3811 int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3812 if (bundleId < 0) {
3813 APP_LOGD("the uid(%{public}d) is not an application", uid);
3814 return ERR_BUNDLE_MANAGER_INVALID_UID;
3815 }
3816
3817 std::shared_lock<ffrt::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3818 auto bundleIdIter = bundleIdMap_.find(bundleId);
3819 if (bundleIdIter == bundleIdMap_.end()) {
3820 APP_LOGD("bundleId %{public}d is not existed", bundleId);
3821 return ERR_BUNDLE_MANAGER_INVALID_UID;
3822 }
3823 std::string keyName = bundleIdIter->second;
3824 if (keyName.empty()) {
3825 return ERR_BUNDLE_MANAGER_INVALID_UID;
3826 }
3827 // bundleName, sandbox_app: \d+_w+, clone_app: \d+clone_w+, others
3828 if (isdigit(keyName[0])) {
3829 size_t pos = keyName.find_first_not_of("0123456789");
3830 if (pos == std::string::npos) {
3831 return ERR_BUNDLE_MANAGER_INVALID_UID;
3832 }
3833 std::string index = keyName.substr(0, pos);
3834 if (!OHOS::StrToInt(index, appIndex)) {
3835 return ERR_BUNDLE_MANAGER_INVALID_UID;
3836 }
3837
3838 auto clonePos = keyName.find(CLONE_BUNDLE_PREFIX);
3839 if (clonePos != std::string::npos && clonePos == pos) {
3840 bundleName = keyName.substr(clonePos + strlen(CLONE_BUNDLE_PREFIX));
3841 return ERR_OK;
3842 }
3843
3844 auto sandboxPos = keyName.find(Constants::FILE_UNDERLINE);
3845 if (sandboxPos != std::string::npos && sandboxPos == pos) {
3846 bundleName = keyName.substr(sandboxPos + strlen(Constants::FILE_UNDERLINE));
3847 return ERR_OK;
3848 }
3849 }
3850
3851 bundleName = keyName;
3852 appIndex = 0;
3853 return ERR_OK;
3854 }
3855
GetInnerBundleInfoAndIndexByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo,int32_t & appIndex) const3856 ErrCode BundleDataMgr::GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo,
3857 int32_t &appIndex) const
3858 {
3859 if (uid < Constants::BASE_APP_UID) {
3860 APP_LOGD("the uid(%{public}d) is not an application", uid);
3861 return ERR_BUNDLE_MANAGER_INVALID_UID;
3862 }
3863 int32_t userId = GetUserIdByUid(uid);
3864 int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3865
3866 std::string keyName;
3867 {
3868 std::shared_lock<ffrt::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3869 auto bundleIdIter = bundleIdMap_.find(bundleId);
3870 if (bundleIdIter == bundleIdMap_.end()) {
3871 APP_LOGW_NOFUNC("uid %{public}d is not existed", uid);
3872 return ERR_BUNDLE_MANAGER_INVALID_UID;
3873 }
3874 keyName = bundleIdIter->second;
3875 }
3876 std::string bundleName = keyName;
3877 GetBundleNameAndIndexByName(keyName, bundleName, appIndex);
3878
3879 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3880 auto bundleInfoIter = bundleInfos_.find(bundleName);
3881 if (bundleInfoIter == bundleInfos_.end()) {
3882 APP_LOGE("bundleName %{public}s is not existed in bundleInfos_", bundleName.c_str());
3883 return ERR_BUNDLE_MANAGER_INVALID_UID;
3884 }
3885 int32_t oriUid = bundleInfoIter->second.GetUid(userId, appIndex);
3886 if (oriUid == uid) {
3887 innerBundleInfo = bundleInfoIter->second;
3888 return ERR_OK;
3889 }
3890
3891 APP_LOGW("bn %{public}s uid %{public}d oriUid %{public}d ", bundleName.c_str(), uid, oriUid);
3892 return ERR_BUNDLE_MANAGER_INVALID_UID;
3893 }
3894
GetInnerBundleInfoByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo) const3895 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const
3896 {
3897 int32_t appIndex = 0;
3898 return GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex);
3899 }
3900
GetRecoverablePreInstallBundleInfos()3901 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
3902 {
3903 std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
3904 int32_t userId = AccountHelper::GetCurrentActiveUserId();
3905 if (userId == Constants::INVALID_USERID) {
3906 APP_LOGW("userId %{public}d is invalid", userId);
3907 return recoverablePreInstallBundleInfos;
3908 }
3909 std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
3910 for (auto preInstallBundleInfo: preInstallBundleInfos) {
3911 if (!preInstallBundleInfo.IsRemovable()) {
3912 continue;
3913 }
3914 if (preInstallBundleInfo.HasForceUninstalledUser(userId)) {
3915 APP_LOGW("-n %{public}s is force unisntalled in -u %{public}d",
3916 preInstallBundleInfo.GetBundleName().c_str(), userId);
3917 continue;
3918 }
3919 if (BundleUserMgrHostImpl::SkipThirdPreloadAppInstallation(userId, preInstallBundleInfo)) {
3920 continue;
3921 }
3922 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3923 auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
3924 if (infoItem == bundleInfos_.end()) {
3925 recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3926 continue;
3927 }
3928 if (infoItem->second.IsU1Enable() &&
3929 !infoItem->second.HasInnerBundleUserInfo(Constants::U1)) {
3930 recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3931 continue;
3932 }
3933 if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
3934 !infoItem->second.HasInnerBundleUserInfo(userId)) {
3935 recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3936 }
3937 }
3938 return recoverablePreInstallBundleInfos;
3939 }
3940
IsBundleExist(const std::string & bundleName) const3941 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
3942 {
3943 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3944 return bundleInfos_.find(bundleName) != bundleInfos_.end();
3945 }
3946
HasUserInstallInBundle(const std::string & bundleName,const int32_t userId) const3947 bool BundleDataMgr::HasUserInstallInBundle(
3948 const std::string &bundleName, const int32_t userId) const
3949 {
3950 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3951 auto infoItem = bundleInfos_.find(bundleName);
3952 if (infoItem == bundleInfos_.end()) {
3953 return false;
3954 }
3955
3956 return infoItem->second.HasInnerBundleUserInfo(userId);
3957 }
3958
3959 #ifdef ABILITY_RUNTIME_ENABLE
GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,const std::string & bundleName,const std::vector<int32_t> & cloneAppIndexes) const3960 std::vector<int32_t> BundleDataMgr::GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,
3961 const std::string &bundleName, const std::vector<int32_t> &cloneAppIndexes) const
3962 {
3963 std::vector<int32_t> noRunningCloneAppIndexes;
3964 if (appMgrProxy == nullptr) {
3965 APP_LOGW("fail to find the app mgr service to check app is running");
3966 return noRunningCloneAppIndexes;
3967 }
3968
3969 for (const auto &appIndex : cloneAppIndexes) {
3970 bool running = SystemAbilityHelper::IsAppRunning(appMgrProxy, bundleName, appIndex);
3971 if (running) {
3972 APP_LOGW("No del cache for %{public}s[%{public}d]: is running", bundleName.c_str(), appIndex);
3973 continue;
3974 }
3975 noRunningCloneAppIndexes.emplace_back(appIndex);
3976 }
3977 return noRunningCloneAppIndexes;
3978 }
3979 #endif
3980
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) const3981 void BundleDataMgr::GetBundleCacheInfo(
3982 std::function<std::vector<int32_t>(std::string&, std::vector<int32_t>&)> idxFilter,
3983 const InnerBundleInfo &info,
3984 std::vector<std::tuple<std::string, std::vector<std::string>, std::vector<int32_t>>> &validBundles,
3985 const int32_t userId, bool isClean) const
3986 {
3987 std::string bundleName = info.GetBundleName();
3988 if (isClean && !info.GetBaseApplicationInfo().userDataClearable) {
3989 APP_LOGW("Not clearable:%{public}s, userid:%{public}d", bundleName.c_str(), userId);
3990 return;
3991 }
3992 std::vector<std::string> moduleNameList;
3993 info.GetModuleNames(moduleNameList);
3994 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
3995 cloneAppIndexes.emplace_back(0);
3996 std::vector<int32_t> allAppIndexes = cloneAppIndexes;
3997 if (isClean) {
3998 allAppIndexes = idxFilter(bundleName, cloneAppIndexes);
3999 }
4000 validBundles.emplace_back(std::make_tuple(bundleName, moduleNameList, allAppIndexes));
4001 // add atomic service
4002 if (info.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE) {
4003 std::string atomicServiceName;
4004 AccountSA::OhosAccountInfo accountInfo;
4005 auto ret = GetDirForAtomicServiceByUserId(bundleName, userId, accountInfo, atomicServiceName);
4006 if (ret == ERR_OK && !atomicServiceName.empty()) {
4007 APP_LOGD("atomicServiceName: %{public}s", atomicServiceName.c_str());
4008 validBundles.emplace_back(std::make_tuple(atomicServiceName, moduleNameList, allAppIndexes));
4009 }
4010 }
4011 }
4012
GetBundleCacheInfos(const int32_t userId,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,bool isClean) const4013 void BundleDataMgr::GetBundleCacheInfos(const int32_t userId, std::vector<std::tuple<std::string,
4014 std::vector<std::string>, std::vector<int32_t>>> &validBundles, bool isClean) const
4015 {
4016 #ifdef ABILITY_RUNTIME_ENABLE
4017 sptr<IAppMgr> appMgrProxy = iface_cast<IAppMgr>(SystemAbilityHelper::GetSystemAbility(APP_MGR_SERVICE_ID));
4018 if (appMgrProxy == nullptr) {
4019 APP_LOGE("CleanBundleCache fail to find the app mgr service to check app is running");
4020 return;
4021 }
4022 auto idxFiltor = [&appMgrProxy, this](std::string &bundleName, std::vector<int32_t> &allidx) {
4023 return this->GetNoRunningBundleCloneIndexes(appMgrProxy, bundleName, allidx);
4024 };
4025 #else
4026 auto idxFiltor = [](std::string &bundleName, std::vector<int32_t> &allidx) {
4027 return allidx;
4028 };
4029 #endif
4030 std::map<std::string, InnerBundleInfo> infos = GetAllInnerBundleInfos();
4031 for (const auto &item : infos) {
4032 GetBundleCacheInfo(idxFiltor, item.second, validBundles, userId, isClean);
4033 }
4034 return;
4035 }
4036
GetBundleStats(const std::string & bundleName,const int32_t userId,std::vector<int64_t> & bundleStats,const int32_t appIndex,const uint32_t statFlag) const4037 bool BundleDataMgr::GetBundleStats(const std::string &bundleName,
4038 const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex, const uint32_t statFlag) const
4039 {
4040 int32_t responseUserId = -1;
4041 int32_t uid = -1;
4042 std::vector<std::string> moduleNameList;
4043 {
4044 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4045 const auto infoItem = bundleInfos_.find(bundleName);
4046 if (infoItem == bundleInfos_.end()) {
4047 return false;
4048 }
4049 responseUserId = infoItem->second.GetResponseUserId(userId);
4050 uid = infoItem->second.GetUid(responseUserId, appIndex);
4051 infoItem->second.GetModuleNames(moduleNameList);
4052 }
4053 ErrCode ret = InstalldClient::GetInstance()->GetBundleStats(
4054 bundleName, responseUserId, bundleStats, uid, appIndex, statFlag, moduleNameList);
4055 if (ret != ERR_OK) {
4056 APP_LOGW("%{public}s getStats failed", bundleName.c_str());
4057 return false;
4058 }
4059 {
4060 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4061 const auto infoItem = bundleInfos_.find(bundleName);
4062 if (infoItem == bundleInfos_.end()) {
4063 return false;
4064 }
4065 if (appIndex == 0 && infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
4066 for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
4067 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
4068 continue;
4069 }
4070 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
4071 }
4072 }
4073 }
4074
4075 return true;
4076 }
4077
BatchGetBundleStats(const std::vector<std::string> & bundleNames,int32_t userId,std::vector<BundleStorageStats> & bundleStats) const4078 ErrCode BundleDataMgr::BatchGetBundleStats(const std::vector<std::string> &bundleNames, int32_t userId,
4079 std::vector<BundleStorageStats> &bundleStats) const
4080 {
4081 int32_t uid = -1;
4082 std::unordered_map<std::string, int32_t> uidMap;
4083 std::vector<std::string> bundleNameList = bundleNames;
4084 std::vector<BundleStorageStats> bundleStatsList;
4085 if (!HasUserId(userId)) {
4086 APP_LOGE("userId %{public}d not exist.", userId);
4087 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4088 }
4089 {
4090 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4091 for (auto bundleName = bundleNameList.begin(); bundleName != bundleNameList.end();) {
4092 const auto infoItem = bundleInfos_.find(*bundleName);
4093 InnerBundleUserInfo userInfo;
4094 if (infoItem == bundleInfos_.end() ||
4095 !infoItem->second.GetInnerBundleUserInfo(infoItem->second.GetResponseUserId(userId), userInfo)) {
4096 BundleStorageStats stats;
4097 stats.bundleName = *bundleName;
4098 bundleName = bundleNameList.erase(bundleName);
4099 stats.errCode = ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4100 bundleStatsList.push_back(stats);
4101 continue;
4102 }
4103 uidMap.emplace(*bundleName, userInfo.uid);
4104 ++bundleName;
4105 }
4106 }
4107 ErrCode ret = InstalldClient::GetInstance()->BatchGetBundleStats(
4108 bundleNameList, userId, uidMap, bundleStats);
4109 if (ret != ERR_OK) {
4110 APP_LOGE("getStats failed");
4111 return ret;
4112 }
4113 if (!bundleStatsList.empty()) {
4114 bundleStats.insert(bundleStats.end(), bundleStatsList.begin(), bundleStatsList.end());
4115 }
4116 for (const auto &name : bundleNameList) {
4117 GetPreBundleSize(name, bundleStats);
4118 }
4119 return ERR_OK;
4120 }
4121
GetPreBundleSize(const std::string & name,std::vector<BundleStorageStats> & bundleStats) const4122 void BundleDataMgr::GetPreBundleSize(const std::string &name, std::vector<BundleStorageStats> &bundleStats) const
4123 {
4124 auto statsIter = std::find_if(bundleStats.begin(), bundleStats.end(),
4125 [&name](const BundleStorageStats &stats) { return stats.bundleName == name; });
4126 if (statsIter == bundleStats.end()) {
4127 return;
4128 }
4129 std::string hapPath;
4130 bool getPreBundleSize = false;
4131 {
4132 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4133 const auto infoItem = bundleInfos_.find(name);
4134 if (infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
4135 for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
4136 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
4137 continue;
4138 }
4139 hapPath = innerModuleInfo.second.hapPath;
4140 getPreBundleSize = true;
4141 }
4142 }
4143 }
4144 if (getPreBundleSize) {
4145 statsIter->bundleStats[0] += BundleUtil::GetFileSize(hapPath);
4146 }
4147 }
4148
GetBundleModuleNames(const std::string & bundleName,std::vector<std::string> & moduleNameList) const4149 void BundleDataMgr::GetBundleModuleNames(const std::string &bundleName,
4150 std::vector<std::string> &moduleNameList) const
4151 {
4152 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4153 const auto infoItem = bundleInfos_.find(bundleName);
4154 if (infoItem == bundleInfos_.end()) {
4155 APP_LOGW("No modules of: %{public}s", bundleName.c_str());
4156 return;
4157 }
4158 infoItem->second.GetModuleNames(moduleNameList);
4159 }
4160
GetAllBundleStats(const int32_t userId,std::vector<int64_t> & bundleStats) const4161 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
4162 {
4163 std::vector<int32_t> uids;
4164 int32_t responseUserId = userId;
4165 int32_t requestUserId = GetUserId(userId);
4166 if (requestUserId == Constants::INVALID_USERID) {
4167 APP_LOGE("invalid userid :%{public}d", userId);
4168 return false;
4169 }
4170 {
4171 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4172 for (const auto &item : bundleInfos_) {
4173 const InnerBundleInfo &info = item.second;
4174 std::string bundleName = info.GetBundleName();
4175 responseUserId = info.GetResponseUserId(requestUserId);
4176 if (responseUserId == Constants::INVALID_USERID) {
4177 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
4178 continue;
4179 }
4180 BundleType type = info.GetApplicationBundleType();
4181 if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
4182 APP_LOGD("BundleType is invalid: %{public}d, bundname: %{public}s", type, bundleName.c_str());
4183 continue;
4184 }
4185 std::vector<int32_t> allAppIndexes = {0};
4186 if (type == BundleType::APP) {
4187 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
4188 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
4189 }
4190 for (int32_t appIndex: allAppIndexes) {
4191 int32_t uid = info.GetUid(responseUserId, appIndex);
4192 uids.emplace_back(uid);
4193 }
4194 }
4195 }
4196 if (InstalldClient::GetInstance()->GetAllBundleStats(responseUserId, bundleStats, uids) != ERR_OK) {
4197 APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
4198 return false;
4199 }
4200 if (bundleStats.empty()) {
4201 APP_LOGE("bundle stats is empty");
4202 return true;
4203 }
4204 return true;
4205 }
4206 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string & bundleName) const4207 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
4208 {
4209 return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
4210 }
4211
GetBundleSpaceSize(const std::string & bundleName,int32_t userId) const4212 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
4213 {
4214 int64_t spaceSize = 0;
4215 if (userId != Constants::ALL_USERID) {
4216 std::vector<int64_t> bundleStats;
4217 if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
4218 APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
4219 return spaceSize;
4220 }
4221
4222 spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
4223 return spaceSize;
4224 }
4225
4226 for (const auto &iterUserId : GetAllUser()) {
4227 std::vector<int64_t> bundleStats;
4228 if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
4229 APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
4230 continue;
4231 }
4232
4233 auto startIter = bundleStats.begin();
4234 auto endIter = bundleStats.end();
4235 if (spaceSize == 0) {
4236 spaceSize = std::accumulate(startIter, endIter, spaceSize);
4237 } else {
4238 spaceSize = std::accumulate(++startIter, endIter, spaceSize);
4239 }
4240 }
4241
4242 return spaceSize;
4243 }
4244
GetAllFreeInstallBundleSpaceSize() const4245 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
4246 {
4247 int64_t allSize = 0;
4248 std::map<std::string, std::vector<std::string>> freeInstallModules;
4249 if (!GetFreeInstallModules(freeInstallModules)) {
4250 APP_LOGW("no removable bundles");
4251 return allSize;
4252 }
4253
4254 for (const auto &iter : freeInstallModules) {
4255 APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
4256 allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
4257 }
4258
4259 APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
4260 return allSize;
4261 }
4262
GetFreeInstallModules(std::map<std::string,std::vector<std::string>> & freeInstallModules) const4263 bool BundleDataMgr::GetFreeInstallModules(
4264 std::map<std::string, std::vector<std::string>> &freeInstallModules) const
4265 {
4266 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4267 if (bundleInfos_.empty()) {
4268 APP_LOGW("bundleInfos_ is data is empty");
4269 return false;
4270 }
4271
4272 for (const auto &iter : bundleInfos_) {
4273 std::vector<std::string> modules;
4274 if (!iter.second.GetFreeInstallModules(modules)) {
4275 continue;
4276 }
4277
4278 freeInstallModules.emplace(iter.first, modules);
4279 }
4280
4281 return !freeInstallModules.empty();
4282 }
4283 #endif
4284
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames) const4285 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
4286 {
4287 InnerBundleInfo innerBundleInfo;
4288 if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4289 APP_LOGD("get innerBundleInfo by uid :%{public}d failed", uid);
4290 return false;
4291 }
4292
4293 bundleNames.emplace_back(innerBundleInfo.GetBundleName());
4294 return true;
4295 }
4296
GetNameForUid(const int uid,std::string & name) const4297 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
4298 {
4299 int32_t appIndex = 0;
4300 ErrCode ret = GetBundleNameAndIndex(uid, name, appIndex);
4301 if (ret != ERR_OK) {
4302 LOG_NOFUNC_W(BMS_TAG_COMMON, "uid(%{public}d) invalid", uid);
4303 return ret;
4304 }
4305 APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
4306 uid, name.c_str(), appIndex);
4307 return ERR_OK;
4308 }
4309
GetAppIdentifierAndAppIndex(const uint32_t accessTokenId,std::string & appIdentifier,int32_t & appIndex)4310 ErrCode BundleDataMgr::GetAppIdentifierAndAppIndex(const uint32_t accessTokenId,
4311 std::string &appIdentifier, int32_t &appIndex)
4312 {
4313 Security::AccessToken::HapTokenInfo tokenInfo;
4314 if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(accessTokenId, tokenInfo) != ERR_OK) {
4315 APP_LOGE("accessTokenId %{public}d not exist", accessTokenId);
4316 return ERR_BUNDLE_MANAGER_ACCESS_TOKENID_NOT_EXIST;
4317 }
4318 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4319 const auto infoItem = bundleInfos_.find(tokenInfo.bundleName);
4320 if (infoItem == bundleInfos_.end()) {
4321 APP_LOGE("bundleName %{public}s not exist", tokenInfo.bundleName.c_str());
4322 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4323 }
4324
4325 const InnerBundleInfo &innerBundleInfo = infoItem->second;
4326 appIdentifier = innerBundleInfo.GetAppIdentifier();
4327 appIndex = tokenInfo.instIndex;
4328 return ERR_OK;
4329 }
4330
GetInnerBundleInfoWithSandboxByUid(const int uid,InnerBundleInfo & innerBundleInfo) const4331 ErrCode BundleDataMgr::GetInnerBundleInfoWithSandboxByUid(const int uid, InnerBundleInfo &innerBundleInfo) const
4332 {
4333 ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
4334 if (ret != ERR_OK) {
4335 APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed");
4336 if (sandboxAppHelper_ == nullptr) {
4337 APP_LOGW("sandboxAppHelper_ is nullptr");
4338 return ERR_BUNDLE_MANAGER_INVALID_UID;
4339 }
4340 if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4341 APP_LOGE("Call GetInnerBundleInfoByUid failed");
4342 return ERR_BUNDLE_MANAGER_INVALID_UID;
4343 }
4344 }
4345 return ERR_OK;
4346 }
4347
GetBundleGids(const std::string & bundleName,std::vector<int> & gids) const4348 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
4349 {
4350 int32_t requestUserId = GetUserId();
4351 InnerBundleUserInfo innerBundleUserInfo;
4352 if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
4353 APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) ",
4354 requestUserId, bundleName.c_str());
4355 return false;
4356 }
4357
4358 gids = innerBundleUserInfo.gids;
4359 return true;
4360 }
4361
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids) const4362 bool BundleDataMgr::GetBundleGidsByUid(
4363 const std::string &bundleName, const int &uid, std::vector<int> &gids) const
4364 {
4365 return true;
4366 }
4367
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos) const4368 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
4369 {
4370 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4371 if (bundleInfos_.empty()) {
4372 APP_LOGW("bundleInfos_ data is empty");
4373 return false;
4374 }
4375
4376 int32_t requestUserId = GetUserId();
4377 for (const auto &info : bundleInfos_) {
4378 if (info.second.IsDisabled()) {
4379 APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
4380 continue;
4381 }
4382 if (info.second.GetIsKeepAlive()) {
4383 BundleInfo bundleInfo;
4384 int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
4385 info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
4386 if (bundleInfo.name == "") {
4387 continue;
4388 }
4389 bundleInfos.emplace_back(bundleInfo);
4390 }
4391 }
4392 return !(bundleInfos.empty());
4393 }
4394
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label) const4395 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
4396 const std::string &abilityName, std::string &label) const
4397 {
4398 #ifdef GLOBAL_RESMGR_ENABLE
4399 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4400 int32_t requestUserId = GetUserId();
4401 if (requestUserId == Constants::INVALID_USERID) {
4402 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4403 }
4404 InnerBundleInfo innerBundleInfo;
4405 ErrCode ret =
4406 GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
4407 if (ret != ERR_OK) {
4408 return ret;
4409 }
4410 AbilityInfo abilityInfo;
4411 ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
4412 if (ret != ERR_OK) {
4413 APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
4414 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
4415 return ret;
4416 }
4417 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4418 bool isEnable = false;
4419 ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
4420 if (ret != ERR_OK) {
4421 return ret;
4422 }
4423 if (!isEnable) {
4424 APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
4425 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
4426 }
4427 if (abilityInfo.labelId == 0) {
4428 label = abilityInfo.label;
4429 return ERR_OK;
4430 }
4431 std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
4432 GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
4433 if (resourceManager == nullptr) {
4434 APP_LOGW("InitResourceManager failed");
4435 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4436 }
4437 auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
4438 if (state != OHOS::Global::Resource::RState::SUCCESS) {
4439 APP_LOGW("ResourceManager GetStringById failed");
4440 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4441 }
4442 return ERR_OK;
4443 #else
4444 APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
4445 return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
4446 #endif
4447 }
4448
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo,int32_t userId) const4449 bool BundleDataMgr::GetHapModuleInfo(
4450 const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
4451 {
4452 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4453 int32_t requestUserId = GetUserId(userId);
4454 if (requestUserId == Constants::INVALID_USERID) {
4455 return false;
4456 }
4457
4458 if (bundleInfos_.empty()) {
4459 APP_LOGW("bundleInfos_ data is empty");
4460 return false;
4461 }
4462
4463 APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
4464 auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4465 if (infoItem == bundleInfos_.end()) {
4466 return false;
4467 }
4468
4469 const InnerBundleInfo &innerBundleInfo = infoItem->second;
4470 if (innerBundleInfo.IsDisabled()) {
4471 APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4472 return false;
4473 }
4474
4475 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4476 auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
4477 if (!module) {
4478 APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
4479 abilityInfo.bundleName.c_str());
4480 return false;
4481 }
4482 hapModuleInfo = *module;
4483 return true;
4484 }
4485
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId) const4486 ErrCode BundleDataMgr::GetLaunchWantForBundle(
4487 const std::string &bundleName, Want &want, int32_t userId) const
4488 {
4489 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4490 InnerBundleInfo innerBundleInfo;
4491 ErrCode ret = GetInnerBundleInfoWithFlagsV9(
4492 bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
4493 if (ret != ERR_OK) {
4494 APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
4495 return ret;
4496 }
4497
4498 std::string mainAbility = innerBundleInfo.GetMainAbility();
4499 if (mainAbility.empty()) {
4500 APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
4501 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4502 }
4503
4504 want.SetElementName("", bundleName, mainAbility);
4505 want.SetAction(Constants::ACTION_HOME);
4506 want.AddEntity(Constants::ENTITY_HOME);
4507 return ERR_OK;
4508 }
4509
CheckIsSystemAppByUid(const int uid) const4510 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
4511 {
4512 // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
4513 // the uid should be the system uid.
4514 if (uid == Constants::ROOT_UID || uid == ServiceConstants::BMS_UID) {
4515 return true;
4516 }
4517
4518 InnerBundleInfo innerBundleInfo;
4519 if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4520 return false;
4521 }
4522
4523 return innerBundleInfo.IsSystemApp();
4524 }
4525
InitStateTransferMap()4526 void BundleDataMgr::InitStateTransferMap()
4527 {
4528 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
4529 transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
4530 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
4531 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
4532 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
4533 transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
4534 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
4535 transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
4536 transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
4537 transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
4538 transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
4539 transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
4540 transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
4541 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
4542 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
4543 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
4544 transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
4545 transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
4546 transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
4547 transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
4548 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
4549 transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
4550 transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
4551 transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
4552 transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
4553 transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
4554 transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
4555 transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
4556 }
4557
IsDeleteDataState(const InstallState state) const4558 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
4559 {
4560 return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
4561 state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
4562 }
4563
IsDisableState(const InstallState state) const4564 bool BundleDataMgr::IsDisableState(const InstallState state) const
4565 {
4566 if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
4567 return true;
4568 }
4569 return false;
4570 }
4571
DeleteBundleInfo(const std::string & bundleName,const InstallState state,const bool isKeepData)4572 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state, const bool isKeepData)
4573 {
4574 if (InstallState::INSTALL_FAIL == state) {
4575 APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
4576 return;
4577 }
4578
4579 auto infoItem = bundleInfos_.find(bundleName);
4580 if (infoItem == bundleInfos_.end()) {
4581 APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
4582 return;
4583 }
4584 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
4585 // remove external overlay bundle info and connection
4586 RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
4587 #endif
4588 APP_LOGI("del bundle name:%{public}s", bundleName.c_str());
4589 const InnerBundleInfo &innerBundleInfo = infoItem->second;
4590 if (!isKeepData) {
4591 RecycleUidAndGid(innerBundleInfo);
4592 }
4593 bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
4594 if (!ret) {
4595 APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
4596 }
4597 bundleInfos_.erase(bundleName);
4598 std::lock_guard<ffrt::mutex> hspLock(hspBundleNameMutex_);
4599 if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
4600 appServiceHspBundleName_.erase(bundleName);
4601 }
4602 DeleteDesktopShortcutInfo(bundleName);
4603 }
4604
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,int32_t userId,int32_t appIndex) const4605 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4606 const int32_t flags, int32_t userId, int32_t appIndex) const
4607 {
4608 if (bundleName.empty()) {
4609 return false;
4610 }
4611 int32_t requestUserId = GetUserId(userId);
4612 if (requestUserId == Constants::INVALID_USERID) {
4613 return false;
4614 }
4615
4616 if (bundleInfos_.empty()) {
4617 APP_LOGW("bundleInfos_ data is empty");
4618 return false;
4619 }
4620 APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
4621 auto item = bundleInfos_.find(bundleName);
4622 if (item == bundleInfos_.end()) {
4623 LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4624 bundleName.c_str(), userId, appIndex, flags);
4625 return false;
4626 }
4627 const InnerBundleInfo &innerBundleInfo = item->second;
4628 if (innerBundleInfo.IsDisabled()) {
4629 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4630 bundleName.c_str(), userId, appIndex, flags);
4631 return false;
4632 }
4633
4634 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4635 if (appIndex == 0) {
4636 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
4637 && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
4638 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false or not installed -n %{public}s -u %{public}d"
4639 " -i %{public}d -f %{public}d", bundleName.c_str(), responseUserId, appIndex, flags);
4640 return false;
4641 }
4642 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
4643 bool isEnabled = false;
4644 ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4645 if (ret != ERR_OK) {
4646 LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle %{public}s not install in user %{public}d -i %{public}d",
4647 bundleName.c_str(), responseUserId, appIndex);
4648 return false;
4649 }
4650 if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
4651 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4652 bundleName.c_str(), responseUserId, appIndex, flags);
4653 return false;
4654 }
4655 } else {
4656 return false;
4657 }
4658 return true;
4659 }
4660
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4661 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4662 const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4663 {
4664 bool res = GetInnerBundleInfoWithFlags(bundleName, flags, userId, appIndex);
4665 if (!res) {
4666 return false;
4667 }
4668 auto item = bundleInfos_.find(bundleName);
4669 if (item == bundleInfos_.end()) {
4670 APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4671 return false;
4672 }
4673 info = item->second;
4674 return true;
4675 }
4676
GetInnerBundleInfoWithBundleFlagsAndLock(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const4677 bool BundleDataMgr::GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName,
4678 const int32_t flags, InnerBundleInfo &info, int32_t userId) const
4679 {
4680 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4681 bool res = GetInnerBundleInfoWithFlags(bundleName, flags, info, userId);
4682 if (!res) {
4683 APP_LOGD("GetInnerBundleInfoWithBundleFlagsAndLock: bundleName %{public}s not find", bundleName.c_str());
4684 return res;
4685 }
4686 return true;
4687 }
4688
GetInnerBundleInfoWithFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4689 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
4690 const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4691 {
4692 int32_t requestUserId = GetUserId(userId);
4693 if (requestUserId == Constants::INVALID_USERID) {
4694 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4695 }
4696
4697 if (bundleInfos_.empty()) {
4698 APP_LOGD("bundleInfos_ data is empty");
4699 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4700 }
4701 APP_LOGD(
4702 "GetInnerBundleInfoWithFlagsV9:bundleName:%{public}s,flags:%{public}d,userId:%{public}d,appIndex:%{public}d",
4703 bundleName.c_str(), flags, userId, appIndex);
4704 auto item = bundleInfos_.find(bundleName);
4705 if (item == bundleInfos_.end()) {
4706 LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4707 bundleName.c_str(), userId, appIndex, flags);
4708 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4709 }
4710 const InnerBundleInfo &innerBundleInfo = item->second;
4711 if (innerBundleInfo.IsDisabled()) {
4712 LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4713 bundleName.c_str(), userId, appIndex, flags);
4714 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4715 }
4716
4717 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4718 bool isEnabled = false;
4719 auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4720 if (ret != ERR_OK) {
4721 LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle %{public}s not install in user %{public}d -i %{public}d",
4722 bundleName.c_str(), responseUserId, appIndex);
4723 return ret;
4724 }
4725 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
4726 && !isEnabled) {
4727 LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4728 bundleName.c_str(), responseUserId, appIndex, flags);
4729 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4730 }
4731 info = innerBundleInfo;
4732 return ERR_OK;
4733 }
4734
GetInnerBundleInfoWithBundleFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4735 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
4736 const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4737 {
4738 if (bundleName.empty()) {
4739 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4740 }
4741 int32_t requestUserId = GetUserId(userId);
4742 if (requestUserId == Constants::INVALID_USERID) {
4743 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4744 }
4745
4746 if (bundleInfos_.empty()) {
4747 APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
4748 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4749 }
4750 APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
4751 auto item = bundleInfos_.find(bundleName);
4752 if (item == bundleInfos_.end()) {
4753 APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4754 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4755 }
4756 const InnerBundleInfo &innerBundleInfo = item->second;
4757 if (innerBundleInfo.IsDisabled()) {
4758 APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
4759 return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4760 }
4761
4762 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4763 bool isEnabled = false;
4764 auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4765 if (ret != ERR_OK) {
4766 return ret;
4767 }
4768 if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
4769 && !isEnabled) {
4770 APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4771 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4772 }
4773 info = innerBundleInfo;
4774 return ERR_OK;
4775 }
4776
GetInnerBundleInfoWithDisable(const std::string & bundleName,InnerBundleInfo & info)4777 bool BundleDataMgr::GetInnerBundleInfoWithDisable(const std::string &bundleName, InnerBundleInfo &info)
4778 {
4779 APP_LOGD("GetInnerBundleInfoWithDisable %{public}s", bundleName.c_str());
4780 if (bundleName.empty()) {
4781 APP_LOGW("bundleName is empty");
4782 return false;
4783 }
4784
4785 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4786 auto infoItem = bundleInfos_.find(bundleName);
4787 if (infoItem == bundleInfos_.end()) {
4788 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4789 return false;
4790 }
4791 infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4792 info = infoItem->second;
4793 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4794 return true;
4795 }
4796
DisableBundle(const std::string & bundleName)4797 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
4798 {
4799 APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
4800 if (bundleName.empty()) {
4801 APP_LOGW("bundleName empty");
4802 return false;
4803 }
4804
4805 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4806 auto infoItem = bundleInfos_.find(bundleName);
4807 if (infoItem == bundleInfos_.end()) {
4808 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4809 return false;
4810 }
4811 infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4812 return true;
4813 }
4814
EnableBundle(const std::string & bundleName)4815 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
4816 {
4817 APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
4818 if (bundleName.empty()) {
4819 APP_LOGW("bundleName empty");
4820 return false;
4821 }
4822
4823 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4824 auto infoItem = bundleInfos_.find(bundleName);
4825 if (infoItem == bundleInfos_.end()) {
4826 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4827 return false;
4828 }
4829 infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4830 return true;
4831 }
4832
IsApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool & isEnabled,int32_t userId) const4833 ErrCode BundleDataMgr::IsApplicationEnabled(
4834 const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const
4835 {
4836 APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
4837 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4838 auto infoItem = bundleInfos_.find(bundleName);
4839 if (infoItem == bundleInfos_.end()) {
4840 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4841 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4842 }
4843 int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId(userId));
4844 if (appIndex == 0) {
4845 ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
4846 if (ret != ERR_OK) {
4847 APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
4848 }
4849 return ret;
4850 }
4851 const InnerBundleInfo &bundleInfo = infoItem->second;
4852 InnerBundleUserInfo innerBundleUserInfo;
4853 if (!bundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
4854 APP_LOGW("can not find userId %{public}d", responseUserId);
4855 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4856 }
4857 auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex));
4858 if (iter == innerBundleUserInfo.cloneInfos.end()) {
4859 APP_LOGW("can not find appIndex %{public}d", appIndex);
4860 return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4861 }
4862 isEnabled = iter->second.enabled;
4863 return ERR_OK;
4864 }
4865
SetApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool isEnable,const std::string & caller,int32_t userId)4866 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName,
4867 int32_t appIndex, bool isEnable, const std::string &caller, int32_t userId)
4868 {
4869 APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
4870 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4871 int32_t requestUserId = GetUserId(userId);
4872 if (requestUserId == Constants::INVALID_USERID) {
4873 APP_LOGW("Request userId %{public}d is invalid, bundleName:%{public}s", userId, bundleName.c_str());
4874 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4875 }
4876 auto infoItem = bundleInfos_.find(bundleName);
4877 if (infoItem == bundleInfos_.end()) {
4878 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4879 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4880 }
4881
4882 InnerBundleInfo& newInfo = infoItem->second;
4883 if (appIndex != 0) {
4884 auto ret = newInfo.SetCloneApplicationEnabled(isEnable, appIndex, caller, requestUserId);
4885 if (ret != ERR_OK) {
4886 APP_LOGW("SetCloneApplicationEnabled for innerBundleInfo fail, errCode is %{public}d", ret);
4887 return ret;
4888 }
4889 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4890 APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", newInfo.GetBundleName().c_str());
4891 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4892 }
4893 return ERR_OK;
4894 }
4895 auto ret = newInfo.SetApplicationEnabled(isEnable, caller, requestUserId);
4896 if (ret != ERR_OK) {
4897 APP_LOGW("SetApplicationEnabled failed, err %{public}d", ret);
4898 return ret;
4899 }
4900
4901 InnerBundleUserInfo innerBundleUserInfo;
4902 if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4903 APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
4904 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4905 }
4906
4907 if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4908 bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
4909 } else {
4910 bundleStateStorage_->SaveBundleStateStorage(
4911 bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4912 }
4913 return ERR_OK;
4914 }
4915
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)4916 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
4917 {
4918 if (bundleName.empty() || moduleName.empty()) {
4919 APP_LOGW("bundleName or moduleName is empty");
4920 return false;
4921 }
4922 int32_t userId = AccountHelper::GetCurrentActiveUserId();
4923 if (userId == Constants::INVALID_USERID) {
4924 APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4925 return false;
4926 }
4927 APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4928 bundleName.c_str(), moduleName.c_str(), userId);
4929 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4930 auto infoItem = bundleInfos_.find(bundleName);
4931 if (infoItem == bundleInfos_.end()) {
4932 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4933 return false;
4934 }
4935 InnerBundleInfo newInfo = infoItem->second;
4936 bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
4937 if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
4938 ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
4939 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
4940 if (isEnable) {
4941 // call clean task
4942 APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
4943 bundleName.c_str(), isEnable, ret);
4944 DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
4945 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
4946 }
4947 #endif
4948 return ret;
4949 } else {
4950 APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
4951 return false;
4952 }
4953 }
4954
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable) const4955 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
4956 bool &isRemovable) const
4957 {
4958 if (bundleName.empty() || moduleName.empty()) {
4959 APP_LOGW("bundleName or moduleName is empty");
4960 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4961 }
4962 int32_t userId = AccountHelper::GetCurrentActiveUserId();
4963 if (userId == Constants::INVALID_USERID) {
4964 APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4965 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4966 }
4967 APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4968 bundleName.c_str(), moduleName.c_str(), userId);
4969 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4970 auto infoItem = bundleInfos_.find(bundleName);
4971 if (infoItem == bundleInfos_.end()) {
4972 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4973 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4974 }
4975 InnerBundleInfo newInfo = infoItem->second;
4976 return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
4977 }
4978
IsAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool & isEnable) const4979 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const
4980 {
4981 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4982 auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4983 if (infoItem == bundleInfos_.end()) {
4984 APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4985 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4986 }
4987 std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(abilityInfo.bundleName, Constants::ALL_USERID);
4988 if ((appIndex != 0) && (std::find(appIndexVec.begin(), appIndexVec.end(), appIndex) == appIndexVec.end())) {
4989 APP_LOGE("appIndex %{public}d is invalid", appIndex);
4990 return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4991 }
4992 InnerBundleInfo innerBundleInfo = infoItem->second;
4993 auto ability = innerBundleInfo.FindAbilityInfoV9(
4994 abilityInfo.moduleName, abilityInfo.name);
4995 if (!ability) {
4996 APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
4997 abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
4998 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4999 }
5000 int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
5001 return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable, appIndex);
5002 }
5003
SetAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool isEnabled,int32_t userId)5004 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex,
5005 bool isEnabled, int32_t userId)
5006 {
5007 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5008 int32_t requestUserId = GetUserId(userId);
5009 if (requestUserId == Constants::INVALID_USERID) {
5010 APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
5011 abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5012 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5013 }
5014 auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
5015 if (infoItem == bundleInfos_.end()) {
5016 APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
5017 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5018 }
5019 InnerBundleInfo& newInfo = infoItem->second;
5020 if (appIndex != 0) {
5021 auto ret = newInfo.SetCloneAbilityEnabled(
5022 abilityInfo.moduleName, abilityInfo.name, isEnabled, userId, appIndex);
5023 if (ret != ERR_OK) {
5024 APP_LOGW("SetCloneAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
5025 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5026 return ret;
5027 }
5028 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
5029 APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", newInfo.GetBundleName().c_str());
5030 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
5031 }
5032 return ERR_OK;
5033 }
5034 ErrCode ret = newInfo.SetAbilityEnabled(
5035 abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
5036 if (ret != ERR_OK) {
5037 APP_LOGW("SetAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
5038 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5039 return ret;
5040 }
5041 InnerBundleUserInfo innerBundleUserInfo;
5042 if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
5043 APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
5044 requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5045 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5046 }
5047 if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
5048 bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
5049 } else {
5050 bundleStateStorage_->SaveBundleStateStorage(
5051 abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
5052 }
5053 return ERR_OK;
5054 }
5055
GetSandboxAppHelper() const5056 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
5057 {
5058 return sandboxAppHelper_;
5059 }
5060
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)5061 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
5062 {
5063 APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
5064 std::unique_lock<ffrt::shared_mutex> lock(callbackMutex_);
5065 callbackList_.emplace_back(bundleStatusCallback);
5066 if (bundleStatusCallback->AsObject() != nullptr) {
5067 sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
5068 new (std::nothrow) BundleStatusCallbackDeathRecipient();
5069 if (deathRecipient == nullptr) {
5070 APP_LOGW("deathRecipient is null");
5071 return false;
5072 }
5073 bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
5074 }
5075 return true;
5076 }
5077
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)5078 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
5079 {
5080 if (bundleEventCallback == nullptr) {
5081 APP_LOGW("bundleEventCallback is null");
5082 return false;
5083 }
5084 std::lock_guard lock(eventCallbackMutex_);
5085 if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
5086 APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
5087 return false;
5088 }
5089 if (bundleEventCallback->AsObject() != nullptr) {
5090 sptr<BundleEventCallbackDeathRecipient> deathRecipient =
5091 new (std::nothrow) BundleEventCallbackDeathRecipient();
5092 if (deathRecipient == nullptr) {
5093 APP_LOGW("deathRecipient is null");
5094 return false;
5095 }
5096 bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
5097 }
5098 eventCallbackList_.emplace_back(bundleEventCallback);
5099 return true;
5100 }
5101
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)5102 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
5103 {
5104 APP_LOGD("begin to UnregisterBundleEventCallback");
5105 if (bundleEventCallback == nullptr) {
5106 APP_LOGW("bundleEventCallback is null");
5107 return false;
5108 }
5109 std::lock_guard lock(eventCallbackMutex_);
5110 eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
5111 [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
5112 return callback->AsObject() == bundleEventCallback->AsObject();
5113 }), eventCallbackList_.end());
5114 return true;
5115 }
5116
NotifyBundleEventCallback(const EventFwk::CommonEventData & eventData) const5117 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
5118 {
5119 APP_LOGD("begin to NotifyBundleEventCallback");
5120 std::lock_guard lock(eventCallbackMutex_);
5121 for (const auto &callback : eventCallbackList_) {
5122 callback->OnReceiveEvent(eventData);
5123 }
5124 APP_LOGD("finish to NotifyBundleEventCallback");
5125 }
5126
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)5127 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
5128 {
5129 APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
5130 std::unique_lock<ffrt::shared_mutex> lock(callbackMutex_);
5131 callbackList_.erase(std::remove_if(callbackList_.begin(),
5132 callbackList_.end(),
5133 [&](const sptr<IBundleStatusCallback> &callback) {
5134 return callback->AsObject() == bundleStatusCallback->AsObject();
5135 }),
5136 callbackList_.end());
5137 return true;
5138 }
5139
UnregisterBundleStatusCallback()5140 bool BundleDataMgr::UnregisterBundleStatusCallback()
5141 {
5142 std::unique_lock<ffrt::shared_mutex> lock(callbackMutex_);
5143 callbackList_.clear();
5144 return true;
5145 }
5146
GenerateUidAndGid(InnerBundleUserInfo & innerBundleUserInfo)5147 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
5148 {
5149 if (innerBundleUserInfo.bundleName.empty()) {
5150 APP_LOGW("bundleName is null");
5151 return false;
5152 }
5153
5154 int32_t bundleId = INVALID_BUNDLEID;
5155 if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
5156 APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
5157 return false;
5158 }
5159
5160 innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
5161 + bundleId % Constants::BASE_USER_RANGE;
5162 innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
5163 return true;
5164 }
5165
GenerateBundleId(const std::string & bundleName,int32_t & bundleId)5166 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
5167 {
5168 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5169 if (bundleIdMap_.empty()) {
5170 APP_LOGD("first app install");
5171 bundleId = baseAppUid_;
5172 bundleIdMap_.emplace(bundleId, bundleName);
5173 return true;
5174 }
5175
5176 for (const auto &innerBundleId : bundleIdMap_) {
5177 if (innerBundleId.second == bundleName) {
5178 bundleId = innerBundleId.first;
5179 return true;
5180 }
5181 }
5182
5183 for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
5184 if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
5185 APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
5186 bundleId = i;
5187 bundleIdMap_.emplace(bundleId, bundleName);
5188 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5189 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
5190 return true;
5191 }
5192 }
5193
5194 if (bundleIdMap_.rbegin()->first == MAX_APP_UID) {
5195 APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
5196 return false;
5197 }
5198
5199 bundleId = bundleIdMap_.rbegin()->first + 1;
5200 bundleIdMap_.emplace(bundleId, bundleName);
5201 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5202 BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
5203 return true;
5204 }
5205
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,const int32_t upgradeFlag)5206 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
5207 const std::string &moduleName, const int32_t upgradeFlag)
5208 {
5209 APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
5210 if (bundleName.empty() || moduleName.empty()) {
5211 APP_LOGW("bundleName or moduleName is empty");
5212 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
5213 }
5214 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5215 auto infoItem = bundleInfos_.find(bundleName);
5216 if (infoItem == bundleInfos_.end()) {
5217 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5218 }
5219 InnerBundleInfo &newInfo = infoItem->second;
5220 ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
5221 if (setFlag == ERR_OK) {
5222 if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
5223 return ERR_OK;
5224 }
5225 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
5226 }
5227 APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
5228 return setFlag;
5229 }
5230
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName) const5231 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
5232 {
5233 APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
5234 if (bundleName.empty() || moduleName.empty()) {
5235 APP_LOGW("bundleName or moduleName is empty");
5236 return false;
5237 }
5238 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5239 auto infoItem = bundleInfos_.find(bundleName);
5240 if (infoItem == bundleInfos_.end()) {
5241 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5242 return false;
5243 }
5244 InnerBundleInfo newInfo = infoItem->second;
5245 return newInfo.GetModuleUpgradeFlag(moduleName);
5246 }
5247
RecycleUidAndGid(const InnerBundleInfo & info)5248 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
5249 {
5250 auto userInfos = info.GetInnerBundleUserInfos();
5251 if (userInfos.empty()) {
5252 APP_LOGE("user infos is empty");
5253 return;
5254 }
5255
5256 auto innerBundleUserInfo = userInfos.begin()->second;
5257 int32_t bundleId = innerBundleUserInfo.uid -
5258 innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5259 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5260 auto infoItem = bundleIdMap_.find(bundleId);
5261 if (infoItem == bundleIdMap_.end()) {
5262 return;
5263 }
5264
5265 UninstallBundleInfo uninstallBundleInfo;
5266 if (GetUninstallBundleInfo(info.GetBundleName(), uninstallBundleInfo)) {
5267 return;
5268 }
5269 bundleIdMap_.erase(bundleId);
5270 BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH);
5271 BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::SHAREFS_CONFIG_PATH);
5272 }
5273
RestoreUidAndGid()5274 bool BundleDataMgr::RestoreUidAndGid()
5275 {
5276 for (const auto &info : bundleInfos_) {
5277 bool onlyInsertOne = false;
5278 for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
5279 auto innerBundleUserInfo = infoItem.second;
5280 AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
5281 if (!onlyInsertOne) {
5282 onlyInsertOne = true;
5283 int32_t bundleId = innerBundleUserInfo.uid -
5284 innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5285 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5286 auto item = bundleIdMap_.find(bundleId);
5287 if (item == bundleIdMap_.end()) {
5288 bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
5289 } else {
5290 bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
5291 }
5292 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5293 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId,
5294 ServiceConstants::SHAREFS_CONFIG_PATH);
5295 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH,
5296 info.second.GetAppProvisionType(), Constants::APP_PROVISION_TYPE_FILE_NAME);
5297 }
5298 // appClone
5299 std::string bundleName = info.second.GetBundleName();
5300 std::map<std::string, InnerBundleCloneInfo> &clones = innerBundleUserInfo.cloneInfos;
5301 for (auto iter = clones.begin(); iter != clones.end(); iter++) {
5302 auto &cloneInfo = iter->second;
5303 int32_t bundleId = cloneInfo.uid - cloneInfo.userId * Constants::BASE_USER_RANGE;
5304 std::string cloneBundleName =
5305 BundleCloneCommonHelper::GetCloneBundleIdKey(bundleName, cloneInfo.appIndex);
5306 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5307 auto item = bundleIdMap_.find(bundleId);
5308 if (item == bundleIdMap_.end()) {
5309 bundleIdMap_.emplace(bundleId, cloneBundleName);
5310 } else {
5311 bundleIdMap_[bundleId] = cloneBundleName;
5312 }
5313 BundleUtil::MakeFsConfig(cloneBundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5314 BundleUtil::MakeFsConfig(cloneBundleName, bundleId,
5315 ServiceConstants::SHAREFS_CONFIG_PATH);
5316 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH,
5317 info.second.GetAppProvisionType(), Constants::APP_PROVISION_TYPE_FILE_NAME);
5318 }
5319 }
5320 }
5321 RestoreUidAndGidFromUninstallInfo();
5322 return true;
5323 }
5324
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)5325 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
5326 {
5327 if (sandboxAppHelper_ != nullptr) {
5328 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5329 sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
5330 }
5331 }
5332
GetBundleMutex(const std::string & bundleName)5333 ffrt::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
5334 {
5335 bundleMutex_.lock_shared();
5336 auto it = bundleMutexMap_.find(bundleName);
5337 if (it == bundleMutexMap_.end()) {
5338 bundleMutex_.unlock_shared();
5339 std::unique_lock lock {bundleMutex_};
5340 return bundleMutexMap_[bundleName];
5341 }
5342 bundleMutex_.unlock_shared();
5343 return it->second;
5344 }
5345
GetProvisionId(const std::string & bundleName,std::string & provisionId) const5346 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
5347 {
5348 APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
5349 if (bundleName.empty()) {
5350 APP_LOGW("bundleName empty");
5351 return false;
5352 }
5353 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5354 auto infoItem = bundleInfos_.find(bundleName);
5355 if (infoItem == bundleInfos_.end()) {
5356 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5357 return false;
5358 }
5359 provisionId = infoItem->second.GetProvisionId();
5360 return true;
5361 }
5362
GetAppFeature(const std::string & bundleName,std::string & appFeature) const5363 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
5364 {
5365 APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
5366 if (bundleName.empty()) {
5367 APP_LOGW("bundleName empty");
5368 return false;
5369 }
5370 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5371 auto infoItem = bundleInfos_.find(bundleName);
5372 if (infoItem == bundleInfos_.end()) {
5373 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5374 return false;
5375 }
5376 appFeature = infoItem->second.GetAppFeature();
5377 return true;
5378 }
5379
SetInitialUserFlag(bool flag)5380 void BundleDataMgr::SetInitialUserFlag(bool flag)
5381 {
5382 APP_LOGD("SetInitialUserFlag %{public}d", flag);
5383 if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
5384 bundlePromise_->NotifyAllTasksExecuteFinished();
5385 }
5386
5387 initialUserFlag_ = flag;
5388 }
5389
GetDataStorage() const5390 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
5391 {
5392 return dataStorage_;
5393 }
5394
GetAllFormsInfo(std::vector<FormInfo> & formInfos) const5395 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
5396 {
5397 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5398 if (bundleInfos_.empty()) {
5399 APP_LOGW("bundleInfos_ data is empty");
5400 return false;
5401 }
5402 auto result = false;
5403 for (const auto &item : bundleInfos_) {
5404 if (item.second.IsDisabled()) {
5405 APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
5406 continue;
5407 }
5408 item.second.GetFormsInfoByApp(formInfos);
5409 result = true;
5410 }
5411 APP_LOGD("all the form infos find success");
5412 return result;
5413 }
5414
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos) const5415 bool BundleDataMgr::GetFormsInfoByModule(
5416 const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
5417 {
5418 if (bundleName.empty()) {
5419 APP_LOGW("bundle name is empty");
5420 return false;
5421 }
5422 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5423 if (bundleInfos_.empty()) {
5424 APP_LOGW("bundleInfos_ data is empty");
5425 return false;
5426 }
5427 auto infoItem = bundleInfos_.find(bundleName);
5428 if (infoItem == bundleInfos_.end()) {
5429 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5430 return false;
5431 }
5432 if (infoItem->second.IsDisabled()) {
5433 APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5434 return false;
5435 }
5436 infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
5437 if (formInfos.empty()) {
5438 return false;
5439 }
5440 APP_LOGD("module forminfo find success");
5441 return true;
5442 }
5443
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos) const5444 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
5445 {
5446 if (bundleName.empty()) {
5447 APP_LOGW("bundle name is empty");
5448 return false;
5449 }
5450 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5451 if (bundleInfos_.empty()) {
5452 APP_LOGW("bundleInfos_ data is empty");
5453 return false;
5454 }
5455 auto infoItem = bundleInfos_.find(bundleName);
5456 if (infoItem == bundleInfos_.end()) {
5457 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5458 return false;
5459 }
5460 if (infoItem->second.IsDisabled()) {
5461 APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5462 return false;
5463 }
5464 infoItem->second.GetFormsInfoByApp(formInfos);
5465 APP_LOGD("App forminfo find success");
5466 return true;
5467 }
5468
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5469 bool BundleDataMgr::GetShortcutInfos(
5470 const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5471 {
5472 int32_t requestUserId = GetUserId(userId);
5473 if (requestUserId == Constants::INVALID_USERID) {
5474 APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5475 return false;
5476 }
5477
5478 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5479 InnerBundleInfo innerBundleInfo;
5480 if (!GetInnerBundleInfoWithFlags(
5481 bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
5482 APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
5483 bundleName.c_str(), requestUserId);
5484 return false;
5485 }
5486 GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5487
5488 // get shortcut visible status
5489 for (auto &info : shortcutInfos) {
5490 shortcutVisibleStorage_->GetShortcutVisibleStatus(requestUserId, Constants::MAIN_APP_INDEX, info);
5491 }
5492 return true;
5493 }
5494
TryGetRawDataByExtractor(const std::string & hapPath,const std::string & profileName,const AbilityInfo & abilityInfo) const5495 std::string BundleDataMgr::TryGetRawDataByExtractor(const std::string &hapPath, const std::string &profileName,
5496 const AbilityInfo &abilityInfo) const
5497 {
5498 std::string rawData;
5499 GetJsonProfileByExtractor(hapPath, profileName, rawData);
5500 if (rawData.empty()) { // if get failed ,try get from resmgr
5501 BundleMgrClient bundleMgrClient;
5502 std::vector<std::string> rawJson;
5503 if (!bundleMgrClient.GetResConfigFile(abilityInfo, META_DATA_SHORTCUTS_NAME, rawJson)) {
5504 APP_LOGD("GetResConfigFile return false");
5505 return "";
5506 }
5507 return rawJson.empty() ? "" : rawJson[0];
5508 }
5509 return rawData;
5510 }
5511
GetShortcutInfosByInnerBundleInfo(const InnerBundleInfo & info,std::vector<ShortcutInfo> & shortcutInfos) const5512 bool BundleDataMgr::GetShortcutInfosByInnerBundleInfo(
5513 const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const
5514 {
5515 if (!info.GetIsNewVersion()) {
5516 info.GetShortcutInfos(shortcutInfos);
5517 return true;
5518 }
5519 AbilityInfo abilityInfo;
5520 info.GetMainAbilityInfo(abilityInfo);
5521 if (abilityInfo.hapPath.empty() || abilityInfo.metadata.size() <= 0) {
5522 return false;
5523 }
5524 std::string rawData;
5525 for (const auto &meta : abilityInfo.metadata) {
5526 if (meta.name.compare(META_DATA_SHORTCUTS_NAME) == 0) {
5527 std::string resName = meta.resource;
5528 std::string hapPath = abilityInfo.hapPath;
5529 size_t pos = resName.rfind(PROFILE_PREFIX);
5530 bool posValid = (pos != std::string::npos) && (pos != resName.length() - strlen(PROFILE_PREFIX));
5531 if (!posValid) {
5532 APP_LOGE("resName invalid %{public}s", resName.c_str());
5533 return false;
5534 }
5535 std::string profileName = PROFILE_PATH + resName.substr(pos + strlen(PROFILE_PREFIX)) + JSON_SUFFIX;
5536 rawData = TryGetRawDataByExtractor(hapPath, profileName, abilityInfo);
5537 break;
5538 }
5539 }
5540 if (rawData.empty()) {
5541 APP_LOGE("shortcutinfo is empty");
5542 return false;
5543 }
5544 nlohmann::json jsonObject = nlohmann::json::parse(rawData, nullptr, false);
5545 if (jsonObject.is_discarded()) {
5546 APP_LOGE("shortcuts json invalid");
5547 return false;
5548 }
5549 ShortcutJson shortcutJson = jsonObject.get<ShortcutJson>();
5550 for (const Shortcut &item : shortcutJson.shortcuts) {
5551 ShortcutInfo shortcutInfo;
5552 shortcutInfo.bundleName = abilityInfo.bundleName;
5553 shortcutInfo.moduleName = abilityInfo.moduleName;
5554 info.InnerProcessShortcut(item, shortcutInfo);
5555 shortcutInfo.sourceType = 1;
5556 APP_LOGI_NOFUNC("shortcutInfo: -n %{public}s, id %{public}s, iconId %{public}d, labelId %{public}d",
5557 shortcutInfo.bundleName.c_str(), shortcutInfo.id.c_str(), shortcutInfo.iconId, shortcutInfo.labelId);
5558 shortcutInfos.emplace_back(shortcutInfo);
5559 }
5560 (void)InnerProcessShortcutId(info.GetBundleUpdateTime(Constants::ALL_USERID), abilityInfo.hapPath, shortcutInfos);
5561 return true;
5562 }
5563
5564 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & hapPath) const5565 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(const std::string &hapPath) const
5566 {
5567 if (hapPath.empty()) {
5568 APP_LOGE("hapPath is empty");
5569 return nullptr;
5570 }
5571 std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
5572 if (resourceManager == nullptr) {
5573 APP_LOGE("InitResMgr failed, -h:%{public}s", hapPath.c_str());
5574 return nullptr;
5575 }
5576
5577 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
5578 if (!resConfig) {
5579 APP_LOGE("resConfig is nullptr");
5580 return nullptr;
5581 }
5582 resourceManager->UpdateResConfig(*resConfig);
5583 if (!resourceManager->AddResource(hapPath.c_str(), Global::Resource::SELECT_STRING)) {
5584 APP_LOGW("AddResource failed");
5585 }
5586 return resourceManager;
5587 }
5588 #endif
5589
CheckUpdateTimeWithBmsParam(const int64_t updateTime) const5590 bool BundleDataMgr::CheckUpdateTimeWithBmsParam(const int64_t updateTime) const
5591 {
5592 auto bmsPara = DelayedSingleton<BundleMgrService>::GetInstance()->GetBmsParam();
5593 if (bmsPara == nullptr) {
5594 LOG_E(BMS_TAG_DEFAULT, "bmsPara is nullptr");
5595 return false;
5596 }
5597 std::string val;
5598 if (!bmsPara->GetBmsParam(ServiceConstants::BMS_SYSTEM_TIME_FOR_SHORTCUT, val)) {
5599 LOG_E(BMS_TAG_DEFAULT, "GetBmsParam BMS_SYSTEM_TIME_FOR_SHORTCUT failed");
5600 return false;
5601 }
5602 if (std::to_string(updateTime) < val) {
5603 LOG_W(BMS_TAG_DEFAULT, "updateTime is less than val");
5604 return false;
5605 }
5606 return true;
5607 }
5608
InnerProcessShortcutId(const int64_t updateTime,const std::string & hapPath,std::vector<ShortcutInfo> & shortcutInfos) const5609 bool BundleDataMgr::InnerProcessShortcutId(const int64_t updateTime,
5610 const std::string &hapPath, std::vector<ShortcutInfo> &shortcutInfos) const
5611 {
5612 #ifdef GLOBAL_RESMGR_ENABLE
5613 bool needToParseShortcutId = false;
5614 for (const auto &info : shortcutInfos) {
5615 if (info.id.find(RESOURCE_STRING_PREFIX) == 0) {
5616 needToParseShortcutId = true;
5617 break;
5618 }
5619 }
5620 if (!needToParseShortcutId) {
5621 return false;
5622 }
5623
5624 if (!CheckUpdateTimeWithBmsParam(updateTime)) {
5625 return false;
5626 }
5627
5628 APP_LOGI("shortcut id conatins $string: need parse");
5629 auto resourceManager = GetResourceManager(hapPath);
5630 if (resourceManager == nullptr) {
5631 APP_LOGI("create resource mgr failed");
5632 return false;
5633 }
5634
5635 for (auto &info : shortcutInfos) {
5636 if (info.id.find(RESOURCE_STRING_PREFIX) != 0) {
5637 continue;
5638 }
5639 uint32_t id = static_cast<uint32_t>(atoi(info.id.substr(std::string(RESOURCE_STRING_PREFIX).size()).c_str()));
5640 std::string shortcutId;
5641 OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(id, shortcutId);
5642 if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
5643 APP_LOGE("GetStringById failed, id:%{public}d", id);
5644 continue;
5645 }
5646 info.id = shortcutId;
5647 }
5648 return true;
5649
5650 #else
5651 return true;
5652 #endif
5653 }
5654
GetShortcutInfoV9(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5655 ErrCode BundleDataMgr::GetShortcutInfoV9(
5656 const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5657 {
5658 int32_t requestUserId = GetUserId(userId);
5659 if (requestUserId == Constants::INVALID_USERID) {
5660 APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5661 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5662 }
5663 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5664 InnerBundleInfo innerBundleInfo;
5665 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
5666 BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
5667 if (ret != ERR_OK) {
5668 APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5669 bundleName.c_str(), requestUserId);
5670 return ret;
5671 }
5672
5673 GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5674 // get shortcut visible status
5675 for (auto &info : shortcutInfos) {
5676 shortcutVisibleStorage_->GetShortcutVisibleStatus(requestUserId, Constants::MAIN_APP_INDEX, info);
5677 }
5678 return ERR_OK;
5679 }
5680
GetShortcutInfoByAppIndex(const std::string & bundleName,const int32_t appIndex,std::vector<ShortcutInfo> & shortcutInfos) const5681 ErrCode BundleDataMgr::GetShortcutInfoByAppIndex(const std::string &bundleName, const int32_t appIndex,
5682 std::vector<ShortcutInfo> &shortcutInfos) const
5683 {
5684 if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
5685 APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
5686 return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
5687 }
5688 int32_t requestUserId = GetUserId();
5689 if (requestUserId == Constants::INVALID_USERID) {
5690 APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), requestUserId);
5691 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5692 }
5693 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5694 InnerBundleInfo innerBundleInfo;
5695 int32_t flag = static_cast<int32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE);
5696 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flag, innerBundleInfo, requestUserId, appIndex);
5697 if (ret != ERR_OK) {
5698 APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5699 bundleName.c_str(), requestUserId);
5700 return ret;
5701 }
5702
5703 GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5704 for (auto &info : shortcutInfos) {
5705 shortcutVisibleStorage_->GetShortcutVisibleStatus(requestUserId, appIndex, info);
5706 info.appIndex = appIndex;
5707 }
5708 return ERR_OK;
5709 }
5710
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos) const5711 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
5712 std::vector<CommonEventInfo> &commonEventInfos) const
5713 {
5714 if (eventKey.empty()) {
5715 APP_LOGW("event key is empty");
5716 return false;
5717 }
5718 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5719 if (bundleInfos_.empty()) {
5720 APP_LOGW("bundleInfos_ data is empty");
5721 return false;
5722 }
5723 for (const auto &item : bundleInfos_) {
5724 const InnerBundleInfo &info = item.second;
5725 if (info.IsDisabled()) {
5726 APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
5727 continue;
5728 }
5729 info.GetCommonEvents(eventKey, commonEventInfos);
5730 }
5731 if (commonEventInfos.size() == 0) {
5732 APP_LOGW("commonEventInfos is empty");
5733 return false;
5734 }
5735 APP_LOGE("commonEventInfos find success");
5736 return true;
5737 }
5738
SavePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5739 bool BundleDataMgr::SavePreInstallBundleInfo(
5740 const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5741 {
5742 if (preInstallDataStorage_ == nullptr) {
5743 APP_LOGW("preInstallDataStorage_ is nullptr");
5744 return false;
5745 }
5746
5747 if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5748 APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
5749 return true;
5750 }
5751
5752 return false;
5753 }
5754
DeletePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5755 bool BundleDataMgr::DeletePreInstallBundleInfo(
5756 const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5757 {
5758 if (preInstallDataStorage_ == nullptr) {
5759 APP_LOGW("preInstallDataStorage_ is nullptr");
5760 return false;
5761 }
5762
5763 if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5764 APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
5765 return true;
5766 }
5767
5768 return false;
5769 }
5770
GetPreInstallBundleInfo(const std::string & bundleName,PreInstallBundleInfo & preInstallBundleInfo)5771 bool BundleDataMgr::GetPreInstallBundleInfo(
5772 const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
5773 {
5774 if (bundleName.empty()) {
5775 APP_LOGW("bundleName is empty");
5776 return false;
5777 }
5778 if (preInstallDataStorage_ == nullptr) {
5779 return false;
5780 }
5781 if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
5782 APP_LOGW_NOFUNC("get preInstall bundleInfo failed -n: %{public}s", bundleName.c_str());
5783 return false;
5784 }
5785 return true;
5786 }
5787
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> & preInstallBundleInfos)5788 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
5789 {
5790 if (preInstallDataStorage_ == nullptr) {
5791 APP_LOGW("preInstallDataStorage_ is nullptr");
5792 return false;
5793 }
5794
5795 if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
5796 APP_LOGD("load all storage success");
5797 return true;
5798 }
5799
5800 return false;
5801 }
5802
SaveInnerBundleInfo(const InnerBundleInfo & info) const5803 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
5804 {
5805 APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
5806 if (dataStorage_->SaveStorageBundleInfo(info)) {
5807 APP_LOGD("save install InnerBundleInfo successfully");
5808 return true;
5809 }
5810 APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
5811 return false;
5812 }
5813
GetInnerBundleUserInfoByUserId(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo) const5814 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
5815 int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
5816 {
5817 APP_LOGD("get user info start: bundleName: (%{public}s) userId: (%{public}d) ",
5818 bundleName.c_str(), userId);
5819 int32_t requestUserId = GetUserId(userId);
5820 if (requestUserId == Constants::INVALID_USERID) {
5821 return false;
5822 }
5823
5824 if (bundleName.empty()) {
5825 APP_LOGW("bundle name is empty");
5826 return false;
5827 }
5828
5829 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5830 if (bundleInfos_.empty()) {
5831 APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5832 return false;
5833 }
5834
5835 auto infoItem = bundleInfos_.find(bundleName);
5836 if (infoItem == bundleInfos_.end()) {
5837 APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5838 return false;
5839 }
5840
5841 return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
5842 }
5843
GetUserId(int32_t userId) const5844 int32_t BundleDataMgr::GetUserId(int32_t userId) const
5845 {
5846 if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
5847 return userId;
5848 }
5849
5850 if (userId == Constants::UNSPECIFIED_USERID) {
5851 userId = GetUserIdByCallingUid();
5852 }
5853
5854 if (!HasUserId(userId)) {
5855 APP_LOGD("user is not existed");
5856 userId = Constants::INVALID_USERID;
5857 }
5858
5859 return userId;
5860 }
5861
GetUserIdByUid(int32_t uid) const5862 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
5863 {
5864 return BundleUtil::GetUserIdByUid(uid);
5865 }
5866
AddUserId(int32_t userId)5867 void BundleDataMgr::AddUserId(int32_t userId)
5868 {
5869 std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5870 auto item = multiUserIdsSet_.find(userId);
5871 if (item != multiUserIdsSet_.end()) {
5872 return;
5873 }
5874
5875 multiUserIdsSet_.insert(userId);
5876 }
5877
RemoveUserId(int32_t userId)5878 void BundleDataMgr::RemoveUserId(int32_t userId)
5879 {
5880 std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5881 auto item = multiUserIdsSet_.find(userId);
5882 if (item == multiUserIdsSet_.end()) {
5883 return;
5884 }
5885
5886 multiUserIdsSet_.erase(item);
5887 }
5888
HasUserId(int32_t userId) const5889 bool BundleDataMgr::HasUserId(int32_t userId) const
5890 {
5891 std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5892 return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
5893 }
5894
GetUserIdByCallingUid() const5895 int32_t BundleDataMgr::GetUserIdByCallingUid() const
5896 {
5897 return BundleUtil::GetUserIdByCallingUid();
5898 }
5899
GetAllUser() const5900 std::set<int32_t> BundleDataMgr::GetAllUser() const
5901 {
5902 std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5903 return multiUserIdsSet_;
5904 }
5905
CreateAppInstallDir(int32_t userId)5906 void BundleDataMgr::CreateAppInstallDir(int32_t userId)
5907 {
5908 std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5909 ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5910 ErrCode ret = InstalldClient::GetInstance()->Mkdir(path,
5911 S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5912 Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5913 if (ret != ERR_OK) {
5914 APP_LOGE("create app install %{public}d failed", userId);
5915 return;
5916 }
5917
5918 std::string appClonePath = path + ServiceConstants::GALLERY_CLONE_PATH;
5919 ret = InstalldClient::GetInstance()->Mkdir(appClonePath,
5920 S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5921 Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5922 if (ret != ERR_OK) {
5923 APP_LOGE("create app clone %{public}d failed", userId);
5924 }
5925 }
5926
RemoveAppInstallDir(int32_t userId)5927 void BundleDataMgr::RemoveAppInstallDir(int32_t userId)
5928 {
5929 std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5930 ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5931 ErrCode ret = InstalldClient::GetInstance()->RemoveDir(path);
5932 if (ret != ERR_OK) {
5933 APP_LOGE("remove app install %{public}d failed", userId);
5934 }
5935 }
5936
GetInnerBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos) const5937 bool BundleDataMgr::GetInnerBundleUserInfos(
5938 const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
5939 {
5940 APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
5941 if (bundleName.empty()) {
5942 APP_LOGW("bundle name is empty");
5943 return false;
5944 }
5945
5946 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5947 if (bundleInfos_.empty()) {
5948 APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5949 return false;
5950 }
5951
5952 auto infoItem = bundleInfos_.find(bundleName);
5953 if (infoItem == bundleInfos_.end()) {
5954 APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
5955 return false;
5956 }
5957
5958 for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
5959 innerBundleUserInfos.emplace_back(userInfo.second);
5960 }
5961
5962 return !innerBundleUserInfos.empty();
5963 }
5964
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)5965 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
5966 {
5967 APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5968 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5969 InnerBundleInfo info;
5970 if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
5971 return Constants::EMPTY_STRING;
5972 }
5973
5974 return info.GetAppPrivilegeLevel();
5975 }
5976
QueryExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5977 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
5978 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5979 {
5980 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
5981 int32_t requestUserId = GetUserId(userId);
5982 if (requestUserId == Constants::INVALID_USERID) {
5983 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5984 return false;
5985 }
5986
5987 ElementName element = want.GetElement();
5988 std::string bundleName = element.GetBundleName();
5989 std::string extensionName = element.GetAbilityName();
5990 LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s extensionName:%{public}s",
5991 bundleName.c_str(), extensionName.c_str());
5992 // explicit query
5993 if (!bundleName.empty() && !extensionName.empty()) {
5994 ExtensionAbilityInfo info;
5995 if (ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex)) {
5996 extensionInfos.emplace_back(info);
5997 }
5998 LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryExtension size:%{public}zu -n %{public}s -e %{public}s -u %{public}d"
5999 " -i %{public}d", extensionInfos.size(), bundleName.c_str(), extensionName.c_str(), userId, appIndex);
6000 return !extensionInfos.empty();
6001 }
6002
6003 bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
6004 if (!ret) {
6005 LOG_D(BMS_TAG_QUERY,
6006 "implicit queryExtension error action:%{public}s uri:%{private}s type:%{public}s"
6007 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
6008 requestUserId);
6009 return false;
6010 }
6011 if (extensionInfos.size() == 0) {
6012 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
6013 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
6014 requestUserId);
6015 return false;
6016 }
6017 LOG_D(BMS_TAG_QUERY, "query extensionAbilityInfo successfully");
6018 return true;
6019 }
6020
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6021 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
6022 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6023 {
6024 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6025 int32_t requestUserId = GetUserId(userId);
6026 if (requestUserId == Constants::INVALID_USERID) {
6027 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6028 }
6029
6030 ElementName element = want.GetElement();
6031 std::string bundleName = element.GetBundleName();
6032 std::string extensionName = element.GetAbilityName();
6033 LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
6034 bundleName.c_str(), extensionName.c_str());
6035 // explicit query
6036 if (!bundleName.empty() && !extensionName.empty()) {
6037 ExtensionAbilityInfo info;
6038 ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
6039 if (ret == ERR_OK) {
6040 extensionInfos.emplace_back(info);
6041 }
6042 LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryExtension V9 size:%{public}zu -n %{public}s -e %{public}s"
6043 " -u %{public}d -i %{public}d", extensionInfos.size(), bundleName.c_str(), extensionName.c_str(),
6044 userId, appIndex);
6045 return ret;
6046 }
6047 ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6048 if (ret != ERR_OK) {
6049 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionInfosV9 error");
6050 return ret;
6051 }
6052 if (extensionInfos.empty()) {
6053 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
6054 " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
6055 requestUserId);
6056 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6057 }
6058 LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 success");
6059 return ERR_OK;
6060 }
6061
QueryExtensionAbilityInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6062 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
6063 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6064 {
6065 int32_t requestUserId = GetUserId(userId);
6066 if (requestUserId == Constants::INVALID_USERID) {
6067 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
6068 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6069 }
6070
6071 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6072 ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
6073 if (ret != ERR_OK) {
6074 LOG_D(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
6075 return ret;
6076 }
6077 if (extensionInfos.empty()) {
6078 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
6079 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6080 }
6081 LOG_D(BMS_TAG_QUERY, "success");
6082 return ERR_OK;
6083 }
6084
QueryExtensionAbilityInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6085 ErrCode BundleDataMgr::QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName,
6086 uint32_t flags, int32_t userId,
6087 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6088 {
6089 LOG_I(BMS_TAG_QUERY, "query failed %{public}s %{public}d", typeName.c_str(), userId);
6090 int32_t requestUserId = GetUserId(userId);
6091 if (requestUserId == Constants::INVALID_USERID) {
6092 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6093 }
6094 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6095 ErrCode ret = ImplicitQueryAllExtensionInfos(
6096 flags, requestUserId, extensionInfos, appIndex, typeName);
6097 if (ret != ERR_OK) {
6098 LOG_W(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
6099 return ret;
6100 }
6101 if (extensionInfos.empty()) {
6102 LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
6103 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6104 }
6105 LOG_D(BMS_TAG_QUERY, "success");
6106 return ERR_OK;
6107 }
6108
GetOneExtensionInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6109 void BundleDataMgr::GetOneExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId,
6110 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6111 {
6112 auto innerExtensionInfos = info.GetInnerExtensionInfos();
6113 for (const auto &item : innerExtensionInfos) {
6114 if (typeName != item.second.extensionTypeName) {
6115 continue;
6116 }
6117 infos.emplace_back(InnerExtensionInfo::ConvertToExtensionInfo(item.second));
6118 return;
6119 }
6120 }
6121
ExplicitQueryExtensionInfo(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const6122 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
6123 ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
6124 {
6125 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6126 ElementName element = want.GetElement();
6127 std::string bundleName = element.GetBundleName();
6128 std::string moduleName = element.GetModuleName();
6129 std::string extensionName = element.GetAbilityName();
6130 int32_t requestUserId = GetUserId(userId);
6131 if (requestUserId == Constants::INVALID_USERID) {
6132 return false;
6133 }
6134 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6135 InnerBundleInfo innerBundleInfo;
6136 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
6137 LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
6138 return false;
6139 }
6140 if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6141 if (sandboxAppHelper_ == nullptr) {
6142 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6143 return false;
6144 }
6145 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
6146 if (ret != ERR_OK) {
6147 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6148 return false;
6149 }
6150 }
6151 if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6152 bool res = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
6153 if (!res) {
6154 LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
6155 return false;
6156 }
6157 }
6158 auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
6159 if (!extension) {
6160 LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
6161 return false;
6162 }
6163 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
6164 extension->permissions.clear();
6165 }
6166 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
6167 extension->metadata.clear();
6168 }
6169 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
6170 extension->skills.clear();
6171 }
6172 extensionInfo = (*extension);
6173 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
6174 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6175 innerBundleInfo.GetApplicationInfo(ApplicationFlag::GET_BASIC_APPLICATION_INFO |
6176 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6177 extensionInfo.applicationInfo, appIndex);
6178 }
6179 // set uid for NAPI cache use
6180 InnerBundleUserInfo innerBundleUserInfo;
6181 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
6182 extensionInfo.uid = innerBundleUserInfo.uid;
6183 if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6184 std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
6185 if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
6186 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
6187 extensionInfo.uid = cloneInfo.uid;
6188 }
6189 }
6190 }
6191 extensionInfo.appIndex = appIndex;
6192 return true;
6193 }
6194
ExplicitQueryExtensionInfoV9(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const6195 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
6196 ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
6197 {
6198 ElementName element = want.GetElement();
6199 std::string bundleName = element.GetBundleName();
6200 std::string moduleName = element.GetModuleName();
6201 std::string extensionName = element.GetAbilityName();
6202 LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
6203 bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
6204 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d, appIndex:%{public}d",
6205 flags, userId, appIndex);
6206 int32_t requestUserId = GetUserId(userId);
6207 if (requestUserId == Constants::INVALID_USERID) {
6208 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6209 }
6210 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6211 InnerBundleInfo innerBundleInfo;
6212 if (appIndex == 0) {
6213 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
6214 if (ret != ERR_OK) {
6215 LOG_D(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
6216 return ret;
6217 }
6218 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6219 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
6220 if (ret != ERR_OK) {
6221 LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
6222 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6223 }
6224 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6225 if (sandboxAppHelper_ == nullptr) {
6226 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6227 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6228 }
6229 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
6230 if (ret != ERR_OK) {
6231 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6232 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6233 }
6234 }
6235 auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
6236 if (!extension) {
6237 LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
6238 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6239 }
6240 if ((static_cast<uint32_t>(flags) &
6241 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6242 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6243 extension->permissions.clear();
6244 }
6245 if ((static_cast<uint32_t>(flags) &
6246 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6247 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6248 extension->metadata.clear();
6249 }
6250 if ((static_cast<uint32_t>(flags) &
6251 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6252 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6253 extension->skills.clear();
6254 }
6255 extensionInfo = (*extension);
6256 if ((static_cast<uint32_t>(flags) &
6257 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6258 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6259 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6260 innerBundleInfo.GetApplicationInfoV9(
6261 static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
6262 responseUserId, extensionInfo.applicationInfo, appIndex);
6263 }
6264 // set uid for NAPI cache use
6265 InnerBundleUserInfo innerBundleUserInfo;
6266 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
6267 extensionInfo.uid = innerBundleUserInfo.uid;
6268 if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6269 std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
6270 if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
6271 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
6272 extensionInfo.uid = cloneInfo.uid;
6273 }
6274 }
6275 }
6276 extensionInfo.appIndex = appIndex;
6277 return ERR_OK;
6278 }
6279
FilterExtensionAbilityInfosByModuleName(const std::string & moduleName,std::vector<ExtensionAbilityInfo> & extensionInfos) const6280 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
6281 std::vector<ExtensionAbilityInfo> &extensionInfos) const
6282 {
6283 LOG_D(BMS_TAG_QUERY, "FilterExtensionAbilityInfos moduleName: %{public}s", moduleName.c_str());
6284 if (moduleName.empty()) {
6285 return;
6286 }
6287 for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
6288 if (iter->moduleName != moduleName) {
6289 iter = extensionInfos.erase(iter);
6290 } else {
6291 ++iter;
6292 }
6293 }
6294 }
6295
ImplicitQueryExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6296 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6297 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6298 {
6299 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6300 if (want.GetAction().empty() && want.GetEntities().empty()
6301 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
6302 LOG_W(BMS_TAG_QUERY, "param invalid");
6303 return false;
6304 }
6305 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
6306 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6307 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
6308
6309 int32_t requestUserId = GetUserId(userId);
6310 if (requestUserId == Constants::INVALID_USERID) {
6311 return false;
6312 }
6313 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6314 std::string bundleName = want.GetElement().GetBundleName();
6315 if (!bundleName.empty()) {
6316 // query in current bundle
6317 if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
6318 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtension failed, bundleName:%{public}s",
6319 bundleName.c_str());
6320 return false;
6321 }
6322 } else {
6323 // query all
6324 ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
6325 }
6326 // sort by priority, descending order.
6327 if (extensionInfos.size() > 1) {
6328 std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6329 [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6330 }
6331 return true;
6332 }
6333
ImplicitQueryExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6334 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6335 std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6336 {
6337 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6338 if (want.GetAction().empty() && want.GetEntities().empty()
6339 && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
6340 LOG_W(BMS_TAG_QUERY, "param invalid");
6341 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6342 }
6343 LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
6344 want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6345 LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
6346
6347 int32_t requestUserId = GetUserId(userId);
6348 if (requestUserId == Constants::INVALID_USERID) {
6349 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6350 }
6351 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6352 std::string bundleName = want.GetElement().GetBundleName();
6353 if (!bundleName.empty()) {
6354 // query in current bundle
6355 ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6356 if (ret != ERR_OK) {
6357 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s",
6358 bundleName.c_str());
6359 return ret;
6360 }
6361 } else {
6362 // query all
6363 ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6364 }
6365 // sort by priority, descending order.
6366 if (extensionInfos.size() > 1) {
6367 std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6368 [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6369 }
6370 return ERR_OK;
6371 }
6372
ImplicitQueryCurExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6373 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6374 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6375 {
6376 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6377 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfos");
6378 std::string bundleName = want.GetElement().GetBundleName();
6379 InnerBundleInfo innerBundleInfo;
6380 if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
6381 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6382 bundleName.c_str());
6383 return false;
6384 }
6385 if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6386 if (sandboxAppHelper_ == nullptr) {
6387 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6388 return false;
6389 }
6390 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6391 if (ret != ERR_OK) {
6392 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6393 return false;
6394 }
6395 }
6396 if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6397 bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex);
6398 if (!ret) {
6399 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed errCode %{public}d", ret);
6400 return false;
6401 }
6402 }
6403 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6404 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6405 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6406 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfos");
6407 return true;
6408 }
6409
ImplicitQueryCurExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6410 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6411 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6412 {
6413 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6414 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfosV9");
6415 std::string bundleName = want.GetElement().GetBundleName();
6416 InnerBundleInfo innerBundleInfo;
6417 if (appIndex == 0) {
6418 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
6419 if (ret != ERR_OK) {
6420 LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6421 bundleName.c_str());
6422 return ret;
6423 }
6424 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6425 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
6426 if (ret != ERR_OK) {
6427 LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6428 bundleName.c_str());
6429 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6430 }
6431 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6432 if (sandboxAppHelper_ == nullptr) {
6433 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6434 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6435 }
6436 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6437 if (ret != ERR_OK) {
6438 LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6439 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6440 }
6441 }
6442 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6443 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6444 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6445 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfosV9");
6446 return ERR_OK;
6447 }
6448
ImplicitQueryAllExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6449 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6450 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6451 {
6452 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6453 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6454 int32_t requestUserId = GetUserId(userId);
6455 if (requestUserId == Constants::INVALID_USERID) {
6456 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
6457 return;
6458 }
6459
6460 // query from bundleInfos_
6461 if (appIndex == 0) {
6462 for (const auto &item : bundleInfos_) {
6463 const InnerBundleInfo &innerBundleInfo = item.second;
6464 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6465 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
6466 continue;
6467 }
6468 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
6469 }
6470 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6471 // query from sandbox manager for sandbox bundle
6472 if (sandboxAppHelper_ == nullptr) {
6473 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6474 return;
6475 }
6476 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6477 for (const auto &item : sandboxMap) {
6478 InnerBundleInfo info;
6479 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6480 if (pos == std::string::npos) {
6481 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6482 continue;
6483 }
6484 std::string innerBundleName = item.first.substr(pos + 1);
6485 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6486 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6487 continue;
6488 }
6489
6490 int32_t responseUserId = info.GetResponseUserId(userId);
6491 GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
6492 }
6493 } else if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6494 LOG_D(BMS_TAG_QUERY, "start to query extensionAbility in appClone");
6495 for (const auto &item : bundleInfos_) {
6496 int32_t responseUserId = item.second.GetResponseUserId(requestUserId);
6497 const InnerBundleInfo &innerBundleInfo = item.second;
6498 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6499 LOG_D(BMS_TAG_QUERY,
6500 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6501 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6502 continue;
6503 }
6504 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6505 }
6506 }
6507 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6508 }
6509
ImplicitQueryAllExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6510 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6511 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6512 {
6513 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6514 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfosV9");
6515 // query from bundleInfos_
6516 if (appIndex == 0) {
6517 for (const auto &item : bundleInfos_) {
6518 const InnerBundleInfo &innerBundleInfo = item.second;
6519 ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
6520 if (ret != ERR_OK) {
6521 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6522 item.first.c_str());
6523 continue;
6524 }
6525 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6526 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
6527 }
6528 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6529 for (const auto &item : bundleInfos_) {
6530 const InnerBundleInfo &innerBundleInfo = item.second;
6531 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6532 if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6533 LOG_D(BMS_TAG_QUERY,
6534 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6535 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6536 continue;
6537 }
6538 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6539 }
6540 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6541 // query from sandbox manager for sandbox bundle
6542 if (sandboxAppHelper_ == nullptr) {
6543 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6544 return;
6545 }
6546 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6547 for (const auto &item : sandboxMap) {
6548 InnerBundleInfo info;
6549 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6550 if (pos == std::string::npos) {
6551 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6552 continue;
6553 }
6554 std::string innerBundleName = item.first.substr(pos + 1);
6555 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6556 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6557 continue;
6558 }
6559
6560 int32_t responseUserId = info.GetResponseUserId(userId);
6561 GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
6562 }
6563 }
6564 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfosV9");
6565 }
6566
GetExtensionAbilityInfoByTypeName(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,const std::string & typeName) const6567 void BundleDataMgr::GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId,
6568 std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const
6569 {
6570 for (const auto &item : bundleInfos_) {
6571 if ((flags &
6572 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
6573 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
6574 if (item.second.GetInnerExtensionInfos().empty() || !item.second.IsSystemApp()) {
6575 continue;
6576 }
6577 bool ret = GetInnerBundleInfoWithFlags(item.first, flags, userId);
6578 if (!ret) {
6579 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6580 item.first.c_str());
6581 continue;
6582 }
6583 int32_t responseUserId = item.second.GetResponseUserId(userId);
6584 GetOneExtensionInfosByExtensionTypeName(typeName, flags, responseUserId, item.second, infos);
6585 if (infos.size() > 0) {
6586 return;
6587 }
6588 } else {
6589 InnerBundleInfo innerBundleInfo;
6590 bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId);
6591 if (!ret) {
6592 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6593 item.first.c_str());
6594 continue;
6595 }
6596 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6597 GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
6598 }
6599 }
6600 }
6601
ImplicitQueryAllExtensionInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex,const std::string & typeName) const6602 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
6603 std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const
6604 {
6605 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6606 // query from bundleInfos_
6607 if (appIndex == 0) {
6608 GetExtensionAbilityInfoByTypeName(flags, userId, infos, typeName);
6609 } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6610 // query from sandbox manager for sandbox bundle
6611 if (sandboxAppHelper_ == nullptr) {
6612 LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6613 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6614 }
6615 auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6616 for (const auto &item : sandboxMap) {
6617 InnerBundleInfo info;
6618 size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6619 if (pos == std::string::npos) {
6620 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6621 continue;
6622 }
6623 std::string innerBundleName = item.first.substr(pos + 1);
6624 if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6625 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6626 continue;
6627 }
6628 int32_t responseUserId = info.GetResponseUserId(userId);
6629 GetAllExtensionInfos(flags, responseUserId, info, infos, appIndex);
6630 }
6631 } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6632 for (const auto &item : bundleInfos_) {
6633 InnerBundleInfo innerBundleInfo;
6634 bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId, appIndex);
6635 if (!ret) {
6636 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6637 item.first.c_str());
6638 continue;
6639 }
6640 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6641 GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos, appIndex);
6642 }
6643 }
6644 LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6645 return ERR_OK;
6646 }
6647
GetMatchExtensionInfos(const Want & want,int32_t flags,const int32_t & userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6648 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
6649 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6650 {
6651 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6652 auto extensionSkillInfos = info.GetExtensionSkillInfos();
6653 auto innerExtensionInfos = info.GetInnerExtensionInfos();
6654 for (const auto &skillInfos : extensionSkillInfos) {
6655 for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6656 const Skill &skill = skillInfos.second[skillIndex];
6657 size_t matchUriIndex = 0;
6658 if (!skill.Match(want, matchUriIndex)) {
6659 continue;
6660 }
6661 if (innerExtensionInfos.find(skillInfos.first) == innerExtensionInfos.end()) {
6662 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6663 skillInfos.first.c_str());
6664 break;
6665 }
6666 ExtensionAbilityInfo extensionInfo =
6667 InnerExtensionInfo::ConvertToExtensionInfo(innerExtensionInfos[skillInfos.first]);
6668 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_APPLICATION) ==
6669 GET_EXTENSION_INFO_WITH_APPLICATION) {
6670 info.GetApplicationInfo(
6671 ApplicationFlag::GET_BASIC_APPLICATION_INFO |
6672 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
6673 extensionInfo.applicationInfo);
6674 }
6675 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_PERMISSION) !=
6676 GET_EXTENSION_INFO_WITH_PERMISSION) {
6677 extensionInfo.permissions.clear();
6678 }
6679 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_METADATA) != GET_EXTENSION_INFO_WITH_METADATA) {
6680 extensionInfo.metadata.clear();
6681 }
6682 if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_SKILL) != GET_EXTENSION_INFO_WITH_SKILL) {
6683 extensionInfo.skills.clear();
6684 }
6685 if ((static_cast<uint32_t>(flags) &
6686 GET_EXTENSION_INFO_WITH_SKILL_URI) == GET_EXTENSION_INFO_WITH_SKILL_URI) {
6687 AddSkillUrisInfo(skillInfos.second, extensionInfo.skillUri, skillIndex, matchUriIndex);
6688 }
6689 extensionInfo.appIndex = appIndex;
6690 infos.emplace_back(extensionInfo);
6691 break;
6692 }
6693 }
6694 }
6695
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) const6696 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
6697 ExtensionAbilityInfo &extensionInfo, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos,
6698 std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
6699 {
6700 if ((static_cast<uint32_t>(flags) &
6701 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6702 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6703 info.GetApplicationInfoV9(static_cast<int32_t>(
6704 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6705 }
6706 if ((static_cast<uint32_t>(flags) &
6707 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6708 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6709 extensionInfo.permissions.clear();
6710 }
6711 if ((static_cast<uint32_t>(flags) &
6712 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6713 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6714 extensionInfo.metadata.clear();
6715 }
6716 if ((static_cast<uint32_t>(flags) &
6717 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6718 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6719 extensionInfo.skills.clear();
6720 }
6721 if ((static_cast<uint32_t>(flags) &
6722 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) ==
6723 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) {
6724 AddSkillUrisInfo(skills, extensionInfo.skillUri, matchSkillIndex, matchUriIndex);
6725 }
6726 extensionInfo.appIndex = appIndex;
6727 infos.emplace_back(extensionInfo);
6728 }
6729
GetMatchExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6730 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6731 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6732 {
6733 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6734 auto extensionSkillInfos = info.GetExtensionSkillInfos();
6735 auto innerExtensionInfos = info.GetInnerExtensionInfos();
6736 for (const auto &skillInfos : extensionSkillInfos) {
6737 if (want.GetAction() == SHARE_ACTION) {
6738 if (!MatchShare(want, skillInfos.second)) {
6739 continue;
6740 }
6741 if (innerExtensionInfos.find(skillInfos.first) == innerExtensionInfos.end()) {
6742 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6743 skillInfos.first.c_str());
6744 continue;
6745 }
6746 ExtensionAbilityInfo extensionInfo =
6747 InnerExtensionInfo::ConvertToExtensionInfo(innerExtensionInfos[skillInfos.first]);
6748 EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6749 std::nullopt, std::nullopt, appIndex);
6750 continue;
6751 }
6752 for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6753 const Skill &skill = skillInfos.second[skillIndex];
6754 size_t matchUriIndex = 0;
6755 if (!skill.Match(want, matchUriIndex)) {
6756 continue;
6757 }
6758 if (innerExtensionInfos.find(skillInfos.first) == innerExtensionInfos.end()) {
6759 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6760 skillInfos.first.c_str());
6761 break;
6762 }
6763 ExtensionAbilityInfo extensionInfo =
6764 InnerExtensionInfo::ConvertToExtensionInfo(innerExtensionInfos[skillInfos.first]);
6765 EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6766 skillIndex, matchUriIndex, appIndex);
6767 break;
6768 }
6769 }
6770 }
6771
GetAllExtensionInfos(uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6772 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
6773 const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6774 {
6775 auto innerExtensionInfos = info.GetInnerExtensionInfos();
6776 for (const auto &item : innerExtensionInfos) {
6777 ExtensionAbilityInfo extensionInfo = InnerExtensionInfo::ConvertToExtensionInfo(item.second);
6778 if ((flags &
6779 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6780 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6781 info.GetApplicationInfoV9(static_cast<int32_t>(
6782 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6783 }
6784 if ((flags &
6785 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6786 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6787 extensionInfo.permissions.clear();
6788 }
6789 if ((flags &
6790 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6791 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6792 extensionInfo.metadata.clear();
6793 }
6794 if ((flags &
6795 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6796 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6797 extensionInfo.skills.clear();
6798 }
6799 extensionInfo.appIndex = appIndex;
6800 infos.emplace_back(extensionInfo);
6801 }
6802 }
6803
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos) const6804 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
6805 std::vector<ExtensionAbilityInfo> &extensionInfos) const
6806 {
6807 int32_t requestUserId = GetUserId(userId);
6808 if (requestUserId == Constants::INVALID_USERID) {
6809 LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", requestUserId);
6810 return false;
6811 }
6812 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6813 for (const auto &item : bundleInfos_) {
6814 const InnerBundleInfo &innerBundleInfo = item.second;
6815 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6816 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
6817 continue;
6818 }
6819 auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
6820 for (const auto &info : innerExtensionInfos) {
6821 if (info.second.type == extensionType) {
6822 ExtensionAbilityInfo extensionAbilityInfo = InnerExtensionInfo::ConvertToExtensionInfo(info.second);
6823 innerBundleInfo.GetApplicationInfo(
6824 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6825 extensionAbilityInfo.applicationInfo);
6826 extensionInfos.emplace_back(extensionAbilityInfo);
6827 }
6828 }
6829 }
6830 return true;
6831 }
6832
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo) const6833 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
6834 ExtensionAbilityInfo &extensionAbilityInfo) const
6835 {
6836 int32_t requestUserId = GetUserId(userId);
6837 if (requestUserId == Constants::INVALID_USERID) {
6838 LOG_W(BMS_TAG_QUERY, "invalid userId -1");
6839 return false;
6840 }
6841 if (uri.empty()) {
6842 LOG_W(BMS_TAG_QUERY, "uri empty");
6843 return false;
6844 }
6845 std::string convertUri = uri;
6846 // example of valid param uri : fileShare:///com.example.FileShare/person/10
6847 // example of convertUri : fileShare://com.example.FileShare
6848 size_t schemePos = uri.find(PARAM_URI_SEPARATOR);
6849 if (schemePos != uri.npos) {
6850 // 1. cut string
6851 size_t cutPos = uri.find(ServiceConstants::PATH_SEPARATOR, schemePos + PARAM_URI_SEPARATOR_LEN);
6852 if (cutPos != uri.npos) {
6853 convertUri = uri.substr(0, cutPos);
6854 }
6855 // 2. replace :/// with ://
6856 convertUri.replace(schemePos, PARAM_URI_SEPARATOR_LEN, URI_SEPARATOR);
6857 } else {
6858 if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
6859 LOG_W(BMS_TAG_QUERY, "invalid uri : %{private}s", uri.c_str());
6860 return false;
6861 }
6862 }
6863 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6864 if (bundleInfos_.empty()) {
6865 LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
6866 return false;
6867 }
6868 for (const auto &item : bundleInfos_) {
6869 const InnerBundleInfo &info = item.second;
6870 if (info.IsDisabled()) {
6871 LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
6872 continue;
6873 }
6874
6875 int32_t responseUserId = info.GetResponseUserId(requestUserId);
6876 if (!info.GetApplicationEnabled(responseUserId)) {
6877 continue;
6878 }
6879
6880 bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
6881 if (!ret) {
6882 continue;
6883 }
6884 info.GetApplicationInfo(
6885 ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6886 extensionAbilityInfo.applicationInfo);
6887 return true;
6888 }
6889 LOG_NOFUNC_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfoByUri (%{public}s) failed", convertUri.c_str());
6890 return false;
6891 }
6892
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)6893 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
6894 uint32_t resId, int32_t userId, const std::string &localeInfo)
6895 {
6896 APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
6897 #ifdef GLOBAL_RESMGR_ENABLE
6898 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6899 std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6900 GetResourceManager(bundleName, moduleName, userId);
6901 if (resourceManager == nullptr) {
6902 APP_LOGW("InitResourceManager failed");
6903 return Constants::EMPTY_STRING;
6904 }
6905 std::string label;
6906 OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
6907 if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6908 APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6909 return Constants::EMPTY_STRING;
6910 }
6911 return label;
6912 #else
6913 APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6914 return Constants::EMPTY_STRING;
6915 #endif
6916 }
6917
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)6918 std::string BundleDataMgr::GetIconById(
6919 const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
6920 {
6921 APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
6922 bundleName.c_str(), moduleName.c_str(), resId, density);
6923 #ifdef GLOBAL_RESMGR_ENABLE
6924 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6925 std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6926 GetResourceManager(bundleName, moduleName, userId);
6927 if (resourceManager == nullptr) {
6928 APP_LOGW("InitResourceManager failed");
6929 return Constants::EMPTY_STRING;
6930 }
6931 std::string base64;
6932 OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
6933 if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6934 APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6935 return Constants::EMPTY_STRING;
6936 }
6937 return base64;
6938 #else
6939 APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6940 return Constants::EMPTY_STRING;
6941 #endif
6942 }
6943
6944 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & bundleName,const std::string & moduleName,int32_t userId,const std::string & localeInfo) const6945 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
6946 const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
6947 {
6948 InnerBundleInfo innerBundleInfo;
6949 if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
6950 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6951 return nullptr;
6952 }
6953 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6954 BundleInfo bundleInfo;
6955 innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
6956 std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
6957 if (resourceManager == nullptr) {
6958 APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
6959 return nullptr;
6960 }
6961
6962 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
6963 if (!resConfig) {
6964 APP_LOGE("resConfig is nullptr");
6965 return nullptr;
6966 }
6967 #ifdef GLOBAL_I18_ENABLE
6968 std::map<std::string, std::string> configs;
6969 OHOS::Global::I18n::LocaleInfo locale(
6970 localeInfo.empty() ? Global::I18n::LocaleConfig::GetEffectiveLanguage() : localeInfo, configs);
6971 resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
6972 #endif
6973 resourceManager->UpdateResConfig(*resConfig);
6974
6975 for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
6976 std::string moduleResPath;
6977 if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
6978 moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
6979 }
6980 if (!moduleResPath.empty()) {
6981 APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
6982 if (!resourceManager->AddResource(moduleResPath.c_str(), Global::Resource::SELECT_STRING
6983 | Global::Resource::SELECT_MEDIA)) {
6984 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
6985 }
6986 }
6987 }
6988 return resourceManager;
6989 }
6990 #endif
6991
GetAllPreInstallBundleInfos()6992 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
6993 {
6994 std::vector<PreInstallBundleInfo> preInstallBundleInfos;
6995 LoadAllPreInstallBundleInfos(preInstallBundleInfos);
6996 return preInstallBundleInfos;
6997 }
6998
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo) const6999 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
7000 AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
7001 {
7002 int32_t requestUserId = GetUserId(userId);
7003 if (requestUserId == Constants::INVALID_USERID) {
7004 APP_LOGW("invalid userId: %{public}d", userId);
7005 return false;
7006 }
7007 std::vector<AbilityInfo> abilityInfos;
7008 bool abilityValid =
7009 ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
7010 std::vector<ExtensionAbilityInfo> extensionInfos;
7011 bool extensionValid =
7012 ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
7013 if (!abilityValid && !extensionValid) {
7014 // both invalid
7015 APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
7016 return false;
7017 }
7018 if (abilityValid && extensionValid) {
7019 // both valid
7020 if (abilityInfos[0].priority >= extensionInfos[0].priority) {
7021 APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
7022 abilityInfo = abilityInfos[0];
7023 } else {
7024 APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
7025 extensionInfos[0].name.c_str());
7026 extensionInfo = extensionInfos[0];
7027 }
7028 } else if (abilityValid) {
7029 // only ability valid
7030 APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
7031 abilityInfo = abilityInfos[0];
7032 } else {
7033 // only extension valid
7034 APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
7035 extensionInfo = extensionInfos[0];
7036 }
7037 return true;
7038 }
7039
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos,bool & findDefaultApp)7040 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
7041 std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
7042 {
7043 APP_LOGI_NOFUNC("ImplicitQueryInfos action:%{public}s uri:%{private}s type:%{public}s flags:%{public}d "
7044 "userId:%{public}d withDefault:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(),
7045 want.GetType().c_str(), flags, userId, withDefault);
7046 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
7047 // step1 : find default infos
7048 if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
7049 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
7050 if (!abilityInfos.empty() || !extensionInfos.empty()) {
7051 APP_LOGI("find target default application");
7052 findDefaultApp = true;
7053 if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
7054 return true;
7055 }
7056 for (auto &info : abilityInfos) {
7057 info.linkType = LinkType::DEFAULT_APP;
7058 }
7059 }
7060 }
7061 // step2 : find backup default infos
7062 if (withDefault &&
7063 DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
7064 FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
7065 if (!abilityInfos.empty() || !extensionInfos.empty()) {
7066 APP_LOGI("find target backup default application");
7067 findDefaultApp = true;
7068 if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
7069 return true;
7070 }
7071 for (auto &info : abilityInfos) {
7072 info.linkType = LinkType::DEFAULT_APP;
7073 }
7074 }
7075 }
7076 #endif
7077 // step3 : implicit query infos
7078 bool abilityRet =
7079 ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
7080 APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
7081
7082 bool extensionRet =
7083 ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
7084 APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
7085
7086 ImplicitQueryCloneAbilityInfos(want, flags, userId, abilityInfos);
7087 return abilityRet || extensionRet || abilityInfos.size() > 0;
7088 }
7089
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)7090 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
7091 std::vector<std::string> &dependentModuleNames)
7092 {
7093 APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
7094 bundleName.c_str(), moduleName.c_str());
7095 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7096 auto item = bundleInfos_.find(bundleName);
7097 if (item == bundleInfos_.end()) {
7098 APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
7099 return false;
7100 }
7101 const InnerBundleInfo &innerBundleInfo = item->second;
7102 return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
7103 }
7104
UpdateRemovable(const std::string & bundleName,bool removable)7105 void BundleDataMgr::UpdateRemovable(
7106 const std::string &bundleName, bool removable)
7107 {
7108 APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
7109 if (bundleName.empty()) {
7110 APP_LOGW("bundleName is empty");
7111 return;
7112 }
7113
7114 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7115 auto infoItem = bundleInfos_.find(bundleName);
7116 if (infoItem == bundleInfos_.end()) {
7117 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7118 return;
7119 }
7120
7121 if (infoItem->second.IsRemovable() != removable) {
7122 infoItem->second.UpdateRemovable(true, removable);
7123 SaveInnerBundleInfo(infoItem->second);
7124 }
7125 }
7126
UpdatePrivilegeCapability(const std::string & bundleName,const ApplicationInfo & appInfo)7127 void BundleDataMgr::UpdatePrivilegeCapability(
7128 const std::string &bundleName, const ApplicationInfo &appInfo)
7129 {
7130 APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
7131 if (bundleName.empty()) {
7132 APP_LOGW("bundleName is empty");
7133 return;
7134 }
7135
7136 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7137 auto infoItem = bundleInfos_.find(bundleName);
7138 if (infoItem == bundleInfos_.end()) {
7139 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7140 return;
7141 }
7142
7143 infoItem->second.UpdatePrivilegeCapability(appInfo);
7144 }
7145
FetchInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)7146 bool BundleDataMgr::FetchInnerBundleInfo(
7147 const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
7148 {
7149 APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
7150 if (bundleName.empty()) {
7151 APP_LOGW("bundleName is empty");
7152 return false;
7153 }
7154
7155 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7156 auto infoItem = bundleInfos_.find(bundleName);
7157 if (infoItem == bundleInfos_.end()) {
7158 APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
7159 return false;
7160 }
7161
7162 innerBundleInfo = infoItem->second;
7163 return true;
7164 }
7165
GetInnerBundleInfoUsers(const std::string & bundleName,std::set<int32_t> & userIds)7166 bool BundleDataMgr::GetInnerBundleInfoUsers(const std::string &bundleName, std::set<int32_t> &userIds)
7167 {
7168 InnerBundleInfo info;
7169 if (!FetchInnerBundleInfo(bundleName, info)) {
7170 APP_LOGW("FetchInnerBundleInfo failed");
7171 return false;
7172 }
7173 std::map<std::string, InnerBundleUserInfo> userInfos = info.GetInnerBundleUserInfos();
7174 for (const auto &userInfo : userInfos) {
7175 userIds.insert(userInfo.second.bundleUserInfo.userId);
7176 }
7177 return true;
7178 }
7179
IsSystemHsp(const std::string & bundleName)7180 bool BundleDataMgr::IsSystemHsp(const std::string &bundleName)
7181 {
7182 InnerBundleInfo info;
7183 if (!FetchInnerBundleInfo(bundleName, info)) {
7184 APP_LOGW("FetchInnerBundleInfo %{public}s failed", bundleName.c_str());
7185 return false;
7186 }
7187 return info.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK;
7188 }
7189
7190 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId,const Element & element,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo,std::vector<Skill> & skills) const7191 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
7192 AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
7193 {
7194 APP_LOGD("begin to QueryInfoAndSkillsByElement");
7195 const std::string& bundleName = element.bundleName;
7196 const std::string& moduleName = element.moduleName;
7197 const std::string& abilityName = element.abilityName;
7198 const std::string& extensionName = element.extensionName;
7199 Want want;
7200 ElementName elementName("", bundleName, abilityName, moduleName);
7201 want.SetElement(elementName);
7202 bool isAbility = !element.abilityName.empty();
7203 bool ret = false;
7204 if (isAbility) {
7205 // get ability info
7206 ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
7207 if (!ret) {
7208 LOG_I(BMS_TAG_QUERY, "ExplicitQueryAbility no match -n %{public}s -m %{public}s -a %{public}s"
7209 " -u %{public}d", bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), userId);
7210 return false;
7211 }
7212 } else {
7213 // get extension info
7214 elementName.SetAbilityName(extensionName);
7215 want.SetElement(elementName);
7216 ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
7217 if (!ret) {
7218 APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
7219 return false;
7220 }
7221 }
7222
7223 // get skills info
7224 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7225 if (bundleInfos_.empty()) {
7226 APP_LOGW("bundleInfos_ is empty");
7227 return false;
7228 }
7229 auto item = bundleInfos_.find(bundleName);
7230 if (item == bundleInfos_.end()) {
7231 APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7232 return false;
7233 }
7234 const InnerBundleInfo& innerBundleInfo = item->second;
7235 if (isAbility) {
7236 std::string key;
7237 key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
7238 APP_LOGD("begin to find ability skills, key : %{public}s", key.c_str());
7239 for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
7240 if (infoItem.first == key) {
7241 skills = infoItem.second;
7242 APP_LOGD("find ability skills success");
7243 break;
7244 }
7245 }
7246 } else {
7247 std::string key;
7248 key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
7249 APP_LOGD("begin to find extension skills, key : %{public}s", key.c_str());
7250 for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
7251 if (infoItem.first == key) {
7252 skills = infoItem.second;
7253 APP_LOGD("find extension skills success");
7254 break;
7255 }
7256 }
7257 }
7258 APP_LOGD("QueryInfoAndSkillsByElement success");
7259 return true;
7260 }
7261
GetElement(int32_t userId,const ElementName & elementName,Element & element) const7262 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
7263 {
7264 APP_LOGD("begin to GetElement");
7265 const std::string& bundleName = elementName.GetBundleName();
7266 const std::string& moduleName = elementName.GetModuleName();
7267 const std::string& abilityName = elementName.GetAbilityName();
7268 if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
7269 APP_LOGW("bundleName or moduleName or abilityName is empty");
7270 return false;
7271 }
7272 Want want;
7273 want.SetElement(elementName);
7274 AbilityInfo abilityInfo;
7275 bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
7276 if (ret) {
7277 APP_LOGD("ElementName is ability");
7278 element.bundleName = bundleName;
7279 element.moduleName = moduleName;
7280 element.abilityName = abilityName;
7281 return true;
7282 }
7283
7284 ExtensionAbilityInfo extensionInfo;
7285 ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
7286 if (ret) {
7287 APP_LOGD("ElementName is extension");
7288 element.bundleName = bundleName;
7289 element.moduleName = moduleName;
7290 element.extensionName = abilityName;
7291 return true;
7292 }
7293
7294 if (DelayedSingleton<BundleMgrService>::GetInstance()->IsBrokerServiceStarted()) {
7295 APP_LOGI("query ability from broker");
7296 AbilityInfo brokerAbilityInfo;
7297 auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
7298 ErrCode resultCode = bmsExtensionClient->QueryAbilityInfo(want, 0, userId, brokerAbilityInfo, true);
7299 if (resultCode == ERR_OK) {
7300 APP_LOGI("ElementName is brokerAbility");
7301 element.bundleName = bundleName;
7302 element.moduleName = moduleName;
7303 element.abilityName = abilityName;
7304 return true;
7305 }
7306 }
7307
7308 APP_LOGW("ElementName doesn't exist");
7309 return false;
7310 }
7311 #endif
7312
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) const7313 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
7314 const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
7315 {
7316 APP_LOGI("begin");
7317 #ifdef GLOBAL_RESMGR_ENABLE
7318 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7319 int32_t requestUserId = GetUserId(userId);
7320 if (requestUserId == Constants::INVALID_USERID) {
7321 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7322 }
7323 InnerBundleInfo innerBundleInfo;
7324 ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
7325 bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
7326 if (errCode != ERR_OK) {
7327 return errCode;
7328 }
7329 AbilityInfo abilityInfo;
7330 errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
7331 if (errCode != ERR_OK) {
7332 return errCode;
7333 }
7334 bool isEnable = false;
7335 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
7336 errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
7337 if (errCode != ERR_OK) {
7338 return errCode;
7339 }
7340 if (!isEnable) {
7341 APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
7342 return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
7343 }
7344 std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
7345 GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
7346 if (resourceManager == nullptr) {
7347 APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
7348 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7349 }
7350 OHOS::Global::Resource::RState ret =
7351 resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
7352 if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
7353 APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
7354 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7355 }
7356 return ERR_OK;
7357 #else
7358 return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
7359 #endif
7360 }
7361
GetStatusCallbackMutex()7362 ffrt::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
7363 {
7364 return callbackMutex_;
7365 }
7366
GetCallBackList() const7367 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
7368 {
7369 return callbackList_;
7370 }
7371
UpdateQuickFixInnerBundleInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)7372 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
7373 const InnerBundleInfo &innerBundleInfo)
7374 {
7375 APP_LOGD("to update info:%{public}s", bundleName.c_str());
7376 if (bundleName.empty()) {
7377 APP_LOGW("update info fail, empty bundle name");
7378 return false;
7379 }
7380
7381 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7382 auto infoItem = bundleInfos_.find(bundleName);
7383 if (infoItem == bundleInfos_.end()) {
7384 APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7385 return false;
7386 }
7387
7388 if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7389 bundleInfos_.at(bundleName) = innerBundleInfo;
7390 return true;
7391 }
7392 APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
7393 return false;
7394 }
7395
UpdateInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,bool needSaveStorage)7396 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo, bool needSaveStorage)
7397 {
7398 std::string bundleName = innerBundleInfo.GetBundleName();
7399 if (bundleName.empty()) {
7400 APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
7401 return false;
7402 }
7403 APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
7404 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7405 auto infoItem = bundleInfos_.find(bundleName);
7406 if (infoItem == bundleInfos_.end()) {
7407 APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7408 return false;
7409 }
7410
7411 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7412 APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
7413 return false;
7414 }
7415 bundleInfos_.at(bundleName) = innerBundleInfo;
7416 return true;
7417 }
7418
UpdateEl5KeyId(const CreateDirParam & el5Param,const std::string keyId,bool needSaveStorage)7419 bool BundleDataMgr::UpdateEl5KeyId(const CreateDirParam &el5Param, const std::string keyId, bool needSaveStorage)
7420 {
7421 if (el5Param.bundleName.empty()) {
7422 APP_LOGW("UpdateEl5KeyId failed, empty bundle name");
7423 return false;
7424 }
7425 APP_LOGD("UpdateEl5KeyId:%{public}s", el5Param.bundleName.c_str());
7426 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7427 auto infoItem = bundleInfos_.find(el5Param.bundleName);
7428 if (infoItem == bundleInfos_.end()) {
7429 APP_LOGW("bundle:%{public}s info is not existed", el5Param.bundleName.c_str());
7430 return false;
7431 }
7432 std::string oldKeyId = infoItem->second.GetKeyId(el5Param.userId, el5Param.appIndex);
7433 infoItem->second.SetkeyId(el5Param.userId, keyId, el5Param.appIndex);
7434
7435 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(infoItem->second)) {
7436 APP_LOGE("to update InnerBundleInfo:%{public}s failed", el5Param.bundleName.c_str());
7437 infoItem->second.InnerSetKeyId(el5Param.userId, oldKeyId, el5Param.appIndex);
7438 return false;
7439 }
7440 return true;
7441 }
7442
QueryOverlayInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)7443 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
7444 {
7445 APP_LOGD("start to query overlay innerBundleInfo");
7446 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7447 if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
7448 info = bundleInfos_.at(bundleName);
7449 return true;
7450 }
7451
7452 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7453 return false;
7454 }
7455
SaveOverlayInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)7456 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
7457 {
7458 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7459 innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
7460 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7461 APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
7462 return;
7463 }
7464 bundleInfos_.at(bundleName) = innerBundleInfo;
7465 }
7466
GetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)7467 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
7468 AppProvisionInfo &appProvisionInfo)
7469 {
7470 if (!HasUserId(userId)) {
7471 APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
7472 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7473 }
7474 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7475 auto infoItem = bundleInfos_.find(bundleName);
7476 if (infoItem == bundleInfos_.end()) {
7477 APP_LOGW_NOFUNC("-n %{public}s not exist", bundleName.c_str());
7478 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7479 }
7480 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7481 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7482 if (responseUserId == Constants::INVALID_USERID) {
7483 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7484 }
7485 }
7486 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
7487 APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
7488 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7489 }
7490 return ERR_OK;
7491 }
7492
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas) const7493 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
7494 std::vector<Metadata> &provisionMetadatas) const
7495 {
7496 // Reserved interface
7497 return ERR_OK;
7498 }
7499
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles) const7500 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
7501 {
7502 APP_LOGD("GetAllSharedBundleInfo");
7503 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7504
7505 for (const auto& [key, innerBundleInfo] : bundleInfos_) {
7506 if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7507 continue;
7508 }
7509 SharedBundleInfo sharedBundleInfo;
7510 innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7511 sharedBundles.emplace_back(sharedBundleInfo);
7512 }
7513
7514 return ERR_OK;
7515 }
7516
GetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)7517 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
7518 std::vector<SharedBundleInfo> &sharedBundles)
7519 {
7520 APP_LOGD("GetSharedBundleInfo");
7521 if (bundleName.empty() || moduleName.empty()) {
7522 APP_LOGW("bundleName or moduleName is empty");
7523 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7524 }
7525
7526 std::vector<Dependency> dependencies;
7527 ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
7528 if (errCode != ERR_OK) {
7529 APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
7530 errCode, bundleName.c_str());
7531 return errCode;
7532 }
7533
7534 for (const auto& dep : dependencies) {
7535 SharedBundleInfo sharedBundleInfo;
7536 errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
7537 if (errCode != ERR_OK) {
7538 APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
7539 errCode, bundleName.c_str());
7540 return errCode;
7541 }
7542 sharedBundles.emplace_back(sharedBundleInfo);
7543 }
7544
7545 return ERR_OK;
7546 }
7547
GetSharedBundleInfoBySelf(const std::string & bundleName,SharedBundleInfo & sharedBundleInfo)7548 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
7549 {
7550 APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
7551 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7552 auto infoItem = bundleInfos_.find(bundleName);
7553 if (infoItem == bundleInfos_.end()) {
7554 APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
7555 bundleName.c_str());
7556 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7557 }
7558 const InnerBundleInfo &innerBundleInfo = infoItem->second;
7559 if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7560 APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
7561 bundleName.c_str());
7562 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7563 }
7564 innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7565 APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
7566 return ERR_OK;
7567 }
7568
GetSharedDependencies(const std::string & bundleName,const std::string & moduleName,std::vector<Dependency> & dependencies)7569 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
7570 std::vector<Dependency> &dependencies)
7571 {
7572 APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
7573 bundleName.c_str(), moduleName.c_str());
7574 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7575 auto item = bundleInfos_.find(bundleName);
7576 if (item == bundleInfos_.end()) {
7577 APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
7578 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7579 }
7580 const InnerBundleInfo &innerBundleInfo = item->second;
7581 if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
7582 APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
7583 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7584 }
7585 APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
7586 bundleName.c_str(), moduleName.c_str());
7587 return ERR_OK;
7588 }
7589
CheckHspVersionIsRelied(int32_t versionCode,const InnerBundleInfo & info) const7590 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
7591 {
7592 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7593 std::string hspBundleName = info.GetBundleName();
7594 if (versionCode == Constants::ALL_VERSIONCODE) {
7595 // uninstall hsp bundle, check other bundle denpendency
7596 return CheckHspBundleIsRelied(hspBundleName);
7597 }
7598 std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
7599 // check whether has higher version
7600 std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
7601 for (const auto &item : versionCodes) {
7602 if (item > static_cast<uint32_t>(versionCode)) {
7603 return false;
7604 }
7605 }
7606 // check other bundle denpendency
7607 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7608 if (bundleName == hspBundleName) {
7609 continue;
7610 }
7611 std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7612 for (const auto &dependencyItem : dependencyList) {
7613 if (dependencyItem.bundleName == hspBundleName &&
7614 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
7615 return true;
7616 }
7617 }
7618 }
7619 return false;
7620 }
7621
CheckHspBundleIsRelied(const std::string & hspBundleName) const7622 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
7623 {
7624 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7625 if (bundleName == hspBundleName) {
7626 continue;
7627 }
7628 std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7629 for (const auto &dependencyItem : dependencyList) {
7630 if (dependencyItem.bundleName == hspBundleName) {
7631 return true;
7632 }
7633 }
7634 }
7635 return false;
7636 }
7637
GetSharedBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo)7638 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
7639 {
7640 if (bundleName.empty()) {
7641 APP_LOGW("bundleName is empty");
7642 return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7643 }
7644
7645 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7646 auto infoItem = bundleInfos_.find(bundleName);
7647 if (infoItem == bundleInfos_.end()) {
7648 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7649 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7650 }
7651 const InnerBundleInfo &innerBundleInfo = infoItem->second;
7652 innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
7653 return ERR_OK;
7654 }
7655
IsPreInstallApp(const std::string & bundleName)7656 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
7657 {
7658 APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
7659 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7660 auto item = bundleInfos_.find(bundleName);
7661 if (item == bundleInfos_.end()) {
7662 APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
7663 bundleName.c_str());
7664 return false;
7665 }
7666 return item->second.IsPreInstallApp();
7667 }
7668
GetProxyDataInfos(const std::string & bundleName,const std::string & moduleName,int32_t userId,std::vector<ProxyData> & proxyDatas) const7669 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
7670 int32_t userId, std::vector<ProxyData> &proxyDatas) const
7671 {
7672 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7673 InnerBundleInfo info;
7674 auto ret = GetInnerBundleInfoWithBundleFlagsV9(
7675 bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
7676 if (ret != ERR_OK) {
7677 APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7678 return ret;
7679 }
7680 return info.GetProxyDataInfos(moduleName, proxyDatas);
7681 }
7682
GetAllProxyDataInfos(int32_t userId,std::vector<ProxyData> & proxyDatas) const7683 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
7684 {
7685 std::vector<BundleInfo> bundleInfos;
7686 auto ret = GetBundleInfosV9(
7687 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
7688 if (ret != ERR_OK) {
7689 APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
7690 return ret;
7691 }
7692 for (const auto &bundleInfo : bundleInfos) {
7693 for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
7694 proxyDatas.insert(
7695 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
7696 }
7697 }
7698 return ERR_OK;
7699 }
7700
GetBundleNameByAppId(const std::string & appId) const7701 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
7702 {
7703 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7704 auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
7705 return appId == pair.second.GetAppId();
7706 });
7707 if (it == bundleInfos_.cend()) {
7708 APP_LOGW("invalid appId, can't find bundleName");
7709 return Constants::EMPTY_STRING;
7710 }
7711 return it->second.GetBundleName();
7712 }
7713
SetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,AOTCompileStatus aotCompileStatus,uint32_t versionCode)7714 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7715 AOTCompileStatus aotCompileStatus, uint32_t versionCode)
7716 {
7717 APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
7718 bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
7719 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7720 auto item = bundleInfos_.find(bundleName);
7721 if (item == bundleInfos_.end()) {
7722 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7723 (void)InstalldClient::GetInstance()->RemoveDir(ServiceConstants::ARK_CACHE_PATH + bundleName);
7724 return;
7725 }
7726 if (item->second.GetVersionCode() != versionCode) {
7727 APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
7728 versionCode, item->second.GetVersionCode(), bundleName.c_str());
7729 return;
7730 }
7731 item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
7732 std::string abi;
7733 std::string path;
7734 if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
7735 abi = ServiceConstants::ARM64_V8A;
7736 path = std::string(ServiceConstants::ARM64) + ServiceConstants::PATH_SEPARATOR;
7737 }
7738 item->second.SetArkNativeFileAbi(abi);
7739 item->second.SetArkNativeFilePath(path);
7740 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7741 APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
7742 }
7743 }
7744
ResetAOTFlags()7745 void BundleDataMgr::ResetAOTFlags()
7746 {
7747 APP_LOGI("ResetAOTFlags begin");
7748 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7749 std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
7750 if (item.second.IsAOTFlagsInitial()) {
7751 return;
7752 }
7753 item.second.ResetAOTFlags();
7754 if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
7755 APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
7756 }
7757 });
7758 APP_LOGI("ResetAOTFlags end");
7759 }
7760
ResetAOTFlagsCommand(const std::string & bundleName)7761 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
7762 {
7763 APP_LOGI("ResetAOTFlagsCommand begin");
7764 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7765 auto item = bundleInfos_.find(bundleName);
7766 if (item == bundleInfos_.end()) {
7767 APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7768 return;
7769 }
7770 if (item->second.IsAOTFlagsInitial()) {
7771 return;
7772 }
7773 item->second.ResetAOTFlags();
7774 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7775 APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7776 return;
7777 }
7778 APP_LOGI("ResetAOTFlagsCommand end");
7779 }
7780
ResetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,int32_t triggerMode)7781 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7782 int32_t triggerMode)
7783 {
7784 APP_LOGI("ResetAOTCompileStatus begin");
7785 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7786 auto item = bundleInfos_.find(bundleName);
7787 if (item == bundleInfos_.end()) {
7788 APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7789 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7790 }
7791 ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
7792 if (ret != ERR_OK) {
7793 return ret;
7794 }
7795 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7796 APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7797 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7798 }
7799 APP_LOGI("ResetAOTCompileStatus end");
7800 return ERR_OK;
7801 }
7802
GetAllBundleName() const7803 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
7804 {
7805 APP_LOGD("GetAllBundleName begin");
7806 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7807 std::vector<std::string> bundleNames;
7808 bundleNames.reserve(bundleInfos_.size());
7809 std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
7810 return item.first;
7811 });
7812 return bundleNames;
7813 }
7814
GetAllSystemHspCodePaths() const7815 std::vector<std::string> BundleDataMgr::GetAllSystemHspCodePaths() const
7816 {
7817 std::vector<std::string> systemHspCodePaths;
7818 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7819 for (const auto &item : bundleInfos_) {
7820 if (item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
7821 std::string installPath = item.second.GetAppCodePath();
7822 APP_LOGD("get appcodepath:%{public}s for %{public}s",
7823 installPath.c_str(), item.second.GetBundleName().c_str());
7824 systemHspCodePaths.emplace_back(installPath);
7825 }
7826 }
7827 return systemHspCodePaths;
7828 }
7829
GetAllExtensionBundleNames(const std::vector<ExtensionAbilityType> & types) const7830 std::vector<std::string> BundleDataMgr::GetAllExtensionBundleNames(const std::vector<ExtensionAbilityType> &types) const
7831 {
7832 APP_LOGD("GetAllExtensionBundleNames begin");
7833 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7834 std::vector<std::string> bundleNames;
7835 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7836 const auto extensionAbilityInfos = innerBundleInfo.GetInnerExtensionInfos();
7837 for (const auto &extensionItem : extensionAbilityInfos) {
7838 if (std::find(types.begin(), types.end(), extensionItem.second.type) != types.end()) {
7839 bundleNames.emplace_back(bundleName);
7840 break;
7841 }
7842 }
7843 }
7844 return bundleNames;
7845 }
7846
GetAllLiteBundleInfo(const int32_t userId) const7847 std::vector<std::tuple<std::string, int32_t, int32_t>> BundleDataMgr::GetAllLiteBundleInfo(const int32_t userId) const
7848 {
7849 std::set<int32_t> userIds = GetAllUser();
7850 if (userIds.find(userId) == userIds.end()) {
7851 APP_LOGW("invalid userId");
7852 return {};
7853 }
7854 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7855 std::vector<std::tuple<std::string, int32_t, int32_t>> bundles;
7856 for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7857 auto installedUsers = innerBundleInfo.GetUsers();
7858 if (installedUsers.find(userId) == installedUsers.end()) {
7859 continue;
7860 }
7861 bundles.emplace_back(bundleName, innerBundleInfo.GetUid(userId), innerBundleInfo.GetGid(userId));
7862 }
7863 return bundles;
7864 }
7865
GetBundleNamesForNewUser() const7866 std::vector<std::string> BundleDataMgr::GetBundleNamesForNewUser() const
7867 {
7868 APP_LOGD("begin");
7869 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7870 std::vector<std::string> bundleNames;
7871 for (const auto &item : bundleInfos_) {
7872 if (item.second.GetApplicationBundleType() == BundleType::SHARED ||
7873 item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
7874 APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
7875 item.second.GetBundleName().c_str());
7876 continue;
7877 }
7878 // this function is used to install additional bundle in new user, so ignore pre-install app
7879 if (item.second.IsPreInstallApp()) {
7880 APP_LOGD("app %{public}s is pre-install app, ignore", item.second.GetBundleName().c_str());
7881 continue;
7882 }
7883 if (item.second.IsInstalledForAllUser() &&
7884 OHOS::system::GetBoolParameter(ServiceConstants::IS_ENTERPRISE_DEVICE, false)) {
7885 APP_LOGI("%{public}s is installed for all user", item.second.GetBundleName().c_str());
7886 bundleNames.emplace_back(item.second.GetBundleName());
7887 continue;
7888 }
7889 const auto extensions = item.second.GetInnerExtensionInfos();
7890 for (const auto &extensionItem : extensions) {
7891 if (extensionItem.second.type == ExtensionAbilityType::DRIVER &&
7892 OHOS::system::GetBoolParameter(ServiceConstants::IS_DRIVER_FOR_ALL_USERS, true)) {
7893 bundleNames.emplace_back(extensionItem.second.bundleName);
7894 APP_LOGI("driver bundle found: %{public}s", extensionItem.second.bundleName.c_str());
7895 break;
7896 }
7897 }
7898 }
7899 return bundleNames;
7900 }
7901
QueryInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info) const7902 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
7903 {
7904 APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
7905 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7906 auto item = bundleInfos_.find(bundleName);
7907 if (item == bundleInfos_.end()) {
7908 APP_LOGW_NOFUNC("QueryInnerBundleInfo not find %{public}s", bundleName.c_str());
7909 return false;
7910 }
7911 info = item->second;
7912 return true;
7913 }
7914
GetUserIds(const std::string & bundleName) const7915 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
7916 {
7917 APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
7918 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7919 std::vector<int32_t> userIds;
7920 auto infoItem = bundleInfos_.find(bundleName);
7921 if (infoItem == bundleInfos_.end()) {
7922 APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7923 return userIds;
7924 }
7925 auto userInfos = infoItem->second.GetInnerBundleUserInfos();
7926 std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
7927 return item.second.bundleUserInfo.userId;
7928 });
7929 return userIds;
7930 }
7931
CreateAppEl5GroupDir(const std::string & bundleName,int32_t userId)7932 void BundleDataMgr::CreateAppEl5GroupDir(const std::string &bundleName, int32_t userId)
7933 {
7934 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7935 auto bundleInfoItem = bundleInfos_.find(bundleName);
7936 if (bundleInfoItem == bundleInfos_.end()) {
7937 APP_LOGW("%{public}s not found", bundleName.c_str());
7938 return;
7939 }
7940 bool needCreateEl5Dir = bundleInfoItem->second.NeedCreateEl5Dir();
7941 if (!needCreateEl5Dir) {
7942 return;
7943 }
7944 auto dataGroupInfoMap = bundleInfoItem->second.GetDataGroupInfos();
7945 if (dataGroupInfoMap.empty()) {
7946 return;
7947 }
7948 std::vector<DataGroupInfo> dataGroupInfos;
7949 for (const auto &groupItem : dataGroupInfoMap) {
7950 for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7951 if (dataGroupInfo.userId == userId) {
7952 dataGroupInfos.emplace_back(dataGroupInfo);
7953 }
7954 }
7955 }
7956 if (CreateEl5GroupDirs(dataGroupInfos, userId) != ERR_OK) {
7957 APP_LOGW("create el5 group dirs for %{public}s %{public}d failed", bundleName.c_str(), userId);
7958 }
7959 }
7960
CreateAppGroupDir(const InnerBundleInfo & info,int32_t userId)7961 bool BundleDataMgr::CreateAppGroupDir(const InnerBundleInfo &info, int32_t userId)
7962 {
7963 auto dataGroupInfoMap = info.GetDataGroupInfos();
7964 if (dataGroupInfoMap.empty()) {
7965 return true;
7966 }
7967 std::vector<DataGroupInfo> dataGroupInfos;
7968 for (const auto &groupItem : dataGroupInfoMap) {
7969 for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7970 if (dataGroupInfo.userId == userId) {
7971 dataGroupInfos.emplace_back(dataGroupInfo);
7972 }
7973 }
7974 }
7975 bool needCreateEl5Dir = info.NeedCreateEl5Dir();
7976 return CreateGroupDirs(dataGroupInfos, userId, needCreateEl5Dir) == ERR_OK;
7977 }
7978
CreateAppGroupDir(const std::string & bundleName,int32_t userId)7979 bool BundleDataMgr::CreateAppGroupDir(const std::string &bundleName, int32_t userId)
7980 {
7981 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7982 auto bundleInfoItem = bundleInfos_.find(bundleName);
7983 if (bundleInfoItem == bundleInfos_.end()) {
7984 APP_LOGW("%{public}s not found", bundleName.c_str());
7985 return false;
7986 }
7987 return CreateAppGroupDir(bundleInfoItem->second, userId);
7988 }
7989
CreateGroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId,bool needCreateEl5Dir)7990 ErrCode BundleDataMgr::CreateGroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId,
7991 bool needCreateEl5Dir)
7992 {
7993 if (dataGroupInfos.empty()) {
7994 return ERR_OK;
7995 }
7996 std::vector<CreateDirParam> params;
7997 for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
7998 CreateDirParam param;
7999 param.uuid = dataGroupInfo.uuid;
8000 param.uid = dataGroupInfo.uid;
8001 param.gid = dataGroupInfo.gid;
8002 param.userId = dataGroupInfo.userId;
8003 params.emplace_back(param);
8004 }
8005 ErrCode res = ERR_OK;
8006 auto nonEl5Res = InstalldClient::GetInstance()->CreateDataGroupDirs(params);
8007 if (nonEl5Res != ERR_OK) {
8008 APP_LOGE("mkdir group dir failed %{public}d", nonEl5Res);
8009 res = nonEl5Res;
8010 }
8011 if (!needCreateEl5Dir) {
8012 return res;
8013 }
8014 auto el5Res = CreateEl5GroupDirs(dataGroupInfos, userId);
8015 if (el5Res != ERR_OK) {
8016 APP_LOGE("el5Res %{public}d", el5Res);
8017 res = el5Res;
8018 }
8019 return res;
8020 }
8021
CreateEl5GroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId)8022 ErrCode BundleDataMgr::CreateEl5GroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId)
8023 {
8024 if (dataGroupInfos.empty()) {
8025 return ERR_OK;
8026 }
8027 std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
8028 ServiceConstants::PATH_SEPARATOR + std::to_string(userId);
8029 if (!BundleUtil::IsExistDir(parentDir)) {
8030 APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
8031 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8032 }
8033 ErrCode res = ERR_OK;
8034 for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
8035 // create el5 group dirs
8036 std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
8037 auto result = InstalldClient::GetInstance()->Mkdir(dir,
8038 ServiceConstants::DATA_GROUP_DIR_MODE, dataGroupInfo.uid, dataGroupInfo.gid);
8039 if (result != ERR_OK) {
8040 APP_LOGW("id %{public}s group dir %{private}s userId %{public}d failed",
8041 dataGroupInfo.dataGroupId.c_str(), dataGroupInfo.uuid.c_str(), userId);
8042 res = result;
8043 }
8044 // set el5 group dirs encryption policy
8045 EncryptionParam encryptionParam("", dataGroupInfo.uuid, dataGroupInfo.uid, userId, EncryptionDirType::GROUP);
8046 std::string keyId = "";
8047 auto setPolicyRes = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
8048 if (setPolicyRes != ERR_OK) {
8049 LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
8050 res = setPolicyRes;
8051 }
8052 }
8053 return res;
8054 }
8055
GetSpecifiedDistributionType(const std::string & bundleName,std::string & specifiedDistributionType)8056 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
8057 const std::string &bundleName, std::string &specifiedDistributionType)
8058 {
8059 APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
8060 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8061 auto infoItem = bundleInfos_.find(bundleName);
8062 if (infoItem == bundleInfos_.end()) {
8063 APP_LOGW_NOFUNC("-n %{public}s does not exist", bundleName.c_str());
8064 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8065 }
8066 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8067 int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8068 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8069 if (responseUserId == Constants::INVALID_USERID) {
8070 APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
8071 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8072 }
8073 }
8074 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
8075 specifiedDistributionType)) {
8076 APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed", bundleName.c_str());
8077 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8078 }
8079 return ERR_OK;
8080 }
8081
GetAdditionalInfo(const std::string & bundleName,std::string & additionalInfo)8082 ErrCode BundleDataMgr::GetAdditionalInfo(
8083 const std::string &bundleName, std::string &additionalInfo)
8084 {
8085 APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
8086 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8087 auto infoItem = bundleInfos_.find(bundleName);
8088 if (infoItem == bundleInfos_.end()) {
8089 APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
8090 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8091 }
8092 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8093 int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8094 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8095 if (responseUserId == Constants::INVALID_USERID) {
8096 APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
8097 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8098 }
8099 }
8100 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
8101 additionalInfo)) {
8102 APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
8103 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8104 }
8105 return ERR_OK;
8106 }
8107
GetAdditionalInfoForAllUser(const std::string & bundleName,std::string & additionalInfo)8108 ErrCode BundleDataMgr::GetAdditionalInfoForAllUser(
8109 const std::string &bundleName, std::string &additionalInfo)
8110 {
8111 APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
8112 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8113 auto infoItem = bundleInfos_.find(bundleName);
8114 if (infoItem == bundleInfos_.end()) {
8115 APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
8116 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8117 }
8118 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
8119 additionalInfo)) {
8120 APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
8121 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8122 }
8123 return ERR_OK;
8124 }
8125
SetExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)8126 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
8127 const std::string &abilityName, const std::string &extName, const std::string &mimeType)
8128 {
8129 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8130 auto item = bundleInfos_.find(bundleName);
8131 if (item == bundleInfos_.end()) {
8132 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
8133 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8134 }
8135 ErrCode ret;
8136 if (!extName.empty()) {
8137 ret = item->second.SetExtName(moduleName, abilityName, extName);
8138 if (ret != ERR_OK) {
8139 APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
8140 return ret;
8141 }
8142 }
8143 if (!mimeType.empty()) {
8144 ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
8145 if (ret != ERR_OK) {
8146 APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
8147 return ret;
8148 }
8149 }
8150 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
8151 APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
8152 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8153 }
8154 return ERR_OK;
8155 }
8156
DelExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)8157 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
8158 const std::string &abilityName, const std::string &extName, const std::string &mimeType)
8159 {
8160 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8161 auto item = bundleInfos_.find(bundleName);
8162 if (item == bundleInfos_.end()) {
8163 APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
8164 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8165 }
8166 ErrCode ret;
8167 if (!extName.empty()) {
8168 ret = item->second.DelExtName(moduleName, abilityName, extName);
8169 if (ret != ERR_OK) {
8170 APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
8171 return ret;
8172 }
8173 }
8174 if (!mimeType.empty()) {
8175 ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
8176 if (ret != ERR_OK) {
8177 APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
8178 return ret;
8179 }
8180 }
8181 if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
8182 APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
8183 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8184 }
8185 return ERR_OK;
8186 }
8187
MatchPrivateType(const Want & want,const std::vector<std::string> & supportExtNames,const std::vector<std::string> & supportMimeTypes,const std::vector<std::string> & paramMimeTypes) const8188 bool BundleDataMgr::MatchPrivateType(const Want &want,
8189 const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes,
8190 const std::vector<std::string> ¶mMimeTypes) const
8191 {
8192 std::string uri = want.GetUriString();
8193 APP_LOGD("MatchPrivateType, uri is %{private}s", uri.c_str());
8194 auto suffixIndex = uri.rfind('.');
8195 if (suffixIndex == std::string::npos) {
8196 return false;
8197 }
8198 std::string suffix = uri.substr(suffixIndex + 1);
8199 bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
8200 return extName == suffix;
8201 });
8202 if (supportPrivateType) {
8203 APP_LOGI("uri is a supported private-type file");
8204 return true;
8205 }
8206
8207 if (!paramMimeTypes.empty()) {
8208 auto iter = std::find_first_of(
8209 paramMimeTypes.begin(), paramMimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
8210 if (iter != paramMimeTypes.end()) {
8211 APP_LOGI("uri is a supported mime-type file");
8212 return true;
8213 }
8214 }
8215 return false;
8216 }
8217
QueryAppGalleryAbilityName(std::string & bundleName,std::string & abilityName)8218 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
8219 {
8220 APP_LOGD("QueryAppGalleryAbilityName called");
8221 AbilityInfo abilityInfo;
8222 ExtensionAbilityInfo extensionInfo;
8223 Want want;
8224 want.SetAction(FREE_INSTALL_ACTION);
8225 if (!ImplicitQueryInfoByPriority(
8226 want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
8227 APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
8228 return false;
8229 }
8230 if (!abilityInfo.name.empty()) {
8231 bundleName = abilityInfo.bundleName;
8232 abilityName = abilityInfo.name;
8233 } else {
8234 bundleName = extensionInfo.bundleName;
8235 abilityName = extensionInfo.name;
8236 }
8237
8238 if (bundleName.empty() || abilityName.empty()) {
8239 APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
8240 bundleName.c_str(), abilityName.c_str());
8241 return false;
8242 }
8243 bool isSystemApp = false;
8244 if (IsSystemApp(bundleName, isSystemApp) != ERR_OK || !isSystemApp) {
8245 APP_LOGW("%{public}s is not systemApp", bundleName.c_str());
8246 bundleName.clear();
8247 abilityName.clear();
8248 return false;
8249 }
8250 APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
8251 bundleName.c_str(), abilityName.c_str());
8252 return true;
8253 }
8254
GetJsonProfile(ProfileType profileType,const std::string & bundleName,const std::string & moduleName,std::string & profile,int32_t userId) const8255 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
8256 const std::string &moduleName, std::string &profile, int32_t userId) const
8257 {
8258 APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
8259 profileType, bundleName.c_str(), moduleName.c_str());
8260 int32_t requestUserId = GetUserId(userId);
8261 if (requestUserId == Constants::INVALID_USERID) {
8262 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8263 }
8264 auto mapItem = PROFILE_TYPE_MAP.find(profileType);
8265 if (mapItem == PROFILE_TYPE_MAP.end()) {
8266 APP_LOGE("profileType: %{public}d is invalid", profileType);
8267 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
8268 }
8269 std::string profilePath = mapItem->second;
8270 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8271 const auto &item = bundleInfos_.find(bundleName);
8272 if (item == bundleInfos_.end()) {
8273 APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
8274 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8275 }
8276 const InnerBundleInfo &bundleInfo = item->second;
8277 bool isEnabled = false;
8278 int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
8279 ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
8280 if (res != ERR_OK) {
8281 APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
8282 return res;
8283 }
8284 if (!isEnabled) {
8285 APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
8286 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
8287 }
8288 std::string moduleNameTmp = moduleName;
8289 if (moduleName.empty()) {
8290 APP_LOGW("moduleName is empty, try to get profile from entry module");
8291 std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
8292 for (const auto &info : moduleInfos) {
8293 if (info.second.isEntry) {
8294 moduleNameTmp = info.second.moduleName;
8295 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
8296 break;
8297 }
8298 }
8299 }
8300 auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
8301 if (!moduleInfo) {
8302 APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
8303 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
8304 }
8305 return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
8306 }
8307
GetJsonProfileByExtractor(const std::string & hapPath,const std::string & profilePath,std::string & profile) const8308 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
8309 const std::string &profilePath, std::string &profile) const
8310 {
8311 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
8312 APP_LOGD("GetJsonProfileByExtractor with hapPath %{private}s and profilePath %{private}s",
8313 hapPath.c_str(), profilePath.c_str());
8314 BundleExtractor bundleExtractor(hapPath);
8315 if (!bundleExtractor.Init()) {
8316 APP_LOGE("bundle extractor init failed");
8317 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8318 }
8319 if (!bundleExtractor.HasEntry(profilePath)) {
8320 APP_LOGD("profile not exist");
8321 return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
8322 }
8323 std::stringstream profileStream;
8324 if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
8325 APP_LOGE("extract profile failed");
8326 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8327 }
8328 profile = profileStream.str();
8329 return ERR_OK;
8330 }
8331
QueryDataGroupInfos(const std::string & bundleName,int32_t userId,std::vector<DataGroupInfo> & infos) const8332 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
8333 std::vector<DataGroupInfo> &infos) const
8334 {
8335 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8336 auto infoItem = bundleInfos_.find(bundleName);
8337 if (infoItem == bundleInfos_.end()) {
8338 APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
8339 return false;
8340 }
8341 auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
8342 for (const auto &item : dataGroupInfos) {
8343 auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
8344 [userId](const DataGroupInfo &info) {
8345 return info.userId == userId;
8346 });
8347 if (dataGroupIter != std::end(item.second)) {
8348 infos.push_back(*dataGroupIter);
8349 }
8350 }
8351 return true;
8352 }
8353
GetGroupDir(const std::string & dataGroupId,std::string & dir,int32_t userId) const8354 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
8355 {
8356 if (userId == Constants::UNSPECIFIED_USERID) {
8357 userId = AccountHelper::GetCurrentActiveUserId();
8358 }
8359 std::string uuid;
8360 if (BundlePermissionMgr::IsSystemApp() &&
8361 BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
8362 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8363 for (const auto &item : bundleInfos_) {
8364 const auto &dataGroupInfos = item.second.GetDataGroupInfos();
8365 auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
8366 if (dataGroupInfosIter == dataGroupInfos.end()) {
8367 continue;
8368 }
8369 auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
8370 std::end(dataGroupInfosIter->second),
8371 [userId](const DataGroupInfo &info) { return info.userId == userId; });
8372 if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
8373 uuid = dataInUserIter->uuid;
8374 break;
8375 }
8376 }
8377 } else {
8378 int32_t callingUid = IPCSkeleton::GetCallingUid();
8379 InnerBundleInfo innerBundleInfo;
8380 if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8381 APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
8382 return false;
8383 }
8384 const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8385 auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
8386 if (dataGroupInfosIter == dataGroupInfos.end()) {
8387 APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
8388 return false;
8389 }
8390 auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
8391 [userId](const DataGroupInfo &info) {
8392 return info.userId == userId;
8393 });
8394 if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
8395 uuid = dataGroupIter->uuid;
8396 }
8397 }
8398 if (uuid.empty()) {
8399 APP_LOGW("get uuid by data group id failed");
8400 return false;
8401 }
8402 dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR + std::to_string(userId)
8403 + ServiceConstants::DATA_GROUP_PATH + uuid;
8404 APP_LOGD("groupDir: %{private}s", dir.c_str());
8405 return true;
8406 }
8407
CreateNewDataGroupInfo(const std::string & groupId,const int32_t userId,const DataGroupInfo & oldDataGroupInfo,DataGroupInfo & newDataGroupInfo)8408 void BundleDataMgr::CreateNewDataGroupInfo(const std::string &groupId, const int32_t userId,
8409 const DataGroupInfo &oldDataGroupInfo, DataGroupInfo &newDataGroupInfo)
8410 {
8411 newDataGroupInfo.dataGroupId = groupId;
8412 newDataGroupInfo.userId = userId;
8413
8414 newDataGroupInfo.uuid = oldDataGroupInfo.uuid;
8415 int32_t uniqueId = oldDataGroupInfo.uid - oldDataGroupInfo.userId * Constants::BASE_USER_RANGE -
8416 DATA_GROUP_UID_OFFSET;
8417 int32_t uid = uniqueId + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8418 newDataGroupInfo.uid = uid;
8419 newDataGroupInfo.gid = uid;
8420 }
8421
ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo & innerBundleInfo)8422 void BundleDataMgr::ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo &innerBundleInfo)
8423 {
8424 auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8425 if (dataGroupInfos.empty()) {
8426 return;
8427 }
8428 for (int32_t userId : innerBundleInfo.GetUsers()) {
8429 for (const auto &dataItem : dataGroupInfos) {
8430 std::string groupId = dataItem.first;
8431 if (dataItem.second.empty()) {
8432 APP_LOGW("id infos %{public}s empty in -n %{public}s", groupId.c_str(),
8433 innerBundleInfo.GetBundleName().c_str());
8434 continue;
8435 }
8436 DataGroupInfo dataGroupInfo;
8437 CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8438 innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
8439 // user path can not access, need create group dir when user unlocked
8440 }
8441 }
8442 }
8443
GenerateDataGroupUuidAndUid(DataGroupInfo & dataGroupInfo,int32_t userId,std::unordered_set<int32_t> & uniqueIdSet) const8444 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
8445 std::unordered_set<int32_t> &uniqueIdSet) const
8446 {
8447 int32_t uniqueId = DATA_GROUP_INDEX_START;
8448 for (int32_t i = DATA_GROUP_INDEX_START; i < DATA_GROUP_UID_OFFSET; i++) {
8449 if (uniqueIdSet.find(i) == uniqueIdSet.end()) {
8450 uniqueId = i;
8451 break;
8452 }
8453 }
8454
8455 int32_t uid = userId * Constants::BASE_USER_RANGE + uniqueId + DATA_GROUP_UID_OFFSET;
8456 dataGroupInfo.uid = uid;
8457 dataGroupInfo.gid = uid;
8458
8459 std::string str = GenerateUuidByKey(dataGroupInfo.dataGroupId);
8460 dataGroupInfo.uuid = str;
8461 uniqueIdSet.insert(uniqueId);
8462 }
8463
GenerateDataGroupInfos(const std::string & bundleName,const std::unordered_set<std::string> & dataGroupIdList,int32_t userId,bool needSaveStorage)8464 void BundleDataMgr::GenerateDataGroupInfos(const std::string &bundleName,
8465 const std::unordered_set<std::string> &dataGroupIdList, int32_t userId, bool needSaveStorage)
8466 {
8467 APP_LOGD("called for user: %{public}d", userId);
8468 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8469 auto bundleInfoItem = bundleInfos_.find(bundleName);
8470 if (bundleInfoItem == bundleInfos_.end()) {
8471 APP_LOGW("%{public}s not found", bundleName.c_str());
8472 return;
8473 }
8474 auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8475 for (const auto &dataItem : dataGroupInfos) {
8476 std::string oldGroupId = dataItem.first;
8477 if (dataGroupIdList.find(oldGroupId) == dataGroupIdList.end()) {
8478 bundleInfoItem->second.DeleteDataGroupInfo(oldGroupId);
8479 }
8480 }
8481 if (dataGroupIdList.empty()) {
8482 APP_LOGD("dataGroupIdList is empty");
8483 return;
8484 }
8485 std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
8486 std::unordered_set<int32_t> uniqueIdSet;
8487 GetDataGroupIndexMap(dataGroupIndexMap, uniqueIdSet);
8488 for (const std::string &groupId : dataGroupIdList) {
8489 DataGroupInfo dataGroupInfo;
8490 dataGroupInfo.dataGroupId = groupId;
8491 dataGroupInfo.userId = userId;
8492 auto iter = dataGroupIndexMap.find(groupId);
8493 if (iter != dataGroupIndexMap.end()) {
8494 dataGroupInfo.uuid = iter->second.second;
8495 int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8496 dataGroupInfo.uid = uid;
8497 dataGroupInfo.gid = uid;
8498 } else {
8499 // need to generate a valid uniqueId
8500 GenerateDataGroupUuidAndUid(dataGroupInfo, userId, uniqueIdSet);
8501 }
8502 bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8503 }
8504 (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8505 ProcessAllUserDataGroupInfosWhenBundleUpdate(bundleInfoItem->second);
8506 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8507 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8508 }
8509 }
8510
GenerateNewUserDataGroupInfos(const std::string & bundleName,int32_t userId)8511 void BundleDataMgr::GenerateNewUserDataGroupInfos(const std::string &bundleName, int32_t userId)
8512 {
8513 APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8514 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8515 auto bundleInfoItem = bundleInfos_.find(bundleName);
8516 if (bundleInfoItem == bundleInfos_.end()) {
8517 APP_LOGW("%{public}s not found", bundleName.c_str());
8518 return;
8519 }
8520 auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8521 if (dataGroupInfos.empty()) {
8522 return;
8523 }
8524 for (const auto &dataItem : dataGroupInfos) {
8525 std::string groupId = dataItem.first;
8526 if (dataItem.second.empty()) {
8527 APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8528 continue;
8529 }
8530 DataGroupInfo dataGroupInfo;
8531 CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8532 bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8533 //need create group dir
8534 (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8535 }
8536 if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8537 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8538 }
8539 }
8540
DeleteUserDataGroupInfos(const std::string & bundleName,int32_t userId,bool keepData)8541 void BundleDataMgr::DeleteUserDataGroupInfos(const std::string &bundleName, int32_t userId, bool keepData)
8542 {
8543 APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8544 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8545 auto bundleInfoItem = bundleInfos_.find(bundleName);
8546 if (bundleInfoItem == bundleInfos_.end()) {
8547 APP_LOGW("%{public}s not found", bundleName.c_str());
8548 return;
8549 }
8550 auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8551 if (dataGroupInfos.empty()) {
8552 return;
8553 }
8554 std::vector<std::string> uuidList;
8555 for (const auto &dataItem : dataGroupInfos) {
8556 std::string groupId = dataItem.first;
8557 if (dataItem.second.empty()) {
8558 APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8559 continue;
8560 }
8561 bundleInfoItem->second.RemoveGroupInfos(userId, groupId);
8562 if (!keepData && !IsDataGroupIdExistNoLock(groupId, userId)) {
8563 uuidList.emplace_back(dataItem.second[0].uuid);
8564 }
8565 }
8566 auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8567 if (result != ERR_OK) {
8568 APP_LOGE("delete group dir failed, err %{public}d", result);
8569 }
8570 if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8571 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8572 }
8573 }
8574
GetDataGroupIndexMap(std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap,std::unordered_set<int32_t> & uniqueIdSet) const8575 void BundleDataMgr::GetDataGroupIndexMap(std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap,
8576 std::unordered_set<int32_t> &uniqueIdSet) const
8577 {
8578 for (const auto &bundleInfo : bundleInfos_) {
8579 for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
8580 for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
8581 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
8582 - DATA_GROUP_UID_OFFSET;
8583 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
8584 std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
8585 uniqueIdSet.insert(index);
8586 });
8587 }
8588 }
8589 }
8590
IsShareDataGroupIdNoLock(const std::string & dataGroupId,int32_t userId) const8591 bool BundleDataMgr::IsShareDataGroupIdNoLock(const std::string &dataGroupId, int32_t userId) const
8592 {
8593 APP_LOGD("IsShareDataGroupIdNoLock, dataGroupId is %{public}s", dataGroupId.c_str());
8594 int32_t count = 0;
8595 for (const auto &info : bundleInfos_) {
8596 auto dataGroupInfos = info.second.GetDataGroupInfos();
8597 auto iter = dataGroupInfos.find(dataGroupId);
8598 if (iter == dataGroupInfos.end()) {
8599 continue;
8600 }
8601
8602 auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8603 [userId](const DataGroupInfo &dataGroupInfo) {
8604 return dataGroupInfo.userId == userId;
8605 });
8606 if (dataGroupIter == std::end(iter->second)) {
8607 continue;
8608 }
8609 count++;
8610 if (count > 1) {
8611 APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
8612 return true;
8613 }
8614 }
8615 return false;
8616 }
8617
IsDataGroupIdExistNoLock(const std::string & dataGroupId,int32_t userId) const8618 bool BundleDataMgr::IsDataGroupIdExistNoLock(const std::string &dataGroupId, int32_t userId) const
8619 {
8620 APP_LOGD("dataGroupId is %{public}s, user %{public}d", dataGroupId.c_str(), userId);
8621 for (const auto &info : bundleInfos_) {
8622 auto dataGroupInfos = info.second.GetDataGroupInfos();
8623 auto iter = dataGroupInfos.find(dataGroupId);
8624 if (iter == dataGroupInfos.end()) {
8625 continue;
8626 }
8627
8628 auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8629 [userId](const DataGroupInfo &dataGroupInfo) {
8630 return dataGroupInfo.userId == userId;
8631 });
8632 if (dataGroupIter == std::end(iter->second)) {
8633 continue;
8634 }
8635 return true;
8636 }
8637 return false;
8638 }
8639
DeleteGroupDirsForException(const InnerBundleInfo & oldInfo,int32_t userId) const8640 void BundleDataMgr::DeleteGroupDirsForException(const InnerBundleInfo &oldInfo, int32_t userId) const
8641 {
8642 //find ids existed in newInfo, but not in oldInfo when there is no others share this id
8643 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8644 const auto bundleInfoItem = bundleInfos_.find(oldInfo.GetBundleName());
8645 if (bundleInfoItem == bundleInfos_.end()) {
8646 APP_LOGE("find bundle %{public}s failed", oldInfo.GetBundleName().c_str());
8647 return;
8648 }
8649 auto newDataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8650 if (newDataGroupInfos.empty()) {
8651 return;
8652 }
8653 auto oldDatagroupInfos = oldInfo.GetDataGroupInfos();
8654 std::vector<std::string> uuidList;
8655 for (const auto &newDataItem : newDataGroupInfos) {
8656 std::string newGroupId = newDataItem.first;
8657 if (newDataItem.second.empty()) {
8658 APP_LOGE("infos empty in %{public}s %{public}s", oldInfo.GetBundleName().c_str(), newGroupId.c_str());
8659 continue;
8660 }
8661 if (oldDatagroupInfos.find(newGroupId) != oldDatagroupInfos.end() ||
8662 IsShareDataGroupIdNoLock(newGroupId, userId)) {
8663 continue;
8664 }
8665 uuidList.emplace_back(newDataItem.second[0].uuid);
8666 }
8667 auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8668 if (result != ERR_OK) {
8669 APP_LOGE("delete group dir failed, err %{public}d", result);
8670 }
8671 }
8672
FindAbilityInfoInBundleInfo(const InnerBundleInfo & innerBundleInfo,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo) const8673 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
8674 const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
8675 {
8676 if (moduleName.empty()) {
8677 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8678 if (!ability) {
8679 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8680 }
8681 abilityInfo = *ability;
8682 return ERR_OK;
8683 }
8684
8685 ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
8686 if (ret != ERR_OK) {
8687 APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
8688 }
8689 return ret;
8690 }
8691
HasAppOrAtomicServiceInUser(const std::string & bundleName,int32_t userId) const8692 bool BundleDataMgr::HasAppOrAtomicServiceInUser(const std::string &bundleName, int32_t userId) const
8693 {
8694 if (!HasUserId(userId)) {
8695 APP_LOGW("user %{public}d error", userId);
8696 return false;
8697 }
8698 if (bundleName.empty()) {
8699 APP_LOGW("param -n %{public}s error", bundleName.c_str());
8700 return false;
8701 }
8702 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8703 auto iter = bundleInfos_.find(bundleName);
8704 if (iter == bundleInfos_.end()) {
8705 APP_LOGW("bundle %{public}s not found", bundleName.c_str());
8706 return false;
8707 }
8708 BundleType bundleType = iter->second.GetApplicationBundleType();
8709 if (bundleType != BundleType::APP && bundleType != BundleType::ATOMIC_SERVICE) {
8710 APP_LOGW("bundle %{public}s is not app or atomicservice", bundleName.c_str());
8711 return false;
8712 }
8713 return iter->second.GetResponseUserId(userId) != Constants::INVALID_USERID;
8714 }
8715
GetAllAppAndAtomicServiceInUser(int32_t userId,std::vector<std::string> & bundleList) const8716 bool BundleDataMgr::GetAllAppAndAtomicServiceInUser(int32_t userId, std::vector<std::string> &bundleList) const
8717 {
8718 if (!HasUserId(userId)) {
8719 APP_LOGW("param -u %{public}d error", userId);
8720 return false;
8721 }
8722 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8723 for (const auto &item : bundleInfos_) {
8724 BundleType bundleType = item.second.GetApplicationBundleType();
8725 if (bundleType != BundleType::APP && bundleType != BundleType::ATOMIC_SERVICE) {
8726 continue;
8727 }
8728 if (item.second.GetResponseUserId(userId) != Constants::INVALID_USERID) {
8729 bundleList.emplace_back(item.first);
8730 }
8731 }
8732 return !bundleList.empty();
8733 }
8734
ScanAllBundleGroupInfo()8735 void BundleDataMgr::ScanAllBundleGroupInfo()
8736 {
8737 // valid info, key: index, value: dataGroupId
8738 std::map<int32_t, std::string> indexMap;
8739 // valid info, key: dataGroupId, value: index
8740 std::map<std::string, int32_t> groupIdMap;
8741 // invalid infos, key: bundleNames, value: dataGroupId
8742 std::map<std::string, std::set<std::string>> needProcessGroupInfoBundleNames;
8743 // invalid GroupId
8744 std::set<std::string> errorGroupIds;
8745 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8746 for (const auto &info : bundleInfos_) {
8747 std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos = info.second.GetDataGroupInfos();
8748 if (dataGroupInfos.empty()) {
8749 continue;
8750 }
8751 for (const auto &dataGroupItem : dataGroupInfos) {
8752 std::string dataGroupId = dataGroupItem.first;
8753 if (dataGroupItem.second.empty()) {
8754 APP_LOGW("dataGroupInfos is empty in %{public}s", dataGroupId.c_str());
8755 continue;
8756 }
8757 int32_t groupUidIndex = dataGroupItem.second[0].uid -
8758 dataGroupItem.second[0].userId * Constants::BASE_USER_RANGE - DATA_GROUP_UID_OFFSET;
8759 bool hasIndex = indexMap.find(groupUidIndex) != indexMap.end();
8760 if (!hasIndex && groupIdMap.find(dataGroupId) == groupIdMap.end()) {
8761 indexMap[groupUidIndex] = dataGroupId;
8762 groupIdMap[dataGroupId] = groupUidIndex;
8763 continue;
8764 }
8765 if (!hasIndex && groupIdMap.find(dataGroupId) != groupIdMap.end()) {
8766 APP_LOGW("id %{public}s has invalid index %{public}d, not index %{public}d",
8767 dataGroupId.c_str(), groupIdMap[dataGroupId], groupUidIndex);
8768 }
8769 if (hasIndex && indexMap[groupUidIndex] == dataGroupId) {
8770 continue;
8771 }
8772 if (hasIndex && indexMap[groupUidIndex] != dataGroupId) {
8773 APP_LOGW("id %{public}s has invalid index %{public}d", dataGroupId.c_str(), groupUidIndex);
8774 }
8775 errorGroupIds.insert(dataGroupId);
8776 // invalid index or groupId
8777 APP_LOGW("error index %{public}d groudId %{public}s -n %{public}s",
8778 groupUidIndex, dataGroupId.c_str(), info.first.c_str());
8779 needProcessGroupInfoBundleNames[info.first].insert(dataGroupId);
8780 }
8781 }
8782 HandleGroupIdAndIndex(errorGroupIds, indexMap, groupIdMap);
8783 if (!HandleErrorDataGroupInfos(groupIdMap, needProcessGroupInfoBundleNames)) {
8784 APP_LOGE("process bundle data group failed");
8785 }
8786 }
8787
HandleGroupIdAndIndex(const std::set<std::string> errorGroupIds,std::map<int32_t,std::string> & indexMap,std::map<std::string,int32_t> & groupIdMap)8788 void BundleDataMgr::HandleGroupIdAndIndex(
8789 const std::set<std::string> errorGroupIds,
8790 std::map<int32_t, std::string> &indexMap,
8791 std::map<std::string, int32_t> &groupIdMap)
8792 {
8793 if (errorGroupIds.empty() || indexMap.empty() || groupIdMap.empty()) {
8794 return;
8795 }
8796 for (const auto &groupId : errorGroupIds) {
8797 if (groupIdMap.find(groupId) != groupIdMap.end()) {
8798 continue;
8799 }
8800 int32_t groupIndex = DATA_GROUP_INDEX_START;
8801 for (int32_t index = DATA_GROUP_INDEX_START; index < DATA_GROUP_UID_OFFSET; ++index) {
8802 if (indexMap.find(index) == indexMap.end()) {
8803 groupIndex = index;
8804 break;
8805 }
8806 }
8807 groupIdMap[groupId] = groupIndex;
8808 indexMap[groupIndex] = groupId;
8809 }
8810 }
8811
HandleErrorDataGroupInfos(const std::map<std::string,int32_t> & groupIdMap,const std::map<std::string,std::set<std::string>> & needProcessGroupInfoBundleNames)8812 bool BundleDataMgr::HandleErrorDataGroupInfos(
8813 const std::map<std::string, int32_t> &groupIdMap,
8814 const std::map<std::string, std::set<std::string>> &needProcessGroupInfoBundleNames)
8815 {
8816 if (groupIdMap.empty() || needProcessGroupInfoBundleNames.empty()) {
8817 return true;
8818 }
8819 bool ret = true;
8820 for (const auto &item : needProcessGroupInfoBundleNames) {
8821 auto bundleInfoIter = bundleInfos_.find(item.first);
8822 if (bundleInfoIter == bundleInfos_.end()) {
8823 ret = false;
8824 continue;
8825 }
8826 std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos =
8827 bundleInfoIter->second.GetDataGroupInfos();
8828 if (dataGroupInfos.empty()) {
8829 continue;
8830 }
8831 auto userIds = bundleInfoIter->second.GetUsers();
8832 for (const auto &groudId : item.second) {
8833 auto groupIndexIter = groupIdMap.find(groudId);
8834 if (groupIndexIter == groupIdMap.end()) {
8835 APP_LOGW("id map not found group %{public}s", groudId.c_str());
8836 ret = false;
8837 continue;
8838 }
8839 auto dataGroupInfoIter = dataGroupInfos.find(groudId);
8840 if ((dataGroupInfoIter == dataGroupInfos.end()) || dataGroupInfoIter->second.empty()) {
8841 continue;
8842 }
8843 for (int32_t userId : userIds) {
8844 DataGroupInfo dataGroupInfo;
8845 dataGroupInfo.dataGroupId = groudId;
8846 dataGroupInfo.userId = userId;
8847 dataGroupInfo.uuid = dataGroupInfoIter->second[0].uuid;
8848 int32_t uid = userId * Constants::BASE_USER_RANGE + groupIndexIter->second + DATA_GROUP_UID_OFFSET;
8849 dataGroupInfo.uid = uid;
8850 dataGroupInfo.gid = uid;
8851 bundleInfoIter->second.AddDataGroupInfo(groudId, dataGroupInfo);
8852 }
8853 }
8854 if (!dataStorage_->SaveStorageBundleInfo(bundleInfoIter->second)) {
8855 APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", item.first.c_str());
8856 ret = false;
8857 }
8858 }
8859 return ret;
8860 }
8861
8862 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)8863 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
8864 {
8865 InnerBundleInfo targetInnerBundleInfo;
8866 std::string targetBundleName = newInfo.GetTargetBundleName();
8867 auto targetInfoItem = bundleInfos_.find(targetBundleName);
8868 if (targetInfoItem != bundleInfos_.end()) {
8869 targetInnerBundleInfo = targetInfoItem->second;
8870 }
8871
8872 if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
8873 APP_LOGW("update overlay info failed");
8874 return false;
8875 }
8876 // storage target bundle info
8877 if (!targetInnerBundleInfo.GetBundleName().empty() &&
8878 dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8879 bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
8880 }
8881 // build overlay connection for external overlay
8882 if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8883 const auto &moduleInfos = newInfo.GetInnerModuleInfos();
8884 std::string moduleName = (moduleInfos.begin()->second).moduleName;
8885 BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
8886 }
8887 return true;
8888 }
8889
ResetExternalOverlayModuleState(const std::string & bundleName,const std::string & modulePackage)8890 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
8891 {
8892 for (auto &info : bundleInfos_) {
8893 if (info.second.GetTargetBundleName() != bundleName) {
8894 continue;
8895 }
8896 const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8897 for (const auto &moduleInfo : innerModuleInfos) {
8898 if (moduleInfo.second.targetModuleName == modulePackage) {
8899 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8900 break;
8901 }
8902 }
8903 if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
8904 APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
8905 }
8906 }
8907 }
8908
BuildExternalOverlayConnection(const std::string & moduleName,InnerBundleInfo & oldInfo,int32_t userId)8909 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
8910 int32_t userId)
8911 {
8912 APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
8913 moduleName.c_str(), userId);
8914 for (auto &info : bundleInfos_) {
8915 if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
8916 continue;
8917 }
8918 // check target bundle is preInstall application
8919 if (!oldInfo.IsPreInstallApp()) {
8920 APP_LOGW("target bundle is not preInstall application");
8921 return;
8922 }
8923
8924 // check fingerprint of current bundle with target bundle
8925 if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
8926 APP_LOGW("target bundle has different fingerprint with current bundle");
8927 return;
8928 }
8929 // external overlay does not support FA model
8930 if (!oldInfo.GetIsNewVersion()) {
8931 APP_LOGW("target bundle is not stage model");
8932 return;
8933 }
8934 // external overlay does not support service
8935 if (oldInfo.GetEntryInstallationFree()) {
8936 APP_LOGW("target bundle is service");
8937 return;
8938 }
8939
8940 const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8941 std::vector<std::string> overlayModuleVec;
8942 for (const auto &moduleInfo : innerModuleInfos) {
8943 if (moduleInfo.second.targetModuleName != moduleName) {
8944 continue;
8945 }
8946 OverlayModuleInfo overlayModuleInfo;
8947 overlayModuleInfo.bundleName = info.second.GetBundleName();
8948 overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
8949 overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
8950 overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
8951 overlayModuleInfo.priority = moduleInfo.second.targetPriority;
8952 oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
8953 overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
8954 }
8955 std::string bundleDir;
8956 const std::string &moduleHapPath =
8957 info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
8958 OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
8959 OverlayBundleInfo overlayBundleInfo;
8960 overlayBundleInfo.bundleName = info.second.GetBundleName();
8961 overlayBundleInfo.bundleDir = bundleDir;
8962 overlayBundleInfo.state = info.second.GetOverlayState();
8963 overlayBundleInfo.priority = info.second.GetTargetPriority();
8964 oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
8965 auto userSet = GetAllUser();
8966 for (const auto &innerUserId : userSet) {
8967 for (const auto &overlayModule : overlayModuleVec) {
8968 int32_t state = OverlayState::OVERLAY_INVALID;
8969 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
8970 if (state == OverlayState::OVERLAY_INVALID) {
8971 info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
8972 }
8973 }
8974 }
8975 }
8976 }
8977
RemoveOverlayInfoAndConnection(const InnerBundleInfo & innerBundleInfo,const std::string & bundleName)8978 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
8979 const std::string &bundleName)
8980 {
8981 if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
8982 std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
8983 auto targetInfoItem = bundleInfos_.find(targetBundleName);
8984 if (targetInfoItem == bundleInfos_.end()) {
8985 APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
8986 } else {
8987 InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
8988 OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
8989 if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8990 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
8991 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
8992 }
8993 }
8994 }
8995
8996 if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8997 for (auto &info : bundleInfos_) {
8998 if (info.second.GetTargetBundleName() != bundleName) {
8999 continue;
9000 }
9001 const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
9002 for (const auto &moduleInfo : innerModuleInfos) {
9003 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
9004 }
9005 dataStorage_->SaveStorageBundleInfo(info.second);
9006 }
9007 }
9008 }
9009 #endif
9010
GetOldAppIds(const std::string & bundleName,std::vector<std::string> & appIds) const9011 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
9012 {
9013 if (bundleName.empty()) {
9014 APP_LOGE("bundleName is empty");
9015 return false;
9016 }
9017 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9018 auto innerBundleInfo = bundleInfos_.find(bundleName);
9019 if (innerBundleInfo == bundleInfos_.end()) {
9020 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
9021 return false;
9022 }
9023 appIds = innerBundleInfo->second.GetOldAppIds();
9024 return true;
9025 }
9026
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo & oldInfo,const InnerBundleInfo & newInfo) const9027 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
9028 const InnerBundleInfo &newInfo) const
9029 {
9030 return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
9031 !oldInfo.HasEntry() || newInfo.HasEntry() ||
9032 (oldInfo.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE &&
9033 oldInfo.GetVersionCode() < newInfo.GetVersionCode());
9034 }
9035
GetModuleNameByBundleAndAbility(const std::string & bundleName,const std::string & abilityName)9036 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
9037 const std::string& bundleName, const std::string& abilityName)
9038 {
9039 if (bundleName.empty() || abilityName.empty()) {
9040 APP_LOGE("bundleName or abilityName is empty");
9041 return std::string();
9042 }
9043 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9044 auto innerBundleInfo = bundleInfos_.find(bundleName);
9045 if (innerBundleInfo == bundleInfos_.end()) {
9046 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
9047 return std::string();
9048 }
9049 auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
9050 if (!abilityInfo) {
9051 APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
9052 bundleName.c_str(), abilityName.c_str());
9053 return std::string();
9054 }
9055 return abilityInfo->moduleName;
9056 }
9057
SetAdditionalInfo(const std::string & bundleName,const std::string & additionalInfo) const9058 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
9059 {
9060 APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
9061 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9062 auto infoItem = bundleInfos_.find(bundleName);
9063 if (infoItem == bundleInfos_.end()) {
9064 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9065 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9066 }
9067
9068 if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
9069 int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
9070 int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
9071 if (responseUserId == Constants::INVALID_USERID) {
9072 APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
9073 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9074 }
9075 }
9076
9077 auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
9078 if (appProvisionInfoManager == nullptr) {
9079 APP_LOGE("Failed, appProvisionInfoManager is nullptr");
9080 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9081 }
9082
9083 if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
9084 APP_LOGE("BundleName: %{public}s set additional info failed", bundleName.c_str());
9085 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9086 }
9087
9088 ElementName element;
9089 element.SetBundleName(bundleName);
9090 OHOS::AAFwk::Want want;
9091 want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
9092 want.SetElement(element);
9093 EventFwk::CommonEventData commonData { want };
9094 NotifyBundleEventCallback(commonData);
9095 return ERR_OK;
9096 }
9097
GetAppServiceHspBundleInfo(const std::string & bundleName,BundleInfo & bundleInfo)9098 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
9099 {
9100 APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
9101 if (bundleName.empty()) {
9102 APP_LOGE("bundleName is empty");
9103 return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
9104 }
9105
9106 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9107 auto infoItem = bundleInfos_.find(bundleName);
9108 if (infoItem == bundleInfos_.end()) {
9109 APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
9110 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9111 }
9112 const InnerBundleInfo &innerBundleInfo = infoItem->second;
9113 auto res = innerBundleInfo.GetAppServiceHspInfo(bundleInfo);
9114 if (res != ERR_OK) {
9115 APP_LOGW("get hspInfo %{public}s fail", bundleName.c_str());
9116 return res;
9117 }
9118 return ERR_OK;
9119 }
9120
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo & innerBundleInfo,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos) const9121 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
9122 std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
9123 {
9124 APP_LOGD("start");
9125 BundleInfo bundleInfo;
9126 if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
9127 APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
9128 for (const auto &hapModule : bundleInfo.hapModuleInfos) {
9129 BaseSharedBundleInfo baseSharedBundleInfo;
9130 baseSharedBundleInfo.bundleName = bundleInfo.name;
9131 baseSharedBundleInfo.moduleName = hapModule.moduleName;
9132 baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
9133 baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
9134 baseSharedBundleInfo.hapPath = hapModule.hapPath;
9135 baseSharedBundleInfo.moduleArkTSMode = hapModule.moduleArkTSMode;
9136 baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
9137 baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
9138 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
9139 }
9140 return;
9141 }
9142 APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
9143 }
9144
AddAppHspBundleName(const BundleType type,const std::string & bundleName)9145 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
9146 {
9147 if (type == BundleType::APP_SERVICE_FWK) {
9148 APP_LOGD("add app hsp bundleName:%{public}s", bundleName.c_str());
9149 std::lock_guard<ffrt::mutex> hspLock(hspBundleNameMutex_);
9150 appServiceHspBundleName_.insert(bundleName);
9151 }
9152 }
9153
CreateBundleDataDir(int32_t userId)9154 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId)
9155 {
9156 APP_LOGI("with -u %{public}d begin", userId);
9157 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9158 std::vector<CreateDirParam> createDirParams;
9159 std::vector<CreateDirParam> el5Params;
9160 for (const auto &item : bundleInfos_) {
9161 const InnerBundleInfo &info = item.second;
9162 int32_t responseUserId = info.GetResponseUserId(userId);
9163 if (responseUserId == Constants::INVALID_USERID) {
9164 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
9165 info.GetBundleName().c_str(), userId);
9166 continue;
9167 }
9168 CreateDirParam createDirParam;
9169 createDirParam.bundleName = info.GetBundleName();
9170 createDirParam.userId = responseUserId;
9171 createDirParam.uid = info.GetUid(responseUserId);
9172 createDirParam.gid = info.GetGid(responseUserId);
9173 createDirParam.apl = info.GetAppPrivilegeLevel();
9174 createDirParam.isPreInstallApp = info.IsPreInstallApp();
9175 createDirParam.debug = info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
9176 createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
9177 createDirParam.extensionDirs = info.GetAllExtensionDirs();
9178 createDirParams.emplace_back(createDirParam);
9179
9180 std::vector<RequestPermission> reqPermissions = info.GetAllRequestPermissions();
9181 auto it = std::find_if(reqPermissions.begin(), reqPermissions.end(), [](const RequestPermission& permission) {
9182 return permission.name == ServiceConstants::PERMISSION_PROTECT_SCREEN_LOCK_DATA;
9183 });
9184 if (it != reqPermissions.end()) {
9185 el5Params.emplace_back(createDirParam);
9186 }
9187 CreateAppGroupDir(info, responseUserId);
9188 }
9189 lock.unlock();
9190 APP_LOGI("begin create dirs");
9191 auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
9192 APP_LOGI("end, res %{public}d", res);
9193 CreateEl5Dir(el5Params, true);
9194 return res;
9195 }
9196
CreateBundleDataDirWithEl(int32_t userId,DataDirEl dirEl)9197 ErrCode BundleDataMgr::CreateBundleDataDirWithEl(int32_t userId, DataDirEl dirEl)
9198 {
9199 APP_LOGI("with -u %{public}d -el %{public}d begin", userId, static_cast<uint8_t>(dirEl));
9200 std::vector<CreateDirParam> createDirParams;
9201 {
9202 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9203 for (const auto &item : bundleInfos_) {
9204 const InnerBundleInfo &info = item.second;
9205 if (!info.HasInnerBundleUserInfo(userId)) {
9206 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
9207 info.GetBundleName().c_str(), userId);
9208 continue;
9209 }
9210 if (dirEl == DataDirEl::EL5 && !info.NeedCreateEl5Dir()) {
9211 continue;
9212 }
9213 CreateDirParam createDirParam;
9214 createDirParam.bundleName = info.GetBundleName();
9215 createDirParam.userId = userId;
9216 createDirParam.uid = info.GetUid(userId);
9217 createDirParam.gid = info.GetGid(userId);
9218 createDirParam.apl = info.GetAppPrivilegeLevel();
9219 createDirParam.isPreInstallApp = info.IsPreInstallApp();
9220 createDirParam.debug =
9221 info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
9222 createDirParam.extensionDirs = info.GetAllExtensionDirs();
9223 createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
9224 createDirParam.dataDirEl = dirEl;
9225 createDirParams.emplace_back(createDirParam);
9226 CreateAppGroupDir(info, userId);
9227 }
9228 }
9229 ErrCode res = ERR_OK;
9230 if (dirEl != DataDirEl::EL5) {
9231 res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
9232 } else {
9233 CreateEl5Dir(createDirParams, true);
9234 }
9235 APP_LOGI("with -u %{public}d -el %{public}d end", userId, static_cast<uint8_t>(dirEl));
9236 return res;
9237 }
9238
CreateEl5Dir(const std::vector<CreateDirParam> & el5Params,bool needSaveStorage)9239 void BundleDataMgr::CreateEl5Dir(const std::vector<CreateDirParam> &el5Params, bool needSaveStorage)
9240 {
9241 for (const auto &el5Param : el5Params) {
9242 APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
9243 el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
9244 InnerCreateEl5Dir(el5Param);
9245 SetEl5DirPolicy(el5Param, needSaveStorage);
9246 }
9247 }
9248
CreateEl5DirNoCache(const std::vector<CreateDirParam> & el5Params,InnerBundleInfo & info)9249 void BundleDataMgr::CreateEl5DirNoCache(const std::vector<CreateDirParam> &el5Params, InnerBundleInfo &info)
9250 {
9251 for (const auto &el5Param : el5Params) {
9252 APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
9253 el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
9254 InnerCreateEl5Dir(el5Param);
9255 std::string keyId = "";
9256 SetEl5DirPolicy(el5Param, info, keyId);
9257 info.SetkeyId(el5Param.userId, keyId, el5Param.appIndex);
9258 }
9259 }
9260
GetUidByBundleName(const std::string & bundleName,int32_t userId,int32_t appIndex) const9261 int32_t BundleDataMgr::GetUidByBundleName(const std::string &bundleName, int32_t userId, int32_t appIndex) const
9262 {
9263 if (bundleName.empty()) {
9264 APP_LOGW("bundleName is empty");
9265 return Constants::INVALID_UID;
9266 }
9267
9268 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9269 auto infoItem = bundleInfos_.find(bundleName);
9270 if (infoItem == bundleInfos_.end()) {
9271 APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
9272 return Constants::INVALID_UID;
9273 }
9274 const InnerBundleInfo &innerBundleInfo = infoItem->second;
9275 if (userId == Constants::UNSPECIFIED_USERID) {
9276 userId = GetUserIdByCallingUid();
9277 }
9278 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9279 return innerBundleInfo.GetUid(responseUserId, appIndex);
9280 }
9281
InnerCreateEl5Dir(const CreateDirParam & el5Param)9282 void BundleDataMgr::InnerCreateEl5Dir(const CreateDirParam &el5Param)
9283 {
9284 std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
9285 ServiceConstants::PATH_SEPARATOR + std::to_string(el5Param.userId);
9286 if (!BundleUtil::IsExistDir(parentDir)) {
9287 APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
9288 return;
9289 }
9290 std::vector<std::string> dirs;
9291 std::string bundleNameDir = el5Param.bundleName;
9292 if (el5Param.appIndex > 0) {
9293 bundleNameDir = BundleCloneCommonHelper::GetCloneDataDir(el5Param.bundleName, el5Param.appIndex);
9294 }
9295 dirs.emplace_back(parentDir + ServiceConstants::BASE + bundleNameDir);
9296 dirs.emplace_back(parentDir + ServiceConstants::DATABASE + bundleNameDir);
9297 for (const std::string &dir : dirs) {
9298 uint32_t mode = S_IRWXU;
9299 int32_t gid = el5Param.uid;
9300 if (dir.find(ServiceConstants::DATABASE) != std::string::npos) {
9301 mode = S_IRWXU | S_IRWXG | S_ISGID;
9302 gid = ServiceConstants::DATABASE_DIR_GID;
9303 }
9304 if (InstalldClient::GetInstance()->Mkdir(dir, mode, el5Param.uid, gid) != ERR_OK) {
9305 LOG_W(BMS_TAG_INSTALLER, "create el5 dir %{public}s failed", dir.c_str());
9306 }
9307 ErrCode result = InstalldClient::GetInstance()->SetDirApl(
9308 dir, el5Param.bundleName, el5Param.apl, el5Param.isPreInstallApp, el5Param.debug, el5Param.uid);
9309 if (result != ERR_OK) {
9310 LOG_W(BMS_TAG_INSTALLER, "fail to SetDirApl dir %{public}s, error is %{public}d", dir.c_str(), result);
9311 }
9312 }
9313 }
9314
SetEl5DirPolicy(const CreateDirParam & el5Param,bool needSaveStorage)9315 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, bool needSaveStorage)
9316 {
9317 InnerBundleInfo info;
9318 if (!FetchInnerBundleInfo(el5Param.bundleName, info)) {
9319 LOG_E(BMS_TAG_INSTALLER, "get bundle %{public}s failed", el5Param.bundleName.c_str());
9320 return;
9321 }
9322 std::string keyId = "";
9323 SetEl5DirPolicy(el5Param, info, keyId);
9324 if (!UpdateEl5KeyId(el5Param, keyId, needSaveStorage)) {
9325 LOG_E(BMS_TAG_INSTALLER, "save keyId failed");
9326 }
9327 }
9328
SetEl5DirPolicy(const CreateDirParam & el5Param,InnerBundleInfo & info,std::string & keyId)9329 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, InnerBundleInfo &info, std::string &keyId)
9330 {
9331 int32_t uid = el5Param.uid;
9332 std::string bundleName = info.GetBundleName();
9333 if (el5Param.appIndex > 0) {
9334 bundleName = BundleCloneCommonHelper::GetCloneDataDir(bundleName, el5Param.appIndex);
9335 }
9336 EncryptionParam encryptionParam(bundleName, "", uid, el5Param.userId, EncryptionDirType::APP);
9337 auto result = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
9338 if (result != ERR_OK) {
9339 LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
9340 }
9341 LOG_D(BMS_TAG_INSTALLER, "%{public}s, keyId: %{public}s", bundleName.c_str(), keyId.c_str());
9342 }
9343
CanOpenLink(const std::string & link,bool & canOpen) const9344 ErrCode BundleDataMgr::CanOpenLink(
9345 const std::string &link, bool &canOpen) const
9346 {
9347 APP_LOGI("link: %{public}s", link.c_str());
9348 auto uid = IPCSkeleton::GetCallingUid();
9349 InnerBundleInfo innerBundleInfo;
9350 if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
9351 APP_LOGE("get innerBundleInfo by uid :%{public}d failed", uid);
9352 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9353 }
9354 auto querySchemes = innerBundleInfo.GetQuerySchemes();
9355 if (querySchemes.empty()) {
9356 APP_LOGI("querySchemes is empty");
9357 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9358 }
9359
9360 size_t pos = link.find(SCHEME_END);
9361 if (pos == std::string::npos) {
9362 APP_LOGE("parse link : %{public}s failed", link.c_str());
9363 return ERR_BUNDLE_MANAGER_INVALID_SCHEME;
9364 }
9365 std::string scheme = link.substr(0, pos);
9366 transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
9367 if (std::find(querySchemes.begin(), querySchemes.end(), scheme) == querySchemes.end()) {
9368 APP_LOGI("scheme :%{public}s is not in the querySchemes", scheme.c_str());
9369 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9370 }
9371
9372 Want want;
9373 want.SetUri(link);
9374 std::vector<AbilityInfo> abilityInfos;
9375 // implicit query
9376 ErrCode ret = ImplicitQueryAbilityInfosV9(
9377 want, static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), GetUserIdByUid(uid), abilityInfos);
9378 if (ret != ERR_OK) {
9379 APP_LOGD("implicit queryAbilityInfosV9 error");
9380 return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9381 }
9382
9383 canOpen = !abilityInfos.empty();
9384 APP_LOGI("canOpen : %{public}d", canOpen);
9385 return ERR_OK;
9386 }
9387
GenerateOdid(const std::string & developerId,std::string & odid) const9388 void BundleDataMgr::GenerateOdid(const std::string &developerId, std::string &odid) const
9389 {
9390 APP_LOGD("start, developerId:%{public}s", developerId.c_str());
9391 if (developerId.empty()) {
9392 APP_LOGE("developerId is empty");
9393 return;
9394 }
9395 std::string groupId = BundleUtil::ExtractGroupIdByDevelopId(developerId);
9396 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9397 for (const auto &item : bundleInfos_) {
9398 std::string developerIdExist;
9399 std::string odidExist;
9400 item.second.GetDeveloperidAndOdid(developerIdExist, odidExist);
9401 std::string groupIdExist = BundleUtil::ExtractGroupIdByDevelopId(developerIdExist);
9402 if (groupId == groupIdExist) {
9403 odid = odidExist;
9404 return;
9405 }
9406 }
9407 odid = GenerateUuid();
9408 APP_LOGI_NOFUNC("developerId:%{public}s not existed generate odid %{private}s",
9409 developerId.c_str(), odid.c_str());
9410 }
9411
GetOdid(std::string & odid) const9412 ErrCode BundleDataMgr::GetOdid(std::string &odid) const
9413 {
9414 int32_t callingUid = IPCSkeleton::GetCallingUid();
9415 InnerBundleInfo innerBundleInfo;
9416 if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
9417 if (sandboxAppHelper_ == nullptr) {
9418 APP_LOGE("sandboxAppHelper_ is nullptr");
9419 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9420 }
9421 if (sandboxAppHelper_->GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
9422 APP_LOGW("app that corresponds to the callingUid %{public}d could not be found", callingUid);
9423 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9424 }
9425 }
9426 std::string developerId;
9427 innerBundleInfo.GetDeveloperidAndOdid(developerId, odid);
9428 return ERR_OK;
9429 }
9430
GetOdidByBundleName(const std::string & bundleName,std::string & odid) const9431 ErrCode BundleDataMgr::GetOdidByBundleName(const std::string &bundleName, std::string &odid) const
9432 {
9433 APP_LOGI_NOFUNC("start GetOdidByBundleName -n %{public}s", bundleName.c_str());
9434 InnerBundleInfo innerBundleInfo;
9435 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9436 const auto &item = bundleInfos_.find(bundleName);
9437 if (item == bundleInfos_.end()) {
9438 APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
9439 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9440 }
9441 const InnerBundleInfo &bundleInfo = item->second;
9442 bundleInfo.GetOdid(odid);
9443 return ERR_OK;
9444 }
9445
HandleOTACodeEncryption()9446 void BundleDataMgr::HandleOTACodeEncryption()
9447 {
9448 int32_t timerId =
9449 XCollieHelper::SetRecoveryTimer(FUNCATION_HANDLE_OTA_CODE_ENCRYPTION, OTA_CODE_ENCRYPTION_TIMEOUT);
9450 ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
9451 APP_LOGI("begin");
9452 std::vector<std::string> withoutKeyBundles;
9453 std::vector<std::string> withKeyBundles;
9454 {
9455 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9456 for (const auto &item : bundleInfos_) {
9457 item.second.HandleOTACodeEncryption(withoutKeyBundles, withKeyBundles);
9458 }
9459 }
9460 for (const std::string &bundleName : withKeyBundles) {
9461 UpdateAppEncryptedStatus(bundleName, true, 0, true);
9462 }
9463 for (const std::string &bundleName : withoutKeyBundles) {
9464 UpdateAppEncryptedStatus(bundleName, false, 0, true);
9465 }
9466 APP_LOGI("end");
9467 }
9468
ProcessAllowedAcls(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo) const9469 void BundleDataMgr::ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const
9470 {
9471 if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
9472 oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
9473 return;
9474 }
9475 oldInfo.AddAllowedAcls(newInfo.GetAllowedAcls());
9476 }
9477
GetAllBundleInfoByDeveloperId(const std::string & developerId,std::vector<BundleInfo> & bundleInfos,int32_t userId)9478 ErrCode BundleDataMgr::GetAllBundleInfoByDeveloperId(const std::string &developerId,
9479 std::vector<BundleInfo> &bundleInfos, int32_t userId)
9480 {
9481 int32_t requestUserId = GetUserId(userId);
9482 APP_LOGI("requestUserId: %{public}d", requestUserId);
9483 if (requestUserId == Constants::INVALID_USERID) {
9484 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9485 }
9486
9487 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9488 if (bundleInfos_.empty()) {
9489 APP_LOGW("bundleInfos_ data is empty");
9490 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9491 }
9492 for (const auto &item : bundleInfos_) {
9493 const InnerBundleInfo &innerBundleInfo = item.second;
9494 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9495 innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9496 APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9497 innerBundleInfo.GetBundleName().c_str());
9498 continue;
9499 }
9500
9501 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9502 auto flag = GET_BASIC_APPLICATION_INFO;
9503 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9504 continue;
9505 }
9506 // check developerId
9507 std::string developerIdExist;
9508 std::string odidExist;
9509 innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9510 if (developerIdExist != developerId) {
9511 continue;
9512 }
9513
9514 BundleInfo bundleInfo;
9515
9516 if (innerBundleInfo.GetBundleInfoV9(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION),
9517 bundleInfo, responseUserId) != ERR_OK) {
9518 continue;
9519 }
9520 bundleInfos.emplace_back(bundleInfo);
9521 }
9522 if (bundleInfos.empty()) {
9523 APP_LOGW("bundleInfos is empty");
9524 return ERR_BUNDLE_MANAGER_INVALID_DEVELOPERID;
9525 }
9526 APP_LOGI("have %{public}d applications, their developerId is %{public}s", requestUserId, developerId.c_str());
9527 return ERR_OK;
9528 }
9529
GetDeveloperIds(const std::string & appDistributionType,std::vector<std::string> & developerIdList,int32_t userId)9530 ErrCode BundleDataMgr::GetDeveloperIds(const std::string &appDistributionType,
9531 std::vector<std::string> &developerIdList, int32_t userId)
9532 {
9533 int32_t requestUserId = GetUserId(userId);
9534 APP_LOGI("requestUserId: %{public}d", requestUserId);
9535 if (requestUserId == Constants::INVALID_USERID) {
9536 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9537 }
9538
9539 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9540 if (bundleInfos_.empty()) {
9541 APP_LOGW("bundleInfos_ data is empty");
9542 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9543 }
9544 std::set<std::string> developerIdSet;
9545 for (const auto &item : bundleInfos_) {
9546 const InnerBundleInfo &innerBundleInfo = item.second;
9547 if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9548 innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9549 APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9550 innerBundleInfo.GetBundleName().c_str());
9551 continue;
9552 }
9553
9554 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9555 auto flag = GET_BASIC_APPLICATION_INFO;
9556 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9557 continue;
9558 }
9559 // check appDistributionType
9560 if (!appDistributionType.empty() && innerBundleInfo.GetAppDistributionType() != appDistributionType) {
9561 continue;
9562 }
9563
9564 std::string developerIdExist;
9565 std::string odidExist;
9566 innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9567 developerIdSet.emplace(developerIdExist);
9568 }
9569 for (const std::string &developerId : developerIdSet) {
9570 developerIdList.emplace_back(developerId);
9571 }
9572 APP_LOGI("have %{public}d developers, their appDistributionType is %{public}s",
9573 static_cast<int32_t>(developerIdList.size()), appDistributionType.c_str());
9574 return ERR_OK;
9575 }
9576
SwitchUninstallState(const std::string & bundleName,const bool & state,const bool isNeedSendNotify,bool & stateChange)9577 ErrCode BundleDataMgr::SwitchUninstallState(const std::string &bundleName, const bool &state,
9578 const bool isNeedSendNotify, bool &stateChange)
9579 {
9580 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9581 auto infoItem = bundleInfos_.find(bundleName);
9582 if (infoItem == bundleInfos_.end()) {
9583 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9584 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9585 }
9586 InnerBundleInfo &innerBundleInfo = infoItem->second;
9587 if (!innerBundleInfo.IsRemovable() && state) {
9588 APP_LOGW("the bundle : %{public}s is not removable", bundleName.c_str());
9589 return ERR_BUNDLE_MANAGER_BUNDLE_CAN_NOT_BE_UNINSTALLED;
9590 }
9591 if (innerBundleInfo.GetUninstallState() == state) {
9592 stateChange = false;
9593 return ERR_OK;
9594 }
9595 innerBundleInfo.SetUninstallState(state);
9596 innerBundleInfo.SetNeedSendNotify(isNeedSendNotify);
9597 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9598 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9599 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9600 }
9601 stateChange = true;
9602 return ERR_OK;
9603 }
9604
AddCloneBundle(const std::string & bundleName,const InnerBundleCloneInfo & attr)9605 ErrCode BundleDataMgr::AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)
9606 {
9607 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9608 auto infoItem = bundleInfos_.find(bundleName);
9609 if (infoItem == bundleInfos_.end()) {
9610 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9611 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9612 }
9613 InnerBundleInfo &innerBundleInfo = infoItem->second;
9614 ErrCode res = innerBundleInfo.AddCloneBundle(attr);
9615 if (res != ERR_OK) {
9616 APP_LOGE("innerBundleInfo addCloneBundleInfo fail");
9617 return res;
9618 }
9619 APP_LOGD("update bundle info in memory for add clone, userId: %{public}d, appIndex: %{public}d",
9620 attr.userId, attr.appIndex);
9621 auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9622 innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9623 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9624 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9625 innerBundleInfo.RemoveCloneBundle(attr.userId, attr.appIndex);
9626 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9627 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9628 }
9629 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9630 APP_LOGD("update bundle info in storage for add clone, userId: %{public}d, appIndex: %{public}d",
9631 attr.userId, attr.appIndex);
9632 return ERR_OK;
9633 }
9634
FilterAbilityInfosByAppLinking(const Want & want,int32_t flags,std::vector<AbilityInfo> & abilityInfos) const9635 void BundleDataMgr::FilterAbilityInfosByAppLinking(const Want &want, int32_t flags,
9636 std::vector<AbilityInfo> &abilityInfos) const
9637 {
9638 #ifdef APP_DOMAIN_VERIFY_ENABLED
9639 APP_LOGD("FilterAbility start");
9640 if (abilityInfos.empty()) {
9641 APP_LOGD("abilityInfos is empty");
9642 return;
9643 }
9644 if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
9645 APP_LOGD("scheme is not https");
9646 if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9647 APP_LOGI("using app linking flag and scheme is not https, return empty list");
9648 abilityInfos.clear();
9649 }
9650 return;
9651 }
9652 std::vector<AbilityInfo> filteredAbilityInfos;
9653 // call FiltedAbilityInfos
9654 APP_LOGI("call FilterAbilities");
9655 std::string identity = IPCSkeleton::ResetCallingIdentity();
9656 if (!DelayedSingleton<AppDomainVerify::AppDomainVerifyMgrClient>::GetInstance()->FilterAbilities(
9657 want, abilityInfos, filteredAbilityInfos)) {
9658 APP_LOGE("FilterAbilities failed");
9659 }
9660 IPCSkeleton::SetCallingIdentity(identity);
9661 if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9662 APP_LOGD("return filteredAbilityInfos");
9663 abilityInfos = filteredAbilityInfos;
9664 for (auto &abilityInfo : abilityInfos) {
9665 abilityInfo.linkType = LinkType::APP_LINK;
9666 }
9667 return;
9668 }
9669 for (auto &filteredAbilityInfo : filteredAbilityInfos) {
9670 for (auto &abilityInfo : abilityInfos) {
9671 if (filteredAbilityInfo.bundleName == abilityInfo.bundleName &&
9672 filteredAbilityInfo.name == abilityInfo.name) {
9673 abilityInfo.linkType = LinkType::APP_LINK;
9674 break;
9675 }
9676 }
9677 }
9678 return;
9679 #else
9680 APP_LOGI("AppDomainVerify is not enabled");
9681 if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9682 APP_LOGI("has flag and return empty list");
9683 abilityInfos.clear();
9684 }
9685 return;
9686 #endif
9687 }
9688
HasAppLinkingFlag(uint32_t flags)9689 bool BundleDataMgr::HasAppLinkingFlag(uint32_t flags)
9690 {
9691 return (flags & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
9692 static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING);
9693 }
9694
RemoveCloneBundle(const std::string & bundleName,const int32_t userId,int32_t appIndex)9695 ErrCode BundleDataMgr::RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)
9696 {
9697 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9698 auto infoItem = bundleInfos_.find(bundleName);
9699 if (infoItem == bundleInfos_.end()) {
9700 APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9701 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9702 }
9703 InnerBundleInfo &innerBundleInfo = infoItem->second;
9704 ErrCode res = innerBundleInfo.RemoveCloneBundle(userId, appIndex);
9705 if (res != ERR_OK) {
9706 APP_LOGE("innerBundleInfo RemoveCloneBundle fail");
9707 return res;
9708 }
9709 auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9710 innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9711 if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9712 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9713 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9714 return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9715 }
9716 innerBundleInfo.SetBundleStatus(nowBundleStatus);
9717 DeleteDesktopShortcutInfo(bundleName, userId, appIndex);
9718 if (DeleteShortcutVisibleInfo(bundleName, userId, appIndex) != ERR_OK) {
9719 APP_LOGE("DeleteShortcutVisibleInfo failed, bundleName: %{public}s, userId: %{public}d, appIndex: %{public}d",
9720 bundleName.c_str(), userId, appIndex);
9721 }
9722 return ERR_OK;
9723 }
9724
QueryAbilityInfoByContinueType(const std::string & bundleName,const std::string & continueType,AbilityInfo & abilityInfo,int32_t userId,int32_t appIndex) const9725 ErrCode BundleDataMgr::QueryAbilityInfoByContinueType(const std::string &bundleName,
9726 const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const
9727 {
9728 int32_t requestUserId = GetUserId(userId);
9729 APP_LOGI("requestUserId: %{public}d", requestUserId);
9730 if (requestUserId == Constants::INVALID_USERID) {
9731 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9732 }
9733
9734 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9735 if (bundleInfos_.empty()) {
9736 APP_LOGW("bundleInfos_ data is empty");
9737 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9738 }
9739 InnerBundleInfo innerBundleInfo;
9740 if (appIndex == 0) {
9741 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, 0, innerBundleInfo, requestUserId);
9742 if (ret != ERR_OK) {
9743 APP_LOGD("QueryAbilityInfoByContinueType failed, bundleName:%{public}s", bundleName.c_str());
9744 return ret;
9745 }
9746 }
9747 if (appIndex > 0) {
9748 if (sandboxAppHelper_ == nullptr) {
9749 APP_LOGW("sandboxAppHelper_ is nullptr");
9750 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9751 }
9752 auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
9753 if (ret != ERR_OK) {
9754 APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
9755 ret, bundleName.c_str());
9756 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9757 }
9758 }
9759 auto ability = innerBundleInfo.FindAbilityInfo(continueType, requestUserId);
9760 if (!ability) {
9761 APP_LOGW("ability not found, bundleName:%{public}s, coutinueType:%{public}s",
9762 bundleName.c_str(), continueType.c_str());
9763 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9764 }
9765 abilityInfo = (*ability);
9766 InnerBundleUserInfo innerBundleUserInfo;
9767 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
9768 abilityInfo.uid = innerBundleUserInfo.uid;
9769 }
9770 return ERR_OK;
9771 }
9772
QueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9773 ErrCode BundleDataMgr::QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9774 int32_t appIndex, AbilityInfo &abilityInfo) const
9775 {
9776 std::string bundleName = element.GetBundleName();
9777 std::string abilityName = element.GetAbilityName();
9778 std::string moduleName = element.GetModuleName();
9779 LOG_D(BMS_TAG_QUERY,
9780 "QueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9781 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9782 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9783 int32_t requestUserId = GetUserId(userId);
9784 if (requestUserId == Constants::INVALID_USERID) {
9785 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9786 }
9787
9788 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9789 InnerBundleInfo innerBundleInfo;
9790
9791 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9792 if (ret != ERR_OK) {
9793 LOG_D(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9794 return ret;
9795 }
9796
9797 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9798 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9799 if (!ability) {
9800 LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9801 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9802 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9803 }
9804 return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9805 }
9806
ExplicitQueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9807 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9808 int32_t appIndex, AbilityInfo &abilityInfo) const
9809 {
9810 std::string bundleName = element.GetBundleName();
9811 std::string abilityName = element.GetAbilityName();
9812 std::string moduleName = element.GetModuleName();
9813 LOG_D(BMS_TAG_QUERY,
9814 "ExplicitQueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9815 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9816 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9817 int32_t requestUserId = GetUserId(userId);
9818 if (requestUserId == Constants::INVALID_USERID) {
9819 return false;
9820 }
9821 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9822 InnerBundleInfo innerBundleInfo;
9823
9824 bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9825 if (!ret) {
9826 LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9827 return false;
9828 }
9829
9830 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9831 auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
9832 if (!ability) {
9833 LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9834 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9835 return false;
9836 }
9837 return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9838 }
9839
ExplicitQueryCloneAbilityInfoV9(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9840 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId,
9841 int32_t appIndex, AbilityInfo &abilityInfo) const
9842 {
9843 std::string bundleName = element.GetBundleName();
9844 std::string abilityName = element.GetAbilityName();
9845 std::string moduleName = element.GetModuleName();
9846 LOG_D(BMS_TAG_QUERY,
9847 "ExplicitQueryCloneAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9848 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9849 LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9850 int32_t requestUserId = GetUserId(userId);
9851 if (requestUserId == Constants::INVALID_USERID) {
9852 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9853 }
9854 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9855 InnerBundleInfo innerBundleInfo;
9856
9857 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9858 if (ret != ERR_OK) {
9859 LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
9860 return ret;
9861 }
9862
9863 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9864 auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9865 if (!ability) {
9866 LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9867 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9868 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9869 }
9870 return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9871 }
9872
GetCloneBundleInfo(const std::string & bundleName,int32_t flags,int32_t appIndex,BundleInfo & bundleInfo,int32_t userId) const9873 ErrCode BundleDataMgr::GetCloneBundleInfo(
9874 const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const
9875 {
9876 std::vector<InnerBundleUserInfo> innerBundleUserInfos;
9877 if (userId == Constants::ANY_USERID) {
9878 if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
9879 LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
9880 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9881 }
9882 userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
9883 }
9884
9885 int32_t requestUserId = GetUserId(userId);
9886 if (requestUserId == Constants::INVALID_USERID) {
9887 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9888 }
9889 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9890 InnerBundleInfo innerBundleInfo;
9891
9892 auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9893 if (ret != ERR_OK) {
9894 LOG_D(BMS_TAG_QUERY, "GetCloneBundleInfo failed, error code: %{public}d, bundleName:%{public}s",
9895 ret, bundleName.c_str());
9896 return ret;
9897 }
9898
9899 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9900 innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
9901
9902 ProcessCertificate(bundleInfo, bundleName, flags);
9903 ProcessBundleMenu(bundleInfo, flags, true);
9904 ProcessBundleRouterMap(bundleInfo, flags);
9905 LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
9906 bundleName.c_str(), userId);
9907 return ERR_OK;
9908 }
9909
QueryAllCloneExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9910 void BundleDataMgr::QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId,
9911 std::vector<ExtensionAbilityInfo> &infos) const
9912 {
9913 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9914 int32_t requestUserId = GetUserId(userId);
9915 if (requestUserId == Constants::INVALID_USERID) {
9916 LOG_D(BMS_TAG_QUERY, "invalid user");
9917 return;
9918 }
9919
9920 ElementName element = want.GetElement();
9921 std::string bundleName = element.GetBundleName();
9922 std::string extensionName = element.GetAbilityName();
9923 LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9924 bundleName.c_str(), extensionName.c_str());
9925
9926 if (!bundleName.empty() && !extensionName.empty()) {
9927 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9928 if (cloneAppIndexes.empty()) {
9929 LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9930 return;
9931 }
9932 for (int32_t appIndex: cloneAppIndexes) {
9933 ExtensionAbilityInfo info;
9934 ErrCode ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
9935 if (ret != ERR_OK) {
9936 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9937 continue;
9938 }
9939 infos.emplace_back(info);
9940 }
9941 return;
9942 } else if (!bundleName.empty()) {
9943 ImplicitQueryCurCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9944 } else {
9945 ImplicitQueryAllCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9946 }
9947 }
9948
QueryAllCloneExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9949 void BundleDataMgr::QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
9950 std::vector<ExtensionAbilityInfo> &infos) const
9951 {
9952 LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9953 int32_t requestUserId = GetUserId(userId);
9954 if (requestUserId == Constants::INVALID_USERID) {
9955 LOG_D(BMS_TAG_QUERY, "invalid user");
9956 return;
9957 }
9958
9959 ElementName element = want.GetElement();
9960 std::string bundleName = element.GetBundleName();
9961 std::string extensionName = element.GetAbilityName();
9962 LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9963 bundleName.c_str(), extensionName.c_str());
9964
9965 if (!bundleName.empty() && !extensionName.empty()) {
9966 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9967 if (cloneAppIndexes.empty()) {
9968 LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9969 return;
9970 }
9971 for (int32_t appIndex: cloneAppIndexes) {
9972 ExtensionAbilityInfo info;
9973 ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
9974 if (ret != ERR_OK) {
9975 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9976 continue;
9977 }
9978 infos.emplace_back(info);
9979 }
9980 return;
9981 } else if (!bundleName.empty()) {
9982 ImplicitQueryCurCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9983 } else {
9984 ImplicitQueryAllCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9985 }
9986 }
9987
ImplicitQueryCurCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9988 bool BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9989 std::vector<ExtensionAbilityInfo> &abilityInfos) const
9990 {
9991 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfos");
9992 std::string bundleName = want.GetElement().GetBundleName();
9993
9994 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9995 InnerBundleInfo innerBundleInfo;
9996 bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId);
9997 if (!ret) {
9998 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfos failed");
9999 return false;
10000 }
10001 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
10002 if (cloneAppIndexes.empty()) {
10003 LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfos empty");
10004 return true;
10005 }
10006 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10007 for (int32_t appIndex: cloneAppIndexes) {
10008 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10009 LOG_D(BMS_TAG_QUERY,
10010 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10011 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10012 continue;
10013 }
10014 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
10015 }
10016 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfos");
10017 return true;
10018 }
10019
ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const10020 ErrCode BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
10021 std::vector<ExtensionAbilityInfo> &abilityInfos) const
10022 {
10023 LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfosV9");
10024 std::string bundleName = want.GetElement().GetBundleName();
10025
10026 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10027 InnerBundleInfo innerBundleInfo;
10028 ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
10029 if (ret != ERR_OK) {
10030 LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfosV9 failed");
10031 return ret;
10032 }
10033 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
10034 if (cloneAppIndexes.empty()) {
10035 LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfosV9 empty");
10036 return ERR_OK;
10037 }
10038 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10039 for (int32_t appIndex: cloneAppIndexes) {
10040 if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10041 LOG_D(BMS_TAG_QUERY,
10042 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10043 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10044 continue;
10045 }
10046 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
10047 }
10048 LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfosV9");
10049 return ERR_OK;
10050 }
10051
ImplicitQueryAllCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const10052 bool BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
10053 std::vector<ExtensionAbilityInfo> &infos) const
10054 {
10055 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10056 for (const auto &item : bundleInfos_) {
10057 const InnerBundleInfo &innerBundleInfo = item.second;
10058 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
10059 if (cloneAppIndexes.empty()) {
10060 continue;
10061 }
10062 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10063 for (int32_t appIndex: cloneAppIndexes) {
10064 if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10065 LOG_D(BMS_TAG_QUERY,
10066 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10067 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10068 continue;
10069 }
10070 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10071 GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
10072 }
10073 }
10074 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
10075 return true;
10076 }
10077
ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const10078 ErrCode BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
10079 std::vector<ExtensionAbilityInfo> &infos) const
10080 {
10081 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10082 for (const auto &item : bundleInfos_) {
10083 const InnerBundleInfo &innerBundleInfo = item.second;
10084 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
10085 if (cloneAppIndexes.empty()) {
10086 continue;
10087 }
10088 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10089 for (int32_t appIndex: cloneAppIndexes) {
10090 if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10091 LOG_D(BMS_TAG_QUERY,
10092 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10093 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10094 continue;
10095 }
10096 int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10097 GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
10098 }
10099 }
10100 FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
10101 return ERR_OK;
10102 }
10103
GetAppIdByBundleName(const std::string & bundleName,std::string & appId) const10104 ErrCode BundleDataMgr::GetAppIdByBundleName(
10105 const std::string &bundleName, std::string &appId) const
10106 {
10107 HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
10108 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10109 auto item = bundleInfos_.find(bundleName);
10110 if (item == bundleInfos_.end()) {
10111 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10112 }
10113
10114 appId = item->second.GetBaseBundleInfo().appId;
10115 return ERR_OK;
10116 }
10117
GetAppIdAndAppIdentifierByBundleName(const std::string & bundleName,std::string & appId,std::string & appIdentifier) const10118 ErrCode BundleDataMgr::GetAppIdAndAppIdentifierByBundleName(
10119 const std::string &bundleName, std::string &appId, std::string &appIdentifier) const
10120 {
10121 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10122 auto item = bundleInfos_.find(bundleName);
10123 if (item == bundleInfos_.end()) {
10124 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10125 }
10126
10127 appId = item->second.GetAppId();
10128 appIdentifier = item->second.GetAppIdentifier();
10129 return ERR_OK;
10130 }
10131
AppIdAndAppIdentifierTransform(const std::string appIdOrAppIdentifier) const10132 std::string BundleDataMgr::AppIdAndAppIdentifierTransform(const std::string appIdOrAppIdentifier) const
10133 {
10134 if (appIdOrAppIdentifier.empty()) {
10135 APP_LOGW("appIdOrAppIdentifier is empty");
10136 return Constants::EMPTY_STRING;
10137 }
10138 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10139 auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appIdOrAppIdentifier](const auto &pair) {
10140 return (appIdOrAppIdentifier == pair.second.GetAppId() ||
10141 appIdOrAppIdentifier == pair.second.GetAppIdentifier());
10142 });
10143 if (it == bundleInfos_.cend()) {
10144 APP_LOGW("can't find appIdOrAppIdentifier in the installed bundle");
10145 return Constants::EMPTY_STRING;
10146 }
10147 if (appIdOrAppIdentifier == it->second.GetAppId()) {
10148 return it->second.GetAppIdentifier();
10149 }
10150 return it->second.GetAppId();
10151 }
10152
GetSignatureInfoByBundleName(const std::string & bundleName,SignatureInfo & signatureInfo) const10153 ErrCode BundleDataMgr::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const
10154 {
10155 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10156 auto item = bundleInfos_.find(bundleName);
10157 if (item == bundleInfos_.end()) {
10158 LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
10159 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10160 }
10161 const InnerBundleInfo &innerBundleInfo = item->second;
10162 signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
10163 signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
10164 signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
10165 return ERR_OK;
10166 }
10167
GetSignatureInfoByUid(const int32_t uid,SignatureInfo & signatureInfo) const10168 ErrCode BundleDataMgr::GetSignatureInfoByUid(const int32_t uid, SignatureInfo &signatureInfo) const
10169 {
10170 InnerBundleInfo innerBundleInfo;
10171 ErrCode errCode = GetInnerBundleInfoWithSandboxByUid(uid, innerBundleInfo);
10172 if (errCode != ERR_OK) {
10173 APP_LOGE("Get innerBundleInfo failed, uid:%{public}d", uid);
10174 return errCode;
10175 }
10176 signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
10177 signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
10178 signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
10179 AppProvisionInfo appProvisionInfo;
10180 if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->
10181 GetAppProvisionInfo(innerBundleInfo.GetBundleName(), appProvisionInfo)) {
10182 APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", innerBundleInfo.GetBundleName().c_str());
10183 } else {
10184 signatureInfo.certificate = appProvisionInfo.certificate;
10185 }
10186 return ERR_OK;
10187 }
10188
UpdateAppEncryptedStatus(const std::string & bundleName,bool isExisted,int32_t appIndex,bool needSaveStorage)10189 ErrCode BundleDataMgr::UpdateAppEncryptedStatus(
10190 const std::string &bundleName, bool isExisted, int32_t appIndex, bool needSaveStorage)
10191 {
10192 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10193 auto item = bundleInfos_.find(bundleName);
10194 if (item == bundleInfos_.end()) {
10195 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10196 }
10197 auto res = item->second.UpdateAppEncryptedStatus(bundleName, isExisted, appIndex);
10198 if (res != ERR_OK) {
10199 LOG_E(BMS_TAG_DEFAULT, "UpdateAppEncryptedStatus failed %{public}s %{public}d", bundleName.c_str(), res);
10200 return res;
10201 }
10202 if (dataStorage_ == nullptr) {
10203 LOG_E(BMS_TAG_DEFAULT, "dataStorage_ nullptr");
10204 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
10205 }
10206 if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(item->second)) {
10207 APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", bundleName.c_str());
10208 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
10209 }
10210 return ERR_OK;
10211 }
10212
AddDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)10213 ErrCode BundleDataMgr::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
10214 {
10215 int32_t requestUserId = GetUserId(userId);
10216 if (requestUserId == Constants::INVALID_USERID) {
10217 APP_LOGW("Input invalid userid, userId:%{public}d", userId);
10218 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10219 }
10220 bool isEnabled = false;
10221 ErrCode ret = IsApplicationEnabled(shortcutInfo.bundleName, shortcutInfo.appIndex, isEnabled, userId);
10222 if (ret != ERR_OK) {
10223 APP_LOGD("IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
10224 ret, shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
10225 return ret;
10226 }
10227 if (!isEnabled) {
10228 APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
10229 shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
10230 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
10231 }
10232 bool isIdIllegal = false;
10233 if (!shortcutStorage_->AddDesktopShortcutInfo(shortcutInfo, userId, isIdIllegal)) {
10234 if (isIdIllegal) {
10235 return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
10236 }
10237 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10238 }
10239 return ERR_OK;
10240 }
10241
DeleteDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)10242 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
10243 {
10244 int32_t requestUserId = GetUserId(userId);
10245 if (requestUserId == Constants::INVALID_USERID) {
10246 APP_LOGW("Input invalid userid, userId:%{public}d", userId);
10247 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10248 }
10249 if (!shortcutStorage_->DeleteDesktopShortcutInfo(shortcutInfo, userId)) {
10250 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10251 }
10252 return ERR_OK;
10253 }
10254
GetAllDesktopShortcutInfo(int32_t userId,std::vector<ShortcutInfo> & shortcutInfos)10255 ErrCode BundleDataMgr::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
10256 {
10257 int32_t requestUserId = GetUserId(userId);
10258 if (requestUserId == Constants::INVALID_USERID) {
10259 APP_LOGW("Input invalid userid, userId:%{public}d", userId);
10260 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10261 }
10262 std::vector<ShortcutInfo> datas;
10263 shortcutStorage_->GetAllDesktopShortcutInfo(userId, datas);
10264 for (const auto &data : datas) {
10265 bool isEnabled = false;
10266 ErrCode ret = IsApplicationEnabled(data.bundleName, data.appIndex, isEnabled, userId);
10267 if (ret != ERR_OK) {
10268 APP_LOGD(
10269 "IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
10270 ret, data.bundleName.c_str(), data.appIndex, userId);
10271 continue;
10272 }
10273 if (!isEnabled) {
10274 APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
10275 data.bundleName.c_str(), data.appIndex, userId);
10276 continue;
10277 }
10278 shortcutInfos.emplace_back(data);
10279 }
10280 return ERR_OK;
10281 }
10282
DeleteDesktopShortcutInfo(const std::string & bundleName)10283 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName)
10284 {
10285 APP_LOGD("DeleteDesktopShortcutInfo by uninstall, bundleName:%{public}s", bundleName.c_str());
10286 if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName)) {
10287 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10288 }
10289 return ERR_OK;
10290 }
10291
DeleteDesktopShortcutInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)10292 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
10293 {
10294 APP_LOGD(
10295 "DeleteDesktopShortcutInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
10296 bundleName.c_str(), userId, appIndex);
10297 if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName, userId, appIndex)) {
10298 return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10299 }
10300 return ERR_OK;
10301 }
10302
GetBundleInfosForContinuation(std::vector<BundleInfo> & bundleInfos) const10303 void BundleDataMgr::GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const
10304 {
10305 if (bundleInfos.empty()) {
10306 APP_LOGD("bundleInfos is empty");
10307 return;
10308 }
10309 bundleInfos.erase(std::remove_if(bundleInfos.begin(), bundleInfos.end(), [](BundleInfo bundleInfo) {
10310 for (auto abilityInfo : bundleInfo.abilityInfos) {
10311 if (abilityInfo.continuable) {
10312 return false;
10313 }
10314 }
10315 return true;
10316 }), bundleInfos.end());
10317 }
10318
GetContinueBundleNames(const std::string & continueBundleName,std::vector<std::string> & bundleNames,int32_t userId)10319 ErrCode BundleDataMgr::GetContinueBundleNames(
10320 const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
10321 {
10322 auto requestUserId = GetUserId(userId);
10323 if (requestUserId == Constants::INVALID_USERID) {
10324 APP_LOGE("Input invalid userid, userId:%{public}d", userId);
10325 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10326 }
10327 if (continueBundleName.empty()) {
10328 return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
10329 }
10330
10331 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10332 for (const auto &[key, innerInfo] : bundleInfos_) {
10333 if (CheckInnerBundleInfoWithFlags(
10334 innerInfo, BundleFlag::GET_BUNDLE_WITH_ABILITIES, innerInfo.GetResponseUserId(requestUserId)) != ERR_OK) {
10335 continue;
10336 }
10337 for (const auto &[key, abilityInfo] : innerInfo.GetInnerAbilityInfos()) {
10338 if (abilityInfo.continueBundleNames.find(continueBundleName) != abilityInfo.continueBundleNames.end()) {
10339 bundleNames.emplace_back(abilityInfo.bundleName);
10340 break;
10341 }
10342 }
10343 }
10344
10345 APP_LOGD("The number of found continue packs, size:[%{public}d]", static_cast<int32_t>(bundleNames.size()));
10346 return ERR_OK;
10347 }
10348
IsBundleInstalled(const std::string & bundleName,int32_t userId,int32_t appIndex,bool & isInstalled)10349 ErrCode BundleDataMgr::IsBundleInstalled(const std::string &bundleName, int32_t userId,
10350 int32_t appIndex, bool &isInstalled)
10351 {
10352 int32_t requestUserId = GetUserId(userId);
10353 if (requestUserId == Constants::INVALID_USERID) {
10354 APP_LOGE("name %{public}s invalid userid :%{public}d", bundleName.c_str(), userId);
10355 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10356 }
10357 if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
10358 APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
10359 return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX;
10360 }
10361 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10362 auto item = bundleInfos_.find(bundleName);
10363 if (item == bundleInfos_.end()) {
10364 isInstalled = false;
10365 return ERR_OK;
10366 }
10367 if (item->second.GetInstallMark().status == InstallExceptionStatus::INSTALL_START) {
10368 APP_LOGW("name %{public}s is installing", bundleName.c_str());
10369 isInstalled = false;
10370 return ERR_OK;
10371 }
10372 if ((item->second.GetApplicationBundleType() == BundleType::SHARED) ||
10373 ((item->second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) &&
10374 item->second.GetInnerBundleUserInfos().empty())) {
10375 isInstalled = true;
10376 return ERR_OK;
10377 }
10378 int32_t responseUserId = item->second.GetResponseUserId(requestUserId);
10379 if (responseUserId == Constants::INVALID_USERID) {
10380 isInstalled = false;
10381 return ERR_OK;
10382 }
10383 if (appIndex == 0) {
10384 isInstalled = true;
10385 return ERR_OK;
10386 }
10387 InnerBundleUserInfo innerBundleUserInfo;
10388 if (item->second.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
10389 if (innerBundleUserInfo.cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) !=
10390 innerBundleUserInfo.cloneInfos.end()) {
10391 isInstalled = true;
10392 return ERR_OK;
10393 }
10394 }
10395 isInstalled = false;
10396 return ERR_OK;
10397 }
10398
UpdateIsPreInstallApp(const std::string & bundleName,bool isPreInstallApp)10399 void BundleDataMgr::UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)
10400 {
10401 APP_LOGD("UpdateIsPreInstallApp %{public}s", bundleName.c_str());
10402 if (bundleName.empty()) {
10403 APP_LOGW("bundleName is empty");
10404 return;
10405 }
10406
10407 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10408 auto infoItem = bundleInfos_.find(bundleName);
10409 if (infoItem == bundleInfos_.end()) {
10410 APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
10411 return;
10412 }
10413
10414 if (infoItem->second.IsPreInstallApp() != isPreInstallApp) {
10415 infoItem->second.SetIsPreInstallApp(isPreInstallApp);
10416 SaveInnerBundleInfo(infoItem->second);
10417 }
10418 }
10419
GetBundleNameByAppId(const std::string & appId,std::string & bundleName)10420 ErrCode BundleDataMgr::GetBundleNameByAppId(const std::string &appId, std::string &bundleName)
10421 {
10422 APP_LOGD("start GetBundleNameByAppId %{private}s", appId.c_str());
10423 if (appId.empty()) {
10424 APP_LOGW("appId is empty");
10425 return ERR_APPEXECFWK_INSTALL_PARAM_ERROR;
10426 }
10427 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10428 for (const auto &[key, innerInfo] : bundleInfos_) {
10429 if (innerInfo.GetAppId() == appId || innerInfo.GetAppIdentifier() == appId) {
10430 bundleName = key;
10431 return ERR_OK;
10432 }
10433 }
10434 APP_LOGI("get bundleName failed %{private}s", appId.c_str());
10435 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10436 }
10437
GetDirForAtomicService(const std::string & bundleName,std::string & dataDir) const10438 ErrCode BundleDataMgr::GetDirForAtomicService(const std::string &bundleName, std::string &dataDir) const
10439 {
10440 APP_LOGD("start GetDirForAtomicService name: %{public}s", bundleName.c_str());
10441 AccountSA::OhosAccountInfo accountInfo;
10442 auto ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfo(accountInfo);
10443 if (ret != ERR_OK) {
10444 APP_LOGE("GetOhosAccountInfo failed, errCode: %{public}d", ret);
10445 return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
10446 }
10447 dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
10448 return ERR_OK;
10449 }
10450
GetDirForAtomicServiceByUserId(const std::string & bundleName,int32_t userId,AccountSA::OhosAccountInfo & accountInfo,std::string & dataDir) const10451 ErrCode BundleDataMgr::GetDirForAtomicServiceByUserId(const std::string &bundleName, int32_t userId,
10452 AccountSA::OhosAccountInfo &accountInfo, std::string &dataDir) const
10453 {
10454 APP_LOGD("start GetDirForAtomicServiceByUserId name: %{public}s userId: %{public}d", bundleName.c_str(), userId);
10455 if (accountInfo.uid_.empty()) {
10456 auto ret = AccountSA::OhosAccountKits::GetInstance().GetOsAccountDistributedInfo(userId, accountInfo);
10457 if (ret != ERR_OK) {
10458 APP_LOGE("GetOsAccountDistributedInfo failed, errCode: %{public}d", ret);
10459 return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
10460 }
10461 }
10462 dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
10463 return ERR_OK;
10464 }
10465
GetDirForApp(const std::string & bundleName,const int32_t appIndex) const10466 std::string BundleDataMgr::GetDirForApp(const std::string &bundleName, const int32_t appIndex) const
10467 {
10468 APP_LOGD("start GetDirForApp name: %{public}s appIndex: %{public}d", bundleName.c_str(), appIndex);
10469 if (appIndex == 0) {
10470 return bundleName;
10471 } else {
10472 return CLONE_APP_DIR_PREFIX + std::to_string(appIndex) + PLUS + bundleName;
10473 }
10474 }
10475
GetDirByBundleNameAndAppIndex(const std::string & bundleName,const int32_t appIndex,std::string & dataDir)10476 ErrCode BundleDataMgr::GetDirByBundleNameAndAppIndex(const std::string &bundleName, const int32_t appIndex,
10477 std::string &dataDir)
10478 {
10479 APP_LOGD("start GetDir bundleName : %{public}s appIndex : %{public}d", bundleName.c_str(), appIndex);
10480 if (appIndex < 0 || appIndex > ServiceConstants::CLONE_APP_INDEX_MAX) {
10481 return ERR_BUNDLE_MANAGER_GET_DIR_INVALID_APP_INDEX;
10482 }
10483 if (!BundlePermissionMgr::IsNativeTokenType()) {
10484 int32_t callingUid = IPCSkeleton::GetCallingUid();
10485 int32_t userId = callingUid / Constants::BASE_USER_RANGE;
10486 bool isBundleInstalled = false;
10487 auto ret = IsBundleInstalled(bundleName, userId, appIndex, isBundleInstalled);
10488 if (ret != ERR_OK) {
10489 APP_LOGE("IsBundleInstalled failed, ret:%{public}d", ret);
10490 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10491 }
10492 if (!isBundleInstalled) {
10493 APP_LOGE("bundle %{public}s is not installed", bundleName.c_str());
10494 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10495 }
10496 }
10497 BundleType type = BundleType::APP;
10498 GetBundleType(bundleName, type);
10499 if (type == BundleType::ATOMIC_SERVICE) {
10500 return GetDirForAtomicService(bundleName, dataDir);
10501 }
10502 dataDir = GetDirForApp(bundleName, appIndex);
10503 return ERR_OK;
10504 }
10505
GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,int32_t userId) const10506 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo &innerBundleInfo,
10507 int32_t userId) const
10508 {
10509 std::vector<int32_t> cloneAppIndexes;
10510 InnerBundleUserInfo innerBundleUserInfo;
10511 if (!innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10512 return cloneAppIndexes;
10513 }
10514 const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
10515 if (cloneInfos.empty()) {
10516 return cloneAppIndexes;
10517 }
10518 for (const auto &cloneInfo : cloneInfos) {
10519 LOG_D(BMS_TAG_QUERY, "get cloneAppIndexes by inner bundle info: %{public}d", cloneInfo.second.appIndex);
10520 cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
10521 }
10522 return cloneAppIndexes;
10523 }
10524
GetBundleDir(int32_t userId,BundleType type,AccountSA::OhosAccountInfo & accountInfo,BundleDir & bundleDir) const10525 ErrCode BundleDataMgr::GetBundleDir(int32_t userId, BundleType type, AccountSA::OhosAccountInfo &accountInfo,
10526 BundleDir &bundleDir) const
10527 {
10528 APP_LOGD("start GetBundleDir");
10529 if (type == BundleType::ATOMIC_SERVICE) {
10530 std::string dataDir;
10531 auto ret = GetDirForAtomicServiceByUserId(bundleDir.bundleName, userId, accountInfo, dataDir);
10532 if (ret != ERR_OK) {
10533 return ret;
10534 }
10535 bundleDir.dir = dataDir;
10536 } else {
10537 bundleDir.dir = GetDirForApp(bundleDir.bundleName, bundleDir.appIndex);
10538 }
10539 return ERR_OK;
10540 }
10541
GetAllBundleDirs(int32_t userId,std::vector<BundleDir> & bundleDirs) const10542 ErrCode BundleDataMgr::GetAllBundleDirs(int32_t userId, std::vector<BundleDir> &bundleDirs) const
10543 {
10544 APP_LOGD("start GetAllBundleDirs");
10545 int32_t requestUserId = GetUserId(userId);
10546 if (requestUserId == Constants::INVALID_USERID) {
10547 APP_LOGE("invalid userid :%{public}d", userId);
10548 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10549 }
10550 AccountSA::OhosAccountInfo accountInfo;
10551 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10552 for (const auto &item : bundleInfos_) {
10553 const InnerBundleInfo &info = item.second;
10554 std::string bundleName = info.GetBundleName();
10555 int32_t responseUserId = info.GetResponseUserId(requestUserId);
10556 if (responseUserId == Constants::INVALID_USERID) {
10557 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
10558 continue;
10559 }
10560 BundleType type = info.GetApplicationBundleType();
10561 if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
10562 continue;
10563 }
10564
10565 std::vector<int32_t> allAppIndexes = {0};
10566 if (type == BundleType::APP) {
10567 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
10568 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
10569 }
10570 for (int32_t appIndex: allAppIndexes) {
10571 BundleDir bundleDir;
10572 bundleDir.bundleName = bundleName;
10573 bundleDir.appIndex = appIndex;
10574 auto ret = GetBundleDir(responseUserId, type, accountInfo, bundleDir);
10575 if (ret != ERR_OK) {
10576 return ret;
10577 }
10578 bundleDirs.emplace_back(bundleDir);
10579 }
10580 }
10581 return ERR_OK;
10582 }
10583
RestoreUidAndGidFromUninstallInfo()10584 void BundleDataMgr::RestoreUidAndGidFromUninstallInfo()
10585 {
10586 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
10587 std::map<std::string, UninstallBundleInfo> uninstallBundleInfos;
10588 if (!GetAllUninstallBundleInfo(uninstallBundleInfos)) {
10589 return;
10590 }
10591 std::map<int32_t, std::string> uninstallBundleIdMap;
10592 for (const auto &info : uninstallBundleInfos) {
10593 if (info.second.userInfos.empty()) {
10594 continue;
10595 }
10596 int32_t userId = -1;
10597 if (!OHOS::StrToInt(info.second.userInfos.begin()->first, userId)) {
10598 APP_LOGW("strToInt fail");
10599 continue;
10600 }
10601 int32_t bundleId = info.second.userInfos.begin()->second.uid
10602 - userId * Constants::BASE_USER_RANGE;
10603 if (bundleId < Constants::BASE_APP_UID || bundleId >= MAX_APP_UID) {
10604 APP_LOGW("invalid bundleId");
10605 continue;
10606 }
10607 auto item = bundleIdMap_.find(bundleId);
10608 if (item == bundleIdMap_.end()) {
10609 uninstallBundleIdMap.emplace(bundleId, info.first);
10610 BundleUtil::MakeFsConfig(info.first, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
10611 BundleUtil::MakeFsConfig(info.first, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
10612 BundleUtil::MakeFsConfig(info.first, ServiceConstants::HMDFS_CONFIG_PATH,
10613 info.second.appProvisionType, Constants::APP_PROVISION_TYPE_FILE_NAME);
10614 }
10615 }
10616 for (const auto &item : uninstallBundleIdMap) {
10617 bundleIdMap_.emplace(item.first, item.second);
10618 }
10619 }
10620
GetAssetAccessGroups(const std::string & bundleName,std::vector<std::string> & assetAccessGroups) const10621 ErrCode BundleDataMgr::GetAssetAccessGroups(const std::string &bundleName,
10622 std::vector<std::string> &assetAccessGroups) const
10623 {
10624 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10625 auto item = bundleInfos_.find(bundleName);
10626 if (item == bundleInfos_.end()) {
10627 APP_LOGE("%{public}s not exist", bundleName.c_str());
10628 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10629 }
10630 assetAccessGroups = item->second.GetAssetAccessGroups();
10631 return ERR_OK;
10632 }
10633
GetDeveloperId(const std::string & bundleName,std::string & developerId) const10634 ErrCode BundleDataMgr::GetDeveloperId(const std::string &bundleName, std::string &developerId) const
10635 {
10636 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10637 auto item = bundleInfos_.find(bundleName);
10638 if (item == bundleInfos_.end()) {
10639 APP_LOGE("%{public}s not exist", bundleName.c_str());
10640 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10641 }
10642 developerId = item->second.GetDeveloperId();
10643 return ERR_OK;
10644 }
10645
IsObtainAbilityInfo(const Want & want,int32_t userId,AbilityInfo & abilityInfo)10646 bool BundleDataMgr::IsObtainAbilityInfo(const Want &want, int32_t userId, AbilityInfo &abilityInfo)
10647 {
10648 APP_LOGI("IsObtainAbilityInfo");
10649 std::string bundleName = want.GetElement().GetBundleName();
10650 std::string abilityName = want.GetElement().GetAbilityName();
10651 std::string moduleName = want.GetElement().GetModuleName();
10652 if (bundleName.empty()) {
10653 APP_LOGE("bundle name empty");
10654 return false;
10655 }
10656 {
10657 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10658 const auto infoItem = bundleInfos_.find(bundleName);
10659 if (infoItem == bundleInfos_.end()) {
10660 APP_LOGE("%{public}s not found", bundleName.c_str());
10661 return false;
10662 }
10663 if (abilityName.empty()) {
10664 return true;
10665 }
10666 }
10667 int32_t flags = static_cast<int32_t>(GET_ABILITY_INFO_DEFAULT);
10668 return ExplicitQueryAbilityInfo(want, flags, userId, abilityInfo);
10669 }
10670
GetAllPluginInfo(const std::string & hostBundleName,int32_t userId,std::vector<PluginBundleInfo> & pluginBundleInfos) const10671 ErrCode BundleDataMgr::GetAllPluginInfo(const std::string &hostBundleName, int32_t userId,
10672 std::vector<PluginBundleInfo> &pluginBundleInfos) const
10673 {
10674 APP_LOGD("start GetAllPluginInfo -n : %{public}s, -u : %{public}d", hostBundleName.c_str(), userId);
10675 int32_t requestUserId = GetUserId(userId);
10676 if (requestUserId == Constants::INVALID_USERID) {
10677 APP_LOGE("invalid userid :%{public}d", userId);
10678 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10679 }
10680 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10681 auto item = bundleInfos_.find(hostBundleName);
10682 if (item == bundleInfos_.end()) {
10683 APP_LOGE("hostBundleName: %{public}s does not exist", hostBundleName.c_str());
10684 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10685 }
10686 const InnerBundleInfo &innerBundleInfo = item->second;
10687 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
10688 if (responseUserId == Constants::INVALID_USERID) {
10689 APP_LOGE("-n : %{public}s is not installed in user %{public}d or 0", hostBundleName.c_str(), userId);
10690 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10691 }
10692 std::unordered_map<std::string, PluginBundleInfo> pluginInfoMap = innerBundleInfo.GetAllPluginBundleInfo();
10693 InnerBundleUserInfo innerBundleUserInfo;
10694 if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10695 for (const auto &pluginName : innerBundleUserInfo.installedPluginSet) {
10696 if (pluginInfoMap.find(pluginName) != pluginInfoMap.end()) {
10697 APP_LOGD("pluginName: %{public}s", pluginName.c_str());
10698 pluginBundleInfos.emplace_back(pluginInfoMap[pluginName]);
10699 }
10700 }
10701 }
10702 return ERR_OK;
10703 }
10704
AddPluginInfo(const std::string & bundleName,const PluginBundleInfo & pluginBundleInfo,const int32_t userId)10705 ErrCode BundleDataMgr::AddPluginInfo(const std::string &bundleName,
10706 const PluginBundleInfo &pluginBundleInfo, const int32_t userId)
10707 {
10708 APP_LOGD("start AddPluginInfo");
10709 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10710 auto item = bundleInfos_.find(bundleName);
10711 if (item == bundleInfos_.end()) {
10712 APP_LOGE("%{public}s not exist", bundleName.c_str());
10713 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10714 }
10715 InnerBundleInfo newInfo = item->second;
10716 if (!newInfo.AddPluginBundleInfo(pluginBundleInfo, userId)) {
10717 APP_LOGE("%{public}s add plugin info failed", bundleName.c_str());
10718 return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10719 }
10720 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10721 APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10722 return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10723 }
10724 bundleInfos_.at(bundleName) = newInfo;
10725 return ERR_OK;
10726 }
10727
RemovePluginInfo(const std::string & bundleName,const std::string & pluginBundleName,const int32_t userId)10728 ErrCode BundleDataMgr::RemovePluginInfo(const std::string &bundleName,
10729 const std::string &pluginBundleName, const int32_t userId)
10730 {
10731 APP_LOGD("start RemovePluginInfo");
10732 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10733 auto item = bundleInfos_.find(bundleName);
10734 if (item == bundleInfos_.end()) {
10735 APP_LOGE("%{public}s not exist", bundleName.c_str());
10736 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10737 }
10738 InnerBundleInfo newInfo = item->second;
10739 if (!newInfo.RemovePluginBundleInfo(pluginBundleName, userId)) {
10740 APP_LOGE("%{public}s remove plugin info failed", bundleName.c_str());
10741 return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10742 }
10743 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10744 APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10745 return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10746 }
10747 bundleInfos_.at(bundleName) = newInfo;
10748 return ERR_OK;
10749 }
10750
GetPluginBundleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const int32_t userId,PluginBundleInfo & pluginBundleInfo)10751 bool BundleDataMgr::GetPluginBundleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10752 const int32_t userId, PluginBundleInfo &pluginBundleInfo)
10753 {
10754 APP_LOGD("bundleName:%{public}s start GetPluginBundleInfo", hostBundleName.c_str());
10755 if (hostBundleName.empty() || pluginBundleName.empty()) {
10756 APP_LOGW("bundleName is empty");
10757 return false;
10758 }
10759
10760 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10761 auto infoItem = bundleInfos_.find(hostBundleName);
10762 if (infoItem == bundleInfos_.end()) {
10763 APP_LOGW_NOFUNC("%{public}s GetPluginBundleInfo not found %{public}s", hostBundleName.c_str(),
10764 pluginBundleName.c_str());
10765 return false;
10766 }
10767 std::unordered_map<std::string, PluginBundleInfo> pluginBundleInfos;
10768 if (!infoItem->second.GetPluginBundleInfos(userId, pluginBundleInfos)) {
10769 APP_LOGE("bundleName:%{public}s can not find userId %{public}d", hostBundleName.c_str(), userId);
10770 return false;
10771 }
10772 auto it = pluginBundleInfos.find(pluginBundleName);
10773 if (it == pluginBundleInfos.end()) {
10774 APP_LOGE("bundleName:%{public}s can not find plugin info for %{public}s in user(%{public}d)",
10775 hostBundleName.c_str(), pluginBundleName.c_str(), userId);
10776 return false;
10777 }
10778 pluginBundleInfo = it->second;
10779 return true;
10780 }
10781
FetchPluginBundleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,PluginBundleInfo & pluginBundleInfo)10782 bool BundleDataMgr::FetchPluginBundleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10783 PluginBundleInfo &pluginBundleInfo)
10784 {
10785 APP_LOGD("bundleName:%{public}s start FetchPluginBundleInfo, plugin:%{public}s",
10786 hostBundleName.c_str(), pluginBundleName.c_str());
10787 if (hostBundleName.empty() || pluginBundleName.empty()) {
10788 APP_LOGW("bundleName is empty");
10789 return false;
10790 }
10791
10792 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10793 auto infoItem = bundleInfos_.find(hostBundleName);
10794 if (infoItem == bundleInfos_.end()) {
10795 APP_LOGW_NOFUNC("%{public}s FetchPluginBundleInfo not found %{public}s", hostBundleName.c_str(),
10796 pluginBundleName.c_str());
10797 return false;
10798 }
10799 std::unordered_map<std::string, PluginBundleInfo> pluginInfoMap = infoItem->second.GetAllPluginBundleInfo();
10800 auto iter = pluginInfoMap.find(pluginBundleName);
10801 if (iter != pluginInfoMap.end()) {
10802 pluginBundleInfo = iter->second;
10803 return true;
10804 }
10805 APP_LOGE("bundleName:%{public}s can not find plugin info, plugin:%{public}s",
10806 hostBundleName.c_str(), pluginBundleName.c_str());
10807 return false;
10808 }
10809
UpdatePluginBundleInfo(const std::string & hostBundleName,const PluginBundleInfo & pluginBundleInfo)10810 ErrCode BundleDataMgr::UpdatePluginBundleInfo(const std::string &hostBundleName,
10811 const PluginBundleInfo &pluginBundleInfo)
10812 {
10813 APP_LOGD("hostBundleName:%{public}s start UpdatePluginBundleInfo, plugin:%{public}s",
10814 hostBundleName.c_str(), pluginBundleInfo.pluginBundleName.c_str());
10815 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10816 auto item = bundleInfos_.find(hostBundleName);
10817 if (item == bundleInfos_.end()) {
10818 APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10819 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10820 }
10821 InnerBundleInfo newInfo = item->second;
10822 if (!newInfo.UpdatePluginBundleInfo(pluginBundleInfo)) {
10823 APP_LOGE("%{public}s update plugin info failed", hostBundleName.c_str());
10824 return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10825 }
10826 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10827 APP_LOGE("save InnerBundleInfo:%{public}s failed, plugin:%{public}s",
10828 hostBundleName.c_str(), pluginBundleInfo.pluginBundleName.c_str());
10829 return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10830 }
10831 bundleInfos_.at(hostBundleName) = newInfo;
10832 return ERR_OK;
10833 }
10834
RemovePluginFromUserInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const int32_t userId)10835 ErrCode BundleDataMgr::RemovePluginFromUserInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10836 const int32_t userId)
10837 {
10838 APP_LOGD("hostBundleName:%{public}s start RemovePluginFromUserInfo, plugin:%{public}s",
10839 hostBundleName.c_str(), pluginBundleName.c_str());
10840 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10841 auto item = bundleInfos_.find(hostBundleName);
10842 if (item == bundleInfos_.end()) {
10843 APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10844 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10845 }
10846 InnerBundleInfo newInfo = item->second;
10847 if (!newInfo.RemovePluginFromUserInfo(pluginBundleName, userId)) {
10848 APP_LOGE("%{public}s reomve plugin info failed", hostBundleName.c_str());
10849 return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10850 }
10851 if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10852 APP_LOGE("save InnerBundleInfo:%{public}s failed, plugin:%{public}s",
10853 hostBundleName.c_str(), pluginBundleName.c_str());
10854 return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10855 }
10856 bundleInfos_.at(hostBundleName) = newInfo;
10857 return ERR_OK;
10858 }
10859
GetPluginAbilityInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const std::string & pluginModuleName,const std::string & pluginAbilityName,const int32_t userId,AbilityInfo & abilityInfo)10860 ErrCode BundleDataMgr::GetPluginAbilityInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10861 const std::string &pluginModuleName, const std::string &pluginAbilityName, const int32_t userId, AbilityInfo &abilityInfo)
10862 {
10863 APP_LOGD("bundleName:%{public}s start GetPluginAbilityInfo, plugin:%{public}s, abilityName:%{public}s",
10864 hostBundleName.c_str(), pluginBundleName.c_str(), pluginAbilityName.c_str());
10865 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10866 auto item = bundleInfos_.find(hostBundleName);
10867 if (item == bundleInfos_.end()) {
10868 APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10869 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10870 }
10871 std::unordered_map<std::string, PluginBundleInfo> pluginInfos;
10872 if (!item->second.GetPluginBundleInfos(userId, pluginInfos)) {
10873 APP_LOGE("bundleName:%{public}s GetPluginBundleInfos failed, plugin:%{public}s, user: %{public}d",
10874 hostBundleName.c_str(), pluginBundleName.c_str(), userId);
10875 return ERR_APPEXECFWK_GET_PLUGIN_INFO_ERROR;
10876 }
10877 auto it = pluginInfos.find(pluginBundleName);
10878 if (it == pluginInfos.end()) {
10879 APP_LOGE("bundleName: %{public}s can not find plugin: %{public}s",
10880 hostBundleName.c_str(), pluginBundleName.c_str());
10881 return ERR_APPEXECFWK_PLUGIN_NOT_FOUND;
10882 }
10883 if (!it->second.GetAbilityInfoByName(pluginAbilityName, pluginModuleName, abilityInfo)) {
10884 APP_LOGE("plugin: %{public}s can not find ability: %{public}s module: %{public}s",
10885 pluginBundleName.c_str(), pluginAbilityName.c_str(), pluginModuleName.c_str());
10886 return ERR_APPEXECFWK_PLUGIN_ABILITY_NOT_FOUND;
10887 }
10888 return ERR_OK;
10889 }
10890
GetPluginHapModuleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const std::string & pluginModuleName,const int32_t userId,HapModuleInfo & hapModuleInfo)10891 ErrCode BundleDataMgr::GetPluginHapModuleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10892 const std::string &pluginModuleName, const int32_t userId, HapModuleInfo &hapModuleInfo)
10893 {
10894 APP_LOGD("bundleName:%{public}s start GetPluginHapModuleInfo, plugin:%{public}s, moduleName:%{public}s",
10895 hostBundleName.c_str(), pluginBundleName.c_str(), pluginModuleName.c_str());
10896 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10897 int32_t requestUserId = GetUserId(userId);
10898 if (requestUserId == Constants::INVALID_USERID) {
10899 APP_LOGE("invalid userid :%{public}d", userId);
10900 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10901 }
10902 auto item = bundleInfos_.find(hostBundleName);
10903 if (item == bundleInfos_.end()) {
10904 APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10905 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10906 }
10907 std::unordered_map<std::string, PluginBundleInfo> pluginInfos;
10908 if (!item->second.GetPluginBundleInfos(requestUserId, pluginInfos)) {
10909 APP_LOGE("bundleName:%{public}s GetPluginBundleInfos failed, plugin:%{public}s, user: %{public}d",
10910 hostBundleName.c_str(), pluginBundleName.c_str(), requestUserId);
10911 return ERR_APPEXECFWK_GET_PLUGIN_INFO_ERROR;
10912 }
10913 auto it = pluginInfos.find(pluginBundleName);
10914 if (it == pluginInfos.end()) {
10915 APP_LOGE("bundleName: %{public}s can not find plugin: %{public}s",
10916 hostBundleName.c_str(), pluginBundleName.c_str());
10917 return ERR_APPEXECFWK_PLUGIN_NOT_FOUND;
10918 }
10919 if (!it->second.GetHapModuleInfo(pluginModuleName, hapModuleInfo)) {
10920 APP_LOGE("plugin: %{public}s can not find module: %{public}s",
10921 pluginBundleName.c_str(), pluginModuleName.c_str());
10922 return ERR_APPEXECFWK_PLUGIN_MODULE_NOT_FOUND;
10923 }
10924 return ERR_OK;
10925 }
10926
RegisterPluginEventCallback(const sptr<IBundleEventCallback> & pluginEventCallback)10927 ErrCode BundleDataMgr::RegisterPluginEventCallback(const sptr<IBundleEventCallback> &pluginEventCallback)
10928 {
10929 if (pluginEventCallback == nullptr) {
10930 APP_LOGW("pluginEventCallback is null");
10931 return ERR_APPEXECFWK_NULL_PTR;
10932 }
10933 std::lock_guard lock(pluginCallbackMutex_);
10934 if (pluginCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
10935 APP_LOGW("pluginCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
10936 return ERR_APPEXECFWK_PLUGIN_CALLBACK_LIST_FULL;
10937 }
10938 if (pluginEventCallback->AsObject() != nullptr) {
10939 sptr<BundleEventCallbackDeathRecipient> deathRecipient =
10940 new (std::nothrow) BundleEventCallbackDeathRecipient();
10941 if (deathRecipient == nullptr) {
10942 APP_LOGW("deathRecipient is null");
10943 return ERR_APPEXECFWK_NULL_PTR;
10944 }
10945 pluginEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
10946 }
10947 pluginCallbackList_.emplace_back(pluginEventCallback);
10948 APP_LOGI("success");
10949 return ERR_OK;
10950 }
10951
UnregisterPluginEventCallback(const sptr<IBundleEventCallback> & pluginEventCallback)10952 ErrCode BundleDataMgr::UnregisterPluginEventCallback(const sptr<IBundleEventCallback> &pluginEventCallback)
10953 {
10954 if (pluginEventCallback == nullptr) {
10955 APP_LOGW("pluginEventCallback is null");
10956 return ERR_APPEXECFWK_NULL_PTR;
10957 }
10958 std::lock_guard lock(pluginCallbackMutex_);
10959 pluginCallbackList_.erase(std::remove_if(pluginCallbackList_.begin(), pluginCallbackList_.end(),
10960 [&pluginEventCallback](const sptr<IBundleEventCallback> &callback) {
10961 return callback->AsObject() == pluginEventCallback->AsObject();
10962 }), pluginCallbackList_.end());
10963 APP_LOGI("success");
10964 return ERR_OK;
10965 }
10966
NotifyPluginEventCallback(const EventFwk::CommonEventData & eventData)10967 void BundleDataMgr::NotifyPluginEventCallback(const EventFwk::CommonEventData &eventData)
10968 {
10969 APP_LOGI("begin");
10970 std::lock_guard lock(pluginCallbackMutex_);
10971 for (const auto &callback : pluginCallbackList_) {
10972 callback->OnReceiveEvent(eventData);
10973 }
10974 APP_LOGI("end");
10975 }
10976
GetAllDynamicIconInfo(const int32_t userId,std::vector<DynamicIconInfo> & dynamicIconInfos)10977 ErrCode BundleDataMgr::GetAllDynamicIconInfo(const int32_t userId, std::vector<DynamicIconInfo> &dynamicIconInfos)
10978 {
10979 APP_LOGI("start userId %{public}d", userId);
10980 if (userId != Constants::UNSPECIFIED_USERID) {
10981 if (!HasUserId(userId)) {
10982 APP_LOGE("userId %{public}d not exist", userId);
10983 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10984 }
10985 }
10986 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10987 for (const auto &item : bundleInfos_) {
10988 item.second.GetAllDynamicIconInfo(userId, dynamicIconInfos);
10989 }
10990 return ERR_OK;
10991 }
10992
ProcessDynamicIconForOta()10993 void BundleDataMgr::ProcessDynamicIconForOta()
10994 {
10995 std::map<std::string, std::string> bundleNames;
10996 {
10997 // process all old curDynamicIconModule when first ota
10998 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10999 for (const auto &item : bundleInfos_) {
11000 if (!item.second.GetCurDynamicIconModule().empty()) {
11001 bundleNames[item.first] = item.second.GetCurDynamicIconModule();
11002 }
11003 }
11004 }
11005 if (bundleNames.empty()) {
11006 return;
11007 }
11008 for (const auto &item : bundleNames) {
11009 UpateCurDynamicIconModule(item.first, item.second);
11010 }
11011 }
11012
GetDynamicIconInfo(const std::string & bundleName,std::vector<DynamicIconInfo> & dynamicIconInfos)11013 ErrCode BundleDataMgr::GetDynamicIconInfo(const std::string &bundleName,
11014 std::vector<DynamicIconInfo> &dynamicIconInfos)
11015 {
11016 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11017 auto item = bundleInfos_.find(bundleName);
11018 if (item == bundleInfos_.end()) {
11019 APP_LOGW("bundleName: %{public}s not exist", bundleName.c_str());
11020 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11021 }
11022 item->second.GetAllDynamicIconInfo(Constants::UNSPECIFIED_USERID, dynamicIconInfos);
11023 return ERR_OK;
11024 }
11025
GetCurDynamicIconModule(const std::string & bundleName,const int32_t userId,const int32_t appIndex)11026 std::string BundleDataMgr::GetCurDynamicIconModule(
11027 const std::string &bundleName, const int32_t userId, const int32_t appIndex)
11028 {
11029 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11030 auto item = bundleInfos_.find(bundleName);
11031 if (item == bundleInfos_.end()) {
11032 return Constants::EMPTY_STRING;
11033 }
11034 return item->second.GetCurDynamicIconModule(userId, appIndex);
11035 }
11036
SetShortcutVisibleForSelf(const std::string & shortcutId,bool visible)11037 ErrCode BundleDataMgr::SetShortcutVisibleForSelf(const std::string &shortcutId, bool visible)
11038 {
11039 APP_LOGD("SetShortcutVisibleForSelf begin");
11040 int32_t uid = IPCSkeleton::GetCallingUid();
11041 int32_t appIndex = 0;
11042 std::string bundleName;
11043 auto ret = GetBundleNameAndIndex(uid, bundleName, appIndex);
11044 if (ret != ERR_OK) {
11045 APP_LOGE("get inner bundle info failed");
11046 return ERR_BUNDLE_MANAGER_INVALID_UID;
11047 }
11048 int32_t userId = GetUserIdByCallingUid();
11049 std::vector<ShortcutInfo> shortcutInfos;
11050 {
11051 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11052 auto iter = bundleInfos_.find(bundleName);
11053 if (iter != bundleInfos_.end()) {
11054 GetShortcutInfosByInnerBundleInfo(iter->second, shortcutInfos);
11055 } else {
11056 APP_LOGE("%{public}s not exist", bundleName.c_str());
11057 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11058 }
11059 }
11060 bool isShortcutIdExist = false;
11061 for (const auto& shortcut : shortcutInfos) {
11062 if (shortcut.id == shortcutId) {
11063 isShortcutIdExist = true;
11064 }
11065 }
11066 if (!isShortcutIdExist) {
11067 APP_LOGE("shortcut id %{public}s not exist", shortcutId.c_str());
11068 return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
11069 }
11070 if (shortcutVisibleStorage_->IsShortcutVisibleInfoExist(bundleName, shortcutId, appIndex, userId, visible)) {
11071 return ERR_OK;
11072 }
11073 if (!shortcutVisibleStorage_->SaveStorageShortcutVisibleInfo(bundleName, shortcutId, appIndex, userId, visible)) {
11074 APP_LOGE("SaveStorageShortcutVisibleInfo failed");
11075 return ERR_APPEXECFWK_DB_INSERT_ERROR;
11076 }
11077 std::shared_ptr<BundleCommonEventMgr> commonEventMgr = std::make_shared<BundleCommonEventMgr>();
11078 commonEventMgr->NotifyShortcutVisibleChanged(bundleName, shortcutId, userId, appIndex, visible);
11079 return ERR_OK;
11080 }
11081
DeleteShortcutVisibleInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)11082 ErrCode BundleDataMgr::DeleteShortcutVisibleInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
11083 {
11084 APP_LOGD(
11085 "DeleteShortcutVisibleInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
11086 bundleName.c_str(), userId, appIndex);
11087 if (!shortcutVisibleStorage_->DeleteShortcutVisibleInfo(bundleName, userId, appIndex)) {
11088 return ERR_APPEXECFWK_DB_DELETE_ERROR;
11089 }
11090 return ERR_OK;
11091 }
11092
GetAllShortcutInfoForSelf(std::vector<ShortcutInfo> & shortcutInfos)11093 ErrCode BundleDataMgr::GetAllShortcutInfoForSelf(std::vector<ShortcutInfo> &shortcutInfos)
11094 {
11095 APP_LOGD("GetAllShortcutInfoForSelf begin");
11096 int32_t uid = IPCSkeleton::GetCallingUid();
11097 int32_t appIndex = 0;
11098 std::string bundleName;
11099 auto ret = GetBundleNameAndIndex(uid, bundleName, appIndex);
11100 if (ret != ERR_OK) {
11101 APP_LOGE("get inner bundle info failed");
11102 return ERR_BUNDLE_MANAGER_INVALID_UID;
11103 }
11104 int32_t userId = GetUserIdByCallingUid();
11105 {
11106 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11107 auto iter = bundleInfos_.find(bundleName);
11108 if (iter != bundleInfos_.end()) {
11109 GetShortcutInfosByInnerBundleInfo(iter->second, shortcutInfos);
11110 } else {
11111 APP_LOGE("%{public}s not exist", bundleName.c_str());
11112 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11113 }
11114 }
11115 for (auto &info : shortcutInfos) {
11116 ret = shortcutVisibleStorage_->GetShortcutVisibleStatus(userId, appIndex, info);
11117 if (ret != ERR_OK) {
11118 APP_LOGD("visible not exist in table");
11119 }
11120 info.appIndex = appIndex;
11121 }
11122 return ERR_OK;
11123 }
11124
GreatOrEqualTargetAPIVersion(const int32_t platformVersion,const int32_t minorVersion,const int32_t patchVersion)11125 bool BundleDataMgr::GreatOrEqualTargetAPIVersion(const int32_t platformVersion, const int32_t minorVersion, const int32_t patchVersion)
11126 {
11127 if (platformVersion > ServiceConstants::API_VERSION_MAX || platformVersion < 1) {
11128 APP_LOGE("GreatOrEqualTargetAPIVersion Error, platformVersion is invalid: %{public}d", platformVersion);
11129 return false;
11130 }
11131 if (minorVersion > ServiceConstants::API_VERSION_MAX || minorVersion < 0) {
11132 APP_LOGE("GreatOrEqualTargetAPIVersion Error, minorVersion is invalid: %{public}d", minorVersion);
11133 return false;
11134 }
11135 if (patchVersion > ServiceConstants::API_VERSION_MAX || patchVersion < 0) {
11136 APP_LOGE("GreatOrEqualTargetAPIVersion Error, patchVersion is invalid: %{public}d", patchVersion);
11137 return false;
11138 }
11139
11140 BundleInfo bundleInfo;
11141 auto ret = GetBundleInfoForSelf(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT), bundleInfo);
11142 if (ret != ERR_OK) {
11143 APP_LOGE("GreatOrEqualTargetAPIVersion, GetBundleInfoForSelf fail");
11144 return false;
11145 }
11146
11147 APP_LOGE("BundleDataMgr::GreatOrEqualTargetAPIVersion, name: %{public}s, major: %{public}d, minor: %{public}d, patch: %{public}d",
11148 bundleInfo.name.c_str(), (bundleInfo.targetVersion % ServiceConstants::API_VERSION_MOD),
11149 bundleInfo.targetMinorApiVersion, bundleInfo.targetPatchApiVersion);
11150 if (static_cast<uint32_t>(platformVersion) != (bundleInfo.targetVersion % ServiceConstants::API_VERSION_MOD)) {
11151 return static_cast<uint32_t>(platformVersion) < (bundleInfo.targetVersion % ServiceConstants::API_VERSION_MOD);
11152 }
11153
11154 if (minorVersion != bundleInfo.targetMinorApiVersion) {
11155 return minorVersion < bundleInfo.targetMinorApiVersion;
11156 }
11157 return patchVersion <= bundleInfo.targetPatchApiVersion;
11158 }
11159
GenerateUuid() const11160 std::string BundleDataMgr::GenerateUuid() const
11161 {
11162 auto currentTime = std::chrono::system_clock::now();
11163 auto timestampNanoseconds =
11164 std::chrono::duration_cast<std::chrono::nanoseconds>(currentTime.time_since_epoch()).count();
11165
11166 // convert nanosecond timestamps to string
11167 std::string timeStr = std::to_string(timestampNanoseconds);
11168
11169 char deviceId[UUID_LENGTH_MAX] = { 0 };
11170 auto ret = GetDevUdid(deviceId, UUID_LENGTH_MAX);
11171 std::string deviceUdid;
11172 if (ret != 0) {
11173 APP_LOGW("GetDevUdid failed");
11174 } else {
11175 deviceUdid = std::string{ deviceId };
11176 }
11177
11178 std::string message = timeStr + deviceUdid;
11179 std::string uuid = OHOS::Security::Verify::GenerateUuidByKey(message);
11180 return uuid;
11181 }
11182
GenerateUuidByKey(const std::string & key) const11183 std::string BundleDataMgr::GenerateUuidByKey(const std::string &key) const
11184 {
11185 char deviceId[UUID_LENGTH_MAX] = { 0 };
11186 auto ret = GetDevUdid(deviceId, UUID_LENGTH_MAX);
11187 std::string deviceUdid;
11188 if (ret != 0) {
11189 APP_LOGW("GetDevUdid failed");
11190 } else {
11191 deviceUdid = std::string{ deviceId };
11192 }
11193
11194 std::string message = key + deviceUdid;
11195 return OHOS::Security::Verify::GenerateUuidByKey(message);
11196 }
11197
GetAllCloneAppIndexesAndUidsByInnerBundleInfo(const int32_t userId,std::unordered_map<std::string,std::vector<std::pair<int32_t,int32_t>>> & cloneInfos) const11198 ErrCode BundleDataMgr::GetAllCloneAppIndexesAndUidsByInnerBundleInfo(const int32_t userId,
11199 std::unordered_map<std::string, std::vector<std::pair<int32_t, int32_t>>> &cloneInfos) const
11200 {
11201 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11202 if (bundleInfos_.empty()) {
11203 APP_LOGW("bundleInfos_ data is empty");
11204 return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
11205 }
11206 for (const auto &item : bundleInfos_) {
11207 const InnerBundleInfo &info = item.second;
11208 std::string bundleName = item.second.GetBundleName();
11209 if (bundleName.empty()) {
11210 continue;
11211 }
11212 std::vector<int32_t> allAppIndexes = {0};
11213 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
11214 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
11215 for (int32_t appIndex: allAppIndexes) {
11216 int32_t uid = info.GetUid(userId, appIndex);
11217 cloneInfos[bundleName].push_back({appIndex, uid});
11218 }
11219 }
11220 return ERR_OK;
11221 }
11222
FilterShortcutJson(nlohmann::json & jsonResult)11223 void BundleDataMgr::FilterShortcutJson(nlohmann::json &jsonResult)
11224 {
11225 if (!jsonResult.is_array()) {
11226 APP_LOGE("Invalid JSON format: expected array");
11227 return;
11228 }
11229 for (auto it = jsonResult.begin(); it != jsonResult.end();) {
11230 if (!it->contains(BUNDLE_NAME) || !it->at(BUNDLE_NAME).is_string()) {
11231 it = jsonResult.erase(it);
11232 continue;
11233 }
11234 if (!it->contains(APP_INDEX) || !it->at(APP_INDEX).is_number()) {
11235 it = jsonResult.erase(it);
11236 continue;
11237 }
11238 if (!it->contains(USER_ID) || !it->at(USER_ID).is_number()) {
11239 it = jsonResult.erase(it);
11240 continue;
11241 }
11242 int32_t userId = (*it)[USER_ID].get<int>();
11243 if (userId != Constants::START_USERID) {
11244 std::string bundleName = (*it)[BUNDLE_NAME].get<std::string>();
11245 int32_t appIndex = (*it)[APP_INDEX].get<int>();
11246 APP_LOGW("userId %{public}d is not supported for clone %{public}s %{public}d",
11247 userId, bundleName.c_str(), appIndex);
11248 it = jsonResult.erase(it);
11249 continue;
11250 }
11251 ++it;
11252 }
11253 }
11254
UpdateDesktopShortcutInfo(const std::string & bundleName)11255 void BundleDataMgr::UpdateDesktopShortcutInfo(const std::string &bundleName)
11256 {
11257 APP_LOGD("UpdateDesktopShortcutInfo begin");
11258 std::vector<ShortcutInfo> shortcutInfos;
11259 {
11260 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11261 auto iter = bundleInfos_.find(bundleName);
11262 if (iter != bundleInfos_.end()) {
11263 GetShortcutInfosByInnerBundleInfo(iter->second, shortcutInfos);
11264 } else {
11265 APP_LOGE("%{public}s not exist", bundleName.c_str());
11266 return;
11267 }
11268 }
11269 if (shortcutInfos.empty()) {
11270 return;
11271 }
11272 shortcutStorage_->UpdateDesktopShortcutInfo(bundleName, shortcutInfos);
11273 }
11274
GetPluginInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const int32_t userId,PluginBundleInfo & pluginBundleInfo)11275 ErrCode BundleDataMgr::GetPluginInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
11276 const int32_t userId, PluginBundleInfo &pluginBundleInfo)
11277 {
11278 APP_LOGD("start GetPluginInfo -n %{public}s -u %{public}d", hostBundleName.c_str(), userId);
11279 int32_t requestUserId = GetUserId(userId);
11280 if (requestUserId == Constants::INVALID_USERID) {
11281 APP_LOGE("invalid userid :%{public}d", userId);
11282 return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
11283 }
11284 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11285 auto item = bundleInfos_.find(hostBundleName);
11286 if (item == bundleInfos_.end()) {
11287 APP_LOGE("-n %{public}s does not exist", hostBundleName.c_str());
11288 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11289 }
11290 const InnerBundleInfo &innerBundleInfo = item->second;
11291 int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
11292 if (responseUserId == Constants::INVALID_USERID) {
11293 APP_LOGE("-n %{public}s is not installed in user %{public}d or 0", hostBundleName.c_str(), userId);
11294 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11295 }
11296 std::unordered_map<std::string, PluginBundleInfo> pluginInfoMap = innerBundleInfo.GetAllPluginBundleInfo();
11297 InnerBundleUserInfo innerBundleUserInfo;
11298 innerBundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo);
11299 if ((pluginInfoMap.find(pluginBundleName) == pluginInfoMap.end()) ||
11300 (innerBundleUserInfo.installedPluginSet.find(pluginBundleName) ==
11301 innerBundleUserInfo.installedPluginSet.end())) {
11302 APP_LOGE("-p %{public}s -u %{public}d not exist", pluginBundleName.c_str(), userId);
11303 return ERR_APPEXECFWK_PLUGIN_NOT_FOUND;
11304 }
11305 pluginBundleInfo = pluginInfoMap.at(pluginBundleName);
11306 return ERR_OK;
11307 }
11308
SetBundleUserInfoRemovable(const std::string bundleName,int32_t userId,bool removable)11309 bool BundleDataMgr::SetBundleUserInfoRemovable(const std::string bundleName, int32_t userId, bool removable)
11310 {
11311 APP_LOGD("SetBundleUserInfoRemovable: %{public}s", bundleName.c_str());
11312 std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11313 auto infoItem = bundleInfos_.find(bundleName);
11314 if (infoItem == bundleInfos_.end()) {
11315 APP_LOGW("%{public}s bundle info not exist", bundleName.c_str());
11316 return false;
11317 }
11318 auto& info = bundleInfos_.at(bundleName);
11319 InnerBundleUserInfo userInfo;
11320 if (!info.GetInnerBundleUserInfo(userId, userInfo)) {
11321 LOG_W(BMS_TAG_DEFAULT, "-n %{public}s is not installed at -u %{public}d", bundleName.c_str(), userId);
11322 return false;
11323 }
11324 if (userInfo.isRemovable == removable) {
11325 APP_LOGI("-n %{public}s -u %{public}d no need to change", bundleName.c_str(), userId);
11326 return true;
11327 }
11328 userInfo.isRemovable = removable;
11329 info.AddInnerBundleUserInfo(userInfo);
11330 info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
11331 if (!dataStorage_->SaveStorageBundleInfo(info)) {
11332 APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
11333 return false;
11334 }
11335 return true;
11336 }
11337
GetTestRunner(const std::string & bundleName,const std::string & moduleName,ModuleTestRunner & testRunner)11338 ErrCode BundleDataMgr::GetTestRunner(const std::string &bundleName, const std::string &moduleName,
11339 ModuleTestRunner &testRunner)
11340 {
11341 APP_LOGD("start GetTestRunner -n %{public}s -m %{public}s", bundleName.c_str(), moduleName.c_str());
11342 std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11343 auto item = bundleInfos_.find(bundleName);
11344 if (item == bundleInfos_.end()) {
11345 APP_LOGE("-n %{public}s does not exist", bundleName.c_str());
11346 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11347 }
11348 auto moduleInfo = item->second.GetInnerModuleInfoByModuleName(moduleName);
11349 if (!moduleInfo) {
11350 APP_LOGE("-m %{public}s is not found", moduleName.c_str());
11351 return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
11352 }
11353 BundleParser bundleParser;
11354 return bundleParser.ParseTestRunner(moduleInfo->hapPath, testRunner);
11355 }
11356 } // namespace AppExecFwk
11357 } // namespace OHOS
11358