1 /*
2  * Copyright (c) 2021-2024 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 
20 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
21 #ifdef ACCOUNT_ENABLE
22 #include "os_account_info.h"
23 #endif
24 #endif
25 #include "account_helper.h"
26 #include "app_log_tag_wrapper.h"
27 #include "app_provision_info_manager.h"
28 #include "bms_extension_client.h"
29 #include "bundle_data_storage_rdb.h"
30 #include "preinstall_data_storage_rdb.h"
31 #include "bundle_event_callback_death_recipient.h"
32 #include "bundle_mgr_service.h"
33 #include "bundle_parser.h"
34 #include "bundle_permission_mgr.h"
35 #include "bundle_status_callback_death_recipient.h"
36 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
37 #include "default_app_mgr.h"
38 #endif
39 #include "hitrace_meter.h"
40 #include "inner_bundle_clone_common.h"
41 #include "installd_client.h"
42 #include "ipc_skeleton.h"
43 #ifdef GLOBAL_I18_ENABLE
44 #include "locale_config.h"
45 #include "locale_info.h"
46 #endif
47 #include "mime_type_mgr.h"
48 #include "parameters.h"
49 #include "router_map_helper.h"
50 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
51 #include "bundle_overlay_data_manager.h"
52 #endif
53 #include "bundle_extractor.h"
54 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
55 #include "type_descriptor.h"
56 #include "utd_client.h"
57 #endif
58 
59 #ifdef APP_DOMAIN_VERIFY_ENABLED
60 #include "app_domain_verify_mgr_client.h"
61 #endif
62 
63 #include "router_data_storage_rdb.h"
64 #include "shortcut_data_storage_rdb.h"
65 
66 namespace OHOS {
67 namespace AppExecFwk {
68 namespace {
69 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
70 constexpr int8_t DATA_GROUP_INDEX_START = 1;
71 constexpr int8_t UUID_LENGTH = 36;
72 constexpr int8_t PROFILE_PREFIX_LENGTH = 9;
73 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
74 // freeInstall action
75 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
76 // share action
77 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
78 constexpr const char* WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
79 constexpr const char* SUMMARY_TOTAL_COUNT = "totalCount";
80 constexpr const char* WANT_PARAM_SUMMARY = "summary";
81 constexpr int8_t DEFAULT_SUMMARY_COUNT = 0;
82 // data share
83 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
84 constexpr int8_t DATA_PROXY_URI_PREFIX_LEN = 17;
85 // profile path
86 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
87 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
88 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
89 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
90 constexpr const char* PKG_CONTEXT_PROFILE_PATH = "pkgContextInfo.json";
91 constexpr const char* PROFILE_PATH = "resources/base/profile/";
92 constexpr const char* PROFILE_PREFIX = "$profile:";
93 constexpr const char* JSON_SUFFIX = ".json";
94 constexpr const char* SCHEME_HTTPS = "https";
95 constexpr const char* META_DATA_SHORTCUTS_NAME = "ohos.ability.shortcuts";
96 constexpr const char* BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
97 constexpr const char* ENTRY = "entry";
98 constexpr const char* CLONE_BUNDLE_PREFIX = "clone_";
99 constexpr const char* PERMISSION_PROTECT_SCREEN_LOCK_DATA = "ohos.permission.PROTECT_SCREEN_LOCK_DATA";
100 
101 const std::map<ProfileType, const char*> PROFILE_TYPE_MAP = {
102     { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
103     { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
104     { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
105     { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH },
106     { ProfileType::PKG_CONTEXT_PROFILE, PKG_CONTEXT_PROFILE_PATH }
107 };
108 const std::string SCHEME_END = "://";
109 const std::string LINK_FEATURE = "linkFeature";
110 constexpr const char* PARAM_URI_SEPARATOR = ":///";
111 constexpr const char* URI_SEPARATOR = "://";
112 constexpr uint8_t PARAM_URI_SEPARATOR_LEN = 4;
113 constexpr int8_t INVALID_BUNDLEID = -1;
114 constexpr int32_t DATA_GROUP_UID_OFFSET = 100000;
115 constexpr int32_t MAX_APP_UID = 65535;
116 constexpr int16_t DATA_GROUP_DIR_MODE = 02770;
117 constexpr int8_t ONLY_ONE_USER = 1;
118 }
119 
BundleDataMgr()120 BundleDataMgr::BundleDataMgr()
121 {
122     InitStateTransferMap();
123     dataStorage_ = std::make_shared<BundleDataStorageRdb>();
124     preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
125     sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
126     bundleStateStorage_ = std::make_shared<BundleStateStorage>();
127     shortcutStorage_ = std::make_shared<ShortcutDataStorageRdb>();
128     routerStorage_ = std::make_shared<RouterDataStorageRdb>();
129     uninstallDataMgr_ = std::make_shared<UninstallDataMgrStorageRdb>();
130     baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
131     if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) {
132         baseAppUid_ = Constants::BASE_APP_UID;
133     }
134     APP_LOGI("BundleDataMgr instance is created");
135 }
136 
~BundleDataMgr()137 BundleDataMgr::~BundleDataMgr()
138 {
139     APP_LOGI("BundleDataMgr instance is destroyed");
140     installStates_.clear();
141     transferStates_.clear();
142     bundleInfos_.clear();
143 }
144 
LoadDataFromPersistentStorage()145 bool BundleDataMgr::LoadDataFromPersistentStorage()
146 {
147     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
148     // Judge whether bundleState json db exists.
149     // If it does not exist, create it and return the judgment result.
150     bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
151     if (!dataStorage_->LoadAllData(bundleInfos_)) {
152         APP_LOGW("LoadAllData failed");
153         return false;
154     }
155 
156     if (bundleInfos_.empty()) {
157         APP_LOGW("persistent data is empty");
158         return false;
159     }
160 
161     for (const auto &item : bundleInfos_) {
162         std::lock_guard<std::mutex> stateLock(stateMutex_);
163         installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
164         AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
165     }
166 
167     RestoreUidAndGid();
168     if (!bundleStateDbExist) {
169         // Compatible old bundle status in kV db
170         CompatibleOldBundleStateInKvDb();
171     } else {
172         ResetBundleStateData();
173         // Load all bundle status from json db.
174         LoadAllBundleStateDataFromJsonDb();
175     }
176 
177     SetInitialUserFlag(true);
178 
179     RestoreSandboxUidAndGid(bundleIdMap_);
180     return true;
181 }
182 
CompatibleOldBundleStateInKvDb()183 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
184 {
185     for (const auto& bundleInfoItem : bundleInfos_) {
186         for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
187             auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
188             if (bundleUserInfo.IsInitialState()) {
189                 continue;
190             }
191 
192             // save old bundle state to json db
193             bundleStateStorage_->SaveBundleStateStorage(
194                 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
195         }
196     }
197 }
198 
LoadAllBundleStateDataFromJsonDb()199 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
200 {
201     APP_LOGD("Load all bundle state start");
202     std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
203     if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
204         APP_LOGW("Load all bundle state failed");
205         return;
206     }
207 
208     for (const auto& bundleState : bundleStateInfos) {
209         auto infoItem = bundleInfos_.find(bundleState.first);
210         if (infoItem == bundleInfos_.end()) {
211             APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
212             continue;
213         }
214 
215         InnerBundleInfo& newInfo = infoItem->second;
216         for (auto& bundleUserState : bundleState.second) {
217             auto& tempUserInfo = bundleUserState.second;
218             newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.first);
219             for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
220                 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
221             }
222         }
223     }
224 
225     APP_LOGD("Load all bundle state end");
226 }
227 
ResetBundleStateData()228 void BundleDataMgr::ResetBundleStateData()
229 {
230     for (auto& bundleInfoItem : bundleInfos_) {
231         bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
232     }
233 }
234 
UpdateBundleInstallState(const std::string &bundleName, const InstallState state)235 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName, const InstallState state)
236 {
237     if (bundleName.empty()) {
238         APP_LOGW("update failed: bundle name is empty");
239         return false;
240     }
241 
242     // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
243     std::unique_lock<std::shared_mutex> lck(bundleInfoMutex_);
244     std::lock_guard<std::mutex> lock(stateMutex_);
245     auto item = installStates_.find(bundleName);
246     if (item == installStates_.end()) {
247         if (state == InstallState::INSTALL_START) {
248             installStates_.emplace(bundleName, state);
249             APP_LOGD("update succeed");
250             return true;
251         }
252         APP_LOGW("update failed: incorrect state, -n: %{public}s", bundleName.c_str());
253         return false;
254     }
255 
256     auto stateRange = transferStates_.equal_range(state);
257     for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
258         if (item->second == previousState->second) {
259             APP_LOGD("update succeed, current:%{public}d, state:%{public}d",
260                 static_cast<int32_t>(previousState->second), static_cast<int32_t>(state));
261             if (IsDeleteDataState(state)) {
262                 installStates_.erase(item);
263                 DeleteBundleInfo(bundleName, state);
264                 return true;
265             }
266             item->second = state;
267             return true;
268         }
269     }
270     APP_LOGW_NOFUNC("UpdateBundleInstallState -n %{public}s fail current:%{public}d state:%{public}d",
271         bundleName.c_str(), static_cast<int32_t>(item->second), static_cast<int32_t>(state));
272     return false;
273 }
274 
AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)275 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
276 {
277     APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
278     if (bundleName.empty()) {
279         APP_LOGW("save info fail, empty bundle name");
280         return false;
281     }
282 
283     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
284     auto infoItem = bundleInfos_.find(bundleName);
285     if (infoItem != bundleInfos_.end()) {
286         APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
287         return false;
288     }
289     std::lock_guard<std::mutex> stateLock(stateMutex_);
290     auto statusItem = installStates_.find(bundleName);
291     if (statusItem == installStates_.end()) {
292         APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
293         return false;
294     }
295     if (statusItem->second == InstallState::INSTALL_START) {
296         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
297         if (info.GetBaseApplicationInfo().needAppDetail) {
298             AddAppDetailAbilityInfo(info);
299         }
300 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
301         if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
302             InnerBundleInfo newInfo = info;
303             std::string targetBundleName = newInfo.GetTargetBundleName();
304             auto targetInfoItem = bundleInfos_.find(targetBundleName);
305             if (targetInfoItem != bundleInfos_.end()) {
306                 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
307                 // storage target bundle info
308                 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
309             }
310         }
311         if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
312             info.SetOverlayModuleState(info.GetCurrentModulePackage(), OverlayState::OVERLAY_INVALID,
313                 info.GetUserId());
314         }
315         if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
316             // build overlay connection for external overlay
317             BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
318         }
319 #endif
320         if (dataStorage_->SaveStorageBundleInfo(info)) {
321             APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
322             bundleInfos_.emplace(bundleName, info);
323             AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
324             return true;
325         }
326     }
327     return false;
328 }
329 
AddNewModuleInfo( const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo, bool isUpgrade)330 bool BundleDataMgr::AddNewModuleInfo(
331     const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo, bool isUpgrade)
332 {
333     LOG_I(BMS_TAG_DEFAULT, "addInfo:%{public}s", newInfo.GetCurrentModulePackage().c_str());
334     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
335     auto infoItem = bundleInfos_.find(bundleName);
336     if (infoItem == bundleInfos_.end()) {
337         APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
338         return false;
339     }
340     std::lock_guard<std::mutex> stateLock(stateMutex_);
341     auto statusItem = installStates_.find(bundleName);
342     if (statusItem == installStates_.end()) {
343         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
344         return false;
345     }
346     if (statusItem->second == InstallState::UPDATING_SUCCESS) {
347         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
348         ProcessAllowedAcls(newInfo, oldInfo);
349         if (isUpgrade || IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
350             oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
351             oldInfo.UpdateBaseApplicationInfo(newInfo.GetBaseApplicationInfo(), newInfo.HasEntry());
352             oldInfo.UpdateRemovable(newInfo.IsPreInstallApp(), newInfo.IsRemovable());
353             oldInfo.UpdateMultiAppMode(newInfo);
354             oldInfo.UpdateReleaseType(newInfo);
355             oldInfo.SetAppType(newInfo.GetAppType());
356             oldInfo.SetAppFeature(newInfo.GetAppFeature());
357         }
358         if (oldInfo.GetOldAppIds().empty()) {
359             oldInfo.AddOldAppId(oldInfo.GetAppId());
360         }
361         oldInfo.SetProvisionId(newInfo.GetProvisionId());
362         oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
363         oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
364         oldInfo.SetCertificate(newInfo.GetCertificate());
365         oldInfo.AddOldAppId(newInfo.GetAppId());
366         oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
367         oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
368         oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
369         oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
370         oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
371         oldInfo.AddModuleInfo(newInfo);
372         oldInfo.UpdateAppDetailAbilityAttrs();
373         if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
374             AddAppDetailAbilityInfo(oldInfo);
375         }
376         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
377         oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
378         oldInfo.UpdateOdidByBundleInfo(newInfo);
379         oldInfo.SetAsanEnabled(oldInfo.IsAsanEnabled());
380         oldInfo.SetGwpAsanEnabled(oldInfo.IsGwpAsanEnabled());
381         oldInfo.SetTsanEnabled(oldInfo.IsTsanEnabled());
382         oldInfo.SetHwasanEnabled(oldInfo.IsHwasanEnabled());
383         oldInfo.SetUbsanEnabled(oldInfo.IsUbsanEnabled());
384 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
385         if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
386             oldInfo.SetOverlayType(newInfo.GetOverlayType());
387         }
388         if (!UpdateOverlayInfo(newInfo, oldInfo)) {
389             APP_LOGD("bundleName: %{public}s : update overlay info failed", bundleName.c_str());
390             return false;
391         }
392 #endif
393         if (dataStorage_->SaveStorageBundleInfo(oldInfo)) {
394             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
395             bundleInfos_.at(bundleName) = oldInfo;
396             return true;
397         }
398     }
399     return false;
400 }
401 
RemoveModuleInfo( const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo)402 bool BundleDataMgr::RemoveModuleInfo(
403     const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo)
404 {
405     APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
406     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
407     auto infoItem = bundleInfos_.find(bundleName);
408     if (infoItem == bundleInfos_.end()) {
409         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
410         return false;
411     }
412     std::lock_guard<std::mutex> stateLock(stateMutex_);
413     auto statusItem = installStates_.find(bundleName);
414     if (statusItem == installStates_.end()) {
415         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
416         return false;
417     }
418     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
419         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
420 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
421         std::string targetBundleName = oldInfo.GetTargetBundleName();
422         InnerBundleInfo targetInnerBundleInfo;
423         if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
424             targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
425         }
426         OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
427             targetInnerBundleInfo);
428         if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
429             // save target innerBundleInfo
430             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
431                 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
432                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
433             }
434         }
435         // remove target module and overlay module state will change to OVERLAY_INVALID
436         if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
437             ResetExternalOverlayModuleState(bundleName, modulePackage);
438         }
439 #endif
440         oldInfo.RemoveModuleInfo(modulePackage);
441         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
442         if (!oldInfo.isExistedOverlayModule()) {
443             oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
444         }
445         oldInfo.SetAsanEnabled(oldInfo.IsAsanEnabled());
446         oldInfo.SetGwpAsanEnabled(oldInfo.IsGwpAsanEnabled());
447         oldInfo.SetTsanEnabled(oldInfo.IsTsanEnabled());
448         oldInfo.SetHwasanEnabled(oldInfo.IsHwasanEnabled());
449         oldInfo.SetUbsanEnabled(oldInfo.IsUbsanEnabled());
450         if (dataStorage_->SaveStorageBundleInfo(oldInfo)) {
451             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
452             bundleInfos_.at(bundleName) = oldInfo;
453             return true;
454         }
455         DeleteRouterInfo(bundleName, modulePackage);
456         APP_LOGD("after delete modulePackage:%{public}s info", modulePackage.c_str());
457     }
458     return true;
459 }
460 
UpdateUninstallBundleInfo(const std::string &bundleName, const UninstallBundleInfo &uninstallBundleInfo)461 bool BundleDataMgr::UpdateUninstallBundleInfo(const std::string &bundleName,
462     const UninstallBundleInfo &uninstallBundleInfo)
463 {
464     if (uninstallDataMgr_ == nullptr) {
465         APP_LOGE("rdbDataManager is null");
466         return false;
467     }
468     if (bundleName.empty() || uninstallBundleInfo.userInfos.empty()) {
469         APP_LOGE("param error");
470         return false;
471     }
472     UninstallBundleInfo oldUninstallBundleInfo;
473     if (uninstallDataMgr_->GetUninstallBundleInfo(bundleName, oldUninstallBundleInfo)) {
474         std::string newUser = uninstallBundleInfo.userInfos.begin()->first;
475         if (oldUninstallBundleInfo.userInfos.find(newUser) != oldUninstallBundleInfo.userInfos.end()) {
476             APP_LOGE("u %{public}s has been saved", newUser.c_str());
477             return false;
478         }
479         oldUninstallBundleInfo.userInfos[newUser] = uninstallBundleInfo.userInfos.begin()->second;
480         return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, oldUninstallBundleInfo);
481     }
482     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
483 }
484 
GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)485 bool BundleDataMgr::GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)
486 {
487     if (uninstallDataMgr_ == nullptr) {
488         APP_LOGE("rdbDataManager is null");
489         return false;
490     }
491     if (bundleName.empty()) {
492         APP_LOGE("param error");
493         return false;
494     }
495     return uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo);
496 }
497 
DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)498 bool BundleDataMgr::DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)
499 {
500     if (uninstallDataMgr_ == nullptr) {
501         APP_LOGE("rdbDataManager is null");
502         return false;
503     }
504     if (bundleName.empty()) {
505         APP_LOGE("param error");
506         return false;
507     }
508     UninstallBundleInfo uninstallBundleInfo;
509     if (!uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo)) {
510         APP_LOGE("bundle %{public}s is not found", bundleName.c_str());
511         return false;
512     }
513     auto it = uninstallBundleInfo.userInfos.find(std::to_string(userId));
514     if (it == uninstallBundleInfo.userInfos.end()) {
515         APP_LOGE("user %{public}d is not found", userId);
516         return false;
517     }
518     uninstallBundleInfo.userInfos.erase(std::to_string(userId));
519     if (uninstallBundleInfo.userInfos.empty()) {
520         return uninstallDataMgr_->DeleteUninstallBundleInfo(bundleName);
521     }
522     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
523 }
524 
RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)525 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
526 {
527     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
528     std::string bundleName = info.GetBundleName();
529     auto infoItem = bundleInfos_.find(bundleName);
530     if (infoItem == bundleInfos_.end()) {
531         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
532         return false;
533     }
534     std::lock_guard<std::mutex> stateLock(stateMutex_);
535     auto statusItem = installStates_.find(bundleName);
536     if (statusItem == installStates_.end()) {
537         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
538         return false;
539     }
540     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
541         info.DeleteHspModuleByVersion(versionCode);
542         info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
543         if (dataStorage_->SaveStorageBundleInfo(info)) {
544             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
545             bundleInfos_.at(bundleName) = info;
546             return true;
547         }
548     }
549     return true;
550 }
551 
AddInnerBundleUserInfo( const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)552 bool BundleDataMgr::AddInnerBundleUserInfo(
553     const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
554 {
555     APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
556     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
557     auto infoItem = bundleInfos_.find(bundleName);
558     if (infoItem == bundleInfos_.end()) {
559         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
560         return false;
561     }
562 
563     std::lock_guard<std::mutex> stateLock(stateMutex_);
564     auto& info = bundleInfos_.at(bundleName);
565     info.AddInnerBundleUserInfo(newUserInfo);
566     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
567     if (!dataStorage_->SaveStorageBundleInfo(info)) {
568         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
569         return false;
570     }
571     return true;
572 }
573 
RemoveInnerBundleUserInfo( const std::string &bundleName, int32_t userId)574 bool BundleDataMgr::RemoveInnerBundleUserInfo(
575     const std::string &bundleName, int32_t userId)
576 {
577     APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
578     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
579     auto infoItem = bundleInfos_.find(bundleName);
580     if (infoItem == bundleInfos_.end()) {
581         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
582         return false;
583     }
584 
585     std::lock_guard<std::mutex> stateLock(stateMutex_);
586     auto& info = bundleInfos_.at(bundleName);
587     info.RemoveInnerBundleUserInfo(userId);
588     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
589     if (!dataStorage_->SaveStorageBundleInfo(info)) {
590         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
591         return false;
592     }
593 
594     bundleStateStorage_->DeleteBundleState(bundleName, userId);
595     return true;
596 }
597 
UpdateInnerBundleInfo( const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo, bool isUpgrade)598 bool BundleDataMgr::UpdateInnerBundleInfo(
599     const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo, bool isUpgrade)
600 {
601     LOG_I(BMS_TAG_DEFAULT, "updateInfo:%{public}s", bundleName.c_str());
602     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
603     auto infoItem = bundleInfos_.find(bundleName);
604     if (infoItem == bundleInfos_.end()) {
605         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
606         return false;
607     }
608     std::lock_guard<std::mutex> stateLock(stateMutex_);
609     auto statusItem = installStates_.find(bundleName);
610     if (statusItem == installStates_.end()) {
611         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
612         return false;
613     }
614     // ROLL_BACK and USER_CHANGE should not be here
615     if (statusItem->second == InstallState::UPDATING_SUCCESS
616         || statusItem->second == InstallState::ROLL_BACK
617         || statusItem->second == InstallState::USER_CHANGE) {
618         APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
619             bundleName.c_str(), newInfo.GetCurrentModulePackage().c_str());
620         if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
621             oldInfo.KeepOldOverlayConnection(newInfo);
622         }
623         ProcessAllowedAcls(newInfo, oldInfo);
624         oldInfo.UpdateModuleInfo(newInfo);
625         oldInfo.SetAsanEnabled(oldInfo.IsAsanEnabled());
626         oldInfo.SetGwpAsanEnabled(oldInfo.IsGwpAsanEnabled());
627         oldInfo.SetTsanEnabled(oldInfo.IsTsanEnabled());
628         oldInfo.SetHwasanEnabled(oldInfo.IsHwasanEnabled());
629         oldInfo.SetUbsanEnabled(oldInfo.IsUbsanEnabled());
630         // 1.exist entry, update entry.
631         // 2.only exist feature, update feature.
632         if (isUpgrade || IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
633             oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
634             oldInfo.UpdateBaseApplicationInfo(
635                 newInfo.GetBaseApplicationInfo(), newInfo.HasEntry());
636             oldInfo.UpdateRemovable(
637                 newInfo.IsPreInstallApp(), newInfo.IsRemovable());
638             oldInfo.SetAppType(newInfo.GetAppType());
639             oldInfo.SetAppFeature(newInfo.GetAppFeature());
640             oldInfo.UpdateMultiAppMode(newInfo);
641             oldInfo.UpdateReleaseType(newInfo);
642         }
643         oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
644         if (oldInfo.GetOldAppIds().empty()) {
645             oldInfo.AddOldAppId(oldInfo.GetAppId());
646         }
647         oldInfo.AddOldAppId(newInfo.GetAppId());
648         oldInfo.SetProvisionId(newInfo.GetProvisionId());
649         oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
650         oldInfo.SetCertificate(newInfo.GetCertificate());
651         oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
652         oldInfo.UpdateAppDetailAbilityAttrs();
653         oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
654         if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
655             AddAppDetailAbilityInfo(oldInfo);
656         }
657         oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
658         oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
659         oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
660         if (newInfo.GetAppCrowdtestDeadline() != Constants::INHERIT_CROWDTEST_DEADLINE) {
661             oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
662         }
663         oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
664         // clear apply quick fix frequency
665         oldInfo.ResetApplyQuickFixFrequency();
666         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
667         oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
668         oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
669         oldInfo.UpdateOdidByBundleInfo(newInfo);
670 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
671         if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
672             if (!UpdateOverlayInfo(newInfo, oldInfo)) {
673                 APP_LOGD("update overlay info failed");
674                 return false;
675             }
676         }
677 
678         if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
679             APP_LOGD("update overlay info failed");
680             return false;
681         }
682 #endif
683         if (!dataStorage_->SaveStorageBundleInfo(oldInfo)) {
684             APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
685             return false;
686         }
687         APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
688         bundleInfos_.at(bundleName) = oldInfo;
689         return true;
690     }
691     return false;
692 }
693 
QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo, int32_t appIndex) const694 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
695     int32_t appIndex) const
696 {
697     int32_t requestUserId = GetUserId(userId);
698     if (requestUserId == Constants::INVALID_USERID) {
699         APP_LOGE("request user id is invalid");
700         return false;
701     }
702 
703     ElementName element = want.GetElement();
704     std::string bundleName = element.GetBundleName();
705     std::string abilityName = element.GetAbilityName();
706     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfo bundleName:%{public}s abilityName:%{public}s",
707         bundleName.c_str(), abilityName.c_str());
708     // explicit query
709     if (!bundleName.empty() && !abilityName.empty()) {
710         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
711         if (!ret) {
712             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d"
713                 " -i %{public}d", bundleName.c_str(), abilityName.c_str(), userId, appIndex);
714             return false;
715         }
716         return true;
717     }
718     std::vector<AbilityInfo> abilityInfos;
719     bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
720     if (!ret) {
721         LOG_D(BMS_TAG_QUERY,
722             "implicit queryAbilityInfos error action:%{public}s uri:%{private}s type:%{public}s",
723             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
724         return false;
725     }
726     if (abilityInfos.size() == 0) {
727         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s",
728             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
729         return false;
730     }
731     abilityInfo = abilityInfos[0];
732     return true;
733 }
734 
GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos, const ElementName &element, int32_t flags, int32_t userId) const735 void BundleDataMgr::GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos,
736     const ElementName &element, int32_t flags, int32_t userId) const
737 {
738     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
739     if (cloneAppIndexes.empty()) {
740         APP_LOGI("clone app index is empty");
741         return;
742     }
743     for (int32_t appIndex: cloneAppIndexes) {
744         AbilityInfo cloneAbilityInfo;
745         bool ret = ExplicitQueryCloneAbilityInfo(element, flags, userId, appIndex, cloneAbilityInfo);
746         if (ret) {
747             abilityInfos.emplace_back(cloneAbilityInfo);
748         }
749     }
750 }
751 
GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos, const ElementName &element, int32_t flags, int32_t userId) const752 void BundleDataMgr::GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos,
753     const ElementName &element, int32_t flags, int32_t userId) const
754 {
755     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
756     if (cloneAppIndexes.empty()) {
757         APP_LOGI("clone app index is empty");
758         return;
759     }
760     for (int32_t appIndex: cloneAppIndexes) {
761         AbilityInfo cloneAbilityInfo;
762         ErrCode ret = ExplicitQueryCloneAbilityInfoV9(element, flags, userId, appIndex, cloneAbilityInfo);
763         if (ret == ERR_OK) {
764             abilityInfos.emplace_back(cloneAbilityInfo);
765         }
766     }
767 }
768 
QueryAbilityInfos( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const769 bool BundleDataMgr::QueryAbilityInfos(
770     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) 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, "QueryAbilityInfos bundleName:%{public}s abilityName:%{public}s",
782         bundleName.c_str(), abilityName.c_str());
783     // explicit query
784     if (!bundleName.empty() && !abilityName.empty()) {
785         AbilityInfo abilityInfo;
786         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
787         LOG_D(BMS_TAG_QUERY, "explicit query ret:%{public}d bundleName:%{public}s abilityName:%{public}s",
788             ret, bundleName.c_str(), abilityName.c_str());
789         if (ret) {
790             abilityInfos.emplace_back(abilityInfo);
791         }
792         // get cloneApp's abilityInfos
793         GetCloneAbilityInfos(abilityInfos, element, flags, userId);
794         if (abilityInfos.empty()) {
795             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d",
796                 bundleName.c_str(), abilityName.c_str(), userId);
797         }
798         return !abilityInfos.empty();
799     }
800     // implicit query
801     (void)ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
802     ImplicitQueryCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
803     if (abilityInfos.size() == 0) {
804         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
805             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
806             requestUserId);
807         return false;
808     }
809     return true;
810 }
811 
QueryAbilityInfosV9( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const812 ErrCode BundleDataMgr::QueryAbilityInfosV9(
813     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
814 {
815     int32_t requestUserId = GetUserId(userId);
816     if (requestUserId == Constants::INVALID_USERID) {
817         APP_LOGE("request user id is invalid");
818         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
819     }
820 
821     ElementName element = want.GetElement();
822     std::string bundleName = element.GetBundleName();
823     std::string abilityName = element.GetAbilityName();
824     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfosV9 bundleName:%{public}s abilityName:%{public}s",
825         bundleName.c_str(), abilityName.c_str());
826     // explicit query
827     if (!bundleName.empty() && !abilityName.empty()) {
828         AbilityInfo abilityInfo;
829         ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
830         LOG_D(BMS_TAG_QUERY, "explicit queryV9 ret:%{public}d, bundleName:%{public}s abilityName:%{public}s",
831             ret, bundleName.c_str(), abilityName.c_str());
832         if (ret == ERR_OK) {
833             abilityInfos.emplace_back(abilityInfo);
834         }
835         // get cloneApp's abilityInfos
836         GetCloneAbilityInfosV9(abilityInfos, element, flags, userId);
837         if (abilityInfos.empty()) {
838             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility V9 error -n %{public}s -a %{public}s -u %{public}d",
839                 bundleName.c_str(), abilityName.c_str(), userId);
840             return ret;
841         }
842         return ERR_OK;
843     }
844     // implicit query
845     ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
846     ImplicitQueryCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
847     if (abilityInfos.empty()) {
848         if (ret != ERR_OK) {
849             return ret;
850         }
851         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
852             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
853             requestUserId);
854         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
855     }
856     return ERR_OK;
857 }
858 
BatchQueryAbilityInfos( const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const859 ErrCode BundleDataMgr::BatchQueryAbilityInfos(
860     const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
861 {
862     int32_t requestUserId = GetUserId(userId);
863     if (requestUserId == Constants::INVALID_USERID) {
864         APP_LOGE("request user id is invalid");
865         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
866     }
867 
868     for (size_t i = 0; i < wants.size(); i++) {
869         std::vector<AbilityInfo> tmpAbilityInfos;
870         ElementName element = wants[i].GetElement();
871         std::string bundleName = element.GetBundleName();
872         std::string abilityName = element.GetAbilityName();
873         APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
874             bundleName.c_str(), abilityName.c_str());
875         // explicit query
876         if (!bundleName.empty() && !abilityName.empty()) {
877             AbilityInfo abilityInfo;
878             ErrCode ret = ExplicitQueryAbilityInfoV9(wants[i], flags, requestUserId, abilityInfo);
879             if (ret != ERR_OK) {
880                 APP_LOGE("explicit queryAbilityInfoV9 error:%{public}d, bundleName:%{public}s, abilityName:%{public}s",
881                     ret, bundleName.c_str(), abilityName.c_str());
882                 return ret;
883             }
884             tmpAbilityInfos.emplace_back(abilityInfo);
885         } else {
886             // implicit query
887             ErrCode ret = ImplicitQueryAbilityInfosV9(wants[i], flags, requestUserId, tmpAbilityInfos);
888             if (ret != ERR_OK) {
889                 APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
890                     wants[i].GetAction().c_str(), wants[i].GetUriString().c_str(), wants[i].GetType().c_str());
891                 return ret;
892             }
893         }
894         for (size_t j = 0; j < tmpAbilityInfos.size(); j++) {
895             auto it = std::find_if(abilityInfos.begin(), abilityInfos.end(),
896                 [&](const AbilityInfo& info) {
897                     return tmpAbilityInfos[j].bundleName == info.bundleName &&
898                         tmpAbilityInfos[j].moduleName == info.moduleName &&
899                         tmpAbilityInfos[j].name == info.name;
900                 });
901             if (it == abilityInfos.end()) {
902                 abilityInfos.push_back(tmpAbilityInfos[j]);
903             }
904         }
905     }
906 
907     if (abilityInfos.empty()) {
908         APP_LOGW("no matching abilityInfo");
909         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
910     }
911 
912     return ERR_OK;
913 }
914 
ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo, int32_t appIndex) const915 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
916     AbilityInfo &abilityInfo, int32_t appIndex) const
917 {
918     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
919     ElementName element = want.GetElement();
920     std::string bundleName = element.GetBundleName();
921     std::string abilityName = element.GetAbilityName();
922     std::string moduleName = element.GetModuleName();
923     LOG_D(BMS_TAG_QUERY,
924         "ExplicitQueryAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
925         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
926     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
927 
928     int32_t requestUserId = GetUserId(userId);
929     if (requestUserId == Constants::INVALID_USERID) {
930         APP_LOGE("request user id is invalid");
931         return false;
932     }
933 
934     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
935     InnerBundleInfo innerBundleInfo;
936     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
937         LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
938         return false;
939     }
940     // explict query from sandbox manager
941     if (appIndex > 0) {
942         if (sandboxAppHelper_ == nullptr) {
943             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
944             return false;
945         }
946         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
947         if (ret != ERR_OK) {
948             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
949                 ret, bundleName.c_str());
950             return false;
951         }
952     }
953 
954     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
955     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
956     if (!ability) {
957         LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility not found UIAbility -n %{public}s -m %{public}s "
958             "-a %{public}s", bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
959         return false;
960     }
961     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
962 }
963 
ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo, int32_t appIndex) const964 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
965     AbilityInfo &abilityInfo, int32_t appIndex) const
966 {
967     ElementName element = want.GetElement();
968     std::string bundleName = element.GetBundleName();
969     std::string abilityName = element.GetAbilityName();
970     std::string moduleName = element.GetModuleName();
971     LOG_D(BMS_TAG_QUERY,
972         "ExplicitQueryAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
973         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
974     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
975     int32_t requestUserId = GetUserId(userId);
976     if (requestUserId == Constants::INVALID_USERID) {
977         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
978     }
979     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
980     InnerBundleInfo innerBundleInfo;
981     if (appIndex == 0) {
982         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
983         if (ret != ERR_OK) {
984             LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
985             return ret;
986         }
987     }
988     // explict query from sandbox manager
989     if (appIndex > 0) {
990         if (sandboxAppHelper_ == nullptr) {
991             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
992             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
993         }
994         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
995         if (ret != ERR_OK) {
996             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
997                 ret, bundleName.c_str());
998             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
999         }
1000     }
1001 
1002     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1003     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
1004     if (!ability) {
1005         LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 not found UIAbility -n %{public}s -m %{public}s "
1006             "-a %{public}s", bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1007         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1008     }
1009 
1010     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1011 }
1012 
FilterAbilityInfosByModuleName(const std::string &moduleName, std::vector<AbilityInfo> &abilityInfos) const1013 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
1014     std::vector<AbilityInfo> &abilityInfos) const
1015 {
1016     LOG_D(BMS_TAG_QUERY, "FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
1017     if (moduleName.empty()) {
1018         return;
1019     }
1020     for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
1021         if (iter->moduleName != moduleName) {
1022             iter = abilityInfos.erase(iter);
1023         } else {
1024             ++iter;
1025         }
1026     }
1027 }
1028 
ImplicitQueryCloneAbilityInfos( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const1029 void BundleDataMgr::ImplicitQueryCloneAbilityInfos(
1030     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1031 {
1032     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfos");
1033     int32_t requestUserId = GetUserId(userId);
1034     if (requestUserId == Constants::INVALID_USERID) {
1035         return;
1036     }
1037 
1038     if (want.GetAction().empty() && want.GetEntities().empty()
1039         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1040         LOG_E(BMS_TAG_QUERY, "param invalid");
1041         return;
1042     }
1043     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1044         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1045     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1046     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1047     if (bundleInfos_.empty()) {
1048         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1049         return;
1050     }
1051     std::string bundleName = want.GetElement().GetBundleName();
1052     if (!bundleName.empty()) {
1053         // query in current bundleName
1054         if (!ImplicitQueryCurCloneAbilityInfos(want, flags, requestUserId, abilityInfos)) {
1055             return;
1056         }
1057     } else {
1058         // query all
1059         ImplicitQueryAllCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
1060     }
1061     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1062     // sort by priority, descending order.
1063     if (abilityInfos.size() > 1) {
1064         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1065             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1066     }
1067     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfos");
1068 }
1069 
ImplicitQueryAbilityInfos( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const1070 bool BundleDataMgr::ImplicitQueryAbilityInfos(
1071     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1072 {
1073     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1074     int32_t requestUserId = GetUserId(userId);
1075     if (requestUserId == Constants::INVALID_USERID) {
1076         return false;
1077     }
1078 
1079     if (want.GetAction().empty() && want.GetEntities().empty()
1080         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1081         LOG_E(BMS_TAG_QUERY, "param invalid");
1082         return false;
1083     }
1084     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1085         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1086     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1087     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1088     if (bundleInfos_.empty()) {
1089         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1090         return false;
1091     }
1092     std::string bundleName = want.GetElement().GetBundleName();
1093     if (!bundleName.empty()) {
1094         // query in current bundleName
1095         if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
1096             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s",
1097                 bundleName.c_str());
1098             return false;
1099         }
1100     } else {
1101         // query all
1102         ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
1103     }
1104     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1105     // sort by priority, descending order.
1106     if (abilityInfos.size() > 1) {
1107         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1108             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1109     }
1110     return true;
1111 }
1112 
ImplicitQueryAbilityInfosV9( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const1113 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
1114     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1115 {
1116     int32_t requestUserId = GetUserId(userId);
1117     if (requestUserId == Constants::INVALID_USERID) {
1118         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1119     }
1120 
1121     if (want.GetAction().empty() && want.GetEntities().empty()
1122         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1123         LOG_E(BMS_TAG_QUERY, "param invalid");
1124         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1125     }
1126     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1127         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1128     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1129     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1130     if (bundleInfos_.empty()) {
1131         APP_LOGW("bundleInfos_ is empty");
1132         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1133     }
1134     std::string bundleName = want.GetElement().GetBundleName();
1135     if (!bundleName.empty()) {
1136         // query in current bundleName
1137         ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1138         if (ret != ERR_OK) {
1139             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed bundleName:%{public}s",
1140                 bundleName.c_str());
1141             return ret;
1142         }
1143     } else {
1144         // query all
1145         ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1146     }
1147     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1148     // sort by priority, descending order.
1149     if (abilityInfos.size() > 1) {
1150         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1151             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1152     }
1153     return ERR_OK;
1154 }
1155 
ImplicitQueryCloneAbilityInfosV9( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const1156 void BundleDataMgr::ImplicitQueryCloneAbilityInfosV9(
1157     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1158 {
1159     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfosV9");
1160     int32_t requestUserId = GetUserId(userId);
1161     if (requestUserId == Constants::INVALID_USERID) {
1162         return;
1163     }
1164     if (want.GetAction().empty() && want.GetEntities().empty()
1165         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1166         LOG_E(BMS_TAG_QUERY, "param invalid");
1167         return;
1168     }
1169     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1170         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1171     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1172 
1173     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1174     if (bundleInfos_.empty()) {
1175         APP_LOGW("bundleInfos_ is empty");
1176         return;
1177     }
1178     std::string bundleName = want.GetElement().GetBundleName();
1179     if (!bundleName.empty()) {
1180         // query in current bundleName
1181         if (!ImplicitQueryCurCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos)) {
1182             return;
1183         }
1184     } else {
1185         // query all
1186         ImplicitQueryAllCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
1187     }
1188     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1189     // sort by priority, descending order.
1190     if (abilityInfos.size() > 1) {
1191         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1192             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1193     }
1194     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfosV9");
1195 }
1196 
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const1197 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
1198     const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const
1199 {
1200     LOG_D(BMS_TAG_QUERY,
1201         "begin to QueryAbilityInfoWithFlags flags=%{public}d,userId=%{public}d,appIndex=%{public}d",
1202         flags, userId, appIndex);
1203     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1204         !innerBundleInfo.IsSystemApp()) {
1205         LOG_W(BMS_TAG_QUERY, "no system app ability info for this calling");
1206         return false;
1207     }
1208     if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1209         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1210             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1211                 option->bundleName.c_str(), option->name.c_str());
1212             return false;
1213         }
1214     }
1215     info = (*option);
1216     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
1217         info.permissions.clear();
1218     }
1219     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1220         info.metaData.customizeData.clear();
1221         info.metadata.clear();
1222     }
1223     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
1224         info.skills.clear();
1225     }
1226     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
1227         innerBundleInfo.GetApplicationInfo(
1228             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
1229     }
1230     // set uid for NAPI cache use
1231     InnerBundleUserInfo innerBundleUserInfo;
1232     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1233         if (appIndex == 0) {
1234             info.uid = innerBundleUserInfo.uid;
1235         } else {
1236             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1237             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1238                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1239                 info.uid = cloneInfo.uid;
1240                 info.appIndex = cloneInfo.appIndex;
1241             } else {
1242                 LOG_W(BMS_TAG_QUERY, "can't find cloneInfos");
1243                 return false;
1244             }
1245         }
1246     }
1247     return true;
1248 }
1249 
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const1250 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
1251     int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info,
1252     int32_t appIndex) const
1253 {
1254     LOG_D(BMS_TAG_QUERY, "begin to QueryAbilityInfoWithFlagsV9");
1255     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1256         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
1257         !innerBundleInfo.IsSystemApp()) {
1258         LOG_W(BMS_TAG_QUERY, "target not system app");
1259         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1260     }
1261     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1262         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1263             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1264                 option->bundleName.c_str(), option->name.c_str());
1265             return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1266         }
1267     }
1268     info = (*option);
1269     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1270         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1271         info.permissions.clear();
1272     }
1273     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1274         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1275         info.metaData.customizeData.clear();
1276         info.metadata.clear();
1277     }
1278     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1279         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1280         info.skills.clear();
1281     }
1282     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1283         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1284         innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1285             userId, info.applicationInfo, appIndex);
1286     }
1287     // set uid for NAPI cache use
1288     InnerBundleUserInfo innerBundleUserInfo;
1289     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1290         if (appIndex == 0) {
1291             info.uid = innerBundleUserInfo.uid;
1292         } else {
1293             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1294             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1295                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1296                 info.uid = cloneInfo.uid;
1297                 info.appIndex = cloneInfo.appIndex;
1298             } else {
1299                 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1300             }
1301         }
1302     }
1303     return ERR_OK;
1304 }
1305 
ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const1306 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1307     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1308 {
1309     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfos");
1310     std::string bundleName = want.GetElement().GetBundleName();
1311     InnerBundleInfo innerBundleInfo;
1312     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
1313         LOG_W(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s", bundleName.c_str());
1314         return false;
1315     }
1316     if (appIndex > 0) {
1317         if (sandboxAppHelper_ == nullptr) {
1318             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1319             return false;
1320         }
1321         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1322         if (ret != ERR_OK) {
1323             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode:%{public}d bundleName:%{public}s",
1324                 ret, bundleName.c_str());
1325             return false;
1326         }
1327     }
1328     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1329     std::vector<std::string> mimeTypes;
1330     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1331     GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1332     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1333     return true;
1334 }
1335 
ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const1336 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1337     std::vector<AbilityInfo> &abilityInfos) const
1338 {
1339     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfos");
1340     std::string bundleName = want.GetElement().GetBundleName();
1341     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1342     if (cloneAppIndexes.empty()) {
1343         return false;
1344     }
1345     std::vector<std::string> mimeTypes;
1346     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1347     for (int32_t appIndex: cloneAppIndexes) {
1348         InnerBundleInfo innerBundleInfo;
1349         if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex)) {
1350             continue;
1351         }
1352         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1353 
1354         GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1355         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1356     }
1357     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfos");
1358     return true;
1359 }
1360 
ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const1361 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1362     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1363 {
1364     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1365     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfosV9");
1366     std::string bundleName = want.GetElement().GetBundleName();
1367     InnerBundleInfo innerBundleInfo;
1368     if (appIndex == 0) {
1369         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1370         if (ret != ERR_OK) {
1371             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s",
1372                 bundleName.c_str());
1373             return ret;
1374         }
1375     }
1376     if (appIndex > 0) {
1377         if (sandboxAppHelper_ == nullptr) {
1378             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1379             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1380         }
1381         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1382         if (ret != ERR_OK) {
1383             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d bundleName:%{public}s",
1384                 ret, bundleName.c_str());
1385             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1386         }
1387     }
1388     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1389     std::vector<std::string> mimeTypes;
1390     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1391     GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1392     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1393     return ERR_OK;
1394 }
1395 
ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const1396 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1397     std::vector<AbilityInfo> &abilityInfos) const
1398 {
1399     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfosV9");
1400     std::string bundleName = want.GetElement().GetBundleName();
1401 
1402     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1403     if (cloneAppIndexes.empty()) {
1404         return false;
1405     }
1406     std::vector<std::string> mimeTypes;
1407     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1408     for (int32_t appIndex: cloneAppIndexes) {
1409         InnerBundleInfo innerBundleInfo;
1410         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
1411         if (ret != ERR_OK) {
1412             LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1413                 bundleName.c_str(), appIndex);
1414             continue;
1415         }
1416         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1417         GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1418         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1419     }
1420     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfosV9");
1421     return true;
1422 }
1423 
ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const1424 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1425     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1426 {
1427     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfos");
1428     int32_t requestUserId = GetUserId(userId);
1429     if (requestUserId == Constants::INVALID_USERID) {
1430         LOG_W(BMS_TAG_QUERY, "invalid userId");
1431         return;
1432     }
1433     std::vector<std::string> mimeTypes;
1434     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1435     // query from bundleInfos_
1436     if (appIndex == 0) {
1437         for (const auto &item : bundleInfos_) {
1438             const InnerBundleInfo &innerBundleInfo = item.second;
1439             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1440             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1441                 LOG_D(BMS_TAG_QUERY,
1442                     "ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1443                     innerBundleInfo.GetBundleName().c_str(), responseUserId);
1444                 continue;
1445             }
1446             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1447         }
1448     } else {
1449         // query from sandbox manager for sandbox bundle
1450         if (sandboxAppHelper_ == nullptr) {
1451             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1452             return;
1453         }
1454         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1455         for (const auto &item : sandboxMap) {
1456             InnerBundleInfo info;
1457             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1458             if (pos == std::string::npos) {
1459                 LOG_D(BMS_TAG_QUERY, "sandbox map contains invalid element");
1460                 continue;
1461             }
1462             std::string innerBundleName = item.first.substr(pos + 1);
1463             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1464                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1465                 continue;
1466             }
1467             int32_t responseUserId = info.GetResponseUserId(userId);
1468             GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1469         }
1470     }
1471     APP_LOGD("finish to ImplicitQueryAllAbilityInfos");
1472 }
1473 
ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const1474 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1475     std::vector<AbilityInfo> &abilityInfos) const
1476 {
1477     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfos");
1478     int32_t requestUserId = GetUserId(userId);
1479     if (requestUserId == Constants::INVALID_USERID) {
1480         LOG_W(BMS_TAG_QUERY, "invalid userId");
1481         return;
1482     }
1483     std::vector<std::string> mimeTypes;
1484     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1485     for (const auto &item : bundleInfos_) {
1486         const InnerBundleInfo &innerBundleInfo = item.second;
1487         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
1488         if (cloneAppIndexes.empty()) {
1489             continue;
1490         }
1491         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1492         for (int32_t appIndex: cloneAppIndexes) {
1493             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
1494                 LOG_D(BMS_TAG_QUERY,
1495                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
1496                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
1497                 continue;
1498             }
1499             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1500         }
1501     }
1502     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfos");
1503 }
1504 
ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const1505 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1506     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1507 {
1508     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1509     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfosV9");
1510     // query from bundleInfos_
1511     std::vector<std::string> mimeTypes;
1512     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1513     if (appIndex == 0) {
1514         for (const auto &item : bundleInfos_) {
1515             InnerBundleInfo innerBundleInfo;
1516             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
1517             if (ret != ERR_OK) {
1518                 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed -n %{public}s", item.first.c_str());
1519                 continue;
1520             }
1521 
1522             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1523             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1524         }
1525     } else {
1526         // query from sandbox manager for sandbox bundle
1527         if (sandboxAppHelper_ == nullptr) {
1528             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1529             return;
1530         }
1531         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1532         for (const auto &item : sandboxMap) {
1533             InnerBundleInfo info;
1534             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1535             if (pos == std::string::npos) {
1536                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
1537                 continue;
1538             }
1539             std::string innerBundleName = item.first.substr(pos + 1);
1540             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1541                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1542                 continue;
1543             }
1544 
1545             int32_t responseUserId = info.GetResponseUserId(userId);
1546             GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1547         }
1548     }
1549     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllAbilityInfosV9");
1550 }
1551 
ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const1552 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1553     std::vector<AbilityInfo> &abilityInfos) const
1554 {
1555     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfosV9");
1556     std::vector<std::string> mimeTypes;
1557     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1558     for (const auto &item : bundleInfos_) {
1559         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(item.second.GetBundleName(), userId);
1560         if (cloneAppIndexes.empty()) {
1561             continue;
1562         }
1563         for (int32_t appIndex: cloneAppIndexes) {
1564             InnerBundleInfo innerBundleInfo;
1565             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId, appIndex);
1566             if (ret != ERR_OK) {
1567                 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1568                     item.first.c_str(), appIndex);
1569                 continue;
1570             }
1571 
1572             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1573             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1574         }
1575     }
1576     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfosV9");
1577 }
1578 
CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const1579 bool BundleDataMgr::CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const
1580 {
1581     return (static_cast<uint32_t>(flags) & static_cast<uint32_t>(abilityInfoFlag)) == abilityInfoFlag;
1582 }
1583 
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) const1584 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags, const InnerBundleInfo &info,
1585     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1586     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1587 {
1588     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1589     if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_SYSTEMAPP_ONLY) && !info.IsSystemApp()) {
1590         return;
1591     }
1592     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1593     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1594         bool isPrivateType = MatchPrivateType(
1595             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1596         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1597         if (skillsPair == skillInfos.end()) {
1598             continue;
1599         }
1600         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1601             const Skill &skill = skillsPair->second[skillIndex];
1602             size_t matchUriIndex = 0;
1603             if (isPrivateType || skill.Match(want, matchUriIndex)) {
1604                 AbilityInfo abilityinfo = abilityInfoPair.second;
1605                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1606                     continue;
1607                 }
1608                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_DISABLE) &&
1609                     !info.IsAbilityEnabled(abilityinfo, GetUserId(userId), appIndex)) {
1610                     LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityinfo.name.c_str());
1611                     continue;
1612                 }
1613                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_APPLICATION)) {
1614                     info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1615                         userId, abilityinfo.applicationInfo, appIndex);
1616                 }
1617                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_PERMISSION)) {
1618                     abilityinfo.permissions.clear();
1619                 }
1620                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_METADATA)) {
1621                     abilityinfo.metaData.customizeData.clear();
1622                     abilityinfo.metadata.clear();
1623                 }
1624                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL)) {
1625                     abilityinfo.skills.clear();
1626                 }
1627                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL_URI)) {
1628                     AddSkillUrisInfo(skillsPair->second, abilityinfo.skillUri, skillIndex, matchUriIndex);
1629                 }
1630                 abilityinfo.appIndex = appIndex;
1631                 abilityInfos.emplace_back(abilityinfo);
1632                 break;
1633             }
1634         }
1635     }
1636 }
1637 
AddSkillUrisInfo(const std::vector<Skill> &skills, std::vector<SkillUriForAbilityAndExtension> &skillUris, std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const1638 void BundleDataMgr::AddSkillUrisInfo(const std::vector<Skill> &skills,
1639     std::vector<SkillUriForAbilityAndExtension> &skillUris,
1640     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const
1641 {
1642     for (size_t skillIndex = 0; skillIndex < skills.size(); ++skillIndex) {
1643         const Skill &skill = skills[skillIndex];
1644         for (size_t uriIndex = 0; uriIndex < skill.uris.size(); ++uriIndex) {
1645             const SkillUri &uri = skill.uris[uriIndex];
1646             SkillUriForAbilityAndExtension skillinfo;
1647             skillinfo.scheme = uri.scheme;
1648             skillinfo.host = uri.host;
1649             skillinfo.port = uri.port;
1650             skillinfo.path = uri.path;
1651             skillinfo.pathStartWith = uri.pathStartWith;
1652             skillinfo.pathRegex = uri.pathRegex;
1653             skillinfo.type = uri.type;
1654             skillinfo.utd = uri.utd;
1655             skillinfo.maxFileSupported = uri.maxFileSupported;
1656             skillinfo.linkFeature = uri.linkFeature;
1657             if (matchSkillIndex.has_value() && matchUriIndex.has_value() &&
1658                 skillIndex == matchSkillIndex.value() && uriIndex == matchUriIndex.value()) {
1659                 skillinfo.isMatch = true;
1660             }
1661             skillUris.emplace_back(skillinfo);
1662         }
1663     }
1664 }
1665 
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) const1666 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
1667     AbilityInfo &abilityInfo, int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos,
1668     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
1669 {
1670     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1671         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1672         if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId), appIndex)) {
1673             LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityInfo.name.c_str());
1674             return;
1675         }
1676     }
1677     if ((static_cast<uint32_t>(flags) &
1678         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1679         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1680         info.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1681             userId, abilityInfo.applicationInfo, appIndex);
1682     }
1683     if ((static_cast<uint32_t>(flags) &
1684         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1685         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1686         abilityInfo.permissions.clear();
1687     }
1688     if ((static_cast<uint32_t>(flags) &
1689         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1690         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1691         abilityInfo.metaData.customizeData.clear();
1692         abilityInfo.metadata.clear();
1693     }
1694     if ((static_cast<uint32_t>(flags) &
1695         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1696         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1697         abilityInfo.skills.clear();
1698     }
1699     if ((static_cast<uint32_t>(flags) &
1700         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) ==
1701         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) {
1702         AddSkillUrisInfo(skills, abilityInfo.skillUri, matchSkillIndex, matchUriIndex);
1703     }
1704     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
1705         // set uid for NAPI cache use
1706         InnerBundleUserInfo innerBundleUserInfo;
1707         if (info.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1708             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1709             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1710                 abilityInfo.uid = innerBundleUserInfo.cloneInfos.at(appIndexKey).uid;
1711                 abilityInfo.appIndex = innerBundleUserInfo.cloneInfos.at(appIndexKey).appIndex;
1712             }
1713         }
1714     }
1715     infos.emplace_back(abilityInfo);
1716 }
1717 
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) const1718 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags, const InnerBundleInfo &info,
1719     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1720     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1721 {
1722     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1723     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1724         static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1725         LOG_W(BMS_TAG_QUERY, "target not system app");
1726         return;
1727     }
1728     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1729     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1730         AbilityInfo abilityinfo = abilityInfoPair.second;
1731         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1732         if (skillsPair == skillInfos.end()) {
1733             continue;
1734         }
1735         bool isPrivateType = MatchPrivateType(
1736             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1737         if (isPrivateType) {
1738             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1739                 std::nullopt, std::nullopt, appIndex);
1740             continue;
1741         }
1742         if (want.GetAction() == SHARE_ACTION) {
1743             if (!MatchShare(want, skillsPair->second)) {
1744                 continue;
1745             }
1746             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1747                 std::nullopt, std::nullopt, appIndex);
1748             continue;
1749         }
1750         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1751             const Skill &skill = skillsPair->second[skillIndex];
1752             size_t matchUriIndex = 0;
1753             if (skill.Match(want, matchUriIndex)) {
1754                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1755                     continue;
1756                 }
1757                 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1758                     skillIndex, matchUriIndex, appIndex);
1759                 break;
1760             }
1761         }
1762     }
1763 }
1764 
MatchShare(const Want &want, const std::vector<Skill> &skills) const1765 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1766 {
1767     if (want.GetAction() != SHARE_ACTION) {
1768         LOG_E(BMS_TAG_QUERY, "action not action");
1769         return false;
1770     }
1771     std::vector<Skill> shareActionSkills = FindSkillsContainShareAction(skills);
1772     if (shareActionSkills.empty()) {
1773         LOG_D(BMS_TAG_QUERY, "shareActionSkills is empty");
1774         return false;
1775     }
1776     auto wantParams = want.GetParams();
1777     auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1778     int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1779     if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1780         LOG_W(BMS_TAG_QUERY, "Invalid total count");
1781     }
1782     auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1783     auto utds = shareSummary.KeySet();
1784     for (const auto &utd : utds) {
1785         int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1786         if (count <= DEFAULT_SUMMARY_COUNT) {
1787             LOG_W(BMS_TAG_QUERY, "invalid utd count");
1788             return false;
1789         }
1790         bool match = false;
1791         for (const auto &skill : shareActionSkills) {
1792             if (MatchUtd(skill, utd, count)) {
1793                 match = true;
1794                 break;
1795             }
1796         }
1797         if (!match) {
1798             LOG_D(BMS_TAG_QUERY, "match failed");
1799             return false;
1800         }
1801     }
1802     return true;
1803 }
1804 
MatchUtd(const Skill &skill, const std::string &utd, int32_t count) const1805 bool BundleDataMgr::MatchUtd(const Skill &skill, const std::string &utd, int32_t count) const
1806 {
1807     for (const SkillUri &skillUri : skill.uris) {
1808         if (skillUri.maxFileSupported < count) {
1809             continue;
1810         }
1811         if (!skillUri.utd.empty()) {
1812             if (MatchUtd(skillUri.utd, utd)) {
1813                 return true;
1814             }
1815         } else {
1816             if (MatchTypeWithUtd(skillUri.type, utd)) {
1817                 return true;
1818             }
1819         }
1820     }
1821     return false;
1822 }
1823 
MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const1824 bool BundleDataMgr::MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const
1825 {
1826 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1827     LOG_W(BMS_TAG_QUERY, "skillUtd %{public}s, wantUtd %{public}s", skillUtd.c_str(), wantUtd.c_str());
1828     std::shared_ptr<UDMF::TypeDescriptor> wantTypeDescriptor;
1829     auto ret = UDMF::UtdClient::GetInstance().GetTypeDescriptor(wantUtd, wantTypeDescriptor);
1830     if (ret != ERR_OK || wantTypeDescriptor == nullptr) {
1831         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1832         return false;
1833     }
1834     bool matchRet = false;
1835     ret = wantTypeDescriptor->BelongsTo(skillUtd, matchRet);
1836     if (ret != ERR_OK) {
1837         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1838         return false;
1839     }
1840     return matchRet;
1841 #endif
1842     return false;
1843 }
1844 
MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const1845 bool BundleDataMgr::MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const
1846 {
1847 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1848     LOG_W(BMS_TAG_QUERY, "mimeType %{public}s, wantUtd %{public}s", mimeType.c_str(), wantUtd.c_str());
1849     std::vector<std::string> typeUtdVector = BundleUtil::GetUtdVectorByMimeType(mimeType);
1850     for (const std::string &typeUtd : typeUtdVector) {
1851         if (MatchUtd(typeUtd, wantUtd)) {
1852             return true;
1853         }
1854     }
1855     return false;
1856 #endif
1857     return false;
1858 }
1859 
FindSkillsContainShareAction(const std::vector<Skill> &skills) const1860 std::vector<Skill> BundleDataMgr::FindSkillsContainShareAction(const std::vector<Skill> &skills) const
1861 {
1862     std::vector<Skill> shareActionSkills;
1863     for (const auto &skill : skills) {
1864         auto &actions = skill.actions;
1865         auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1866             return SHARE_ACTION == action;
1867         });
1868         if (matchAction == actions.end()) {
1869             continue;
1870         }
1871         shareActionSkills.emplace_back(skill);
1872     }
1873     return shareActionSkills;
1874 }
1875 
ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const1876 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1877 {
1878     if (abilityInfo.labelId == 0) {
1879         if (isStage) {
1880             abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1881             abilityInfo.label = abilityInfo.applicationInfo.label;
1882         } else {
1883             abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1884             abilityInfo.label = abilityInfo.bundleName;
1885         }
1886     }
1887 
1888     if (abilityInfo.iconId == 0) {
1889         abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1890     }
1891 }
1892 
GetMatchLauncherAbilityInfos(const Want& want, const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos, int64_t installTime, int32_t userId) const1893 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1894     const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1895     int64_t installTime, int32_t userId) const
1896 {
1897     int32_t requestUserId = GetUserId(userId);
1898     if (requestUserId == Constants::INVALID_USERID) {
1899         APP_LOGD("request user id is invalid");
1900         return;
1901     }
1902     int32_t responseUserId = info.GetResponseUserId(requestUserId);
1903     if (responseUserId == Constants::INVALID_USERID) {
1904         APP_LOGD("response user id is invalid");
1905         return;
1906     }
1907     // get clone bundle info
1908     InnerBundleUserInfo bundleUserInfo;
1909     (void)info.GetInnerBundleUserInfo(responseUserId, bundleUserInfo);
1910     if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(info.GetBundleName()) !=
1911         ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) {
1912         GetMultiLauncherAbilityInfo(want, info, bundleUserInfo, installTime, abilityInfos);
1913         return;
1914     }
1915     AbilityInfo mainAbilityInfo;
1916     info.GetMainAbilityInfo(mainAbilityInfo);
1917     if (!mainAbilityInfo.name.empty() && (mainAbilityInfo.type == AbilityType::PAGE)) {
1918         APP_LOGD("bundleName %{public}s exist mainAbility", info.GetBundleName().c_str());
1919         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1920             responseUserId, mainAbilityInfo.applicationInfo);
1921         if (mainAbilityInfo.applicationInfo.removable && info.IsNeedSendNotify()) {
1922             mainAbilityInfo.applicationInfo.removable = info.GetUninstallState();
1923         }
1924         mainAbilityInfo.installTime = installTime;
1925         // fix labelId or iconId is equal 0
1926         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), mainAbilityInfo);
1927         abilityInfos.emplace_back(mainAbilityInfo);
1928         GetMatchLauncherAbilityInfosForCloneInfos(info, mainAbilityInfo, bundleUserInfo,
1929             abilityInfos);
1930         return;
1931     }
1932     // add app detail ability
1933     if (info.GetBaseApplicationInfo().needAppDetail) {
1934         LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s add detail ability info", info.GetBundleName().c_str());
1935         std::string moduleName = "";
1936         auto ability = info.FindAbilityInfo(moduleName, ServiceConstants::APP_DETAIL_ABILITY, responseUserId);
1937         if (!ability) {
1938             LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s cant find ability", info.GetBundleName().c_str());
1939             return;
1940         }
1941         if (!info.GetIsNewVersion()) {
1942             ability->applicationInfo.label = info.GetBundleName();
1943         }
1944         ability->installTime = installTime;
1945         abilityInfos.emplace_back(*ability);
1946         GetMatchLauncherAbilityInfosForCloneInfos(info, *ability, bundleUserInfo, abilityInfos);
1947     }
1948 }
1949 
GetMultiLauncherAbilityInfo(const Want& want, const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo, int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const1950 void BundleDataMgr::GetMultiLauncherAbilityInfo(const Want& want,
1951     const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo,
1952     int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const
1953 {
1954     int32_t count = 0;
1955     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1956     for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
1957         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1958         if (skillsPair == skillInfos.end()) {
1959             continue;
1960         }
1961         for (const Skill& skill : skillsPair->second) {
1962             if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
1963                 count++;
1964                 AbilityInfo abilityInfo = abilityInfoPair.second;
1965                 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1966                     bundleUserInfo.bundleUserInfo.userId, abilityInfo.applicationInfo);
1967                 abilityInfo.installTime = installTime;
1968                 // fix labelId or iconId is equal 0
1969                 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), abilityInfo);
1970                 abilityInfos.emplace_back(abilityInfo);
1971                 GetMatchLauncherAbilityInfosForCloneInfos(info, abilityInfoPair.second, bundleUserInfo, abilityInfos);
1972                 break;
1973             }
1974         }
1975     }
1976     APP_LOGI_NOFUNC("GetMultiLauncherAbilityInfo -n %{public}s has %{public}d launcher ability",
1977         info.GetBundleName().c_str(), count);
1978 }
1979 
GetMatchLauncherAbilityInfosForCloneInfos( const InnerBundleInfo& info, const AbilityInfo &abilityInfo, const InnerBundleUserInfo &bundleUserInfo, std::vector<AbilityInfo>& abilityInfos) const1980 void BundleDataMgr::GetMatchLauncherAbilityInfosForCloneInfos(
1981     const InnerBundleInfo& info,
1982     const AbilityInfo &abilityInfo,
1983     const InnerBundleUserInfo &bundleUserInfo,
1984     std::vector<AbilityInfo>& abilityInfos) const
1985 {
1986     for (const auto &item : bundleUserInfo.cloneInfos) {
1987         APP_LOGD("bundleName:%{public}s appIndex:%{public}d start", info.GetBundleName().c_str(), item.second.appIndex);
1988         AbilityInfo cloneAbilityInfo = abilityInfo;
1989         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1990             bundleUserInfo.bundleUserInfo.userId, cloneAbilityInfo.applicationInfo, item.second.appIndex);
1991         cloneAbilityInfo.installTime = item.second.installTime;
1992         cloneAbilityInfo.uid = item.second.uid;
1993         cloneAbilityInfo.appIndex = item.second.appIndex;
1994         // fix labelId or iconId is equal 0
1995         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), cloneAbilityInfo);
1996         abilityInfos.emplace_back(cloneAbilityInfo);
1997     }
1998 }
1999 
ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo, ApplicationInfo &applicationInfo) const2000 void BundleDataMgr::ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2001     ApplicationInfo &applicationInfo) const
2002 {
2003     applicationInfo.accessTokenId = cloneInfo.accessTokenId;
2004     applicationInfo.accessTokenIdEx = cloneInfo.accessTokenIdEx;
2005     applicationInfo.enabled = cloneInfo.enabled;
2006     applicationInfo.uid = cloneInfo.uid;
2007     applicationInfo.appIndex = cloneInfo.appIndex;
2008 }
2009 
ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo, BundleInfo &bundleInfo) const2010 void BundleDataMgr::ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2011     BundleInfo &bundleInfo) const
2012 {
2013     bundleInfo.uid = cloneInfo.uid;
2014     bundleInfo.gid = cloneInfo.uid; // no gids, need add
2015     bundleInfo.installTime = cloneInfo.installTime;
2016     bundleInfo.appIndex = cloneInfo.appIndex;
2017     if (!bundleInfo.applicationInfo.bundleName.empty()) {
2018         ModifyApplicationInfoByCloneInfo(cloneInfo, bundleInfo.applicationInfo);
2019     }
2020 }
2021 
GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId, BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const2022 void BundleDataMgr::GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId,
2023     BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const
2024 {
2025     // get clone bundle info
2026     InnerBundleUserInfo bundleUserInfo;
2027     (void)info.GetInnerBundleUserInfo(userId, bundleUserInfo);
2028     if (bundleUserInfo.cloneInfos.empty()) {
2029         return;
2030     }
2031     LOG_D(BMS_TAG_QUERY, "app %{public}s start get bundle clone info",
2032         info.GetBundleName().c_str());
2033     for (const auto &item : bundleUserInfo.cloneInfos) {
2034         BundleInfo cloneBundleInfo;
2035         ErrCode ret = info.GetBundleInfoV9(flags, cloneBundleInfo, userId, item.second.appIndex);
2036         if (ret == ERR_OK) {
2037             ProcessBundleMenu(cloneBundleInfo, flags, true);
2038             ProcessBundleRouterMap(cloneBundleInfo, flags);
2039             bundleInfos.emplace_back(cloneBundleInfo);
2040         }
2041     }
2042 }
2043 
GetBundleNameAndIndexByName( const std::string &keyName, std::string &bundleName, int32_t &appIndex) const2044 void BundleDataMgr::GetBundleNameAndIndexByName(
2045     const std::string &keyName, std::string &bundleName, int32_t &appIndex) const
2046 {
2047     bundleName = keyName;
2048     appIndex = 0;
2049     // for clone bundle name
2050     auto pos = keyName.find(CLONE_BUNDLE_PREFIX);
2051     if ((pos == std::string::npos) || (pos == 0)) {
2052         return;
2053     }
2054     std::string index = keyName.substr(0, pos);
2055     if (!OHOS::StrToInt(index, appIndex)) {
2056         appIndex = 0;
2057         return;
2058     }
2059     bundleName = keyName.substr(pos + strlen(CLONE_BUNDLE_PREFIX));
2060 }
2061 
GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const2062 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const
2063 {
2064     std::vector<int32_t> cloneAppIndexes;
2065     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2066     if (userId == Constants::ANY_USERID) {
2067         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2068             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2069             return cloneAppIndexes;
2070         }
2071         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2072     }
2073     int32_t requestUserId = GetUserId(userId);
2074     if (requestUserId == Constants::INVALID_USERID) {
2075         return cloneAppIndexes;
2076     }
2077     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2078     auto infoItem = bundleInfos_.find(bundleName);
2079     if (infoItem == bundleInfos_.end()) {
2080         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2081         return cloneAppIndexes;
2082     }
2083     const InnerBundleInfo &bundleInfo = infoItem->second;
2084     InnerBundleUserInfo innerBundleUserInfo;
2085     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2086         return cloneAppIndexes;
2087     }
2088     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2089     if (cloneInfos.empty()) {
2090         return cloneAppIndexes;
2091     }
2092     for (const auto &cloneInfo : cloneInfos) {
2093         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes: %{public}d", cloneInfo.second.appIndex);
2094         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2095     }
2096     return cloneAppIndexes;
2097 }
2098 
GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const2099 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const
2100 {
2101     std::vector<int32_t> cloneAppIndexes;
2102     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2103     if (userId == Constants::ANY_USERID) {
2104         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2105             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2106             return cloneAppIndexes;
2107         }
2108         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2109     }
2110     int32_t requestUserId = GetUserId(userId);
2111     if (requestUserId == Constants::INVALID_USERID) {
2112         return cloneAppIndexes;
2113     }
2114     auto infoItem = bundleInfos_.find(bundleName);
2115     if (infoItem == bundleInfos_.end()) {
2116         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2117         return cloneAppIndexes;
2118     }
2119     const InnerBundleInfo &bundleInfo = infoItem->second;
2120     InnerBundleUserInfo innerBundleUserInfo;
2121     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2122         return cloneAppIndexes;
2123     }
2124     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2125     if (cloneInfos.empty()) {
2126         return cloneAppIndexes;
2127     }
2128     for (const auto &cloneInfo : cloneInfos) {
2129         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes unLock: %{public}d", cloneInfo.second.appIndex);
2130         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2131     }
2132     return cloneAppIndexes;
2133 }
2134 
AddAppDetailAbilityInfo(InnerBundleInfo &info) const2135 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
2136 {
2137     AbilityInfo appDetailAbility;
2138     appDetailAbility.name = ServiceConstants::APP_DETAIL_ABILITY;
2139     appDetailAbility.bundleName = info.GetBundleName();
2140     appDetailAbility.enabled = true;
2141     appDetailAbility.type = AbilityType::PAGE;
2142     appDetailAbility.isNativeAbility = true;
2143 
2144     ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
2145     appDetailAbility.applicationName = applicationInfo.name;
2146     appDetailAbility.labelId = applicationInfo.labelResource.id;
2147     if (!info.GetIsNewVersion()) {
2148         appDetailAbility.labelId = 0;
2149         appDetailAbility.label = info.GetBundleName();
2150     }
2151     appDetailAbility.iconId = applicationInfo.iconResource.id;
2152     appDetailAbility.moduleName = applicationInfo.iconResource.moduleName;
2153 
2154     if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
2155         LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo appDetailAbility.iconId is 0");
2156         // get system resource icon Id
2157         auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
2158         if (iter != bundleInfos_.end()) {
2159             LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo get system resource iconId");
2160             appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
2161         } else {
2162             LOG_W(BMS_TAG_QUERY, "AddAppDetailAbilityInfo error: ohos.global.systemres does not exist");
2163         }
2164     }
2165     // not show in the mission list
2166     appDetailAbility.removeMissionAfterTerminate = true;
2167     // set hapPath, for label resource
2168     auto innerModuleInfo = info.GetInnerModuleInfoByModuleName(appDetailAbility.moduleName);
2169     if (innerModuleInfo) {
2170         appDetailAbility.package = innerModuleInfo->modulePackage;
2171         appDetailAbility.hapPath = innerModuleInfo->hapPath;
2172     }
2173     appDetailAbility.visible = true;
2174     std::string keyName;
2175     keyName.append(appDetailAbility.bundleName).append(".")
2176         .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
2177     info.InsertAbilitiesInfo(keyName, appDetailAbility);
2178 }
2179 
GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos, const int32_t userId, const int32_t requestUserId) const2180 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2181     const int32_t userId, const int32_t requestUserId) const
2182 {
2183     for (const auto &item : bundleInfos_) {
2184         const InnerBundleInfo &info = item.second;
2185         if (info.IsDisabled()) {
2186             LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2187             continue;
2188         }
2189         if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2190             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
2191             continue;
2192         }
2193         if (info.GetBaseBundleInfo().entryInstallationFree) {
2194             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon",
2195                 info.GetBundleName().c_str());
2196             continue;
2197         }
2198 
2199         // get installTime from innerBundleUserInfo
2200         int64_t installTime = 0;
2201         std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2202         std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2203         auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2204             [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2205             return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2206         });
2207         if (iter != info.GetInnerBundleUserInfos().end()) {
2208             installTime = iter->second.installTime;
2209         }
2210         GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
2211     }
2212 }
2213 
GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos, const int32_t userId, const int32_t requestUserId) const2214 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2215     const int32_t userId, const int32_t requestUserId) const
2216 {
2217     ElementName element = want.GetElement();
2218     std::string bundleName = element.GetBundleName();
2219     const auto &item = bundleInfos_.find(bundleName);
2220     if (item == bundleInfos_.end()) {
2221         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2222         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2223     }
2224     const InnerBundleInfo &info = item->second;
2225     if (info.IsDisabled()) {
2226         LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2227         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
2228     }
2229     if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2230         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2231         return ERR_OK;
2232     }
2233     if (info.GetBaseBundleInfo().entryInstallationFree) {
2234         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2235         return ERR_OK;
2236     }
2237     // get installTime from innerBundleUserInfo
2238     int64_t installTime = 0;
2239     std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2240     std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2241     auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2242         [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2243         return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2244     });
2245     if (iter != info.GetInnerBundleUserInfos().end()) {
2246         installTime = iter->second.installTime;
2247     }
2248     GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2249     FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2250     return ERR_OK;
2251 }
2252 
QueryLauncherAbilityInfos( const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const2253 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
2254     const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
2255 {
2256     int32_t requestUserId = GetUserId(userId);
2257     if (requestUserId == Constants::INVALID_USERID) {
2258         LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2259         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2260     }
2261     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2262     if (bundleInfos_.empty()) {
2263         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
2264         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2265     }
2266 
2267     ElementName element = want.GetElement();
2268     std::string bundleName = element.GetBundleName();
2269     if (bundleName.empty()) {
2270         // query all launcher ability
2271         GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
2272         return ERR_OK;
2273     }
2274     // query definite abilities by bundle name
2275     ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
2276     if (ret == ERR_OK) {
2277         LOG_D(BMS_TAG_QUERY, "ability infos have been found");
2278     }
2279     return ret;
2280 }
2281 
QueryAbilityInfoByUri( const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const2282 bool BundleDataMgr::QueryAbilityInfoByUri(
2283     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
2284 {
2285     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2286     int32_t requestUserId = GetUserId(userId);
2287     if (requestUserId == Constants::INVALID_USERID) {
2288         return false;
2289     }
2290 
2291     if (abilityUri.empty()) {
2292         return false;
2293     }
2294     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2295         return false;
2296     }
2297     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2298     if (bundleInfos_.empty()) {
2299         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2300         return false;
2301     }
2302     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2303     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2304     if (posFirstSeparator == std::string::npos) {
2305         return false;
2306     }
2307     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2308     std::string uri;
2309     if (posSecondSeparator == std::string::npos) {
2310         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2311     } else {
2312         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2313     }
2314     for (const auto &item : bundleInfos_) {
2315         const InnerBundleInfo &info = item.second;
2316         if (info.IsDisabled()) {
2317             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2318             continue;
2319         }
2320 
2321         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2322         if (!info.GetApplicationEnabled(responseUserId)) {
2323             continue;
2324         }
2325 
2326         auto ability = info.FindAbilityInfoByUri(uri);
2327         if (!ability) {
2328             continue;
2329         }
2330 
2331         abilityInfo = (*ability);
2332         info.GetApplicationInfo(
2333             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
2334             abilityInfo.applicationInfo);
2335         return true;
2336     }
2337 
2338     LOG_W(BMS_TAG_QUERY, "query abilityUri(%{private}s) failed", abilityUri.c_str());
2339     return false;
2340 }
2341 
QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)2342 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
2343 {
2344     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2345     if (abilityUri.empty()) {
2346         return false;
2347     }
2348     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2349         return false;
2350     }
2351     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2352     if (bundleInfos_.empty()) {
2353         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2354         return false;
2355     }
2356     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2357     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2358     if (posFirstSeparator == std::string::npos) {
2359         return false;
2360     }
2361     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2362     std::string uri;
2363     if (posSecondSeparator == std::string::npos) {
2364         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2365     } else {
2366         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2367     }
2368 
2369     for (auto &item : bundleInfos_) {
2370         InnerBundleInfo &info = item.second;
2371         if (info.IsDisabled()) {
2372             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2373             continue;
2374         }
2375         info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
2376     }
2377     if (abilityInfos.size() == 0) {
2378         return false;
2379     }
2380 
2381     return true;
2382 }
2383 
GetApplicationInfo( const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const2384 bool BundleDataMgr::GetApplicationInfo(
2385     const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
2386 {
2387     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2388     int32_t requestUserId = GetUserId(userId);
2389     if (requestUserId == Constants::INVALID_USERID) {
2390         return false;
2391     }
2392 
2393     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2394     InnerBundleInfo innerBundleInfo;
2395     if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
2396         LOG_D(BMS_TAG_QUERY, "GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
2397         return false;
2398     }
2399 
2400     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2401     innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
2402     return true;
2403 }
2404 
GetApplicationInfoV9( const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const2405 ErrCode BundleDataMgr::GetApplicationInfoV9(
2406     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const
2407 {
2408     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2409     int32_t requestUserId = GetUserId(userId);
2410     if (requestUserId == Constants::INVALID_USERID) {
2411         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2412     }
2413 
2414     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2415     InnerBundleInfo innerBundleInfo;
2416     int32_t flag = 0;
2417     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2418         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2419         flag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2420     }
2421     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId, appIndex);
2422     if (ret != ERR_OK) {
2423         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2424             appName.c_str(), requestUserId, appIndex);
2425         return ret;
2426     }
2427 
2428     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2429     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo, appIndex);
2430     if (ret != ERR_OK) {
2431         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2432             appName.c_str(), responseUserId, appIndex);
2433         return ret;
2434     }
2435     return ret;
2436 }
2437 
GetApplicationInfoWithResponseId( const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const2438 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
2439     const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
2440 {
2441     int32_t requestUserId = GetUserId(userId);
2442     if (requestUserId == Constants::INVALID_USERID) {
2443         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2444     }
2445 
2446     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2447     InnerBundleInfo innerBundleInfo;
2448     int32_t flag = 0;
2449     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2450         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2451         flag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2452     }
2453     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
2454     if (ret != ERR_OK) {
2455         LOG_D(BMS_TAG_QUERY,
2456             "GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
2457             appName.c_str(), requestUserId);
2458         return ret;
2459     }
2460 
2461     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2462     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
2463     if (ret != ERR_OK) {
2464         LOG_D(BMS_TAG_QUERY,
2465             "GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
2466             appName.c_str(), responseUserId);
2467         return ret;
2468     }
2469     userId = responseUserId;
2470     return ret;
2471 }
2472 
GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags, std::vector<ApplicationInfo> &appInfos) const2473 void BundleDataMgr::GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2474     std::vector<ApplicationInfo> &appInfos) const
2475 {
2476     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2477     for (int32_t appIndex : appIndexVec) {
2478         bool isEnabled = false;
2479         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2480         if (ret != ERR_OK) {
2481             continue;
2482         }
2483         if (isEnabled || (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2484             ApplicationInfo cloneAppInfo;
2485             info.GetApplicationInfo(flags, userId, cloneAppInfo, appIndex);
2486             if (cloneAppInfo.appIndex == appIndex) {
2487                 appInfos.emplace_back(cloneAppInfo);
2488             }
2489         }
2490     }
2491 }
2492 
GetApplicationInfos( int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const2493 bool BundleDataMgr::GetApplicationInfos(
2494     int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
2495 {
2496     int32_t requestUserId = GetUserId(userId);
2497     if (requestUserId == Constants::INVALID_USERID) {
2498         return false;
2499     }
2500 
2501     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2502     if (bundleInfos_.empty()) {
2503         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2504         return false;
2505     }
2506 
2507     for (const auto &item : bundleInfos_) {
2508         const InnerBundleInfo &info = item.second;
2509         if (info.IsDisabled()) {
2510             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2511             continue;
2512         }
2513         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2514         if (info.GetApplicationEnabled(responseUserId) ||
2515             (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2516             ApplicationInfo appInfo;
2517             info.GetApplicationInfo(flags, responseUserId, appInfo);
2518             appInfos.emplace_back(appInfo);
2519         }
2520         GetCloneAppInfo(info, responseUserId, flags, appInfos);
2521     }
2522     LOG_D(BMS_TAG_QUERY, "get installed bundles success");
2523     return !appInfos.empty();
2524 }
2525 
UpateExtResources(const std::string &bundleName, const std::vector<ExtendResourceInfo> &extendResourceInfos)2526 bool BundleDataMgr::UpateExtResources(const std::string &bundleName,
2527     const std::vector<ExtendResourceInfo> &extendResourceInfos)
2528 {
2529     if (bundleName.empty()) {
2530         APP_LOGW("bundleName is empty");
2531         return false;
2532     }
2533 
2534     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2535     auto infoItem = bundleInfos_.find(bundleName);
2536     if (infoItem == bundleInfos_.end()) {
2537         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2538         return false;
2539     }
2540 
2541     auto info = infoItem->second;
2542     info.AddExtendResourceInfos(extendResourceInfos);
2543     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2544         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2545         return false;
2546     }
2547 
2548     bundleInfos_.at(bundleName) = info;
2549     return true;
2550 }
2551 
RemoveExtResources(const std::string &bundleName, const std::vector<std::string> &moduleNames)2552 bool BundleDataMgr::RemoveExtResources(const std::string &bundleName,
2553     const std::vector<std::string> &moduleNames)
2554 {
2555     if (bundleName.empty()) {
2556         APP_LOGW("bundleName is empty");
2557         return false;
2558     }
2559 
2560     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2561     auto infoItem = bundleInfos_.find(bundleName);
2562     if (infoItem == bundleInfos_.end()) {
2563         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2564         return false;
2565     }
2566 
2567     auto info = infoItem->second;
2568     info.RemoveExtendResourceInfos(moduleNames);
2569     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2570         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2571         return false;
2572     }
2573 
2574     bundleInfos_.at(bundleName) = info;
2575     return true;
2576 }
2577 
UpateCurDynamicIconModule( const std::string &bundleName, const std::string &moduleName)2578 bool BundleDataMgr::UpateCurDynamicIconModule(
2579     const std::string &bundleName, const std::string &moduleName)
2580 {
2581     if (bundleName.empty()) {
2582         APP_LOGW("bundleName is empty");
2583         return false;
2584     }
2585 
2586     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2587     auto infoItem = bundleInfos_.find(bundleName);
2588     if (infoItem == bundleInfos_.end()) {
2589         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2590         return false;
2591     }
2592 
2593     auto info = infoItem->second;
2594     info.SetCurDynamicIconModule(moduleName);
2595     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2596         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2597         return false;
2598     }
2599 
2600     bundleInfos_.at(bundleName) = info;
2601     return true;
2602 }
2603 
GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags, std::vector<ApplicationInfo> &appInfos) const2604 void BundleDataMgr::GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2605     std::vector<ApplicationInfo> &appInfos) const
2606 {
2607     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2608     for (int32_t appIndex : appIndexVec) {
2609         bool isEnabled = false;
2610         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2611         if (ret != ERR_OK) {
2612             continue;
2613         }
2614         if (isEnabled || (static_cast<uint32_t>(flags) &
2615             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2616             ApplicationInfo cloneAppInfo;
2617             ret = info.GetApplicationInfoV9(flags, userId, cloneAppInfo, appIndex);
2618             if (ret == ERR_OK) {
2619                 appInfos.emplace_back(cloneAppInfo);
2620             }
2621         }
2622     }
2623 }
2624 
GetApplicationInfosV9( int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const2625 ErrCode BundleDataMgr::GetApplicationInfosV9(
2626     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
2627 {
2628     int32_t requestUserId = GetUserId(userId);
2629     if (requestUserId == Constants::INVALID_USERID) {
2630         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2631     }
2632 
2633     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2634     if (bundleInfos_.empty()) {
2635         APP_LOGW("bundleInfos_ data is empty");
2636         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2637     }
2638     for (const auto &item : bundleInfos_) {
2639         const InnerBundleInfo &info = item.second;
2640         if (info.IsDisabled()) {
2641             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2642             continue;
2643         }
2644         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2645         if (info.GetApplicationEnabled(responseUserId) ||
2646             (static_cast<uint32_t>(flags) &
2647             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2648             ApplicationInfo appInfo;
2649             if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) == ERR_OK) {
2650                 appInfos.emplace_back(appInfo);
2651             }
2652         }
2653         GetCloneAppInfoV9(info, responseUserId, flags, appInfos);
2654     }
2655     APP_LOGD("get installed bundles success");
2656     return ERR_OK;
2657 }
2658 
GetBundleInfo( const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const2659 bool BundleDataMgr::GetBundleInfo(
2660     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
2661 {
2662     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2663     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2664     if (userId == Constants::ANY_USERID) {
2665         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2666             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2667             return false;
2668         }
2669         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2670     }
2671 
2672     int32_t requestUserId = GetUserId(userId);
2673     if (requestUserId == Constants::INVALID_USERID) {
2674         return false;
2675     }
2676     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2677     InnerBundleInfo innerBundleInfo;
2678     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
2679         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d",
2680             bundleName.c_str(), requestUserId);
2681         return false;
2682     }
2683     // for only one user, bundle info can not be obtained during installation
2684     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2685         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2686         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2687             bundleName.c_str(), requestUserId);
2688         return false;
2689     }
2690 
2691     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2692     innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
2693 
2694     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
2695         ProcessBundleMenu(bundleInfo, flags, false);
2696     }
2697     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) ==
2698         BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) {
2699         ProcessBundleRouterMap(bundleInfo, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
2700             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP));
2701     }
2702     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2703         bundleName.c_str(), userId);
2704     return true;
2705 }
2706 
GetBundleInfoV9( const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const2707 ErrCode BundleDataMgr::GetBundleInfoV9(
2708     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const
2709 {
2710     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2711 
2712     if (userId == Constants::ANY_USERID) {
2713         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2714         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2715             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2716             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2717         }
2718         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2719     }
2720 
2721     int32_t requestUserId = GetUserId(userId);
2722     if (requestUserId == Constants::INVALID_USERID) {
2723         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2724     }
2725 
2726     int32_t originalUserId = requestUserId;
2727     PreProcessAnyUserFlag(bundleName, flags, requestUserId);
2728     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2729     InnerBundleInfo innerBundleInfo;
2730 
2731     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
2732     if (ret != ERR_OK) {
2733         LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s",
2734             ret, bundleName.c_str());
2735         return ret;
2736     }
2737     // for only one user, bundle info can not be obtained during installation
2738     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2739         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2740         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2741             bundleName.c_str(), requestUserId);
2742         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2743     }
2744 
2745     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2746     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
2747     PostProcessAnyUserFlags(flags, responseUserId, originalUserId, bundleInfo);
2748 
2749     ProcessBundleMenu(bundleInfo, flags, true);
2750     ProcessBundleRouterMap(bundleInfo, flags);
2751     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2752         bundleName.c_str(), userId);
2753     return ERR_OK;
2754 }
2755 
BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const2756 void BundleDataMgr::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
2757     std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2758 {
2759     for (const auto &bundleName : bundleNames) {
2760         BundleInfo bundleInfo;
2761         ErrCode ret = GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2762         if (ret != ERR_OK) {
2763             continue;
2764         }
2765         bundleInfos.push_back(bundleInfo);
2766     }
2767 }
2768 
ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const2769 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
2770 {
2771     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2772     if (clearData) {
2773         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2774             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2775             return ERR_OK;
2776         }
2777         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
2778             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
2779             APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
2780             std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
2781                 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
2782             });
2783             return ERR_OK;
2784         }
2785     }
2786     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2787         std::string menuProfile = hapModuleInfo.fileContextMenu;
2788         auto pos = menuProfile.find(PROFILE_PREFIX);
2789         if (pos == std::string::npos) {
2790             APP_LOGD("invalid menu profile");
2791             continue;
2792         }
2793         std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
2794         std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
2795 
2796         std::string menuProfileContent;
2797         GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
2798         hapModuleInfo.fileContextMenu = menuProfileContent;
2799     }
2800     return ERR_OK;
2801 }
2802 
ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const2803 void BundleDataMgr::ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const
2804 {
2805     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2806     if (routerStorage_ == nullptr) {
2807         APP_LOGE("routerStorage_ is null");
2808         return;
2809     }
2810     APP_LOGD("ProcessBundleRouterMap with flags: %{public}d", flag);
2811     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2812         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2813         return;
2814     }
2815     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP))
2816         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP)) {
2817         return;
2818     }
2819     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2820         std::string routerPath = hapModuleInfo.routerMap;
2821         auto pos = routerPath.find(PROFILE_PREFIX);
2822         if (pos == std::string::npos) {
2823             APP_LOGD("invalid router profile");
2824             continue;
2825         }
2826         if (!routerStorage_->GetRouterInfo(bundleInfo.name, hapModuleInfo.moduleName, hapModuleInfo.routerArray)) {
2827             APP_LOGE("get failed for %{public}s", hapModuleInfo.moduleName.c_str());
2828             continue;
2829         }
2830     }
2831     RouterMapHelper::MergeRouter(bundleInfo);
2832 }
2833 
DeleteRouterInfo(const std::string &bundleName, const std::string &moduleName)2834 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName, const std::string &moduleName)
2835 {
2836     if (routerStorage_ == nullptr) {
2837         APP_LOGE("routerStorage_ is null");
2838         return false;
2839     }
2840     return routerStorage_->DeleteRouterInfo(bundleName, moduleName);
2841 }
2842 
DeleteRouterInfo(const std::string &bundleName)2843 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName)
2844 {
2845     if (routerStorage_ == nullptr) {
2846         APP_LOGE("routerStorage_ is null");
2847         return false;
2848     }
2849     return routerStorage_->DeleteRouterInfo(bundleName);
2850 }
2851 
UpdateRouterInfo(const std::string &bundleName)2852 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName)
2853 {
2854     if (routerStorage_ == nullptr) {
2855         APP_LOGE("routerStorage_ is null");
2856         return;
2857     }
2858     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2859     const auto infoItem = bundleInfos_.find(bundleName);
2860     if (infoItem == bundleInfos_.end()) {
2861         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
2862         return;
2863     }
2864     auto moduleMap = infoItem->second.GetInnerModuleInfos();
2865     std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
2866     for (auto it = moduleMap.begin(); it != moduleMap.end(); it++) {
2867         std::string routerPath = it->second.routerMap;
2868         auto pos = routerPath.find(PROFILE_PREFIX);
2869         if (pos == std::string::npos) {
2870             continue;
2871         }
2872         std::string routerJsonName = routerPath.substr(pos + PROFILE_PREFIX_LENGTH);
2873         std::string routerJsonPath = PROFILE_PATH + routerJsonName + JSON_SUFFIX;
2874         hapPathMap[it->second.moduleName] = std::make_pair(it->second.hapPath, routerJsonPath);
2875     }
2876     lock.unlock();
2877     std::map<std::string, std::string> routerInfoMap;
2878     for (auto hapIter = hapPathMap.begin(); hapIter != hapPathMap.end(); hapIter++) {
2879         std::string routerMapString;
2880         if (GetJsonProfileByExtractor(hapIter->second.first, hapIter->second.second, routerMapString) != ERR_OK) {
2881             APP_LOGW("get json string from %{public}s failed", hapIter->second.second.c_str());
2882             continue;
2883         }
2884         routerInfoMap[hapIter->first] = routerMapString;
2885     }
2886     if (!routerStorage_->UpdateRouterInfo(bundleName, routerInfoMap)) {
2887         APP_LOGW("add router for %{public}s failed", bundleName.c_str());
2888     }
2889 }
2890 
GetAllBundleNames(std::set<std::string> &bundleNames)2891 void BundleDataMgr::GetAllBundleNames(std::set<std::string> &bundleNames)
2892 {
2893     if (routerStorage_ == nullptr) {
2894         APP_LOGE("routerStorage_ is null");
2895         return;
2896     }
2897     return routerStorage_->GetAllBundleNames(bundleNames);
2898 }
2899 
PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const2900 void BundleDataMgr::PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const
2901 {
2902     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0) {
2903         flags = static_cast<int32_t>(
2904             static_cast<uint32_t>(flags) | static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE));
2905         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2906         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2907             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2908             return;
2909         }
2910         if (innerBundleUserInfos.empty()) {
2911             return;
2912         }
2913         for (auto &bundleUserInfo: innerBundleUserInfos) {
2914             if (bundleUserInfo.bundleUserInfo.userId == userId) {
2915                 return;
2916             }
2917             if (bundleUserInfo.bundleUserInfo.userId < Constants::START_USERID) {
2918                 return;
2919             }
2920         }
2921         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2922     }
2923 }
2924 
PostProcessAnyUserFlags( int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo) const2925 void BundleDataMgr::PostProcessAnyUserFlags(
2926     int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo) const
2927 {
2928     bool withApplicationFlag =
2929         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION))
2930             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
2931     if (withApplicationFlag) {
2932         if (userId >= Constants::START_USERID && userId != originalUserId) {
2933             uint32_t flagInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_INSTALLED);
2934             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
2935             if ((applicationFlags & flagInstalled) != 0) {
2936                 bundleInfo.applicationInfo.applicationFlags = static_cast<int32_t>(applicationFlags ^ flagInstalled);
2937             }
2938         }
2939     }
2940 }
2941 
GetBaseSharedBundleInfos(const std::string &bundleName, std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const2942 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
2943     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
2944 {
2945     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
2946     if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
2947         (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
2948         // for app service hsp
2949         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2950         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
2951         for (const std::string &hspName : appServiceHspBundleName_) {
2952             APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
2953             auto infoItem = bundleInfos_.find(hspName);
2954             if (infoItem == bundleInfos_.end()) {
2955                 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
2956                 continue;
2957             }
2958             ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
2959         }
2960     }
2961     if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
2962         flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
2963         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2964         auto infoItem = bundleInfos_.find(bundleName);
2965         if (infoItem == bundleInfos_.end()) {
2966             APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
2967             return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
2968                 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
2969         }
2970         const InnerBundleInfo &innerBundleInfo = infoItem->second;
2971         std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
2972         for (const auto &item : dependencies) {
2973             BaseSharedBundleInfo baseSharedBundleInfo;
2974             if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
2975                 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
2976             }
2977         }
2978     }
2979     APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
2980     return ERR_OK;
2981 }
2982 
GetBundleType(const std::string &bundleName, BundleType &bundleType) const2983 bool BundleDataMgr::GetBundleType(const std::string &bundleName, BundleType &bundleType)const
2984 {
2985     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2986     auto item = bundleInfos_.find(bundleName);
2987     if (item == bundleInfos_.end()) {
2988         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2989         return false;
2990     }
2991     bundleType = item->second.GetApplicationBundleType();
2992     APP_LOGI("bundle %{public}s bundleType is %{public}d", bundleName.c_str(), bundleType);
2993     return true;
2994 }
2995 
GetBaseSharedBundleInfo(const Dependency &dependency, BaseSharedBundleInfo &baseSharedBundleInfo) const2996 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
2997     BaseSharedBundleInfo &baseSharedBundleInfo) const
2998 {
2999     auto infoItem = bundleInfos_.find(dependency.bundleName);
3000     if (infoItem == bundleInfos_.end()) {
3001         APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
3002             dependency.bundleName.c_str());
3003         return false;
3004     }
3005     const InnerBundleInfo &innerBundleInfo = infoItem->second;
3006     if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3007         innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3008     } else {
3009         APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
3010             innerBundleInfo.GetApplicationBundleType());
3011         return false;
3012     }
3013     APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
3014     return true;
3015 }
3016 
DeleteSharedBundleInfo(const std::string &bundleName)3017 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
3018 {
3019     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
3020     auto infoItem = bundleInfos_.find(bundleName);
3021     if (infoItem != bundleInfos_.end()) {
3022         APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
3023         const InnerBundleInfo &innerBundleInfo = infoItem->second;
3024         bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
3025         if (!ret) {
3026             APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
3027         }
3028         bundleInfos_.erase(bundleName);
3029         return ret;
3030     }
3031     return false;
3032 }
3033 
GetBundlePackInfo( const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const3034 ErrCode BundleDataMgr::GetBundlePackInfo(
3035     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
3036 {
3037     APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
3038     int32_t requestUserId;
3039     if (userId == Constants::UNSPECIFIED_USERID) {
3040         requestUserId = GetUserIdByCallingUid();
3041     } else {
3042         requestUserId = userId;
3043     }
3044 
3045     if (requestUserId == Constants::INVALID_USERID) {
3046         APP_LOGW("getBundlePackInfo userId is invalid");
3047         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3048     }
3049     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3050     InnerBundleInfo innerBundleInfo;
3051     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
3052         APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
3053         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3054     }
3055     BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
3056     if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
3057         bundlePackInfo.packages = innerBundlePackInfo.packages;
3058         return ERR_OK;
3059     }
3060     if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
3061         bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
3062         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3063         return ERR_OK;
3064     }
3065     if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
3066         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3067         return ERR_OK;
3068     }
3069     bundlePackInfo = innerBundlePackInfo;
3070     return ERR_OK;
3071 }
3072 
GetBundleInfosByMetaData( const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const3073 bool BundleDataMgr::GetBundleInfosByMetaData(
3074     const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
3075 {
3076     if (metaData.empty()) {
3077         APP_LOGW("bundle name is empty");
3078         return false;
3079     }
3080 
3081     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3082     if (bundleInfos_.empty()) {
3083         APP_LOGW("bundleInfos_ data is empty");
3084         return false;
3085     }
3086 
3087     bool find = false;
3088     int32_t requestUserId = GetUserId();
3089     for (const auto &item : bundleInfos_) {
3090         const InnerBundleInfo &info = item.second;
3091         if (info.IsDisabled()) {
3092             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3093             continue;
3094         }
3095         if (info.CheckSpecialMetaData(metaData)) {
3096             BundleInfo bundleInfo;
3097             int32_t responseUserId = info.GetResponseUserId(requestUserId);
3098             info.GetBundleInfo(
3099                 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3100             bundleInfos.emplace_back(bundleInfo);
3101             find = true;
3102         }
3103     }
3104     return find;
3105 }
3106 
GetBundleList( std::vector<std::string> &bundleNames, int32_t userId) const3107 bool BundleDataMgr::GetBundleList(
3108     std::vector<std::string> &bundleNames, int32_t userId) const
3109 {
3110     int32_t requestUserId = GetUserId(userId);
3111     if (requestUserId == Constants::INVALID_USERID) {
3112         return false;
3113     }
3114 
3115     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3116     if (bundleInfos_.empty()) {
3117         APP_LOGW("bundleInfos_ data is empty");
3118         return false;
3119     }
3120 
3121     bool find = false;
3122     for (const auto &infoItem : bundleInfos_) {
3123         const InnerBundleInfo &innerBundleInfo = infoItem.second;
3124         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3125         if (CheckInnerBundleInfoWithFlags(
3126             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3127             continue;
3128         }
3129 
3130         bundleNames.emplace_back(infoItem.first);
3131         find = true;
3132     }
3133     APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
3134     return find;
3135 }
3136 
GetBundleInfos( int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const3137 bool BundleDataMgr::GetBundleInfos(
3138     int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3139 {
3140     if (userId == Constants::ALL_USERID) {
3141         return GetAllBundleInfos(flags, bundleInfos);
3142     }
3143 
3144     int32_t requestUserId = GetUserId(userId);
3145     if (requestUserId == Constants::INVALID_USERID) {
3146         return false;
3147     }
3148 
3149     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3150     if (bundleInfos_.empty()) {
3151         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3152         return false;
3153     }
3154 
3155     bool find = false;
3156     for (const auto &item : bundleInfos_) {
3157         const InnerBundleInfo &innerBundleInfo = item.second;
3158         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3159             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3160                 innerBundleInfo.GetBundleName().c_str());
3161             continue;
3162         }
3163 
3164         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3165         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
3166             continue;
3167         }
3168 
3169         BundleInfo bundleInfo;
3170         if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
3171             continue;
3172         }
3173 
3174         bundleInfos.emplace_back(bundleInfo);
3175         find = true;
3176         // add clone bundle info
3177         // flags convert
3178         GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3179     }
3180 
3181     LOG_D(BMS_TAG_QUERY, "get bundleInfos result(%{public}d) in user(%{public}d)", find, userId);
3182     return find;
3183 }
3184 
CheckInnerBundleInfoWithFlags( const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const3185 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
3186     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3187 {
3188     if (userId == Constants::INVALID_USERID) {
3189         APP_LOGD("userId is invalid");
3190         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3191     }
3192     if (innerBundleInfo.IsDisabled()) {
3193         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3194         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3195     }
3196 
3197     if (appIndex == 0) {
3198         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
3199             && !innerBundleInfo.GetApplicationEnabled(userId)) {
3200             APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3201                 innerBundleInfo.GetBundleName().c_str(), userId);
3202             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3203         }
3204     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3205         int32_t requestUserId = GetUserId(userId);
3206         if (requestUserId == Constants::INVALID_USERID) {
3207             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3208         }
3209         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3210         bool isEnabled = false;
3211         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3212         if (ret != ERR_OK) {
3213             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3214         }
3215         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
3216             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3217                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3218             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3219         }
3220     } else {
3221         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3222     }
3223     return ERR_OK;
3224 }
3225 
CheckInnerBundleInfoWithFlagsV9( const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const3226 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlagsV9(
3227     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3228 {
3229     if (userId == Constants::INVALID_USERID) {
3230         APP_LOGD("userId is invalid");
3231         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3232     }
3233     if (innerBundleInfo.IsDisabled()) {
3234         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3235         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3236     }
3237 
3238     if (appIndex == 0) {
3239         if (!(static_cast<uint32_t>(flags) &
3240             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
3241             bool isEnabled = false;
3242             ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(userId, isEnabled, appIndex);
3243             if (ret != ERR_OK) {
3244                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3245                     innerBundleInfo.GetBundleName().c_str(), userId);
3246                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3247             }
3248             if (!isEnabled) {
3249                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3250                     innerBundleInfo.GetBundleName().c_str(), userId);
3251                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3252             }
3253         }
3254     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3255         int32_t requestUserId = GetUserId(userId);
3256         if (requestUserId == Constants::INVALID_USERID) {
3257             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3258         }
3259         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3260         bool isEnabled = false;
3261         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3262         if (ret != ERR_OK) {
3263             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3264         }
3265         if (!(static_cast<uint32_t>(flags) &
3266             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
3267             && !isEnabled) {
3268             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3269                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3270             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3271         }
3272     } else {
3273         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3274     }
3275     return ERR_OK;
3276 }
3277 
GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const3278 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3279 {
3280     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3281     if (bundleInfos_.empty()) {
3282         APP_LOGW("bundleInfos_ data is empty");
3283         return false;
3284     }
3285 
3286     bool find = false;
3287     for (const auto &item : bundleInfos_) {
3288         const InnerBundleInfo &info = item.second;
3289         if (info.IsDisabled()) {
3290             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3291             continue;
3292         }
3293         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3294             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3295             continue;
3296         }
3297         BundleInfo bundleInfo;
3298         info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
3299         bundleInfos.emplace_back(bundleInfo);
3300         find = true;
3301         // add clone bundle info
3302         GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3303     }
3304 
3305     APP_LOGD("get all bundleInfos result(%{public}d)", find);
3306     return find;
3307 }
3308 
GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const3309 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3310 {
3311     if (userId == Constants::ALL_USERID) {
3312         return GetAllBundleInfosV9(flags, bundleInfos);
3313     }
3314     int32_t requestUserId = GetUserId(userId);
3315     if (requestUserId == Constants::INVALID_USERID) {
3316         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3317     }
3318     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3319     if (bundleInfos_.empty()) {
3320         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3321         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3322     }
3323     bool ofAnyUserFlag =
3324         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0;
3325     for (const auto &item : bundleInfos_) {
3326         const InnerBundleInfo &innerBundleInfo = item.second;
3327         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3328             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3329                 innerBundleInfo.GetBundleName().c_str());
3330             continue;
3331         }
3332         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3333         auto flag = GET_BASIC_APPLICATION_INFO;
3334         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
3335             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
3336             flag = GET_APPLICATION_INFO_WITH_DISABLE;
3337         }
3338         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
3339             auto &hp = innerBundleInfo.GetInnerBundleUserInfos();
3340             if (ofAnyUserFlag && hp.size() > 0) {
3341                 responseUserId = hp.begin()->second.bundleUserInfo.userId;
3342             } else {
3343                 continue;
3344             }
3345         }
3346         uint32_t launchFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY);
3347         if (((static_cast<uint32_t>(flags) & launchFlag) == launchFlag) && (innerBundleInfo.IsHideDesktopIcon())) {
3348             LOG_D(BMS_TAG_QUERY, "bundleName %{public}s is hide desktopIcon",
3349                 innerBundleInfo.GetBundleName().c_str());
3350             continue;
3351         }
3352         BundleInfo bundleInfo;
3353         if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
3354             continue;
3355         }
3356         ProcessBundleMenu(bundleInfo, flags, true);
3357         ProcessBundleRouterMap(bundleInfo, flags);
3358         PostProcessAnyUserFlags(flags, responseUserId, requestUserId, bundleInfo);
3359         bundleInfos.emplace_back(bundleInfo);
3360         if (!ofAnyUserFlag && ((static_cast<uint32_t>(flags) &
3361             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3362             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3363             // add clone bundle info
3364             GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3365         }
3366     }
3367     if (bundleInfos.empty()) {
3368         LOG_W(BMS_TAG_QUERY, "bundleInfos is empty");
3369     }
3370     return ERR_OK;
3371 }
3372 
GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const3373 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3374 {
3375     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3376     if (bundleInfos_.empty()) {
3377         APP_LOGW("bundleInfos_ data is empty");
3378         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3379     }
3380 
3381     for (const auto &item : bundleInfos_) {
3382         const InnerBundleInfo &info = item.second;
3383         if (info.IsDisabled()) {
3384             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3385             continue;
3386         }
3387         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3388             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3389             continue;
3390         }
3391         if (((static_cast<uint32_t>(flags) &
3392             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) ==
3393             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) &&
3394             (info.IsHideDesktopIcon())) {
3395             APP_LOGD("getAllBundleInfosV9 bundleName %{public}s is hide desktopIcon",
3396                 info.GetBundleName().c_str());
3397             continue;
3398         }
3399         BundleInfo bundleInfo;
3400         info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
3401         auto ret = ProcessBundleMenu(bundleInfo, flags, true);
3402         if (ret == ERR_OK) {
3403             bundleInfos.emplace_back(bundleInfo);
3404             if (((static_cast<uint32_t>(flags) &
3405                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3406                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3407                 // add clone bundle info
3408                 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3409             }
3410         }
3411     }
3412     if (bundleInfos.empty()) {
3413         APP_LOGW("bundleInfos is empty");
3414     }
3415     return ERR_OK;
3416 }
3417 
GetBundleNameForUid(const int32_t uid, std::string &bundleName) const3418 bool BundleDataMgr::GetBundleNameForUid(const int32_t uid, std::string &bundleName) const
3419 {
3420     int32_t appIndex = 0;
3421     return GetBundleNameAndIndexForUid(uid, bundleName, appIndex) == ERR_OK;
3422 }
3423 
GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName, int32_t &appIndex) const3424 ErrCode BundleDataMgr::GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName,
3425     int32_t &appIndex) const
3426 {
3427     InnerBundleInfo innerBundleInfo;
3428     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
3429         if (sandboxAppHelper_ == nullptr) {
3430             return ERR_BUNDLE_MANAGER_INVALID_UID;
3431         }
3432         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3433             return ERR_BUNDLE_MANAGER_INVALID_UID;
3434         }
3435     }
3436 
3437     bundleName = innerBundleInfo.GetBundleName();
3438     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
3439         uid, bundleName.c_str(), appIndex);
3440     return ERR_OK;
3441 }
3442 
GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo, int32_t &appIndex) const3443 ErrCode BundleDataMgr::GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo,
3444     int32_t &appIndex) const
3445 {
3446     if (uid < Constants::BASE_APP_UID) {
3447         APP_LOGD("the uid(%{public}d) is not an application", uid);
3448         return ERR_BUNDLE_MANAGER_INVALID_UID;
3449     }
3450     int32_t userId = GetUserIdByUid(uid);
3451     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3452 
3453     std::string keyName;
3454     {
3455         std::shared_lock<std::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3456         auto bundleIdIter = bundleIdMap_.find(bundleId);
3457         if (bundleIdIter == bundleIdMap_.end()) {
3458             APP_LOGW_NOFUNC("uid %{public}d is not existed", uid);
3459             return ERR_BUNDLE_MANAGER_INVALID_UID;
3460         }
3461         keyName = bundleIdIter->second;
3462     }
3463     std::string bundleName = keyName;
3464     GetBundleNameAndIndexByName(keyName, bundleName, appIndex);
3465 
3466     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3467     auto bundleInfoIter = bundleInfos_.find(bundleName);
3468     if (bundleInfoIter == bundleInfos_.end()) {
3469         APP_LOGE("bundleName %{public}s is not existed in bundleInfos_", bundleName.c_str());
3470         return ERR_BUNDLE_MANAGER_INVALID_UID;
3471     }
3472 
3473     if (bundleInfoIter->second.GetUid(userId, appIndex) == uid) {
3474         innerBundleInfo = bundleInfoIter->second;
3475         return ERR_OK;
3476     }
3477 
3478     APP_LOGW("the uid(%{public}d) is not exists", uid);
3479     return ERR_BUNDLE_MANAGER_INVALID_UID;
3480 }
3481 
GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const3482 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const
3483 {
3484     int32_t appIndex = 0;
3485     return GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex);
3486 }
3487 
GetRecoverablePreInstallBundleInfos()3488 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
3489 {
3490     std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
3491     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3492     if (userId == Constants::INVALID_USERID) {
3493         APP_LOGW("userId %{public}d is invalid", userId);
3494         return recoverablePreInstallBundleInfos;
3495     }
3496     std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
3497     for (auto preInstallBundleInfo: preInstallBundleInfos) {
3498         if (!preInstallBundleInfo.IsRemovable()) {
3499             continue;
3500         }
3501         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3502         auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
3503         if (infoItem == bundleInfos_.end()) {
3504             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3505             continue;
3506         }
3507         if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
3508             !infoItem->second.HasInnerBundleUserInfo(userId)) {
3509             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3510         }
3511     }
3512     return recoverablePreInstallBundleInfos;
3513 }
3514 
IsBundleExist(const std::string &bundleName) const3515 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
3516 {
3517     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3518     return bundleInfos_.find(bundleName) != bundleInfos_.end();
3519 }
3520 
HasUserInstallInBundle( const std::string &bundleName, const int32_t userId) const3521 bool BundleDataMgr::HasUserInstallInBundle(
3522     const std::string &bundleName, const int32_t userId) const
3523 {
3524     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3525     auto infoItem = bundleInfos_.find(bundleName);
3526     if (infoItem == bundleInfos_.end()) {
3527         return false;
3528     }
3529 
3530     return infoItem->second.HasInnerBundleUserInfo(userId);
3531 }
3532 
GetBundleStats(const std::string &bundleName, const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex) const3533 bool BundleDataMgr::GetBundleStats(const std::string &bundleName,
3534     const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex) const
3535 {
3536     int32_t responseUserId = -1;
3537     int32_t uid = -1;
3538     {
3539         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3540         const auto infoItem = bundleInfos_.find(bundleName);
3541         if (infoItem == bundleInfos_.end()) {
3542             return false;
3543         }
3544         responseUserId = infoItem->second.GetResponseUserId(userId);
3545         uid = infoItem->second.GetUid(responseUserId, appIndex);
3546     }
3547 
3548     ErrCode ret =
3549         InstalldClient::GetInstance()->GetBundleStats(bundleName, responseUserId, bundleStats, uid, appIndex);
3550     if (ret != ERR_OK) {
3551         APP_LOGW("%{public}s getStats failed", bundleName.c_str());
3552         return false;
3553     }
3554 
3555     {
3556         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3557         const auto infoItem = bundleInfos_.find(bundleName);
3558         if (infoItem == bundleInfos_.end()) {
3559             return false;
3560         }
3561         if (appIndex == 0 && infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
3562             for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
3563                 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
3564                     continue;
3565                 }
3566                 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
3567             }
3568         }
3569     }
3570 
3571     return true;
3572 }
3573 
GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const3574 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
3575 {
3576     std::vector<std::string> bundleNames;
3577     std::vector<int32_t> uids;
3578     int32_t responseUserId = userId;
3579     GetBundleList(bundleNames, userId);
3580     {
3581         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3582         for (const auto &bundleName : bundleNames) {
3583             auto infoItem = bundleInfos_.find(bundleName);
3584             if (infoItem == bundleInfos_.end()) {
3585                 return false;
3586             }
3587             responseUserId = infoItem->second.GetResponseUserId(userId);
3588             int32_t uid = infoItem->second.GetUid(responseUserId);
3589             uids.emplace_back(uid);
3590         }
3591     }
3592     if (InstalldClient::GetInstance()->GetAllBundleStats(responseUserId, bundleStats, uids) != ERR_OK) {
3593         APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
3594         return false;
3595     }
3596     if (bundleStats.empty()) {
3597         APP_LOGE("bundle stats is empty");
3598         return true;
3599     }
3600     return true;
3601 }
3602 
3603 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string &bundleName) const3604 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
3605 {
3606     return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
3607 }
3608 
GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const3609 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
3610 {
3611     int64_t spaceSize = 0;
3612     if (userId != Constants::ALL_USERID) {
3613         std::vector<int64_t> bundleStats;
3614         if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
3615             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
3616             return spaceSize;
3617         }
3618 
3619         spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
3620         return spaceSize;
3621     }
3622 
3623     for (const auto &iterUserId : GetAllUser()) {
3624         std::vector<int64_t> bundleStats;
3625         if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
3626             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
3627             continue;
3628         }
3629 
3630         auto startIter = bundleStats.begin();
3631         auto endIter = bundleStats.end();
3632         if (spaceSize == 0) {
3633             spaceSize = std::accumulate(startIter, endIter, spaceSize);
3634         } else {
3635             spaceSize = std::accumulate(++startIter, endIter, spaceSize);
3636         }
3637     }
3638 
3639     return spaceSize;
3640 }
3641 
GetAllFreeInstallBundleSpaceSize() const3642 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
3643 {
3644     int64_t allSize = 0;
3645     std::map<std::string, std::vector<std::string>> freeInstallModules;
3646     if (!GetFreeInstallModules(freeInstallModules)) {
3647         APP_LOGW("no removable bundles");
3648         return allSize;
3649     }
3650 
3651     for (const auto &iter : freeInstallModules) {
3652         APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
3653         allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
3654     }
3655 
3656     APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
3657     return allSize;
3658 }
3659 
GetFreeInstallModules( std::map<std::string, std::vector<std::string>> &freeInstallModules) const3660 bool BundleDataMgr::GetFreeInstallModules(
3661     std::map<std::string, std::vector<std::string>> &freeInstallModules) const
3662 {
3663     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3664     if (bundleInfos_.empty()) {
3665         APP_LOGW("bundleInfos_ is data is empty");
3666         return false;
3667     }
3668 
3669     for (const auto &iter : bundleInfos_) {
3670         std::vector<std::string> modules;
3671         if (!iter.second.GetFreeInstallModules(modules)) {
3672             continue;
3673         }
3674 
3675         freeInstallModules.emplace(iter.first, modules);
3676     }
3677 
3678     return !freeInstallModules.empty();
3679 }
3680 #endif
3681 
GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const3682 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
3683 {
3684     InnerBundleInfo innerBundleInfo;
3685     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3686         APP_LOGD("get innerBundleInfo by uid :%{public}d failed", uid);
3687         return false;
3688     }
3689 
3690     bundleNames.emplace_back(innerBundleInfo.GetBundleName());
3691     return true;
3692 }
3693 
GetNameForUid(const int uid, std::string &name) const3694 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
3695 {
3696     InnerBundleInfo innerBundleInfo;
3697     ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
3698     if (ret != ERR_OK) {
3699         APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed");
3700         if (sandboxAppHelper_ == nullptr) {
3701             APP_LOGW("sandboxAppHelper_ is nullptr");
3702             return ERR_BUNDLE_MANAGER_INVALID_UID;
3703         }
3704         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3705             return ERR_BUNDLE_MANAGER_INVALID_UID;
3706         }
3707     }
3708 
3709     name = innerBundleInfo.GetBundleName();
3710     return ERR_OK;
3711 }
3712 
GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const3713 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
3714 {
3715     int32_t requestUserId = GetUserId();
3716     InnerBundleUserInfo innerBundleUserInfo;
3717     if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
3718         APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) ",
3719             requestUserId, bundleName.c_str());
3720         return false;
3721     }
3722 
3723     gids = innerBundleUserInfo.gids;
3724     return true;
3725 }
3726 
GetBundleGidsByUid( const std::string &bundleName, const int &uid, std::vector<int> &gids) const3727 bool BundleDataMgr::GetBundleGidsByUid(
3728     const std::string &bundleName, const int &uid, std::vector<int> &gids) const
3729 {
3730     return true;
3731 }
3732 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const3733 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
3734 {
3735     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3736     if (bundleInfos_.empty()) {
3737         APP_LOGW("bundleInfos_ data is empty");
3738         return false;
3739     }
3740 
3741     int32_t requestUserId = GetUserId();
3742     for (const auto &info : bundleInfos_) {
3743         if (info.second.IsDisabled()) {
3744             APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
3745             continue;
3746         }
3747         if (info.second.GetIsKeepAlive()) {
3748             BundleInfo bundleInfo;
3749             int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
3750             info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3751             if (bundleInfo.name == "") {
3752                 continue;
3753             }
3754             bundleInfos.emplace_back(bundleInfo);
3755         }
3756     }
3757     return !(bundleInfos.empty());
3758 }
3759 
GetAbilityLabel(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, std::string &label) const3760 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
3761     const std::string &abilityName, std::string &label) const
3762 {
3763 #ifdef GLOBAL_RESMGR_ENABLE
3764     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3765     int32_t requestUserId = GetUserId();
3766     if (requestUserId == Constants::INVALID_USERID) {
3767         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3768     }
3769     InnerBundleInfo innerBundleInfo;
3770     ErrCode ret =
3771         GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
3772     if (ret != ERR_OK) {
3773         return ret;
3774     }
3775     AbilityInfo abilityInfo;
3776     ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
3777     if (ret != ERR_OK) {
3778         APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
3779             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
3780         return ret;
3781     }
3782     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3783     bool isEnable = false;
3784     ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
3785     if (ret != ERR_OK) {
3786         return ret;
3787     }
3788     if (!isEnable) {
3789         APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
3790         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
3791     }
3792     if (abilityInfo.labelId == 0) {
3793         label = abilityInfo.label;
3794         return ERR_OK;
3795     }
3796     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
3797         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
3798     if (resourceManager == nullptr) {
3799         APP_LOGW("InitResourceManager failed");
3800         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3801     }
3802     auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
3803     if (state != OHOS::Global::Resource::RState::SUCCESS) {
3804         APP_LOGW("ResourceManager GetStringById failed");
3805         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3806     }
3807     return ERR_OK;
3808 #else
3809     APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
3810     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
3811 #endif
3812 }
3813 
GetHapModuleInfo( const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const3814 bool BundleDataMgr::GetHapModuleInfo(
3815     const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
3816 {
3817     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3818     int32_t requestUserId = GetUserId(userId);
3819     if (requestUserId == Constants::INVALID_USERID) {
3820         return false;
3821     }
3822 
3823     if (bundleInfos_.empty()) {
3824         APP_LOGW("bundleInfos_ data is empty");
3825         return false;
3826     }
3827 
3828     APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
3829     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
3830     if (infoItem == bundleInfos_.end()) {
3831         return false;
3832     }
3833 
3834     const InnerBundleInfo &innerBundleInfo = infoItem->second;
3835     if (innerBundleInfo.IsDisabled()) {
3836         APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
3837         return false;
3838     }
3839 
3840     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3841     auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
3842     if (!module) {
3843         APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
3844             abilityInfo.bundleName.c_str());
3845         return false;
3846     }
3847     hapModuleInfo = *module;
3848     return true;
3849 }
3850 
GetLaunchWantForBundle( const std::string &bundleName, Want &want, int32_t userId) const3851 ErrCode BundleDataMgr::GetLaunchWantForBundle(
3852     const std::string &bundleName, Want &want, int32_t userId) const
3853 {
3854     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3855     InnerBundleInfo innerBundleInfo;
3856     ErrCode ret = GetInnerBundleInfoWithFlagsV9(
3857         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
3858     if (ret != ERR_OK) {
3859         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
3860         return ret;
3861     }
3862 
3863     std::string mainAbility = innerBundleInfo.GetMainAbility();
3864     if (mainAbility.empty()) {
3865         APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
3866         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3867     }
3868 
3869     want.SetElementName("", bundleName, mainAbility);
3870     want.SetAction(Constants::ACTION_HOME);
3871     want.AddEntity(Constants::ENTITY_HOME);
3872     return ERR_OK;
3873 }
3874 
CheckIsSystemAppByUid(const int uid) const3875 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
3876 {
3877     // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
3878     // the uid should be the system uid.
3879     if (uid == Constants::ROOT_UID || uid == ServiceConstants::BMS_UID) {
3880         return true;
3881     }
3882 
3883     InnerBundleInfo innerBundleInfo;
3884     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3885         return false;
3886     }
3887 
3888     return innerBundleInfo.IsSystemApp();
3889 }
3890 
InitStateTransferMap()3891 void BundleDataMgr::InitStateTransferMap()
3892 {
3893     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
3894     transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
3895     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
3896     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
3897     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
3898     transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
3899     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
3900     transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
3901     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
3902     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
3903     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
3904     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
3905     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
3906     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
3907     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
3908     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
3909     transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
3910     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
3911     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
3912     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
3913     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
3914     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
3915     transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
3916     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
3917     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
3918     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
3919     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
3920     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
3921 }
3922 
IsDeleteDataState(const InstallState state) const3923 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
3924 {
3925     return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
3926             state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
3927 }
3928 
IsDisableState(const InstallState state) const3929 bool BundleDataMgr::IsDisableState(const InstallState state) const
3930 {
3931     if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
3932         return true;
3933     }
3934     return false;
3935 }
3936 
DeleteBundleInfo(const std::string &bundleName, const InstallState state)3937 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state)
3938 {
3939     if (InstallState::INSTALL_FAIL == state) {
3940         APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
3941         return;
3942     }
3943 
3944     auto infoItem = bundleInfos_.find(bundleName);
3945     if (infoItem == bundleInfos_.end()) {
3946         APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
3947         return;
3948     }
3949 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
3950     // remove external overlay bundle info and connection
3951     RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
3952 #endif
3953     APP_LOGI("del bundle name:%{public}s", bundleName.c_str());
3954     const InnerBundleInfo &innerBundleInfo = infoItem->second;
3955     RecycleUidAndGid(innerBundleInfo);
3956     bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
3957     if (!ret) {
3958         APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
3959     }
3960     bundleInfos_.erase(bundleName);
3961     std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
3962     if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
3963         appServiceHspBundleName_.erase(bundleName);
3964     }
3965     DeleteDesktopShortcutInfo(bundleName);
3966 }
3967 
GetInnerBundleInfoWithFlags(const std::string &bundleName, const int32_t flags, int32_t userId, int32_t appIndex) const3968 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
3969     const int32_t flags, int32_t userId, int32_t appIndex) const
3970 {
3971     if (bundleName.empty()) {
3972         return false;
3973     }
3974     int32_t requestUserId = GetUserId(userId);
3975     if (requestUserId == Constants::INVALID_USERID) {
3976         return false;
3977     }
3978 
3979     if (bundleInfos_.empty()) {
3980         APP_LOGW("bundleInfos_ data is empty");
3981         return false;
3982     }
3983     APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
3984     auto item = bundleInfos_.find(bundleName);
3985     if (item == bundleInfos_.end()) {
3986         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
3987             bundleName.c_str(), userId, appIndex, flags);
3988         return false;
3989     }
3990     const InnerBundleInfo &innerBundleInfo = item->second;
3991     if (innerBundleInfo.IsDisabled()) {
3992         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
3993             bundleName.c_str(), userId, appIndex, flags);
3994         return false;
3995     }
3996 
3997     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3998     if (appIndex == 0) {
3999         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
4000             && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
4001             APP_LOGD("bundleName: %{public}s userId: %{public}d incorrect",
4002                 innerBundleInfo.GetBundleName().c_str(), requestUserId);
4003             return false;
4004         }
4005     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
4006         bool isEnabled = false;
4007         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4008         if (ret != ERR_OK) {
4009             APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d", ret);
4010             return false;
4011         }
4012         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
4013             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
4014                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
4015             return false;
4016         }
4017     } else {
4018         return false;
4019     }
4020     return true;
4021 }
4022 
GetInnerBundleInfoWithFlags(const std::string &bundleName, const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const4023 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4024     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4025 {
4026     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, userId, appIndex);
4027     if (!res) {
4028         APP_LOGW("get with flag failed");
4029         return false;
4030     }
4031     auto item = bundleInfos_.find(bundleName);
4032     if (item == bundleInfos_.end()) {
4033         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4034         return false;
4035     }
4036     info = item->second;
4037     return true;
4038 }
4039 
GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName, const int32_t flags, InnerBundleInfo &info, int32_t userId) const4040 bool BundleDataMgr::GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName,
4041     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
4042 {
4043     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4044     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, info, userId);
4045     if (!res) {
4046         APP_LOGD("GetInnerBundleInfoWithBundleFlagsAndLock: bundleName %{public}s not find", bundleName.c_str());
4047         return res;
4048     }
4049     return true;
4050 }
4051 
GetInnerBundleInfoWithFlagsV9(const std::string &bundleName, const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const4052 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
4053     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4054 {
4055     int32_t requestUserId = GetUserId(userId);
4056     if (requestUserId == Constants::INVALID_USERID) {
4057         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4058     }
4059 
4060     if (bundleInfos_.empty()) {
4061         APP_LOGD("bundleInfos_ data is empty");
4062         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4063     }
4064     APP_LOGD(
4065         "GetInnerBundleInfoWithFlagsV9:bundleName:%{public}s,flags:%{public}d,userId:%{public}d,appIndex:%{public}d",
4066         bundleName.c_str(), flags, userId, appIndex);
4067     auto item = bundleInfos_.find(bundleName);
4068     if (item == bundleInfos_.end()) {
4069         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4070             bundleName.c_str(), userId, appIndex, flags);
4071         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4072     }
4073     const InnerBundleInfo &innerBundleInfo = item->second;
4074     if (innerBundleInfo.IsDisabled()) {
4075         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4076             bundleName.c_str(), userId, appIndex, flags);
4077         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4078     }
4079 
4080     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4081     bool isEnabled = false;
4082     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4083     if (ret != ERR_OK) {
4084         APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d -n %{public}s", ret, bundleName.c_str());
4085         return ret;
4086     }
4087     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
4088         && !isEnabled) {
4089         APP_LOGD("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4090         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4091     }
4092     info = innerBundleInfo;
4093     return ERR_OK;
4094 }
4095 
GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName, const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const4096 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
4097     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4098 {
4099     if (bundleName.empty()) {
4100         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4101     }
4102     int32_t requestUserId = GetUserId(userId);
4103     if (requestUserId == Constants::INVALID_USERID) {
4104         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4105     }
4106 
4107     if (bundleInfos_.empty()) {
4108         APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
4109         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4110     }
4111     APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
4112     auto item = bundleInfos_.find(bundleName);
4113     if (item == bundleInfos_.end()) {
4114         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4115         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4116     }
4117     const InnerBundleInfo &innerBundleInfo = item->second;
4118     if (innerBundleInfo.IsDisabled()) {
4119         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
4120         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4121     }
4122 
4123     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4124     bool isEnabled = false;
4125     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4126     if (ret != ERR_OK) {
4127         return ret;
4128     }
4129     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
4130         && !isEnabled) {
4131         APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4132         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4133     }
4134     info = innerBundleInfo;
4135     return ERR_OK;
4136 }
4137 
GetInnerBundleInfoWithDisable(const std::string &bundleName, InnerBundleInfo &info)4138 bool BundleDataMgr::GetInnerBundleInfoWithDisable(const std::string &bundleName, InnerBundleInfo &info)
4139 {
4140     APP_LOGD("GetInnerBundleInfoWithDisable %{public}s", bundleName.c_str());
4141     if (bundleName.empty()) {
4142         APP_LOGW("bundleName is empty");
4143         return false;
4144     }
4145 
4146     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4147     auto infoItem = bundleInfos_.find(bundleName);
4148     if (infoItem == bundleInfos_.end()) {
4149         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4150         return false;
4151     }
4152     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4153     info = infoItem->second;
4154     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4155     return true;
4156 }
4157 
DisableBundle(const std::string &bundleName)4158 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
4159 {
4160     APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
4161     if (bundleName.empty()) {
4162         APP_LOGW("bundleName empty");
4163         return false;
4164     }
4165 
4166     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4167     auto infoItem = bundleInfos_.find(bundleName);
4168     if (infoItem == bundleInfos_.end()) {
4169         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4170         return false;
4171     }
4172     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4173     return true;
4174 }
4175 
EnableBundle(const std::string &bundleName)4176 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
4177 {
4178     APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
4179     if (bundleName.empty()) {
4180         APP_LOGW("bundleName empty");
4181         return false;
4182     }
4183 
4184     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4185     auto infoItem = bundleInfos_.find(bundleName);
4186     if (infoItem == bundleInfos_.end()) {
4187         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4188         return false;
4189     }
4190     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4191     return true;
4192 }
4193 
IsApplicationEnabled( const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const4194 ErrCode BundleDataMgr::IsApplicationEnabled(
4195     const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const
4196 {
4197     APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
4198     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4199     auto infoItem = bundleInfos_.find(bundleName);
4200     if (infoItem == bundleInfos_.end()) {
4201         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4202         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4203     }
4204     int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId(userId));
4205     if (appIndex == 0) {
4206         ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
4207         if (ret != ERR_OK) {
4208             APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
4209         }
4210         return ret;
4211     }
4212     const InnerBundleInfo &bundleInfo = infoItem->second;
4213     InnerBundleUserInfo innerBundleUserInfo;
4214     if (!bundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
4215         APP_LOGW("can not find userId %{public}d", responseUserId);
4216         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4217     }
4218     auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex));
4219     if (iter == innerBundleUserInfo.cloneInfos.end()) {
4220         APP_LOGW("can not find appIndex %{public}d", appIndex);
4221         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4222     }
4223     isEnabled = iter->second.enabled;
4224     return ERR_OK;
4225 }
4226 
SetApplicationEnabled(const std::string &bundleName, int32_t appIndex, bool isEnable, int32_t userId)4227 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName,
4228     int32_t appIndex, bool isEnable, int32_t userId)
4229 {
4230     APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
4231     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4232     int32_t requestUserId = GetUserId(userId);
4233     if (requestUserId == Constants::INVALID_USERID) {
4234         APP_LOGW("Request userId %{public}d is invalid, bundleName:%{public}s", userId, bundleName.c_str());
4235         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4236     }
4237     auto infoItem = bundleInfos_.find(bundleName);
4238     if (infoItem == bundleInfos_.end()) {
4239         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4240         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4241     }
4242 
4243     InnerBundleInfo& newInfo = infoItem->second;
4244     if (appIndex != 0) {
4245         auto ret = newInfo.SetCloneApplicationEnabled(isEnable, appIndex, requestUserId);
4246         if (ret != ERR_OK) {
4247             APP_LOGW("SetCloneApplicationEnabled for innerBundleInfo fail, errCode is %{public}d", ret);
4248             return ret;
4249         }
4250         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4251             APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", newInfo.GetBundleName().c_str());
4252             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4253         }
4254         return ERR_OK;
4255     }
4256     auto ret = newInfo.SetApplicationEnabled(isEnable, requestUserId);
4257     if (ret != ERR_OK) {
4258         APP_LOGW("SetApplicationEnabled failed, err %{public}d", ret);
4259         return ret;
4260     }
4261 
4262     InnerBundleUserInfo innerBundleUserInfo;
4263     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4264         APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
4265         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4266     }
4267 
4268     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4269         bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
4270     } else {
4271         bundleStateStorage_->SaveBundleStateStorage(
4272             bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4273     }
4274     return ERR_OK;
4275 }
4276 
SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)4277 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
4278 {
4279     if (bundleName.empty() || moduleName.empty()) {
4280         APP_LOGW("bundleName or moduleName is empty");
4281         return false;
4282     }
4283     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4284     if (userId == Constants::INVALID_USERID) {
4285         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4286         return false;
4287     }
4288     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4289         bundleName.c_str(), moduleName.c_str(), userId);
4290     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4291     auto infoItem = bundleInfos_.find(bundleName);
4292     if (infoItem == bundleInfos_.end()) {
4293         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4294         return false;
4295     }
4296     InnerBundleInfo newInfo = infoItem->second;
4297     bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
4298     if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
4299         ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
4300 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
4301         if (isEnable) {
4302             // call clean task
4303             APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
4304                 bundleName.c_str(), isEnable, ret);
4305             DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
4306                 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
4307         }
4308 #endif
4309         return ret;
4310     } else {
4311         APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
4312         return false;
4313     }
4314 }
4315 
IsModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool &isRemovable) const4316 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
4317     bool &isRemovable) const
4318 {
4319     if (bundleName.empty() || moduleName.empty()) {
4320         APP_LOGW("bundleName or moduleName is empty");
4321         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4322     }
4323     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4324     if (userId == Constants::INVALID_USERID) {
4325         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4326         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4327     }
4328     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4329         bundleName.c_str(), moduleName.c_str(), userId);
4330     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4331     auto infoItem = bundleInfos_.find(bundleName);
4332     if (infoItem == bundleInfos_.end()) {
4333         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4334         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4335     }
4336     InnerBundleInfo newInfo = infoItem->second;
4337     return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
4338 }
4339 
IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const4340 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const
4341 {
4342     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4343     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4344     if (infoItem == bundleInfos_.end()) {
4345         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4346         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4347     }
4348     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(abilityInfo.bundleName, Constants::ALL_USERID);
4349     if ((appIndex != 0) && (std::find(appIndexVec.begin(), appIndexVec.end(), appIndex) == appIndexVec.end())) {
4350         APP_LOGE("appIndex %{public}d is invalid", appIndex);
4351         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4352     }
4353     InnerBundleInfo innerBundleInfo = infoItem->second;
4354     auto ability = innerBundleInfo.FindAbilityInfoV9(
4355         abilityInfo.moduleName, abilityInfo.name);
4356     if (!ability) {
4357         APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
4358             abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
4359         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4360     }
4361     int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
4362     return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable, appIndex);
4363 }
4364 
SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool isEnabled, int32_t userId)4365 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex,
4366     bool isEnabled, int32_t userId)
4367 {
4368     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4369     int32_t requestUserId = GetUserId(userId);
4370     if (requestUserId == Constants::INVALID_USERID) {
4371         APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
4372             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4373         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4374     }
4375     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4376     if (infoItem == bundleInfos_.end()) {
4377         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4378         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4379     }
4380     InnerBundleInfo& newInfo = infoItem->second;
4381     if (appIndex != 0) {
4382         auto ret = newInfo.SetCloneAbilityEnabled(
4383             abilityInfo.moduleName, abilityInfo.name, isEnabled, userId, appIndex);
4384         if (ret != ERR_OK) {
4385             APP_LOGW("SetCloneAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4386                 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4387             return ret;
4388         }
4389         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4390             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", newInfo.GetBundleName().c_str());
4391             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4392         }
4393         return ERR_OK;
4394     }
4395     ErrCode ret = newInfo.SetAbilityEnabled(
4396         abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
4397     if (ret != ERR_OK) {
4398         APP_LOGW("SetAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4399             ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4400         return ret;
4401     }
4402     InnerBundleUserInfo innerBundleUserInfo;
4403     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4404         APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4405             requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4406         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4407     }
4408     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4409         bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
4410     } else {
4411         bundleStateStorage_->SaveBundleStateStorage(
4412             abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4413     }
4414     return ERR_OK;
4415 }
4416 
GetSandboxAppHelper() const4417 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
4418 {
4419     return sandboxAppHelper_;
4420 }
4421 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)4422 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4423 {
4424     APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4425     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4426     callbackList_.emplace_back(bundleStatusCallback);
4427     if (bundleStatusCallback->AsObject() != nullptr) {
4428         sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
4429             new (std::nothrow) BundleStatusCallbackDeathRecipient();
4430         if (deathRecipient == nullptr) {
4431             APP_LOGW("deathRecipient is null");
4432             return false;
4433         }
4434         bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
4435     }
4436     return true;
4437 }
4438 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)4439 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4440 {
4441     if (bundleEventCallback == nullptr) {
4442         APP_LOGW("bundleEventCallback is null");
4443         return false;
4444     }
4445     std::lock_guard lock(eventCallbackMutex_);
4446     if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
4447         APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
4448         return false;
4449     }
4450     if (bundleEventCallback->AsObject() != nullptr) {
4451         sptr<BundleEventCallbackDeathRecipient> deathRecipient =
4452             new (std::nothrow) BundleEventCallbackDeathRecipient();
4453         if (deathRecipient == nullptr) {
4454             APP_LOGW("deathRecipient is null");
4455             return false;
4456         }
4457         bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
4458     }
4459     eventCallbackList_.emplace_back(bundleEventCallback);
4460     return true;
4461 }
4462 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)4463 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4464 {
4465     APP_LOGD("begin to UnregisterBundleEventCallback");
4466     if (bundleEventCallback == nullptr) {
4467         APP_LOGW("bundleEventCallback is null");
4468         return false;
4469     }
4470     std::lock_guard lock(eventCallbackMutex_);
4471     eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
4472         [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
4473             return callback->AsObject() == bundleEventCallback->AsObject();
4474         }), eventCallbackList_.end());
4475     return true;
4476 }
4477 
NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const4478 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
4479 {
4480     APP_LOGD("begin to NotifyBundleEventCallback");
4481     std::lock_guard lock(eventCallbackMutex_);
4482     for (const auto &callback : eventCallbackList_) {
4483         callback->OnReceiveEvent(eventData);
4484     }
4485     APP_LOGD("finish to NotifyBundleEventCallback");
4486 }
4487 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)4488 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4489 {
4490     APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4491     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4492     callbackList_.erase(std::remove_if(callbackList_.begin(),
4493         callbackList_.end(),
4494         [&](const sptr<IBundleStatusCallback> &callback) {
4495             return callback->AsObject() == bundleStatusCallback->AsObject();
4496         }),
4497         callbackList_.end());
4498     return true;
4499 }
4500 
UnregisterBundleStatusCallback()4501 bool BundleDataMgr::UnregisterBundleStatusCallback()
4502 {
4503     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4504     callbackList_.clear();
4505     return true;
4506 }
4507 
GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)4508 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
4509 {
4510     if (innerBundleUserInfo.bundleName.empty()) {
4511         APP_LOGW("bundleName is null");
4512         return false;
4513     }
4514 
4515     int32_t bundleId = INVALID_BUNDLEID;
4516     if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
4517         APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
4518         return false;
4519     }
4520 
4521     innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
4522         + bundleId % Constants::BASE_USER_RANGE;
4523     innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
4524     return true;
4525 }
4526 
GenerateBundleId(const std::string &bundleName, int32_t &bundleId)4527 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
4528 {
4529     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4530     if (bundleIdMap_.empty()) {
4531         APP_LOGD("first app install");
4532         bundleId = baseAppUid_;
4533         bundleIdMap_.emplace(bundleId, bundleName);
4534         return true;
4535     }
4536 
4537     for (const auto &innerBundleId : bundleIdMap_) {
4538         if (innerBundleId.second == bundleName) {
4539             bundleId = innerBundleId.first;
4540             return true;
4541         }
4542     }
4543 
4544     for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
4545         if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
4546             APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
4547             bundleId = i;
4548             bundleIdMap_.emplace(bundleId, bundleName);
4549             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4550             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4551             return true;
4552         }
4553     }
4554 
4555     if (bundleIdMap_.rbegin()->first == MAX_APP_UID) {
4556         APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
4557         return false;
4558     }
4559 
4560     bundleId = bundleIdMap_.rbegin()->first + 1;
4561     bundleIdMap_.emplace(bundleId, bundleName);
4562     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4563     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4564     return true;
4565 }
4566 
SetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName, const int32_t upgradeFlag)4567 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
4568     const std::string &moduleName, const int32_t upgradeFlag)
4569 {
4570     APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
4571     if (bundleName.empty() || moduleName.empty()) {
4572         APP_LOGW("bundleName or moduleName is empty");
4573         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4574     }
4575     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4576     auto infoItem = bundleInfos_.find(bundleName);
4577     if (infoItem == bundleInfos_.end()) {
4578         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4579     }
4580     InnerBundleInfo &newInfo = infoItem->second;
4581     ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
4582     if (setFlag == ERR_OK) {
4583         if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
4584             return ERR_OK;
4585         }
4586         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
4587     }
4588     APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
4589     return setFlag;
4590 }
4591 
GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const4592 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
4593 {
4594     APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
4595     if (bundleName.empty() || moduleName.empty()) {
4596         APP_LOGW("bundleName or moduleName is empty");
4597         return false;
4598     }
4599     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4600     auto infoItem = bundleInfos_.find(bundleName);
4601     if (infoItem == bundleInfos_.end()) {
4602         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4603         return false;
4604     }
4605     InnerBundleInfo newInfo = infoItem->second;
4606     return newInfo.GetModuleUpgradeFlag(moduleName);
4607 }
4608 
RecycleUidAndGid(const InnerBundleInfo &info)4609 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
4610 {
4611     auto userInfos = info.GetInnerBundleUserInfos();
4612     if (userInfos.empty()) {
4613         APP_LOGE("user infos is empty");
4614         return;
4615     }
4616 
4617     auto innerBundleUserInfo = userInfos.begin()->second;
4618     int32_t bundleId = innerBundleUserInfo.uid -
4619         innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
4620     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4621     auto infoItem = bundleIdMap_.find(bundleId);
4622     if (infoItem == bundleIdMap_.end()) {
4623         return;
4624     }
4625 
4626     bundleIdMap_.erase(bundleId);
4627     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH);
4628     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::SHAREFS_CONFIG_PATH);
4629 }
4630 
RestoreUidAndGid()4631 bool BundleDataMgr::RestoreUidAndGid()
4632 {
4633     for (const auto &info : bundleInfos_) {
4634         bool onlyInsertOne = false;
4635         for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
4636             auto innerBundleUserInfo = infoItem.second;
4637             AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
4638             if (!onlyInsertOne) {
4639                 onlyInsertOne = true;
4640                 int32_t bundleId = innerBundleUserInfo.uid -
4641                     innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
4642                 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4643                 auto item = bundleIdMap_.find(bundleId);
4644                 if (item == bundleIdMap_.end()) {
4645                     bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
4646                 } else {
4647                     bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
4648                 }
4649                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4650                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId,
4651                     ServiceConstants::SHAREFS_CONFIG_PATH);
4652             }
4653             // appClone
4654             std::string bundleName = info.second.GetBundleName();
4655             std::map<std::string, InnerBundleCloneInfo> &clones = innerBundleUserInfo.cloneInfos;
4656             for (auto iter = clones.begin(); iter != clones.end(); iter++) {
4657                 auto &cloneInfo = iter->second;
4658                 int32_t bundleId = cloneInfo.uid - cloneInfo.userId * Constants::BASE_USER_RANGE;
4659                 std::string cloneBundleName =
4660                     BundleCloneCommonHelper::GetCloneBundleIdKey(bundleName, cloneInfo.appIndex);
4661                 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4662                 auto item = bundleIdMap_.find(bundleId);
4663                 if (item == bundleIdMap_.end()) {
4664                     bundleIdMap_.emplace(bundleId, cloneBundleName);
4665                 } else {
4666                     bundleIdMap_[bundleId] = cloneBundleName;
4667                 }
4668             }
4669         }
4670     }
4671     return true;
4672 }
4673 
RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)4674 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
4675 {
4676     if (sandboxAppHelper_ != nullptr) {
4677         std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4678         sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
4679     }
4680 }
4681 
GetBundleMutex(const std::string &bundleName)4682 std::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
4683 {
4684     bundleMutex_.lock_shared();
4685     auto it = bundleMutexMap_.find(bundleName);
4686     if (it == bundleMutexMap_.end()) {
4687         bundleMutex_.unlock_shared();
4688         std::unique_lock lock {bundleMutex_};
4689         return bundleMutexMap_[bundleName];
4690     }
4691     bundleMutex_.unlock_shared();
4692     return it->second;
4693 }
4694 
GetProvisionId(const std::string &bundleName, std::string &provisionId) const4695 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
4696 {
4697     APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
4698     if (bundleName.empty()) {
4699         APP_LOGW("bundleName empty");
4700         return false;
4701     }
4702     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4703     auto infoItem = bundleInfos_.find(bundleName);
4704     if (infoItem == bundleInfos_.end()) {
4705         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4706         return false;
4707     }
4708     provisionId = infoItem->second.GetProvisionId();
4709     return true;
4710 }
4711 
GetAppFeature(const std::string &bundleName, std::string &appFeature) const4712 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
4713 {
4714     APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
4715     if (bundleName.empty()) {
4716         APP_LOGW("bundleName empty");
4717         return false;
4718     }
4719     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4720     auto infoItem = bundleInfos_.find(bundleName);
4721     if (infoItem == bundleInfos_.end()) {
4722         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4723         return false;
4724     }
4725     appFeature = infoItem->second.GetAppFeature();
4726     return true;
4727 }
4728 
SetInitialUserFlag(bool flag)4729 void BundleDataMgr::SetInitialUserFlag(bool flag)
4730 {
4731     APP_LOGD("SetInitialUserFlag %{public}d", flag);
4732     if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
4733         bundlePromise_->NotifyAllTasksExecuteFinished();
4734     }
4735 
4736     initialUserFlag_ = flag;
4737 }
4738 
GetDataStorage() const4739 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
4740 {
4741     return dataStorage_;
4742 }
4743 
GetAllFormsInfo(std::vector<FormInfo> &formInfos) const4744 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
4745 {
4746     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4747     if (bundleInfos_.empty()) {
4748         APP_LOGW("bundleInfos_ data is empty");
4749         return false;
4750     }
4751     auto result = false;
4752     for (const auto &item : bundleInfos_) {
4753         if (item.second.IsDisabled()) {
4754             APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
4755             continue;
4756         }
4757         item.second.GetFormsInfoByApp(formInfos);
4758         result = true;
4759     }
4760     APP_LOGD("all the form infos find success");
4761     return result;
4762 }
4763 
GetFormsInfoByModule( const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const4764 bool BundleDataMgr::GetFormsInfoByModule(
4765     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
4766 {
4767     if (bundleName.empty()) {
4768         APP_LOGW("bundle name is empty");
4769         return false;
4770     }
4771     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4772     if (bundleInfos_.empty()) {
4773         APP_LOGW("bundleInfos_ data is empty");
4774         return false;
4775     }
4776     auto infoItem = bundleInfos_.find(bundleName);
4777     if (infoItem == bundleInfos_.end()) {
4778         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
4779         return false;
4780     }
4781     if (infoItem->second.IsDisabled()) {
4782         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
4783         return false;
4784     }
4785     infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
4786     if (formInfos.empty()) {
4787         return false;
4788     }
4789     APP_LOGD("module forminfo find success");
4790     return true;
4791 }
4792 
GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const4793 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
4794 {
4795     if (bundleName.empty()) {
4796         APP_LOGW("bundle name is empty");
4797         return false;
4798     }
4799     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4800     if (bundleInfos_.empty()) {
4801         APP_LOGW("bundleInfos_ data is empty");
4802         return false;
4803     }
4804     auto infoItem = bundleInfos_.find(bundleName);
4805     if (infoItem == bundleInfos_.end()) {
4806         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
4807         return false;
4808     }
4809     if (infoItem->second.IsDisabled()) {
4810         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
4811         return false;
4812     }
4813     infoItem->second.GetFormsInfoByApp(formInfos);
4814     APP_LOGD("App forminfo find success");
4815     return true;
4816 }
4817 
GetShortcutInfos( const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const4818 bool BundleDataMgr::GetShortcutInfos(
4819     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
4820 {
4821     int32_t requestUserId = GetUserId(userId);
4822     if (requestUserId == Constants::INVALID_USERID) {
4823         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
4824         return false;
4825     }
4826 
4827     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4828     InnerBundleInfo innerBundleInfo;
4829     if (!GetInnerBundleInfoWithFlags(
4830         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
4831         APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
4832             bundleName.c_str(), requestUserId);
4833         return false;
4834     }
4835     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
4836     return true;
4837 }
GetShortcutInfosByInnerBundleInfo( const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const4838 bool BundleDataMgr::GetShortcutInfosByInnerBundleInfo(
4839     const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const
4840 {
4841     if (!info.GetIsNewVersion()) {
4842         info.GetShortcutInfos(shortcutInfos);
4843         return true;
4844     }
4845     AbilityInfo abilityInfo;
4846     info.GetMainAbilityInfo(abilityInfo);
4847     if (abilityInfo.hapPath.empty() || abilityInfo.metadata.size() <= 0) {
4848         return false;
4849     }
4850     std::string rawData;
4851     for (const auto &meta : abilityInfo.metadata) {
4852         if (meta.name.compare(META_DATA_SHORTCUTS_NAME) == 0) {
4853             std::string resName = meta.resource;
4854             std::string hapPath = abilityInfo.hapPath;
4855             size_t pos = resName.rfind(PROFILE_PREFIX);
4856             bool posValid = (pos != std::string::npos) && (pos != resName.length() - strlen(PROFILE_PREFIX));
4857             if (!posValid) {
4858                 APP_LOGE("resName invalid %{public}s", resName.c_str());
4859                 return false;
4860             }
4861             std::string profileName = PROFILE_PATH + resName.substr(pos + strlen(PROFILE_PREFIX)) + JSON_SUFFIX;
4862             GetJsonProfileByExtractor(hapPath, profileName, rawData);
4863             break;
4864         }
4865     }
4866     if (rawData.empty()) {
4867         APP_LOGE("shortcutinfo is empty");
4868         return false;
4869     }
4870     nlohmann::json jsonObject = nlohmann::json::parse(rawData, nullptr, false);
4871     if (jsonObject.is_discarded()) {
4872         APP_LOGE("shortcuts json invalid");
4873         return false;
4874     }
4875     ShortcutJson shortcutJson = jsonObject.get<ShortcutJson>();
4876     for (const Shortcut &item : shortcutJson.shortcuts) {
4877         ShortcutInfo shortcutInfo;
4878         shortcutInfo.bundleName = abilityInfo.bundleName;
4879         shortcutInfo.moduleName = abilityInfo.moduleName;
4880         info.InnerProcessShortcut(item, shortcutInfo);
4881         shortcutInfo.sourceType = 1;
4882         shortcutInfos.emplace_back(shortcutInfo);
4883     }
4884     return true;
4885 }
4886 
GetShortcutInfoV9( const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const4887 ErrCode BundleDataMgr::GetShortcutInfoV9(
4888     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
4889 {
4890     int32_t requestUserId = GetUserId(userId);
4891     if (requestUserId == Constants::INVALID_USERID) {
4892         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
4893         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4894     }
4895     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4896     InnerBundleInfo innerBundleInfo;
4897     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
4898         BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
4899     if (ret != ERR_OK) {
4900         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
4901             bundleName.c_str(), requestUserId);
4902         return ret;
4903     }
4904 
4905     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
4906     return ERR_OK;
4907 }
4908 
GetAllCommonEventInfo(const std::string &eventKey, std::vector<CommonEventInfo> &commonEventInfos) const4909 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
4910     std::vector<CommonEventInfo> &commonEventInfos) const
4911 {
4912     if (eventKey.empty()) {
4913         APP_LOGW("event key is empty");
4914         return false;
4915     }
4916     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4917     if (bundleInfos_.empty()) {
4918         APP_LOGW("bundleInfos_ data is empty");
4919         return false;
4920     }
4921     for (const auto &item : bundleInfos_) {
4922         const InnerBundleInfo &info = item.second;
4923         if (info.IsDisabled()) {
4924             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
4925             continue;
4926         }
4927         info.GetCommonEvents(eventKey, commonEventInfos);
4928     }
4929     if (commonEventInfos.size() == 0) {
4930         APP_LOGW("commonEventInfos is empty");
4931         return false;
4932     }
4933     APP_LOGE("commonEventInfos find success");
4934     return true;
4935 }
4936 
SavePreInstallBundleInfo( const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)4937 bool BundleDataMgr::SavePreInstallBundleInfo(
4938     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
4939 {
4940     if (preInstallDataStorage_ == nullptr) {
4941         APP_LOGW("preInstallDataStorage_ is nullptr");
4942         return false;
4943     }
4944 
4945     if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
4946         APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
4947         return true;
4948     }
4949 
4950     return false;
4951 }
4952 
DeletePreInstallBundleInfo( const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)4953 bool BundleDataMgr::DeletePreInstallBundleInfo(
4954     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
4955 {
4956     if (preInstallDataStorage_ == nullptr) {
4957         APP_LOGW("preInstallDataStorage_ is nullptr");
4958         return false;
4959     }
4960 
4961     if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
4962         APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
4963         return true;
4964     }
4965 
4966     return false;
4967 }
4968 
GetPreInstallBundleInfo( const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)4969 bool BundleDataMgr::GetPreInstallBundleInfo(
4970     const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
4971 {
4972     if (bundleName.empty()) {
4973         APP_LOGW("bundleName is empty");
4974         return false;
4975     }
4976     if (preInstallDataStorage_ == nullptr) {
4977         return false;
4978     }
4979     if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
4980         APP_LOGW_NOFUNC("get preInstall bundleInfo failed -n: %{public}s", bundleName.c_str());
4981         return false;
4982     }
4983     return true;
4984 }
4985 
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)4986 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
4987 {
4988     if (preInstallDataStorage_ == nullptr) {
4989         APP_LOGW("preInstallDataStorage_ is nullptr");
4990         return false;
4991     }
4992 
4993     if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
4994         APP_LOGD("load all storage success");
4995         return true;
4996     }
4997 
4998     return false;
4999 }
5000 
SaveInnerBundleInfo(const InnerBundleInfo &info) const5001 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
5002 {
5003     APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
5004     if (dataStorage_->SaveStorageBundleInfo(info)) {
5005         APP_LOGD("save install InnerBundleInfo successfully");
5006         return true;
5007     }
5008     APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
5009     return false;
5010 }
5011 
GetInnerBundleUserInfoByUserId(const std::string &bundleName, int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const5012 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
5013     int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
5014 {
5015     APP_LOGD("get user info start: bundleName: (%{public}s)  userId: (%{public}d) ",
5016         bundleName.c_str(), userId);
5017     int32_t requestUserId = GetUserId(userId);
5018     if (requestUserId == Constants::INVALID_USERID) {
5019         return false;
5020     }
5021 
5022     if (bundleName.empty()) {
5023         APP_LOGW("bundle name is empty");
5024         return false;
5025     }
5026 
5027     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5028     if (bundleInfos_.empty()) {
5029         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5030         return false;
5031     }
5032 
5033     auto infoItem = bundleInfos_.find(bundleName);
5034     if (infoItem == bundleInfos_.end()) {
5035         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5036         return false;
5037     }
5038 
5039     return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
5040 }
5041 
GetUserId(int32_t userId) const5042 int32_t BundleDataMgr::GetUserId(int32_t userId) const
5043 {
5044     if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
5045         return userId;
5046     }
5047 
5048     if (userId == Constants::UNSPECIFIED_USERID) {
5049         userId = GetUserIdByCallingUid();
5050     }
5051 
5052     if (!HasUserId(userId)) {
5053         APP_LOGD("user is not existed");
5054         userId = Constants::INVALID_USERID;
5055     }
5056 
5057     return userId;
5058 }
5059 
GetUserIdByUid(int32_t uid) const5060 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
5061 {
5062     return BundleUtil::GetUserIdByUid(uid);
5063 }
5064 
AddUserId(int32_t userId)5065 void BundleDataMgr::AddUserId(int32_t userId)
5066 {
5067     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5068     auto item = multiUserIdsSet_.find(userId);
5069     if (item != multiUserIdsSet_.end()) {
5070         return;
5071     }
5072 
5073     multiUserIdsSet_.insert(userId);
5074 }
5075 
RemoveUserId(int32_t userId)5076 void BundleDataMgr::RemoveUserId(int32_t userId)
5077 {
5078     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5079     auto item = multiUserIdsSet_.find(userId);
5080     if (item == multiUserIdsSet_.end()) {
5081         return;
5082     }
5083 
5084     multiUserIdsSet_.erase(item);
5085 }
5086 
HasUserId(int32_t userId) const5087 bool BundleDataMgr::HasUserId(int32_t userId) const
5088 {
5089     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5090     return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
5091 }
5092 
GetUserIdByCallingUid() const5093 int32_t BundleDataMgr::GetUserIdByCallingUid() const
5094 {
5095     return BundleUtil::GetUserIdByCallingUid();
5096 }
5097 
GetAllUser() const5098 std::set<int32_t> BundleDataMgr::GetAllUser() const
5099 {
5100     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5101     return multiUserIdsSet_;
5102 }
5103 
GetInnerBundleUserInfos( const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const5104 bool BundleDataMgr::GetInnerBundleUserInfos(
5105     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
5106 {
5107     APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
5108     if (bundleName.empty()) {
5109         APP_LOGW("bundle name is empty");
5110         return false;
5111     }
5112 
5113     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5114     if (bundleInfos_.empty()) {
5115         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5116         return false;
5117     }
5118 
5119     auto infoItem = bundleInfos_.find(bundleName);
5120     if (infoItem == bundleInfos_.end()) {
5121         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
5122         return false;
5123     }
5124 
5125     for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
5126         innerBundleUserInfos.emplace_back(userInfo.second);
5127     }
5128 
5129     return !innerBundleUserInfos.empty();
5130 }
5131 
GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)5132 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
5133 {
5134     APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5135     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5136     InnerBundleInfo info;
5137     if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
5138         return Constants::EMPTY_STRING;
5139     }
5140 
5141     return info.GetAppPrivilegeLevel();
5142 }
5143 
QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const5144 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
5145     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5146 {
5147     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5148     int32_t requestUserId = GetUserId(userId);
5149     if (requestUserId == Constants::INVALID_USERID) {
5150         return false;
5151     }
5152 
5153     ElementName element = want.GetElement();
5154     std::string bundleName = element.GetBundleName();
5155     std::string extensionName = element.GetAbilityName();
5156     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s extensionName:%{public}s",
5157         bundleName.c_str(), extensionName.c_str());
5158     // explicit query
5159     if (!bundleName.empty() && !extensionName.empty()) {
5160         ExtensionAbilityInfo info;
5161         bool ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
5162         if (!ret) {
5163             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension error -n %{public}s -e %{public}s -u %{public}d"
5164                 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5165             return false;
5166         }
5167         extensionInfos.emplace_back(info);
5168         return true;
5169     }
5170 
5171     bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
5172     if (!ret) {
5173         LOG_D(BMS_TAG_QUERY,
5174             "implicit queryExtension error action:%{public}s uri:%{private}s type:%{public}s"
5175             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5176             requestUserId);
5177         return false;
5178     }
5179     if (extensionInfos.size() == 0) {
5180         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5181             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5182             requestUserId);
5183         return false;
5184     }
5185     LOG_D(BMS_TAG_QUERY, "query extensionAbilityInfo successfully");
5186     return true;
5187 }
5188 
QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const5189 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
5190     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5191 {
5192     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5193     int32_t requestUserId = GetUserId(userId);
5194     if (requestUserId == Constants::INVALID_USERID) {
5195         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5196     }
5197 
5198     ElementName element = want.GetElement();
5199     std::string bundleName = element.GetBundleName();
5200     std::string extensionName = element.GetAbilityName();
5201     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
5202         bundleName.c_str(), extensionName.c_str());
5203     // explicit query
5204     if (!bundleName.empty() && !extensionName.empty()) {
5205         ExtensionAbilityInfo info;
5206         ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
5207         if (ret != ERR_OK) {
5208             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension V9 error -n %{public}s -e %{public}s -u %{public}d"
5209                 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5210             return ret;
5211         }
5212         extensionInfos.emplace_back(info);
5213         return ERR_OK;
5214     }
5215     ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5216     if (ret != ERR_OK) {
5217         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionInfosV9 error");
5218         return ret;
5219     }
5220     if (extensionInfos.empty()) {
5221         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5222             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5223             requestUserId);
5224         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5225     }
5226     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 success");
5227     return ERR_OK;
5228 }
5229 
QueryExtensionAbilityInfos(uint32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const5230 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
5231     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5232 {
5233     int32_t requestUserId = GetUserId(userId);
5234     if (requestUserId == Constants::INVALID_USERID) {
5235         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5236     }
5237 
5238     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5239     ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
5240     if (ret != ERR_OK) {
5241         LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos error");
5242         return ret;
5243     }
5244     if (extensionInfos.empty()) {
5245         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5246         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5247     }
5248     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos success");
5249     return ERR_OK;
5250 }
5251 
QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const5252 ErrCode BundleDataMgr::QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName,
5253     uint32_t flags, int32_t userId,
5254     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5255 {
5256     LOG_I(BMS_TAG_QUERY, "query failed %{public}s %{public}d", typeName.c_str(), userId);
5257     int32_t requestUserId = GetUserId(userId);
5258     if (requestUserId == Constants::INVALID_USERID) {
5259         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5260     }
5261     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5262     ErrCode ret = ImplicitQueryAllExtensionInfos(
5263         flags, requestUserId, extensionInfos, appIndex, typeName);
5264     if (ret != ERR_OK) {
5265         LOG_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfos error");
5266         return ret;
5267     }
5268     if (extensionInfos.empty()) {
5269         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5270         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5271     }
5272     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos success");
5273     return ERR_OK;
5274 }
5275 
GetAllExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId, const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5276 void BundleDataMgr::GetAllExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId,
5277     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5278 {
5279     auto extensionInfos = info.GetInnerExtensionInfos();
5280     for (const auto &extensionAbilityInfo : extensionInfos) {
5281         if (typeName != extensionAbilityInfo.second.extensionTypeName) {
5282             continue;
5283         }
5284         infos.emplace_back(extensionAbilityInfo.second);
5285         return;
5286     }
5287 }
5288 
ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId, ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const5289 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
5290     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5291 {
5292     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5293     ElementName element = want.GetElement();
5294     std::string bundleName = element.GetBundleName();
5295     std::string moduleName = element.GetModuleName();
5296     std::string extensionName = element.GetAbilityName();
5297     int32_t requestUserId = GetUserId(userId);
5298     if (requestUserId == Constants::INVALID_USERID) {
5299         return false;
5300     }
5301     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5302     InnerBundleInfo innerBundleInfo;
5303     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
5304         LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5305         return false;
5306     }
5307     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5308         if (sandboxAppHelper_ == nullptr) {
5309             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5310             return false;
5311         }
5312         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5313         if (ret != ERR_OK) {
5314             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5315             return false;
5316         }
5317     }
5318     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5319         bool res = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5320         if (!res) {
5321             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5322             return false;
5323         }
5324     }
5325     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5326     if (!extension) {
5327         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5328         return false;
5329     }
5330     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
5331         extension->permissions.clear();
5332     }
5333     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
5334         extension->metadata.clear();
5335     }
5336     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
5337         extension->skills.clear();
5338     }
5339     extensionInfo = (*extension);
5340     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
5341         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5342         innerBundleInfo.GetApplicationInfo(ApplicationFlag::GET_BASIC_APPLICATION_INFO |
5343             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
5344             extensionInfo.applicationInfo, appIndex);
5345     }
5346     // set uid for NAPI cache use
5347     InnerBundleUserInfo innerBundleUserInfo;
5348     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5349         extensionInfo.uid = innerBundleUserInfo.uid;
5350         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5351             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5352             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5353                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5354                 extensionInfo.uid = cloneInfo.uid;
5355             }
5356         }
5357     }
5358     extensionInfo.appIndex = appIndex;
5359     return true;
5360 }
5361 
ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId, ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const5362 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
5363     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5364 {
5365     ElementName element = want.GetElement();
5366     std::string bundleName = element.GetBundleName();
5367     std::string moduleName = element.GetModuleName();
5368     std::string extensionName = element.GetAbilityName();
5369     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
5370         bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
5371     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d, appIndex:%{public}d",
5372         flags, userId, appIndex);
5373     int32_t requestUserId = GetUserId(userId);
5374     if (requestUserId == Constants::INVALID_USERID) {
5375         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5376     }
5377     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5378     InnerBundleInfo innerBundleInfo;
5379     if (appIndex == 0) {
5380         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
5381         if (ret != ERR_OK) {
5382             LOG_D(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5383             return ret;
5384         }
5385     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5386         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5387         if (ret != ERR_OK) {
5388             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5389             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5390         }
5391     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5392         if (sandboxAppHelper_ == nullptr) {
5393             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5394             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5395         }
5396         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5397         if (ret != ERR_OK) {
5398             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5399             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5400         }
5401     }
5402     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5403     if (!extension) {
5404         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5405         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5406     }
5407     if ((static_cast<uint32_t>(flags) &
5408         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
5409         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
5410         extension->permissions.clear();
5411     }
5412     if ((static_cast<uint32_t>(flags) &
5413         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
5414         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
5415         extension->metadata.clear();
5416     }
5417     if ((static_cast<uint32_t>(flags) &
5418         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
5419         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
5420         extension->skills.clear();
5421     }
5422     extensionInfo = (*extension);
5423     if ((static_cast<uint32_t>(flags) &
5424         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5425         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5426         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5427         innerBundleInfo.GetApplicationInfoV9(
5428             static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
5429             responseUserId, extensionInfo.applicationInfo, appIndex);
5430     }
5431     // set uid for NAPI cache use
5432     InnerBundleUserInfo innerBundleUserInfo;
5433     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5434         extensionInfo.uid = innerBundleUserInfo.uid;
5435         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5436             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5437             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5438                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5439                 extensionInfo.uid = cloneInfo.uid;
5440             }
5441         }
5442     }
5443     extensionInfo.appIndex = appIndex;
5444     return ERR_OK;
5445 }
5446 
FilterExtensionAbilityInfosByModuleName(const std::string &moduleName, std::vector<ExtensionAbilityInfo> &extensionInfos) const5447 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
5448     std::vector<ExtensionAbilityInfo> &extensionInfos) const
5449 {
5450     LOG_D(BMS_TAG_QUERY, "FilterExtensionAbilityInfos moduleName: %{public}s", moduleName.c_str());
5451     if (moduleName.empty()) {
5452         return;
5453     }
5454     for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
5455         if (iter->moduleName != moduleName) {
5456             iter = extensionInfos.erase(iter);
5457         } else {
5458             ++iter;
5459         }
5460     }
5461 }
5462 
ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const5463 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5464     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5465 {
5466     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5467     if (want.GetAction().empty() && want.GetEntities().empty()
5468         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
5469         LOG_W(BMS_TAG_QUERY, "param invalid");
5470         return false;
5471     }
5472     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
5473         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
5474     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
5475 
5476     int32_t requestUserId = GetUserId(userId);
5477     if (requestUserId == Constants::INVALID_USERID) {
5478         return false;
5479     }
5480     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5481     std::string bundleName = want.GetElement().GetBundleName();
5482     if (!bundleName.empty()) {
5483         // query in current bundle
5484         if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
5485             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtension failed, bundleName:%{public}s",
5486                 bundleName.c_str());
5487             return false;
5488         }
5489     } else {
5490         // query all
5491         ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
5492     }
5493     // sort by priority, descending order.
5494     if (extensionInfos.size() > 1) {
5495         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
5496             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
5497     }
5498     return true;
5499 }
5500 
ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const5501 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5502     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5503 {
5504     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5505     if (want.GetAction().empty() && want.GetEntities().empty()
5506         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
5507         LOG_W(BMS_TAG_QUERY, "param invalid");
5508         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5509     }
5510     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
5511         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
5512     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
5513 
5514     int32_t requestUserId = GetUserId(userId);
5515     if (requestUserId == Constants::INVALID_USERID) {
5516         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5517     }
5518     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5519     std::string bundleName = want.GetElement().GetBundleName();
5520     if (!bundleName.empty()) {
5521         // query in current bundle
5522         ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5523         if (ret != ERR_OK) {
5524             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s",
5525                 bundleName.c_str());
5526             return ret;
5527         }
5528     } else {
5529         // query all
5530         ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5531     }
5532     // sort by priority, descending order.
5533     if (extensionInfos.size() > 1) {
5534         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
5535             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
5536     }
5537     return ERR_OK;
5538 }
5539 
ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5540 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5541     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5542 {
5543     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5544     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfos");
5545     std::string bundleName = want.GetElement().GetBundleName();
5546     InnerBundleInfo innerBundleInfo;
5547     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
5548         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
5549             bundleName.c_str());
5550         return false;
5551     }
5552     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5553         if (sandboxAppHelper_ == nullptr) {
5554             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5555             return false;
5556         }
5557         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
5558         if (ret != ERR_OK) {
5559             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5560             return false;
5561         }
5562     }
5563     if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5564         bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex);
5565         if (!ret) {
5566             LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed errCode %{public}d", ret);
5567             return false;
5568         }
5569     }
5570     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5571     GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5572     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
5573     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfos");
5574     return true;
5575 }
5576 
ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5577 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5578     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5579 {
5580     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5581     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfosV9");
5582     std::string bundleName = want.GetElement().GetBundleName();
5583     InnerBundleInfo innerBundleInfo;
5584     if (appIndex == 0) {
5585         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
5586         if (ret != ERR_OK) {
5587             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5588                 bundleName.c_str());
5589             return ret;
5590         }
5591     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5592         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
5593         if (ret != ERR_OK) {
5594             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5595                 bundleName.c_str());
5596             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5597         }
5598     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5599         if (sandboxAppHelper_ == nullptr) {
5600             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5601             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5602         }
5603         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
5604         if (ret != ERR_OK) {
5605             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5606             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5607         }
5608     }
5609     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5610     GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5611     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
5612     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfosV9");
5613     return ERR_OK;
5614 }
5615 
ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5616 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5617     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5618 {
5619     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5620     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
5621     int32_t requestUserId = GetUserId(userId);
5622     if (requestUserId == Constants::INVALID_USERID) {
5623         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5624         return;
5625     }
5626 
5627     // query from bundleInfos_
5628     if (appIndex == 0) {
5629         for (const auto &item : bundleInfos_) {
5630             const InnerBundleInfo &innerBundleInfo = item.second;
5631             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5632             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
5633                 continue;
5634             }
5635             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
5636         }
5637     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5638         // query from sandbox manager for sandbox bundle
5639         if (sandboxAppHelper_ == nullptr) {
5640             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5641             return;
5642         }
5643         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
5644         for (const auto &item : sandboxMap) {
5645             InnerBundleInfo info;
5646             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
5647             if (pos == std::string::npos) {
5648                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
5649                 continue;
5650             }
5651             std::string innerBundleName = item.first.substr(pos + 1);
5652             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
5653                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
5654                 continue;
5655             }
5656 
5657             int32_t responseUserId = info.GetResponseUserId(userId);
5658             GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
5659         }
5660     } else if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5661         LOG_D(BMS_TAG_QUERY, "start to query extensionAbility in appClone");
5662         for (const auto &item : bundleInfos_) {
5663             int32_t responseUserId = item.second.GetResponseUserId(requestUserId);
5664             const InnerBundleInfo &innerBundleInfo = item.second;
5665             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
5666                 LOG_D(BMS_TAG_QUERY,
5667                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
5668                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
5669                 continue;
5670             }
5671             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5672         }
5673     }
5674     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
5675 }
5676 
ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5677 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5678     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5679 {
5680     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5681     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfosV9");
5682     // query from bundleInfos_
5683     if (appIndex == 0) {
5684         for (const auto &item : bundleInfos_) {
5685             InnerBundleInfo innerBundleInfo;
5686             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
5687             if (ret != ERR_OK) {
5688                 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
5689                     item.first.c_str());
5690                 continue;
5691             }
5692             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5693             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
5694         }
5695     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5696         for (const auto &item : bundleInfos_) {
5697             const InnerBundleInfo &innerBundleInfo = item.second;
5698             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5699             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
5700                 LOG_D(BMS_TAG_QUERY,
5701                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
5702                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
5703                 continue;
5704             }
5705             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5706         }
5707     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5708         // query from sandbox manager for sandbox bundle
5709         if (sandboxAppHelper_ == nullptr) {
5710             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5711             return;
5712         }
5713         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
5714         for (const auto &item : sandboxMap) {
5715             InnerBundleInfo info;
5716             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
5717             if (pos == std::string::npos) {
5718                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
5719                 continue;
5720             }
5721             std::string innerBundleName = item.first.substr(pos + 1);
5722             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
5723                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
5724                 continue;
5725             }
5726 
5727             int32_t responseUserId = info.GetResponseUserId(userId);
5728             GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
5729         }
5730     }
5731     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfosV9");
5732 }
5733 
GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const5734 void BundleDataMgr::GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId,
5735     std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const
5736 {
5737     for (const auto &item : bundleInfos_) {
5738         if ((flags &
5739                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
5740                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
5741             if (item.second.GetInnerExtensionInfos().empty() || !item.second.IsSystemApp()) {
5742                 continue;
5743             }
5744             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, userId);
5745             if (!ret) {
5746                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5747                     item.first.c_str());
5748                 continue;
5749             }
5750             int32_t responseUserId = item.second.GetResponseUserId(userId);
5751             GetAllExtensionInfosByExtensionTypeName(typeName, flags, responseUserId, item.second, infos);
5752             if (infos.size() > 0) {
5753                 return;
5754             }
5755         } else {
5756             InnerBundleInfo innerBundleInfo;
5757             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId);
5758             if (!ret) {
5759                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5760                     item.first.c_str());
5761                 continue;
5762             }
5763             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5764             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
5765         }
5766     }
5767 }
5768 
ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const5769 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
5770     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const
5771 {
5772     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
5773     // query from bundleInfos_
5774     if (appIndex == 0) {
5775         GetExtensionAbilityInfoByTypeName(flags, userId, infos, typeName);
5776     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5777         // query from sandbox manager for sandbox bundle
5778         if (sandboxAppHelper_ == nullptr) {
5779             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5780             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5781         }
5782         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
5783         for (const auto &item : sandboxMap) {
5784             InnerBundleInfo info;
5785             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
5786             if (pos == std::string::npos) {
5787                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
5788                 continue;
5789             }
5790             std::string innerBundleName = item.first.substr(pos + 1);
5791             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
5792                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
5793                 continue;
5794             }
5795             int32_t responseUserId = info.GetResponseUserId(userId);
5796             GetAllExtensionInfos(flags, responseUserId, info, infos, appIndex);
5797         }
5798     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5799         for (const auto &item : bundleInfos_) {
5800             InnerBundleInfo innerBundleInfo;
5801             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId, appIndex);
5802             if (!ret) {
5803                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5804                     item.first.c_str());
5805                 continue;
5806             }
5807             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5808             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos, appIndex);
5809         }
5810     }
5811     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
5812     return ERR_OK;
5813 }
5814 
GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId, const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5815 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
5816     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5817 {
5818     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5819     auto extensionSkillInfos = info.GetExtensionSkillInfos();
5820     auto extensionInfos = info.GetInnerExtensionInfos();
5821     for (const auto &skillInfos : extensionSkillInfos) {
5822         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
5823             const Skill &skill = skillInfos.second[skillIndex];
5824             size_t matchUriIndex = 0;
5825             if (!skill.Match(want, matchUriIndex)) {
5826                 continue;
5827             }
5828             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
5829                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
5830                     skillInfos.first.c_str());
5831                 break;
5832             }
5833             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
5834             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_APPLICATION) ==
5835                 GET_EXTENSION_INFO_WITH_APPLICATION) {
5836                 info.GetApplicationInfo(
5837                     ApplicationFlag::GET_BASIC_APPLICATION_INFO |
5838                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
5839                     extensionInfo.applicationInfo);
5840             }
5841             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_PERMISSION) !=
5842                 GET_EXTENSION_INFO_WITH_PERMISSION) {
5843                 extensionInfo.permissions.clear();
5844             }
5845             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_METADATA) != GET_EXTENSION_INFO_WITH_METADATA) {
5846                 extensionInfo.metadata.clear();
5847             }
5848             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_SKILL) != GET_EXTENSION_INFO_WITH_SKILL) {
5849                 extensionInfo.skills.clear();
5850             }
5851             if ((static_cast<uint32_t>(flags) &
5852                 GET_EXTENSION_INFO_WITH_SKILL_URI) == GET_EXTENSION_INFO_WITH_SKILL_URI) {
5853                 AddSkillUrisInfo(skillInfos.second, extensionInfo.skillUri, skillIndex, matchUriIndex);
5854             }
5855             extensionInfo.appIndex = appIndex;
5856             infos.emplace_back(extensionInfo);
5857             break;
5858         }
5859     }
5860 }
5861 
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) const5862 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
5863     ExtensionAbilityInfo &extensionInfo, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos,
5864     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
5865 {
5866     if ((static_cast<uint32_t>(flags) &
5867         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5868         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5869         info.GetApplicationInfoV9(static_cast<int32_t>(
5870             GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
5871     }
5872     if ((static_cast<uint32_t>(flags) &
5873         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
5874         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
5875         extensionInfo.permissions.clear();
5876     }
5877     if ((static_cast<uint32_t>(flags) &
5878         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
5879         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
5880         extensionInfo.metadata.clear();
5881     }
5882     if ((static_cast<uint32_t>(flags) &
5883         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
5884         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
5885         extensionInfo.skills.clear();
5886     }
5887     if ((static_cast<uint32_t>(flags) &
5888         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) ==
5889         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) {
5890         AddSkillUrisInfo(skills, extensionInfo.skillUri, matchSkillIndex, matchUriIndex);
5891     }
5892     extensionInfo.appIndex = appIndex;
5893     infos.emplace_back(extensionInfo);
5894 }
5895 
GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId, const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5896 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5897     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5898 {
5899     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5900     auto extensionSkillInfos = info.GetExtensionSkillInfos();
5901     auto extensionInfos = info.GetInnerExtensionInfos();
5902     for (const auto &skillInfos : extensionSkillInfos) {
5903         if (want.GetAction() == SHARE_ACTION) {
5904             if (!MatchShare(want, skillInfos.second)) {
5905                 continue;
5906             }
5907             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
5908                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
5909                     skillInfos.first.c_str());
5910                 continue;
5911             }
5912             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
5913             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
5914                 std::nullopt, std::nullopt, appIndex);
5915             continue;
5916         }
5917         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
5918             const Skill &skill = skillInfos.second[skillIndex];
5919             size_t matchUriIndex = 0;
5920             if (!skill.Match(want, matchUriIndex)) {
5921                 continue;
5922             }
5923             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
5924                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
5925                     skillInfos.first.c_str());
5926                 break;
5927             }
5928             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
5929             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
5930                 skillIndex, matchUriIndex, appIndex);
5931             break;
5932         }
5933     }
5934 }
5935 
GetAllExtensionInfos(uint32_t flags, int32_t userId, const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const5936 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
5937     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5938 {
5939     auto extensionInfos = info.GetInnerExtensionInfos();
5940     for (const auto &extensionAbilityInfo : extensionInfos) {
5941         ExtensionAbilityInfo extensionInfo = extensionAbilityInfo.second;
5942         if ((flags &
5943             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5944             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5945             info.GetApplicationInfoV9(static_cast<int32_t>(
5946                 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
5947         }
5948         if ((flags &
5949             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
5950             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
5951             extensionInfo.permissions.clear();
5952         }
5953         if ((flags &
5954             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
5955             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
5956             extensionInfo.metadata.clear();
5957         }
5958         if ((flags &
5959             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
5960             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
5961             extensionInfo.skills.clear();
5962         }
5963         extensionInfo.appIndex = appIndex;
5964         infos.emplace_back(extensionInfo);
5965     }
5966 }
5967 
QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId, std::vector<ExtensionAbilityInfo> &extensionInfos) const5968 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
5969     std::vector<ExtensionAbilityInfo> &extensionInfos) const
5970 {
5971     int32_t requestUserId = GetUserId(userId);
5972     if (requestUserId == Constants::INVALID_USERID) {
5973         return false;
5974     }
5975     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5976     for (const auto &item : bundleInfos_) {
5977         const InnerBundleInfo &innerBundleInfo = item.second;
5978         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5979         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
5980             continue;
5981         }
5982         auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
5983         for (const auto &info : innerExtensionInfos) {
5984             if (info.second.type == extensionType) {
5985                 ExtensionAbilityInfo extensionAbilityInfo = info.second;
5986                 innerBundleInfo.GetApplicationInfo(
5987                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
5988                     extensionAbilityInfo.applicationInfo);
5989                 extensionInfos.emplace_back(extensionAbilityInfo);
5990             }
5991         }
5992     }
5993     return true;
5994 }
5995 
QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId, ExtensionAbilityInfo &extensionAbilityInfo) const5996 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
5997     ExtensionAbilityInfo &extensionAbilityInfo) const
5998 {
5999     int32_t requestUserId = GetUserId(userId);
6000     if (requestUserId == Constants::INVALID_USERID) {
6001         LOG_W(BMS_TAG_QUERY, "invalid userId -1");
6002         return false;
6003     }
6004     if (uri.empty()) {
6005         LOG_W(BMS_TAG_QUERY, "uri empty");
6006         return false;
6007     }
6008     std::string convertUri = uri;
6009     // example of valid param uri : fileShare:///com.example.FileShare/person/10
6010     // example of convertUri : fileShare://com.example.FileShare
6011     size_t schemePos = uri.find(PARAM_URI_SEPARATOR);
6012     if (schemePos != uri.npos) {
6013         // 1. cut string
6014         size_t cutPos = uri.find(ServiceConstants::PATH_SEPARATOR, schemePos + PARAM_URI_SEPARATOR_LEN);
6015         if (cutPos != uri.npos) {
6016             convertUri = uri.substr(0, cutPos);
6017         }
6018         // 2. replace :/// with ://
6019         convertUri.replace(schemePos, PARAM_URI_SEPARATOR_LEN, URI_SEPARATOR);
6020     } else {
6021         if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
6022             LOG_W(BMS_TAG_QUERY, "invalid uri : %{private}s", uri.c_str());
6023             return false;
6024         }
6025     }
6026     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6027     if (bundleInfos_.empty()) {
6028         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
6029         return false;
6030     }
6031     for (const auto &item : bundleInfos_) {
6032         const InnerBundleInfo &info = item.second;
6033         if (info.IsDisabled()) {
6034             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
6035             continue;
6036         }
6037 
6038         int32_t responseUserId = info.GetResponseUserId(requestUserId);
6039         if (!info.GetApplicationEnabled(responseUserId)) {
6040             continue;
6041         }
6042 
6043         bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
6044         if (!ret) {
6045             continue;
6046         }
6047         info.GetApplicationInfo(
6048             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6049             extensionAbilityInfo.applicationInfo);
6050         return true;
6051     }
6052     LOG_NOFUNC_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfoByUri (%{public}s) failed", convertUri.c_str());
6053     return false;
6054 }
6055 
GetStringById(const std::string &bundleName, const std::string &moduleName, uint32_t resId, int32_t userId, const std::string &localeInfo)6056 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
6057     uint32_t resId, int32_t userId, const std::string &localeInfo)
6058 {
6059     APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
6060 #ifdef GLOBAL_RESMGR_ENABLE
6061     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6062     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6063         GetResourceManager(bundleName, moduleName, userId);
6064     if (resourceManager == nullptr) {
6065         APP_LOGW("InitResourceManager failed");
6066         return Constants::EMPTY_STRING;
6067     }
6068     std::string label;
6069     OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
6070     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6071         APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6072         return Constants::EMPTY_STRING;
6073     }
6074     return label;
6075 #else
6076     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6077     return Constants::EMPTY_STRING;
6078 #endif
6079 }
6080 
GetIconById( const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)6081 std::string BundleDataMgr::GetIconById(
6082     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
6083 {
6084     APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
6085         bundleName.c_str(), moduleName.c_str(), resId, density);
6086 #ifdef GLOBAL_RESMGR_ENABLE
6087     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6088     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6089         GetResourceManager(bundleName, moduleName, userId);
6090     if (resourceManager == nullptr) {
6091         APP_LOGW("InitResourceManager failed");
6092         return Constants::EMPTY_STRING;
6093     }
6094     std::string base64;
6095     OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
6096     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6097         APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6098         return Constants::EMPTY_STRING;
6099     }
6100     return base64;
6101 #else
6102     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6103     return Constants::EMPTY_STRING;
6104 #endif
6105 }
6106 
6107 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager( const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const6108 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
6109     const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
6110 {
6111     InnerBundleInfo innerBundleInfo;
6112     if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
6113         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6114         return nullptr;
6115     }
6116     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6117     BundleInfo bundleInfo;
6118     innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
6119     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
6120 
6121     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
6122     if (!resConfig) {
6123         APP_LOGE("resConfig is nullptr");
6124         return nullptr;
6125     }
6126 #ifdef GLOBAL_I18_ENABLE
6127     std::map<std::string, std::string> configs;
6128     OHOS::Global::I18n::LocaleInfo locale(
6129         localeInfo.empty() ? Global::I18n::LocaleConfig::GetSystemLocale() : localeInfo, configs);
6130     resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
6131 #endif
6132     resourceManager->UpdateResConfig(*resConfig);
6133 
6134     for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
6135         std::string moduleResPath;
6136         if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
6137             moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
6138         }
6139         if (!moduleResPath.empty()) {
6140             APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
6141             if (!resourceManager->AddResource(moduleResPath.c_str(), Global::Resource::SELECT_STRING
6142             | Global::Resource::SELECT_MEDIA)) {
6143                 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
6144             }
6145         }
6146     }
6147     return resourceManager;
6148 }
6149 #endif
6150 
GetAllPreInstallBundleInfos()6151 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
6152 {
6153     std::vector<PreInstallBundleInfo> preInstallBundleInfos;
6154     LoadAllPreInstallBundleInfos(preInstallBundleInfos);
6155     return preInstallBundleInfos;
6156 }
6157 
ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const6158 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
6159     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
6160 {
6161     int32_t requestUserId = GetUserId(userId);
6162     if (requestUserId == Constants::INVALID_USERID) {
6163         APP_LOGW("invalid userId");
6164         return false;
6165     }
6166     std::vector<AbilityInfo> abilityInfos;
6167     bool abilityValid =
6168         ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
6169     std::vector<ExtensionAbilityInfo> extensionInfos;
6170     bool extensionValid =
6171         ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
6172     if (!abilityValid && !extensionValid) {
6173         // both invalid
6174         APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
6175         return false;
6176     }
6177     if (abilityValid && extensionValid) {
6178         // both valid
6179         if (abilityInfos[0].priority >= extensionInfos[0].priority) {
6180             APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
6181             abilityInfo = abilityInfos[0];
6182         } else {
6183             APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
6184                 extensionInfos[0].name.c_str());
6185             extensionInfo = extensionInfos[0];
6186         }
6187     } else if (abilityValid) {
6188         // only ability valid
6189         APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
6190         abilityInfo = abilityInfos[0];
6191     } else {
6192         // only extension valid
6193         APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
6194         extensionInfo = extensionInfos[0];
6195     }
6196     return true;
6197 }
6198 
ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault, std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)6199 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
6200     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
6201 {
6202     APP_LOGI_NOFUNC("ImplicitQueryInfos action:%{public}s uri:%{private}s type:%{public}s flags:%{public}d "
6203         "userId:%{public}d withDefault:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(),
6204         want.GetType().c_str(), flags, userId, withDefault);
6205 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
6206     // step1 : find default infos
6207     if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
6208         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6209         if (!abilityInfos.empty() || !extensionInfos.empty()) {
6210             APP_LOGI("find target default application");
6211             findDefaultApp = true;
6212             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6213                 return true;
6214             }
6215             for (auto &info : abilityInfos) {
6216                 info.linkType = LinkType::DEFAULT_APP;
6217             }
6218         }
6219     }
6220     // step2 : find backup default infos
6221     if (withDefault &&
6222         DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
6223         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6224         if (!abilityInfos.empty() || !extensionInfos.empty()) {
6225             APP_LOGI("find target backup default application");
6226             findDefaultApp = true;
6227             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6228                 return true;
6229             }
6230             for (auto &info : abilityInfos) {
6231                 info.linkType = LinkType::DEFAULT_APP;
6232             }
6233         }
6234     }
6235 #endif
6236     // step3 : implicit query infos
6237     bool abilityRet =
6238         ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
6239     APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
6240 
6241     bool extensionRet =
6242         ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
6243     APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
6244 
6245     ImplicitQueryCloneAbilityInfos(want, flags, userId, abilityInfos);
6246     return abilityRet || extensionRet || abilityInfos.size() > 0;
6247 }
6248 
GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName, std::vector<std::string> &dependentModuleNames)6249 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
6250     std::vector<std::string> &dependentModuleNames)
6251 {
6252     APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
6253         bundleName.c_str(), moduleName.c_str());
6254     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6255     auto item = bundleInfos_.find(bundleName);
6256     if (item == bundleInfos_.end()) {
6257         APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
6258         return false;
6259     }
6260     const InnerBundleInfo &innerBundleInfo = item->second;
6261     return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
6262 }
6263 
UpdateRemovable( const std::string &bundleName, bool removable)6264 void BundleDataMgr::UpdateRemovable(
6265     const std::string &bundleName, bool removable)
6266 {
6267     APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
6268     if (bundleName.empty()) {
6269         APP_LOGW("bundleName is empty");
6270         return;
6271     }
6272 
6273     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6274     auto infoItem = bundleInfos_.find(bundleName);
6275     if (infoItem == bundleInfos_.end()) {
6276         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6277         return;
6278     }
6279 
6280     if (infoItem->second.IsRemovable() != removable) {
6281         infoItem->second.UpdateRemovable(true, removable);
6282         SaveInnerBundleInfo(infoItem->second);
6283     }
6284 }
6285 
UpdatePrivilegeCapability( const std::string &bundleName, const ApplicationInfo &appInfo)6286 void BundleDataMgr::UpdatePrivilegeCapability(
6287     const std::string &bundleName, const ApplicationInfo &appInfo)
6288 {
6289     APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
6290     if (bundleName.empty()) {
6291         APP_LOGW("bundleName is empty");
6292         return;
6293     }
6294 
6295     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6296     auto infoItem = bundleInfos_.find(bundleName);
6297     if (infoItem == bundleInfos_.end()) {
6298         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6299         return;
6300     }
6301 
6302     infoItem->second.UpdatePrivilegeCapability(appInfo);
6303 }
6304 
FetchInnerBundleInfo( const std::string &bundleName, InnerBundleInfo &innerBundleInfo)6305 bool BundleDataMgr::FetchInnerBundleInfo(
6306     const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
6307 {
6308     APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
6309     if (bundleName.empty()) {
6310         APP_LOGW("bundleName is empty");
6311         return false;
6312     }
6313 
6314     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6315     auto infoItem = bundleInfos_.find(bundleName);
6316     if (infoItem == bundleInfos_.end()) {
6317         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
6318         return false;
6319     }
6320 
6321     innerBundleInfo = infoItem->second;
6322     return true;
6323 }
6324 
GetInnerBundleInfoUsers(const std::string &bundleName, std::set<int32_t> &userIds)6325 bool BundleDataMgr::GetInnerBundleInfoUsers(const std::string &bundleName, std::set<int32_t> &userIds)
6326 {
6327     InnerBundleInfo info;
6328     if (!FetchInnerBundleInfo(bundleName, info)) {
6329         APP_LOGW("FetchInnerBundleInfo failed");
6330         return false;
6331     }
6332     std::map<std::string, InnerBundleUserInfo> userInfos = info.GetInnerBundleUserInfos();
6333     for (const auto &userInfo : userInfos) {
6334         userIds.insert(userInfo.second.bundleUserInfo.userId);
6335     }
6336     return true;
6337 }
6338 
IsSystemHsp(const std::string &bundleName)6339 bool BundleDataMgr::IsSystemHsp(const std::string &bundleName)
6340 {
6341     InnerBundleInfo info;
6342     if (!FetchInnerBundleInfo(bundleName, info)) {
6343         APP_LOGW("FetchInnerBundleInfo %{public}s failed", bundleName.c_str());
6344         return false;
6345     }
6346     return info.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK;
6347 }
6348 
6349 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId, const Element& element, AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const6350 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
6351     AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
6352 {
6353     APP_LOGD("begin to QueryInfoAndSkillsByElement");
6354     const std::string& bundleName = element.bundleName;
6355     const std::string& moduleName = element.moduleName;
6356     const std::string& abilityName = element.abilityName;
6357     const std::string& extensionName = element.extensionName;
6358     Want want;
6359     ElementName elementName("", bundleName, abilityName, moduleName);
6360     want.SetElement(elementName);
6361     bool isAbility = !element.abilityName.empty();
6362     bool ret = false;
6363     if (isAbility) {
6364         // get ability info
6365         ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6366         if (!ret) {
6367             APP_LOGD("ExplicitQueryAbilityInfo failed, abilityName:%{public}s", element.abilityName.c_str());
6368             return false;
6369         }
6370     } else {
6371         // get extension info
6372         elementName.SetAbilityName(extensionName);
6373         want.SetElement(elementName);
6374         ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6375         if (!ret) {
6376             APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
6377             return false;
6378         }
6379     }
6380 
6381     // get skills info
6382     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6383     if (bundleInfos_.empty()) {
6384         APP_LOGW("bundleInfos_ is empty");
6385         return false;
6386     }
6387     auto item = bundleInfos_.find(bundleName);
6388     if (item == bundleInfos_.end()) {
6389         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
6390         return false;
6391     }
6392     const InnerBundleInfo& innerBundleInfo = item->second;
6393     if (isAbility) {
6394         std::string key;
6395         key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
6396         APP_LOGD("begin to find ability skills, key : %{public}s", key.c_str());
6397         for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
6398             if (infoItem.first == key) {
6399                 skills = infoItem.second;
6400                 APP_LOGD("find ability skills success");
6401                 break;
6402             }
6403         }
6404     } else {
6405         std::string key;
6406         key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
6407         APP_LOGD("begin to find extension skills, key : %{public}s", key.c_str());
6408         for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
6409             if (infoItem.first == key) {
6410                 skills = infoItem.second;
6411                 APP_LOGD("find extension skills success");
6412                 break;
6413             }
6414         }
6415     }
6416     APP_LOGD("QueryInfoAndSkillsByElement success");
6417     return true;
6418 }
6419 
GetElement(int32_t userId, const ElementName& elementName, Element& element) const6420 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
6421 {
6422     APP_LOGD("begin to GetElement");
6423     const std::string& bundleName = elementName.GetBundleName();
6424     const std::string& moduleName = elementName.GetModuleName();
6425     const std::string& abilityName = elementName.GetAbilityName();
6426     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
6427         APP_LOGW("bundleName or moduleName or abilityName is empty");
6428         return false;
6429     }
6430     Want want;
6431     want.SetElement(elementName);
6432     AbilityInfo abilityInfo;
6433     bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6434     if (ret) {
6435         APP_LOGD("ElementName is ability");
6436         element.bundleName = bundleName;
6437         element.moduleName = moduleName;
6438         element.abilityName = abilityName;
6439         return true;
6440     }
6441 
6442     ExtensionAbilityInfo extensionInfo;
6443     ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6444     if (ret) {
6445         APP_LOGD("ElementName is extension");
6446         element.bundleName = bundleName;
6447         element.moduleName = moduleName;
6448         element.extensionName = abilityName;
6449         return true;
6450     }
6451 
6452     if (DelayedSingleton<BundleMgrService>::GetInstance()->IsBrokerServiceStarted()) {
6453         APP_LOGI("query ability from broker");
6454         AbilityInfo brokerAbilityInfo;
6455         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
6456         ErrCode resultCode = bmsExtensionClient->QueryAbilityInfo(want, 0, userId, brokerAbilityInfo, true);
6457         if (resultCode == ERR_OK) {
6458             APP_LOGI("ElementName is brokerAbility");
6459             element.bundleName = bundleName;
6460             element.moduleName = moduleName;
6461             element.abilityName = abilityName;
6462             return true;
6463         }
6464     }
6465 
6466     APP_LOGW("ElementName doesn't exist");
6467     return false;
6468 }
6469 #endif
6470 
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) const6471 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
6472     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
6473 {
6474     APP_LOGI("begin");
6475 #ifdef GLOBAL_RESMGR_ENABLE
6476     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6477     int32_t requestUserId = GetUserId(userId);
6478     if (requestUserId == Constants::INVALID_USERID) {
6479         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6480     }
6481     InnerBundleInfo innerBundleInfo;
6482     ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
6483         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
6484     if (errCode != ERR_OK) {
6485         return errCode;
6486     }
6487     AbilityInfo abilityInfo;
6488     errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
6489     if (errCode != ERR_OK) {
6490         return errCode;
6491     }
6492     bool isEnable = false;
6493     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6494     errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
6495     if (errCode != ERR_OK) {
6496         return errCode;
6497     }
6498     if (!isEnable) {
6499         APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
6500         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
6501     }
6502     std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
6503         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
6504     if (resourceManager == nullptr) {
6505         APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
6506         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6507     }
6508     OHOS::Global::Resource::RState ret =
6509         resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
6510     if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
6511         APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
6512         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6513     }
6514     return ERR_OK;
6515 #else
6516     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
6517 #endif
6518 }
6519 
GetStatusCallbackMutex()6520 std::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
6521 {
6522     return callbackMutex_;
6523 }
6524 
GetCallBackList() const6525 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
6526 {
6527     return callbackList_;
6528 }
6529 
UpdateQuickFixInnerBundleInfo(const std::string &bundleName, const InnerBundleInfo &innerBundleInfo)6530 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
6531     const InnerBundleInfo &innerBundleInfo)
6532 {
6533     APP_LOGD("to update info:%{public}s", bundleName.c_str());
6534     if (bundleName.empty()) {
6535         APP_LOGW("update info fail, empty bundle name");
6536         return false;
6537     }
6538 
6539     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6540     auto infoItem = bundleInfos_.find(bundleName);
6541     if (infoItem == bundleInfos_.end()) {
6542         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
6543         return false;
6544     }
6545 
6546     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
6547         bundleInfos_.at(bundleName) = innerBundleInfo;
6548         return true;
6549     }
6550     APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
6551     return false;
6552 }
6553 
UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo)6554 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo)
6555 {
6556     std::string bundleName = innerBundleInfo.GetBundleName();
6557     if (bundleName.empty()) {
6558         APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
6559         return false;
6560     }
6561     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
6562     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6563     auto infoItem = bundleInfos_.find(bundleName);
6564     if (infoItem == bundleInfos_.end()) {
6565         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
6566         return false;
6567     }
6568 
6569     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
6570         bundleInfos_.at(bundleName) = innerBundleInfo;
6571         return true;
6572     }
6573     APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
6574     return false;
6575 }
6576 
QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)6577 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
6578 {
6579     APP_LOGD("start to query overlay innerBundleInfo");
6580     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6581     if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
6582         info = bundleInfos_.at(bundleName);
6583         return true;
6584     }
6585 
6586     APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6587     return false;
6588 }
6589 
SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)6590 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
6591 {
6592     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6593     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
6594     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
6595         APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
6596         return;
6597     }
6598     bundleInfos_.at(bundleName) = innerBundleInfo;
6599 }
6600 
GetAppProvisionInfo(const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)6601 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
6602     AppProvisionInfo &appProvisionInfo)
6603 {
6604     if (!HasUserId(userId)) {
6605         APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
6606         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6607     }
6608     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6609     auto infoItem = bundleInfos_.find(bundleName);
6610     if (infoItem == bundleInfos_.end()) {
6611         APP_LOGW_NOFUNC("-n %{public}s not exist", bundleName.c_str());
6612         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6613     }
6614     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
6615         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
6616         if (responseUserId == Constants::INVALID_USERID) {
6617             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6618         }
6619     }
6620     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
6621         APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
6622         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6623     }
6624     return ERR_OK;
6625 }
6626 
GetProvisionMetadata(const std::string &bundleName, int32_t userId, std::vector<Metadata> &provisionMetadatas) const6627 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
6628     std::vector<Metadata> &provisionMetadatas) const
6629 {
6630     // Reserved interface
6631     return ERR_OK;
6632 }
6633 
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const6634 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
6635 {
6636     APP_LOGD("GetAllSharedBundleInfo");
6637     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6638 
6639     for (const auto& [key, innerBundleInfo] : bundleInfos_) {
6640         if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
6641             continue;
6642         }
6643         SharedBundleInfo sharedBundleInfo;
6644         innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
6645         sharedBundles.emplace_back(sharedBundleInfo);
6646     }
6647 
6648     return ERR_OK;
6649 }
6650 
GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName, std::vector<SharedBundleInfo> &sharedBundles)6651 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
6652     std::vector<SharedBundleInfo> &sharedBundles)
6653 {
6654     APP_LOGD("GetSharedBundleInfo");
6655     if (bundleName.empty() || moduleName.empty()) {
6656         APP_LOGW("bundleName or moduleName is empty");
6657         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
6658     }
6659 
6660     std::vector<Dependency> dependencies;
6661     ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
6662     if (errCode != ERR_OK) {
6663         APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
6664             errCode, bundleName.c_str());
6665         return errCode;
6666     }
6667 
6668     for (const auto& dep : dependencies) {
6669         SharedBundleInfo sharedBundleInfo;
6670         errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
6671         if (errCode != ERR_OK) {
6672             APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
6673                 errCode, bundleName.c_str());
6674             return errCode;
6675         }
6676         sharedBundles.emplace_back(sharedBundleInfo);
6677     }
6678 
6679     return ERR_OK;
6680 }
6681 
GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)6682 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
6683 {
6684     APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
6685     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6686     auto infoItem = bundleInfos_.find(bundleName);
6687     if (infoItem == bundleInfos_.end()) {
6688         APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
6689             bundleName.c_str());
6690         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6691     }
6692     const InnerBundleInfo &innerBundleInfo = infoItem->second;
6693     if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
6694         APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
6695             bundleName.c_str());
6696         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6697     }
6698     innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
6699     APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
6700     return ERR_OK;
6701 }
6702 
GetSharedDependencies(const std::string &bundleName, const std::string &moduleName, std::vector<Dependency> &dependencies)6703 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
6704     std::vector<Dependency> &dependencies)
6705 {
6706     APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
6707         bundleName.c_str(), moduleName.c_str());
6708     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6709     auto item = bundleInfos_.find(bundleName);
6710     if (item == bundleInfos_.end()) {
6711         APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
6712         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6713     }
6714     const InnerBundleInfo &innerBundleInfo = item->second;
6715     if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
6716         APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
6717         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
6718     }
6719     APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
6720         bundleName.c_str(), moduleName.c_str());
6721     return ERR_OK;
6722 }
6723 
CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const6724 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
6725 {
6726     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6727     std::string hspBundleName = info.GetBundleName();
6728     if (versionCode == Constants::ALL_VERSIONCODE) {
6729         // uninstall hsp bundle, check other bundle denpendency
6730         return CheckHspBundleIsRelied(hspBundleName);
6731     }
6732     std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
6733     // check whether has higher version
6734     std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
6735     for (const auto &item : versionCodes) {
6736         if (item > static_cast<uint32_t>(versionCode)) {
6737             return false;
6738         }
6739     }
6740     // check other bundle denpendency
6741     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
6742         if (bundleName == hspBundleName) {
6743             continue;
6744         }
6745         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
6746         for (const auto &dependencyItem : dependencyList) {
6747             if (dependencyItem.bundleName == hspBundleName &&
6748                 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
6749                 return true;
6750             }
6751         }
6752     }
6753     return false;
6754 }
6755 
CheckHspBundleIsRelied(const std::string &hspBundleName) const6756 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
6757 {
6758     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
6759         if (bundleName == hspBundleName) {
6760             continue;
6761         }
6762         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
6763         for (const auto &dependencyItem : dependencyList) {
6764             if (dependencyItem.bundleName == hspBundleName) {
6765                 return true;
6766             }
6767         }
6768     }
6769     return false;
6770 }
6771 
GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)6772 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
6773 {
6774     if (bundleName.empty()) {
6775         APP_LOGW("bundleName is empty");
6776         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
6777     }
6778 
6779     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6780     auto infoItem = bundleInfos_.find(bundleName);
6781     if (infoItem == bundleInfos_.end()) {
6782         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6783         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6784     }
6785     const InnerBundleInfo &innerBundleInfo = infoItem->second;
6786     innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
6787     return ERR_OK;
6788 }
6789 
IsPreInstallApp(const std::string &bundleName)6790 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
6791 {
6792     APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
6793     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6794     auto item = bundleInfos_.find(bundleName);
6795     if (item == bundleInfos_.end()) {
6796         APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
6797             bundleName.c_str());
6798         return false;
6799     }
6800     return item->second.IsPreInstallApp();
6801 }
6802 
GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName, int32_t userId, std::vector<ProxyData> &proxyDatas) const6803 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
6804     int32_t userId, std::vector<ProxyData> &proxyDatas) const
6805 {
6806     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6807     InnerBundleInfo info;
6808     auto ret = GetInnerBundleInfoWithBundleFlagsV9(
6809         bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
6810     if (ret != ERR_OK) {
6811         APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
6812         return ret;
6813     }
6814     return info.GetProxyDataInfos(moduleName, proxyDatas);
6815 }
6816 
GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const6817 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
6818 {
6819     std::vector<BundleInfo> bundleInfos;
6820     auto ret = GetBundleInfosV9(
6821         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
6822     if (ret != ERR_OK) {
6823         APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
6824         return ret;
6825     }
6826     for (const auto &bundleInfo : bundleInfos) {
6827         for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
6828             proxyDatas.insert(
6829                 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
6830         }
6831     }
6832     return ERR_OK;
6833 }
6834 
GetBundleNameByAppId(const std::string &appId) const6835 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
6836 {
6837     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6838     auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
6839         return appId == pair.second.GetAppId();
6840     });
6841     if (it == bundleInfos_.cend()) {
6842         APP_LOGW("invalid appId, can't find bundleName");
6843         return Constants::EMPTY_STRING;
6844     }
6845     return it->second.GetBundleName();
6846 }
6847 
SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName, AOTCompileStatus aotCompileStatus, uint32_t versionCode)6848 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
6849     AOTCompileStatus aotCompileStatus, uint32_t versionCode)
6850 {
6851     APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
6852         bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
6853     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6854     auto item = bundleInfos_.find(bundleName);
6855     if (item == bundleInfos_.end()) {
6856         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
6857         (void)InstalldClient::GetInstance()->RemoveDir(ServiceConstants::ARK_CACHE_PATH + bundleName);
6858         return;
6859     }
6860     if (item->second.GetVersionCode() != versionCode) {
6861         APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
6862             versionCode, item->second.GetVersionCode(), bundleName.c_str());
6863         return;
6864     }
6865     item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
6866     std::string abi;
6867     std::string path;
6868     if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
6869         abi = ServiceConstants::ARM64_V8A;
6870         path = std::string(ServiceConstants::ARM64) + ServiceConstants::PATH_SEPARATOR;
6871     }
6872     item->second.SetArkNativeFileAbi(abi);
6873     item->second.SetArkNativeFilePath(path);
6874     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
6875         APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
6876     }
6877 }
6878 
ResetAOTFlags()6879 void BundleDataMgr::ResetAOTFlags()
6880 {
6881     APP_LOGI("ResetAOTFlags begin");
6882     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6883     std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
6884         item.second.ResetAOTFlags();
6885         if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
6886             APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
6887         }
6888     });
6889     APP_LOGI("ResetAOTFlags end");
6890 }
6891 
ResetAOTFlagsCommand(const std::string &bundleName)6892 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
6893 {
6894     APP_LOGI("ResetAOTFlagsCommand begin");
6895     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6896     auto item = bundleInfos_.find(bundleName);
6897     if (item == bundleInfos_.end()) {
6898         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
6899         return;
6900     }
6901     item->second.ResetAOTFlags();
6902     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
6903         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
6904         return;
6905     }
6906     APP_LOGI("ResetAOTFlagsCommand end");
6907 }
6908 
ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName, int32_t triggerMode)6909 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
6910     int32_t triggerMode)
6911 {
6912     APP_LOGI("ResetAOTCompileStatus begin");
6913     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6914     auto item = bundleInfos_.find(bundleName);
6915     if (item == bundleInfos_.end()) {
6916         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
6917         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6918     }
6919     ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
6920     if (ret != ERR_OK) {
6921         return ret;
6922     }
6923     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
6924         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
6925         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6926     }
6927     APP_LOGI("ResetAOTCompileStatus end");
6928     return ERR_OK;
6929 }
6930 
GetAllBundleName() const6931 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
6932 {
6933     APP_LOGD("GetAllBundleName begin");
6934     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6935     std::vector<std::string> bundleNames;
6936     bundleNames.reserve(bundleInfos_.size());
6937     std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
6938         return item.first;
6939     });
6940     return bundleNames;
6941 }
6942 
GetAllDriverBundleName() const6943 std::vector<std::string> BundleDataMgr::GetAllDriverBundleName() const
6944 {
6945     APP_LOGD("GetAllDriverBundleName begin");
6946     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6947     std::vector<std::string> bundleNames;
6948     for (const auto &item : bundleInfos_) {
6949         if (item.second.GetApplicationBundleType() == BundleType::SHARED ||
6950             item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
6951             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
6952                 item.second.GetBundleName().c_str());
6953             continue;
6954         }
6955         // this function is used to install driver bundle in new user, so ignore pre-install app
6956         if (item.second.IsPreInstallApp()) {
6957             APP_LOGD("app %{public}s is pre-install app, ignore", item.second.GetBundleName().c_str());
6958             continue;
6959         }
6960         const auto extensions = item.second.GetInnerExtensionInfos();
6961         for (const auto &item : extensions) {
6962             if (item.second.type == ExtensionAbilityType::DRIVER) {
6963                 bundleNames.emplace_back(item.second.bundleName);
6964                 APP_LOGI("driver bundle found: %{public}s", item.second.bundleName.c_str());
6965                 break;
6966             }
6967         }
6968     }
6969     return bundleNames;
6970 }
6971 
QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const6972 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
6973 {
6974     APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
6975     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6976     auto item = bundleInfos_.find(bundleName);
6977     if (item == bundleInfos_.end()) {
6978         APP_LOGW_NOFUNC("QueryInnerBundleInfo not find %{public}s", bundleName.c_str());
6979         return false;
6980     }
6981     info = item->second;
6982     return true;
6983 }
6984 
GetUserIds(const std::string &bundleName) const6985 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
6986 {
6987     APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
6988     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6989     std::vector<int32_t> userIds;
6990     auto infoItem = bundleInfos_.find(bundleName);
6991     if (infoItem == bundleInfos_.end()) {
6992         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
6993         return userIds;
6994     }
6995     auto userInfos = infoItem->second.GetInnerBundleUserInfos();
6996     std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
6997         return item.second.bundleUserInfo.userId;
6998     });
6999     return userIds;
7000 }
7001 
GetSpecifiedDistributionType( const std::string &bundleName, std::string &specifiedDistributionType)7002 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
7003     const std::string &bundleName, std::string &specifiedDistributionType)
7004 {
7005     APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
7006     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7007     auto infoItem = bundleInfos_.find(bundleName);
7008     if (infoItem == bundleInfos_.end()) {
7009         APP_LOGW_NOFUNC("-n %{public}s does not exist", bundleName.c_str());
7010         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7011     }
7012     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7013         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7014         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7015         if (responseUserId == Constants::INVALID_USERID) {
7016             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7017             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7018         }
7019     }
7020     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
7021         specifiedDistributionType)) {
7022         APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed", bundleName.c_str());
7023         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7024     }
7025     return ERR_OK;
7026 }
7027 
GetAdditionalInfo( const std::string &bundleName, std::string &additionalInfo)7028 ErrCode BundleDataMgr::GetAdditionalInfo(
7029     const std::string &bundleName, std::string &additionalInfo)
7030 {
7031     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
7032     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7033     auto infoItem = bundleInfos_.find(bundleName);
7034     if (infoItem == bundleInfos_.end()) {
7035         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
7036         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7037     }
7038     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7039         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7040         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7041         if (responseUserId == Constants::INVALID_USERID) {
7042             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7043             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7044         }
7045     }
7046     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
7047         additionalInfo)) {
7048         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
7049         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7050     }
7051     return ERR_OK;
7052 }
7053 
SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, const std::string &extName, const std::string &mimeType)7054 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7055     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7056 {
7057     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7058     auto item = bundleInfos_.find(bundleName);
7059     if (item == bundleInfos_.end()) {
7060         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7061         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7062     }
7063     ErrCode ret;
7064     if (!extName.empty()) {
7065         ret = item->second.SetExtName(moduleName, abilityName, extName);
7066         if (ret != ERR_OK) {
7067             APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7068             return ret;
7069         }
7070     }
7071     if (!mimeType.empty()) {
7072         ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
7073         if (ret != ERR_OK) {
7074             APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7075             return ret;
7076         }
7077     }
7078     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7079         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7080         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7081     }
7082     return ERR_OK;
7083 }
7084 
DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, const std::string &extName, const std::string &mimeType)7085 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7086     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7087 {
7088     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7089     auto item = bundleInfos_.find(bundleName);
7090     if (item == bundleInfos_.end()) {
7091         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7092         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7093     }
7094     ErrCode ret;
7095     if (!extName.empty()) {
7096         ret = item->second.DelExtName(moduleName, abilityName, extName);
7097         if (ret != ERR_OK) {
7098             APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7099             return ret;
7100         }
7101     }
7102     if (!mimeType.empty()) {
7103         ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
7104         if (ret != ERR_OK) {
7105             APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7106             return ret;
7107         }
7108     }
7109     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7110         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7111         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7112     }
7113     return ERR_OK;
7114 }
7115 
MatchPrivateType(const Want &want, const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes, const std::vector<std::string> &paramMimeTypes) const7116 bool BundleDataMgr::MatchPrivateType(const Want &want,
7117     const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes,
7118     const std::vector<std::string> &paramMimeTypes) const
7119 {
7120     std::string uri = want.GetUriString();
7121     APP_LOGD("MatchPrivateType, uri is %{private}s", uri.c_str());
7122     auto suffixIndex = uri.rfind('.');
7123     if (suffixIndex == std::string::npos) {
7124         return false;
7125     }
7126     std::string suffix = uri.substr(suffixIndex + 1);
7127     bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
7128         return extName == suffix;
7129     });
7130     if (supportPrivateType) {
7131         APP_LOGI("uri is a supported private-type file");
7132         return true;
7133     }
7134 
7135     if (!paramMimeTypes.empty()) {
7136         auto iter = std::find_first_of(
7137             paramMimeTypes.begin(), paramMimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
7138         if (iter != paramMimeTypes.end()) {
7139             APP_LOGI("uri is a supported mime-type file");
7140             return true;
7141         }
7142     }
7143     return false;
7144 }
7145 
QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)7146 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
7147 {
7148     APP_LOGD("QueryAppGalleryAbilityName called");
7149     AbilityInfo abilityInfo;
7150     ExtensionAbilityInfo extensionInfo;
7151     Want want;
7152     want.SetAction(FREE_INSTALL_ACTION);
7153     if (!ImplicitQueryInfoByPriority(
7154         want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
7155         APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
7156         return false;
7157     }
7158     if (!abilityInfo.name.empty()) {
7159         bundleName = abilityInfo.bundleName;
7160         abilityName = abilityInfo.name;
7161     } else {
7162         bundleName = extensionInfo.bundleName;
7163         abilityName = extensionInfo.name;
7164     }
7165 
7166     if (bundleName.empty() || abilityName.empty()) {
7167         APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
7168             bundleName.c_str(), abilityName.c_str());
7169         return false;
7170     }
7171     APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
7172         bundleName.c_str(), abilityName.c_str());
7173     return true;
7174 }
7175 
GetJsonProfile(ProfileType profileType, const std::string &bundleName, const std::string &moduleName, std::string &profile, int32_t userId) const7176 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
7177     const std::string &moduleName, std::string &profile, int32_t userId) const
7178 {
7179     APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
7180         profileType, bundleName.c_str(), moduleName.c_str());
7181     int32_t requestUserId = GetUserId(userId);
7182     if (requestUserId == Constants::INVALID_USERID) {
7183         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7184     }
7185     auto mapItem = PROFILE_TYPE_MAP.find(profileType);
7186     if (mapItem == PROFILE_TYPE_MAP.end()) {
7187         APP_LOGE("profileType: %{public}d is invalid", profileType);
7188         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7189     }
7190     std::string profilePath = mapItem->second;
7191     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7192     const auto &item = bundleInfos_.find(bundleName);
7193     if (item == bundleInfos_.end()) {
7194         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
7195         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7196     }
7197     const InnerBundleInfo &bundleInfo = item->second;
7198     bool isEnabled = false;
7199     int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
7200     ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
7201     if (res != ERR_OK) {
7202         APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
7203         return res;
7204     }
7205     if (!isEnabled) {
7206         APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
7207         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
7208     }
7209     std::string moduleNameTmp = moduleName;
7210     if (moduleName.empty()) {
7211         APP_LOGW("moduleName is empty, try to get profile from entry module");
7212         std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
7213         for (const auto &info : moduleInfos) {
7214             if (info.second.isEntry) {
7215                 moduleNameTmp = info.second.moduleName;
7216                 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
7217                 break;
7218             }
7219         }
7220     }
7221     auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
7222     if (!moduleInfo) {
7223         APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
7224         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7225     }
7226     return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
7227 }
7228 
GetJsonProfileByExtractor(const std::string &hapPath, const std::string &profilePath, std::string &profile) const7229 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
7230     const std::string &profilePath, std::string &profile) const
7231 {
7232     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
7233     APP_LOGD("GetJsonProfileByExtractor with hapPath %{private}s and profilePath %{private}s",
7234         hapPath.c_str(), profilePath.c_str());
7235     BundleExtractor bundleExtractor(hapPath);
7236     if (!bundleExtractor.Init()) {
7237         APP_LOGE("bundle extractor init failed");
7238         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7239     }
7240     if (!bundleExtractor.HasEntry(profilePath)) {
7241         APP_LOGD("profile not exist");
7242         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7243     }
7244     std::stringstream profileStream;
7245     if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
7246         APP_LOGE("extract profile failed");
7247         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7248     }
7249     profile = profileStream.str();
7250     return ERR_OK;
7251 }
7252 
QueryDataGroupInfos(const std::string &bundleName, int32_t userId, std::vector<DataGroupInfo> &infos) const7253 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
7254     std::vector<DataGroupInfo> &infos) const
7255 {
7256     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7257     auto infoItem = bundleInfos_.find(bundleName);
7258     if (infoItem == bundleInfos_.end()) {
7259         APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
7260         return false;
7261     }
7262     auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
7263     for (const auto &item : dataGroupInfos) {
7264         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
7265             [userId](const DataGroupInfo &info) {
7266             return info.userId == userId;
7267         });
7268         if (dataGroupIter != std::end(item.second)) {
7269             infos.push_back(*dataGroupIter);
7270         }
7271     }
7272     return true;
7273 }
7274 
GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const7275 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
7276 {
7277     if (userId == Constants::UNSPECIFIED_USERID) {
7278         userId = AccountHelper::GetCurrentActiveUserId();
7279     }
7280     std::string uuid;
7281     if (BundlePermissionMgr::IsSystemApp() &&
7282         BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
7283         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7284         for (const auto &item : bundleInfos_) {
7285             const auto &dataGroupInfos = item.second.GetDataGroupInfos();
7286             auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7287             if (dataGroupInfosIter == dataGroupInfos.end()) {
7288                 continue;
7289             }
7290             auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
7291                 std::end(dataGroupInfosIter->second),
7292                 [userId](const DataGroupInfo &info) { return info.userId == userId; });
7293             if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
7294                 uuid = dataInUserIter->uuid;
7295                 break;
7296             }
7297         }
7298     } else {
7299         int32_t callingUid = IPCSkeleton::GetCallingUid();
7300         InnerBundleInfo innerBundleInfo;
7301         if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
7302             APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
7303             return false;
7304         }
7305         const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
7306         auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7307         if (dataGroupInfosIter == dataGroupInfos.end()) {
7308             APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
7309             return false;
7310         }
7311         auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
7312             [userId](const DataGroupInfo &info) {
7313             return info.userId == userId;
7314         });
7315         if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
7316             uuid = dataGroupIter->uuid;
7317         }
7318     }
7319     if (uuid.empty()) {
7320         APP_LOGW("get uuid by data group id failed");
7321         return false;
7322     }
7323     dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR + std::to_string(userId)
7324         + ServiceConstants::DATA_GROUP_PATH + uuid;
7325     APP_LOGD("groupDir: %{private}s", dir.c_str());
7326     return true;
7327 }
7328 
GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId, std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap) const7329 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
7330     std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap) const
7331 {
7332     std::set<int32_t> indexList;
7333     for (auto iter = dataGroupIndexMap.begin(); iter != dataGroupIndexMap.end(); iter++) {
7334         indexList.emplace(iter->second.first);
7335     }
7336     int32_t index = DATA_GROUP_INDEX_START;
7337     for (int32_t i = DATA_GROUP_INDEX_START; i < DATA_GROUP_UID_OFFSET; i++) {
7338         if (indexList.find(i) == indexList.end()) {
7339             index = i;
7340             break;
7341         }
7342     }
7343 
7344     int32_t uid = userId * Constants::BASE_USER_RANGE + index + DATA_GROUP_UID_OFFSET;
7345     dataGroupInfo.uid = uid;
7346     dataGroupInfo.gid = uid;
7347 
7348     std::string str = BundleUtil::GenerateUuidByKey(dataGroupInfo.dataGroupId);
7349     dataGroupInfo.uuid = str;
7350     dataGroupIndexMap[dataGroupInfo.dataGroupId] = std::pair<int32_t, std::string>(index, str);
7351 }
7352 
GenerateDataGroupInfos(InnerBundleInfo &innerBundleInfo, const std::vector<std::string> &dataGroupIdList, int32_t userId) const7353 void BundleDataMgr::GenerateDataGroupInfos(InnerBundleInfo &innerBundleInfo,
7354     const std::vector<std::string> &dataGroupIdList, int32_t userId) const
7355 {
7356     APP_LOGD("GenerateDataGroupInfos called for user: %{public}d", userId);
7357     if (dataGroupIdList.empty() || bundleInfos_.empty()) {
7358         APP_LOGW("dataGroupIdList or bundleInfos_ data is empty");
7359         return;
7360     }
7361     std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
7362     GetDataGroupIndexMap(dataGroupIndexMap);
7363     for (const std::string &groupId : dataGroupIdList) {
7364         DataGroupInfo dataGroupInfo;
7365         dataGroupInfo.dataGroupId = groupId;
7366         dataGroupInfo.userId = userId;
7367         auto iter = dataGroupIndexMap.find(groupId);
7368         if (iter != dataGroupIndexMap.end()) {
7369             dataGroupInfo.uuid = iter->second.second;
7370             int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
7371             dataGroupInfo.uid = uid;
7372             dataGroupInfo.gid = uid;
7373             innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
7374             continue;
7375         }
7376         GenerateDataGroupUuidAndUid(dataGroupInfo, userId, dataGroupIndexMap);
7377         innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
7378     }
7379 }
7380 
GetDataGroupIndexMap( std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap) const7381 void BundleDataMgr::GetDataGroupIndexMap(
7382     std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap) const
7383 {
7384     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7385     for (const auto &bundleInfo : bundleInfos_) {
7386         for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
7387             for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
7388                 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
7389                     - DATA_GROUP_UID_OFFSET;
7390                 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
7391                     std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
7392             });
7393         }
7394     }
7395 }
7396 
IsShareDataGroupId(const std::string &dataGroupId, int32_t userId) const7397 bool BundleDataMgr::IsShareDataGroupId(const std::string &dataGroupId, int32_t userId) const
7398 {
7399     APP_LOGD("IsShareDataGroupId, dataGroupId is %{public}s", dataGroupId.c_str());
7400     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7401     int32_t count = 0;
7402     for (const auto &info : bundleInfos_) {
7403         auto dataGroupInfos = info.second.GetDataGroupInfos();
7404         auto iter = dataGroupInfos.find(dataGroupId);
7405         if (iter == dataGroupInfos.end()) {
7406             continue;
7407         }
7408 
7409         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
7410             [userId](const DataGroupInfo &dataGroupInfo) {
7411             return dataGroupInfo.userId == userId;
7412         });
7413         if (dataGroupIter == std::end(iter->second)) {
7414             continue;
7415         }
7416         count++;
7417         if (count > 1) {
7418             APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
7419             return true;
7420         }
7421     }
7422     return false;
7423 }
7424 
FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo, const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const7425 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
7426     const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
7427 {
7428     if (moduleName.empty()) {
7429         auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
7430         if (!ability) {
7431             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
7432         }
7433         abilityInfo = *ability;
7434         return ERR_OK;
7435     }
7436 
7437     ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
7438     if (ret != ERR_OK) {
7439         APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
7440     }
7441     return ret;
7442 }
7443 
7444 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)7445 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
7446 {
7447     InnerBundleInfo targetInnerBundleInfo;
7448     std::string targetBundleName = newInfo.GetTargetBundleName();
7449     auto targetInfoItem = bundleInfos_.find(targetBundleName);
7450     if (targetInfoItem != bundleInfos_.end()) {
7451         targetInnerBundleInfo = targetInfoItem->second;
7452     }
7453 
7454     if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
7455         APP_LOGW("update overlay info failed");
7456         return false;
7457     }
7458     // storage target bundle info
7459     if (!targetInnerBundleInfo.GetBundleName().empty() &&
7460         dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
7461         bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
7462     }
7463     // build overlay connection for external overlay
7464     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
7465         const auto &moduleInfos = newInfo.GetInnerModuleInfos();
7466         std::string moduleName = (moduleInfos.begin()->second).moduleName;
7467         BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
7468     }
7469     return true;
7470 }
7471 
ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)7472 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
7473 {
7474     for (auto &info : bundleInfos_) {
7475         if (info.second.GetTargetBundleName() != bundleName) {
7476             continue;
7477         }
7478         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
7479         for (const auto &moduleInfo : innerModuleInfos) {
7480             if (moduleInfo.second.targetModuleName == modulePackage) {
7481                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
7482                 break;
7483             }
7484         }
7485         if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
7486             APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
7487         }
7488     }
7489 }
7490 
BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo, int32_t userId)7491 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
7492     int32_t userId)
7493 {
7494     APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
7495         moduleName.c_str(), userId);
7496     for (auto &info : bundleInfos_) {
7497         if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
7498             continue;
7499         }
7500         // check target bundle is preInstall application
7501         if (!oldInfo.IsPreInstallApp()) {
7502             APP_LOGW("target bundle is not preInstall application");
7503             return;
7504         }
7505 
7506         // check fingerprint of current bundle with target bundle
7507         if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
7508             APP_LOGW("target bundle has different fingerprint with current bundle");
7509             return;
7510         }
7511         // external overlay does not support FA model
7512         if (!oldInfo.GetIsNewVersion()) {
7513             APP_LOGW("target bundle is not stage model");
7514             return;
7515         }
7516         // external overlay does not support service
7517         if (oldInfo.GetEntryInstallationFree()) {
7518             APP_LOGW("target bundle is service");
7519             return;
7520         }
7521 
7522         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
7523         std::vector<std::string> overlayModuleVec;
7524         for (const auto &moduleInfo : innerModuleInfos) {
7525             if (moduleInfo.second.targetModuleName != moduleName) {
7526                 continue;
7527             }
7528             OverlayModuleInfo overlayModuleInfo;
7529             overlayModuleInfo.bundleName = info.second.GetBundleName();
7530             overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
7531             overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
7532             overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
7533             overlayModuleInfo.priority = moduleInfo.second.targetPriority;
7534             oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
7535             overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
7536         }
7537         std::string bundleDir;
7538         const std::string &moduleHapPath =
7539             info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
7540         OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
7541         OverlayBundleInfo overlayBundleInfo;
7542         overlayBundleInfo.bundleName = info.second.GetBundleName();
7543         overlayBundleInfo.bundleDir = bundleDir;
7544         overlayBundleInfo.state = info.second.GetOverlayState();
7545         overlayBundleInfo.priority = info.second.GetTargetPriority();
7546         oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
7547         auto userSet = GetAllUser();
7548         for (const auto &innerUserId : userSet) {
7549             for (const auto &overlayModule : overlayModuleVec) {
7550                 int32_t state = OverlayState::OVERLAY_INVALID;
7551                 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
7552                 if (state == OverlayState::OVERLAY_INVALID) {
7553                     info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
7554                 }
7555             }
7556             dataStorage_->SaveStorageBundleInfo(info.second);
7557         }
7558     }
7559 }
7560 
RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo, const std::string &bundleName)7561 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
7562     const std::string &bundleName)
7563 {
7564     if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
7565         std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
7566         auto targetInfoItem = bundleInfos_.find(targetBundleName);
7567         if (targetInfoItem == bundleInfos_.end()) {
7568             APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
7569         } else {
7570             InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
7571             OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
7572             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
7573                 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
7574                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
7575             }
7576         }
7577     }
7578 
7579     if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
7580         for (auto &info : bundleInfos_) {
7581             if (info.second.GetTargetBundleName() != bundleName) {
7582                 continue;
7583             }
7584             const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
7585             for (const auto &moduleInfo : innerModuleInfos) {
7586                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
7587             }
7588             dataStorage_->SaveStorageBundleInfo(info.second);
7589         }
7590     }
7591 }
7592 #endif
7593 
GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const7594 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
7595 {
7596     if (bundleName.empty()) {
7597         APP_LOGE("bundleName is empty");
7598         return false;
7599     }
7600     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7601     auto innerBundleInfo = bundleInfos_.find(bundleName);
7602     if (innerBundleInfo == bundleInfos_.end()) {
7603         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
7604         return false;
7605     }
7606     appIds = innerBundleInfo->second.GetOldAppIds();
7607     return true;
7608 }
7609 
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo, const InnerBundleInfo &newInfo) const7610 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
7611     const InnerBundleInfo &newInfo) const
7612 {
7613     return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
7614         !oldInfo.HasEntry() || newInfo.HasEntry();
7615 }
7616 
GetModuleNameByBundleAndAbility( const std::string& bundleName, const std::string& abilityName)7617 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
7618     const std::string& bundleName, const std::string& abilityName)
7619 {
7620     if (bundleName.empty() || abilityName.empty()) {
7621         APP_LOGE("bundleName or abilityName is empty");
7622         return std::string();
7623     }
7624     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7625     auto innerBundleInfo = bundleInfos_.find(bundleName);
7626     if (innerBundleInfo == bundleInfos_.end()) {
7627         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
7628         return std::string();
7629     }
7630     auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
7631     if (!abilityInfo) {
7632         APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
7633             bundleName.c_str(), abilityName.c_str());
7634         return std::string();
7635     }
7636     return abilityInfo->moduleName;
7637 }
7638 
SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const7639 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
7640 {
7641     APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
7642     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7643     auto infoItem = bundleInfos_.find(bundleName);
7644     if (infoItem == bundleInfos_.end()) {
7645         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
7646         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7647     }
7648 
7649     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7650         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7651         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7652         if (responseUserId == Constants::INVALID_USERID) {
7653             APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
7654             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7655         }
7656     }
7657 
7658     auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
7659     if (appProvisionInfoManager == nullptr) {
7660         APP_LOGE("Failed, appProvisionInfoManager is nullptr");
7661         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7662     }
7663 
7664     if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
7665         APP_LOGE("BundleName: %{public}s set additional info failed", bundleName.c_str());
7666         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7667     }
7668 
7669     ElementName element;
7670     element.SetBundleName(bundleName);
7671     OHOS::AAFwk::Want want;
7672     want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
7673     want.SetElement(element);
7674     EventFwk::CommonEventData commonData { want };
7675     NotifyBundleEventCallback(commonData);
7676     return ERR_OK;
7677 }
7678 
GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)7679 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
7680 {
7681     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
7682     if (bundleName.empty()) {
7683         APP_LOGE("bundleName is empty");
7684         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
7685     }
7686 
7687     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7688     auto infoItem = bundleInfos_.find(bundleName);
7689     if (infoItem == bundleInfos_.end()) {
7690         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
7691         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7692     }
7693     const InnerBundleInfo &innerBundleInfo = infoItem->second;
7694     auto res = innerBundleInfo.GetAppServiceHspInfo(bundleInfo);
7695     if (res != ERR_OK) {
7696         APP_LOGW("get hspInfo %{public}s fail", bundleName.c_str());
7697         return res;
7698     }
7699     return ERR_OK;
7700 }
7701 
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo, std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const7702 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
7703     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
7704 {
7705     APP_LOGD("start");
7706     BundleInfo bundleInfo;
7707     if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
7708         APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
7709         for (const auto &hapModule : bundleInfo.hapModuleInfos) {
7710             BaseSharedBundleInfo baseSharedBundleInfo;
7711             baseSharedBundleInfo.bundleName = bundleInfo.name;
7712             baseSharedBundleInfo.moduleName = hapModule.moduleName;
7713             baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
7714             baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
7715             baseSharedBundleInfo.hapPath = hapModule.hapPath;
7716             baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
7717             baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
7718             baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
7719         }
7720         return;
7721     }
7722     APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
7723 }
7724 
AddAppHspBundleName(const BundleType type, const std::string &bundleName)7725 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
7726 {
7727     if (type == BundleType::APP_SERVICE_FWK) {
7728         APP_LOGD("add app hsp bundleName:%{pubcli}s", bundleName.c_str());
7729         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
7730         appServiceHspBundleName_.insert(bundleName);
7731     }
7732 }
7733 
CreateGroupDir(const InnerBundleInfo &innerBundleInfo, int32_t userId) const7734 void BundleDataMgr::CreateGroupDir(const InnerBundleInfo &innerBundleInfo, int32_t userId) const
7735 {
7736     std::vector<DataGroupInfo> infos;
7737     auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
7738     for (const auto &item : dataGroupInfos) {
7739         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
7740             [userId](const DataGroupInfo &info) {
7741             return info.userId == userId;
7742         });
7743         if (dataGroupIter != std::end(item.second)) {
7744             infos.push_back(*dataGroupIter);
7745         }
7746     }
7747     if (infos.empty()) {
7748         return;
7749     }
7750 
7751     std::string parentDir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR
7752         + std::to_string(userId);
7753     if (!BundleUtil::IsExistDir(parentDir)) {
7754         APP_LOGE("parent dir(%{public}s) missing: group", parentDir.c_str());
7755         return;
7756     }
7757     for (const DataGroupInfo &dataGroupInfo : infos) {
7758         std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
7759         APP_LOGD("create group dir: %{public}s", dir.c_str());
7760         auto result = InstalldClient::GetInstance()->Mkdir(dir,
7761             DATA_GROUP_DIR_MODE, dataGroupInfo.uid, dataGroupInfo.gid);
7762         if (result != ERR_OK) {
7763             APP_LOGW("%{public}s group dir %{public}s userId %{public}d failed",
7764                 innerBundleInfo.GetBundleName().c_str(), dataGroupInfo.uuid.c_str(), userId);
7765         }
7766     }
7767 }
7768 
CreateBundleDataDir(int32_t userId)7769 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId)
7770 {
7771     APP_LOGI("with -u %{public}d begin", userId);
7772     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7773     std::vector<CreateDirParam> createDirParams;
7774     std::vector<CreateDirParam> el5Params;
7775     for (const auto &item : bundleInfos_) {
7776         const InnerBundleInfo &info = item.second;
7777         int32_t responseUserId = info.GetResponseUserId(userId);
7778         if (responseUserId == Constants::INVALID_USERID) {
7779             APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
7780                 info.GetBundleName().c_str(), userId);
7781             continue;
7782         }
7783         CreateDirParam createDirParam;
7784         createDirParam.bundleName = info.GetBundleName();
7785         createDirParam.userId = responseUserId;
7786         createDirParam.uid = info.GetUid(responseUserId);
7787         createDirParam.gid = info.GetGid(responseUserId);
7788         createDirParam.apl = info.GetAppPrivilegeLevel();
7789         createDirParam.isPreInstallApp = info.IsPreInstallApp();
7790         createDirParam.debug = info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
7791         createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
7792         createDirParam.extensionDirs = info.GetAllExtensionDirs();
7793         createDirParams.emplace_back(createDirParam);
7794 
7795         std::vector<RequestPermission> reqPermissions = info.GetAllRequestPermissions();
7796         auto it = std::find_if(reqPermissions.begin(), reqPermissions.end(), [](const RequestPermission& permission) {
7797             return permission.name == PERMISSION_PROTECT_SCREEN_LOCK_DATA;
7798         });
7799         if (it != reqPermissions.end()) {
7800             el5Params.emplace_back(createDirParam);
7801         }
7802         CreateGroupDir(info, responseUserId);
7803     }
7804     lock.unlock();
7805     APP_LOGI("begin create dirs");
7806     auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
7807     APP_LOGI("end, res %{public}d", res);
7808     CreateEl5Dir(el5Params);
7809     return res;
7810 }
7811 
CreateEl5Dir(const std::vector<CreateDirParam> &el5Params)7812 void BundleDataMgr::CreateEl5Dir(const std::vector<CreateDirParam> &el5Params)
7813 {
7814     for (const auto &el5Param : el5Params) {
7815         APP_LOGI("-n %{public}s -u %{public}d", el5Param.bundleName.c_str(), el5Param.userId);
7816         InnerCreateEl5Dir(el5Param);
7817         SetEl5DirPolicy(el5Param);
7818     }
7819 }
7820 
InnerCreateEl5Dir(const CreateDirParam &el5Param)7821 void BundleDataMgr::InnerCreateEl5Dir(const CreateDirParam &el5Param)
7822 {
7823     std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
7824         ServiceConstants::PATH_SEPARATOR + std::to_string(el5Param.userId);
7825     if (!BundleUtil::IsExistDir(parentDir)) {
7826         APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
7827         return;
7828     }
7829     std::vector<std::string> dirs;
7830     dirs.emplace_back(parentDir + ServiceConstants::BASE + el5Param.bundleName);
7831     dirs.emplace_back(parentDir + ServiceConstants::DATABASE + el5Param.bundleName);
7832     for (const std::string &dir : dirs) {
7833         uint32_t mode = S_IRWXU;
7834         int32_t gid = el5Param.uid;
7835         if (dir.find(ServiceConstants::DATABASE) != std::string::npos) {
7836             mode = S_IRWXU | S_IRWXG | S_ISGID;
7837             gid = ServiceConstants::DATABASE_DIR_GID;
7838         }
7839         if (InstalldClient::GetInstance()->Mkdir(dir, mode, el5Param.uid, gid) != ERR_OK) {
7840             LOG_W(BMS_TAG_INSTALLER, "create el5 dir %{public}s failed", dir.c_str());
7841         }
7842         ErrCode result = InstalldClient::GetInstance()->SetDirApl(
7843             dir, el5Param.bundleName, el5Param.apl, el5Param.isPreInstallApp, el5Param.debug);
7844         if (result != ERR_OK) {
7845             LOG_W(BMS_TAG_INSTALLER, "fail to SetDirApl dir %{public}s, error is %{public}d", dir.c_str(), result);
7846         }
7847     }
7848 }
7849 
SetEl5DirPolicy(const CreateDirParam &el5Param)7850 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param)
7851 {
7852     InnerBundleInfo info;
7853     if (!FetchInnerBundleInfo(el5Param.bundleName, info)) {
7854         LOG_E(BMS_TAG_INSTALLER, "get bundle %{public}s failed", el5Param.bundleName.c_str());
7855         return;
7856     }
7857     InnerBundleUserInfo userInfo;
7858     if (!info.GetInnerBundleUserInfo(el5Param.userId, userInfo)) {
7859         LOG_E(BMS_TAG_INSTALLER, "%{public}s get user %{public}d failed",
7860             info.GetBundleName().c_str(), el5Param.userId);
7861         return;
7862     }
7863     int32_t uid = userInfo.uid;
7864     std::string keyId = "";
7865     auto result = InstalldClient::GetInstance()->SetEncryptionPolicy(uid, info.GetBundleName(), el5Param.userId, keyId);
7866     if (result != ERR_OK) {
7867         LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
7868     }
7869     LOG_D(BMS_TAG_INSTALLER, "%{public}s, keyId: %{public}s", info.GetBundleName().c_str(), keyId.c_str());
7870     info.SetkeyId(el5Param.userId, keyId);
7871     if (!UpdateInnerBundleInfo(info)) {
7872         LOG_E(BMS_TAG_INSTALLER, "save keyId failed");
7873     }
7874 }
7875 
CanOpenLink( const std::string &link, bool &canOpen) const7876 ErrCode BundleDataMgr::CanOpenLink(
7877     const std::string &link, bool &canOpen) const
7878 {
7879     APP_LOGI("CanOpenLink link: %{public}s", link.c_str());
7880     auto uid = IPCSkeleton::GetCallingUid();
7881     InnerBundleInfo innerBundleInfo;
7882     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
7883         APP_LOGE("get innerBundleInfo by uid :%{public}d failed", uid);
7884         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
7885     }
7886     auto querySchemes = innerBundleInfo.GetQuerySchemes();
7887     if (querySchemes.empty()) {
7888         APP_LOGI("querySchemes is empty");
7889         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
7890     }
7891 
7892     size_t pos = link.find(SCHEME_END);
7893     if (pos == std::string::npos) {
7894         APP_LOGE("parse link : %{public}s failed", link.c_str());
7895         return ERR_BUNDLE_MANAGER_INVALID_SCHEME;
7896     }
7897     std::string scheme = link.substr(0, pos);
7898     transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
7899     if (std::find(querySchemes.begin(), querySchemes.end(), scheme) == querySchemes.end()) {
7900         APP_LOGI("scheme :%{public}s is not in the querySchemes", scheme.c_str());
7901         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
7902     }
7903 
7904     Want want;
7905     want.SetUri(link);
7906     std::vector<AbilityInfo> abilityInfos;
7907     // implicit query
7908     ErrCode ret = ImplicitQueryAbilityInfosV9(
7909         want, static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), GetUserIdByUid(uid), abilityInfos);
7910     if (ret != ERR_OK) {
7911         APP_LOGD("implicit queryAbilityInfosV9 error");
7912         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
7913     }
7914 
7915     canOpen = !abilityInfos.empty();
7916     APP_LOGI("canOpen : %{public}d", canOpen);
7917     return ERR_OK;
7918 }
7919 
GenerateOdid(const std::string &developerId, std::string &odid) const7920 void BundleDataMgr::GenerateOdid(const std::string &developerId, std::string &odid) const
7921 {
7922     APP_LOGD("start, developerId:%{public}s", developerId.c_str());
7923     if (developerId.empty()) {
7924         APP_LOGE("developerId is empty");
7925         return;
7926     }
7927     std::string groupId = BundleUtil::ExtractGroupIdByDevelopId(developerId);
7928     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7929     for (const auto &item : bundleInfos_) {
7930         std::string developerIdExist;
7931         std::string odidExist;
7932         item.second.GetDeveloperidAndOdid(developerIdExist, odidExist);
7933         std::string groupIdExist = BundleUtil::ExtractGroupIdByDevelopId(developerIdExist);
7934         if (groupId == groupIdExist) {
7935             odid = odidExist;
7936             return;
7937         }
7938     }
7939     odid = BundleUtil::GenerateUuid();
7940     APP_LOGI("developerId:%{public}s is not existed local, need to generate an odid %{private}s",
7941         developerId.c_str(), odid.c_str());
7942 }
7943 
GetOdid(std::string &odid) const7944 ErrCode BundleDataMgr::GetOdid(std::string &odid) const
7945 {
7946     int32_t callingUid = IPCSkeleton::GetCallingUid();
7947     InnerBundleInfo innerBundleInfo;
7948     if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
7949         if (sandboxAppHelper_ == nullptr) {
7950             APP_LOGE("sandboxAppHelper_ is nullptr");
7951             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7952         }
7953         if (sandboxAppHelper_->GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
7954             APP_LOGW("app that corresponds to the callingUid %{public}d could not be found", callingUid);
7955             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7956         }
7957     }
7958     std::string developerId;
7959     innerBundleInfo.GetDeveloperidAndOdid(developerId, odid);
7960     return ERR_OK;
7961 }
7962 
GetOdidByBundleName(const std::string &bundleName, std::string &odid) const7963 ErrCode BundleDataMgr::GetOdidByBundleName(const std::string &bundleName, std::string &odid) const
7964 {
7965     APP_LOGI("start GetOdidByBundleName, bundleName %{public}s", bundleName.c_str());
7966     InnerBundleInfo innerBundleInfo;
7967     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7968     const auto &item = bundleInfos_.find(bundleName);
7969     if (item == bundleInfos_.end()) {
7970         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
7971         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7972     }
7973     const InnerBundleInfo &bundleInfo = item->second;
7974     bundleInfo.GetOdid(odid);
7975     return ERR_OK;
7976 }
7977 
ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const7978 void BundleDataMgr::ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const
7979 {
7980     if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
7981         oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
7982         return;
7983     }
7984     oldInfo.AddAllowedAcls(newInfo.GetAllowedAcls());
7985 }
7986 
GetAllBundleInfoByDeveloperId(const std::string &developerId, std::vector<BundleInfo> &bundleInfos, int32_t userId)7987 ErrCode BundleDataMgr::GetAllBundleInfoByDeveloperId(const std::string &developerId,
7988     std::vector<BundleInfo> &bundleInfos, int32_t userId)
7989 {
7990     int32_t requestUserId = GetUserId(userId);
7991     APP_LOGI("requestUserId: %{public}d", requestUserId);
7992     if (requestUserId == Constants::INVALID_USERID) {
7993         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7994     }
7995 
7996     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7997     if (bundleInfos_.empty()) {
7998         APP_LOGW("bundleInfos_ data is empty");
7999         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8000     }
8001     for (const auto &item : bundleInfos_) {
8002         const InnerBundleInfo &innerBundleInfo = item.second;
8003         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
8004             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
8005             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
8006                 innerBundleInfo.GetBundleName().c_str());
8007             continue;
8008         }
8009 
8010         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8011         auto flag = GET_BASIC_APPLICATION_INFO;
8012         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
8013             continue;
8014         }
8015         // check developerId
8016         std::string developerIdExist;
8017         std::string odidExist;
8018         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
8019         if (developerIdExist != developerId) {
8020             continue;
8021         }
8022 
8023         BundleInfo bundleInfo;
8024 
8025         if (innerBundleInfo.GetBundleInfoV9(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION),
8026             bundleInfo, responseUserId) != ERR_OK) {
8027             continue;
8028         }
8029         bundleInfos.emplace_back(bundleInfo);
8030     }
8031     if (bundleInfos.empty()) {
8032         APP_LOGW("bundleInfos is empty");
8033         return ERR_BUNDLE_MANAGER_INVALID_DEVELOPERID;
8034     }
8035     APP_LOGI("have %{public}d applications, their developerId is %{public}s", requestUserId, developerId.c_str());
8036     return ERR_OK;
8037 }
8038 
GetDeveloperIds(const std::string &appDistributionType, std::vector<std::string> &developerIdList, int32_t userId)8039 ErrCode BundleDataMgr::GetDeveloperIds(const std::string &appDistributionType,
8040     std::vector<std::string> &developerIdList, int32_t userId)
8041 {
8042     int32_t requestUserId = GetUserId(userId);
8043     APP_LOGI("requestUserId: %{public}d", requestUserId);
8044     if (requestUserId == Constants::INVALID_USERID) {
8045         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8046     }
8047 
8048     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8049     if (bundleInfos_.empty()) {
8050         APP_LOGW("bundleInfos_ data is empty");
8051         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8052     }
8053     std::set<std::string> developerIdSet;
8054     for (const auto &item : bundleInfos_) {
8055         const InnerBundleInfo &innerBundleInfo = item.second;
8056         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
8057             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
8058             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
8059                 innerBundleInfo.GetBundleName().c_str());
8060             continue;
8061         }
8062 
8063         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8064         auto flag = GET_BASIC_APPLICATION_INFO;
8065         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
8066             continue;
8067         }
8068         // check appDistributionType
8069         if (!appDistributionType.empty() && innerBundleInfo.GetAppDistributionType() != appDistributionType) {
8070             continue;
8071         }
8072 
8073         std::string developerIdExist;
8074         std::string odidExist;
8075         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
8076         developerIdSet.emplace(developerIdExist);
8077     }
8078     for (const std::string &developerId : developerIdSet) {
8079         developerIdList.emplace_back(developerId);
8080     }
8081     APP_LOGI("have %{public}d developers, their appDistributionType is %{public}s",
8082         static_cast<int32_t>(developerIdList.size()), appDistributionType.c_str());
8083     return ERR_OK;
8084 }
8085 
SwitchUninstallState(const std::string &bundleName, const bool &state, const bool isNeedSendNotify)8086 ErrCode BundleDataMgr::SwitchUninstallState(const std::string &bundleName, const bool &state,
8087     const bool isNeedSendNotify)
8088 {
8089     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8090     auto infoItem = bundleInfos_.find(bundleName);
8091     if (infoItem == bundleInfos_.end()) {
8092         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8093         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8094     }
8095     InnerBundleInfo &innerBundleInfo = infoItem->second;
8096     if (!innerBundleInfo.IsRemovable() && state) {
8097         APP_LOGW("the bundle : %{public}s is not removable", bundleName.c_str());
8098         return ERR_BUNDLE_MANAGER_BUNDLE_CAN_NOT_BE_UNINSTALLED;
8099     }
8100     if (innerBundleInfo.GetUninstallState() == state) {
8101         return ERR_OK;
8102     }
8103     innerBundleInfo.SetUninstallState(state);
8104     innerBundleInfo.SetNeedSendNotify(isNeedSendNotify);
8105     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
8106         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8107         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8108     }
8109     return ERR_OK;
8110 }
8111 
AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)8112 ErrCode BundleDataMgr::AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)
8113 {
8114     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8115     auto infoItem = bundleInfos_.find(bundleName);
8116     if (infoItem == bundleInfos_.end()) {
8117         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8118         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8119     }
8120     InnerBundleInfo &innerBundleInfo = infoItem->second;
8121     ErrCode res = innerBundleInfo.AddCloneBundle(attr);
8122     if (res != ERR_OK) {
8123         APP_LOGE("innerBundleInfo addCloneBundleInfo fail");
8124         return res;
8125     }
8126     APP_LOGD("update bundle info in memory for add clone, userId: %{public}d, appIndex: %{public}d",
8127         attr.userId, attr.appIndex);
8128     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
8129     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
8130     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
8131         innerBundleInfo.SetBundleStatus(nowBundleStatus);
8132         innerBundleInfo.RemoveCloneBundle(attr.userId, attr.appIndex);
8133         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8134         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8135     }
8136     innerBundleInfo.SetBundleStatus(nowBundleStatus);
8137     APP_LOGD("update bundle info in storage for add clone, userId: %{public}d, appIndex: %{public}d",
8138         attr.userId, attr.appIndex);
8139     return ERR_OK;
8140 }
8141 
FilterAbilityInfosByAppLinking(const Want &want, int32_t flags, std::vector<AbilityInfo> &abilityInfos) const8142 void BundleDataMgr::FilterAbilityInfosByAppLinking(const Want &want, int32_t flags,
8143     std::vector<AbilityInfo> &abilityInfos) const
8144 {
8145 #ifdef APP_DOMAIN_VERIFY_ENABLED
8146     APP_LOGD("FilterAbility start");
8147     if (abilityInfos.empty()) {
8148         APP_LOGD("abilityInfos is empty");
8149         return;
8150     }
8151     if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
8152         APP_LOGD("scheme is not https");
8153         if ((static_cast<uint32_t>(flags) &
8154             static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
8155             static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) {
8156             APP_LOGI("using app linking flag and scheme is not https, return empty list");
8157             abilityInfos.clear();
8158         }
8159         return;
8160     }
8161     std::vector<AbilityInfo> filteredAbilityInfos;
8162     // call FiltedAbilityInfos
8163     APP_LOGI("call FilterAbilities");
8164     std::string identity = IPCSkeleton::ResetCallingIdentity();
8165     if (!DelayedSingleton<AppDomainVerify::AppDomainVerifyMgrClient>::GetInstance()->FilterAbilities(
8166         want, abilityInfos, filteredAbilityInfos)) {
8167         APP_LOGE("FilterAbilities failed");
8168     }
8169     IPCSkeleton::SetCallingIdentity(identity);
8170     if ((static_cast<uint32_t>(flags) &
8171         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
8172         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) {
8173         APP_LOGD("return filteredAbilityInfos");
8174         abilityInfos = filteredAbilityInfos;
8175         for (auto &abilityInfo : abilityInfos) {
8176             abilityInfo.linkType = LinkType::APP_LINK;
8177         }
8178         return;
8179     }
8180     for (auto &filteredAbilityInfo : filteredAbilityInfos) {
8181         for (auto &abilityInfo : abilityInfos) {
8182             if (filteredAbilityInfo.bundleName == abilityInfo.bundleName &&
8183                 filteredAbilityInfo.name == abilityInfo.name) {
8184                 abilityInfo.linkType = LinkType::APP_LINK;
8185                 break;
8186             }
8187         }
8188     }
8189     return;
8190 #else
8191     APP_LOGI("AppDomainVerify is not enabled");
8192     return;
8193 #endif
8194 }
8195 
RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)8196 ErrCode BundleDataMgr::RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)
8197 {
8198     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8199     auto infoItem = bundleInfos_.find(bundleName);
8200     if (infoItem == bundleInfos_.end()) {
8201         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8202         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8203     }
8204     InnerBundleInfo &innerBundleInfo = infoItem->second;
8205     ErrCode res = innerBundleInfo.RemoveCloneBundle(userId, appIndex);
8206     if (res != ERR_OK) {
8207         APP_LOGE("innerBundleInfo RemoveCloneBundle fail");
8208         return res;
8209     }
8210     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
8211     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
8212     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
8213         innerBundleInfo.SetBundleStatus(nowBundleStatus);
8214         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8215         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8216     }
8217     innerBundleInfo.SetBundleStatus(nowBundleStatus);
8218     DeleteDesktopShortcutInfo(bundleName, userId, appIndex);
8219     return ERR_OK;
8220 }
8221 
QueryAbilityInfoByContinueType(const std::string &bundleName, const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const8222 ErrCode BundleDataMgr::QueryAbilityInfoByContinueType(const std::string &bundleName,
8223     const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const
8224 {
8225     int32_t requestUserId = GetUserId(userId);
8226     APP_LOGI("requestUserId: %{public}d", requestUserId);
8227     if (requestUserId == Constants::INVALID_USERID) {
8228         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8229     }
8230 
8231     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8232     if (bundleInfos_.empty()) {
8233         APP_LOGW("bundleInfos_ data is empty");
8234         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8235     }
8236     InnerBundleInfo innerBundleInfo;
8237     if (appIndex == 0) {
8238         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, 0, innerBundleInfo, requestUserId);
8239         if (ret != ERR_OK) {
8240             APP_LOGD("QueryAbilityInfoByContinueType failed, bundleName:%{public}s", bundleName.c_str());
8241             return ret;
8242         }
8243     }
8244     if (appIndex > 0) {
8245         if (sandboxAppHelper_ == nullptr) {
8246             APP_LOGW("sandboxAppHelper_ is nullptr");
8247             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8248         }
8249         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
8250         if (ret != ERR_OK) {
8251             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
8252                 ret, bundleName.c_str());
8253             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8254         }
8255     }
8256     auto ability = innerBundleInfo.FindAbilityInfo(continueType, requestUserId);
8257     if (!ability) {
8258         APP_LOGW("ability not found, bundleName:%{public}s, coutinueType:%{public}s",
8259             bundleName.c_str(), continueType.c_str());
8260         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8261     }
8262     abilityInfo = (*ability);
8263     InnerBundleUserInfo innerBundleUserInfo;
8264     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
8265         abilityInfo.uid = innerBundleUserInfo.uid;
8266     }
8267     return ERR_OK;
8268 }
8269 
QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId, int32_t appIndex, AbilityInfo &abilityInfo) const8270 ErrCode BundleDataMgr::QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
8271     int32_t appIndex, AbilityInfo &abilityInfo) const
8272 {
8273     std::string bundleName = element.GetBundleName();
8274     std::string abilityName = element.GetAbilityName();
8275     std::string moduleName = element.GetModuleName();
8276     LOG_D(BMS_TAG_QUERY,
8277         "QueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8278         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8279     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
8280     int32_t requestUserId = GetUserId(userId);
8281     if (requestUserId == Constants::INVALID_USERID) {
8282         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8283     }
8284 
8285     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8286     InnerBundleInfo innerBundleInfo;
8287 
8288     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8289     if (ret != ERR_OK) {
8290         LOG_D(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
8291         return ret;
8292     }
8293 
8294     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8295     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8296     if (!ability) {
8297         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8298             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8299         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8300     }
8301     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
8302 }
8303 
ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId, int32_t appIndex, AbilityInfo &abilityInfo) const8304 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
8305     int32_t appIndex, AbilityInfo &abilityInfo) const
8306 {
8307     std::string bundleName = element.GetBundleName();
8308     std::string abilityName = element.GetAbilityName();
8309     std::string moduleName = element.GetModuleName();
8310     LOG_D(BMS_TAG_QUERY,
8311         "ExplicitQueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8312         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8313     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
8314     int32_t requestUserId = GetUserId(userId);
8315     if (requestUserId == Constants::INVALID_USERID) {
8316         return false;
8317     }
8318     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8319     InnerBundleInfo innerBundleInfo;
8320 
8321     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8322     if (!ret) {
8323         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
8324         return false;
8325     }
8326 
8327     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8328     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
8329     if (!ability) {
8330         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8331             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8332         return false;
8333     }
8334     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
8335 }
8336 
ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId, int32_t appIndex, AbilityInfo &abilityInfo) const8337 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId,
8338     int32_t appIndex, AbilityInfo &abilityInfo) const
8339 {
8340     std::string bundleName = element.GetBundleName();
8341     std::string abilityName = element.GetAbilityName();
8342     std::string moduleName = element.GetModuleName();
8343     LOG_D(BMS_TAG_QUERY,
8344         "ExplicitQueryCloneAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8345         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8346     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
8347     int32_t requestUserId = GetUserId(userId);
8348     if (requestUserId == Constants::INVALID_USERID) {
8349         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8350     }
8351     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8352     InnerBundleInfo innerBundleInfo;
8353 
8354     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8355     if (ret != ERR_OK) {
8356         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
8357         return ret;
8358     }
8359 
8360     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8361     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8362     if (!ability) {
8363         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8364             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8365         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8366     }
8367     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
8368 }
8369 
GetCloneBundleInfo( const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const8370 ErrCode BundleDataMgr::GetCloneBundleInfo(
8371     const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const
8372 {
8373     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
8374     if (userId == Constants::ANY_USERID) {
8375         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
8376             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
8377             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8378         }
8379         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
8380     }
8381 
8382     int32_t requestUserId = GetUserId(userId);
8383     if (requestUserId == Constants::INVALID_USERID) {
8384         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8385     }
8386     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8387     InnerBundleInfo innerBundleInfo;
8388 
8389     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8390     if (ret != ERR_OK) {
8391         LOG_D(BMS_TAG_QUERY, "GetCloneBundleInfo failed, error code: %{public}d, bundleName:%{public}s",
8392             ret, bundleName.c_str());
8393         return ret;
8394     }
8395 
8396     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8397     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
8398 
8399     ProcessBundleMenu(bundleInfo, flags, true);
8400     ProcessBundleRouterMap(bundleInfo, flags);
8401     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
8402         bundleName.c_str(), userId);
8403     return ERR_OK;
8404 }
8405 
QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos) const8406 void BundleDataMgr::QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId,
8407     std::vector<ExtensionAbilityInfo> &infos) const
8408 {
8409     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
8410     int32_t requestUserId = GetUserId(userId);
8411     if (requestUserId == Constants::INVALID_USERID) {
8412         LOG_D(BMS_TAG_QUERY, "invalid user");
8413         return;
8414     }
8415 
8416     ElementName element = want.GetElement();
8417     std::string bundleName = element.GetBundleName();
8418     std::string extensionName = element.GetAbilityName();
8419     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
8420         bundleName.c_str(), extensionName.c_str());
8421 
8422     if (!bundleName.empty() && !extensionName.empty()) {
8423         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
8424         if (cloneAppIndexes.empty()) {
8425             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
8426             return;
8427         }
8428         for (int32_t appIndex: cloneAppIndexes) {
8429             ExtensionAbilityInfo info;
8430             ErrCode ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
8431             if (ret != ERR_OK) {
8432                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
8433                 continue;
8434             }
8435             infos.emplace_back(info);
8436         }
8437         return;
8438     } else if (!bundleName.empty()) {
8439         ImplicitQueryCurCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
8440     } else {
8441         ImplicitQueryAllCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
8442     }
8443 }
8444 
QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos) const8445 void BundleDataMgr::QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
8446     std::vector<ExtensionAbilityInfo> &infos) const
8447 {
8448     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
8449     int32_t requestUserId = GetUserId(userId);
8450     if (requestUserId == Constants::INVALID_USERID) {
8451         LOG_D(BMS_TAG_QUERY, "invalid user");
8452         return;
8453     }
8454 
8455     ElementName element = want.GetElement();
8456     std::string bundleName = element.GetBundleName();
8457     std::string extensionName = element.GetAbilityName();
8458     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
8459         bundleName.c_str(), extensionName.c_str());
8460 
8461     if (!bundleName.empty() && !extensionName.empty()) {
8462         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
8463         if (cloneAppIndexes.empty()) {
8464             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
8465             return;
8466         }
8467         for (int32_t appIndex: cloneAppIndexes) {
8468             ExtensionAbilityInfo info;
8469             ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
8470             if (ret != ERR_OK) {
8471                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
8472                 continue;
8473             }
8474             infos.emplace_back(info);
8475         }
8476         return;
8477     } else if (!bundleName.empty()) {
8478         ImplicitQueryCurCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
8479     } else {
8480         ImplicitQueryAllCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
8481     }
8482 }
8483 
ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &abilityInfos) const8484 bool BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
8485     std::vector<ExtensionAbilityInfo> &abilityInfos) const
8486 {
8487     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfos");
8488     std::string bundleName = want.GetElement().GetBundleName();
8489 
8490     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8491     InnerBundleInfo innerBundleInfo;
8492     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId);
8493     if (!ret) {
8494         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfos failed");
8495         return false;
8496     }
8497     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
8498     if (cloneAppIndexes.empty()) {
8499         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfos empty");
8500         return true;
8501     }
8502     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8503     for (int32_t appIndex: cloneAppIndexes) {
8504         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
8505             LOG_D(BMS_TAG_QUERY,
8506                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
8507                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
8508             continue;
8509         }
8510         GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
8511     }
8512     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfos");
8513     return true;
8514 }
8515 
ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &abilityInfos) const8516 ErrCode BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
8517     std::vector<ExtensionAbilityInfo> &abilityInfos) const
8518 {
8519     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfosV9");
8520     std::string bundleName = want.GetElement().GetBundleName();
8521 
8522     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8523     InnerBundleInfo innerBundleInfo;
8524     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
8525     if (ret != ERR_OK) {
8526         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfosV9 failed");
8527         return ret;
8528     }
8529     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
8530     if (cloneAppIndexes.empty()) {
8531         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfosV9 empty");
8532         return ERR_OK;
8533     }
8534     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8535     for (int32_t appIndex: cloneAppIndexes) {
8536         if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
8537             LOG_D(BMS_TAG_QUERY,
8538                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
8539                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
8540             continue;
8541         }
8542         GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
8543     }
8544     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfosV9");
8545     return ERR_OK;
8546 }
8547 
ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos) const8548 bool BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
8549     std::vector<ExtensionAbilityInfo> &infos) const
8550 {
8551     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8552     for (const auto &item : bundleInfos_) {
8553         const InnerBundleInfo &innerBundleInfo = item.second;
8554         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
8555         if (cloneAppIndexes.empty()) {
8556             continue;
8557         }
8558         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8559         for (int32_t appIndex: cloneAppIndexes) {
8560             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
8561                 LOG_D(BMS_TAG_QUERY,
8562                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
8563                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
8564                 continue;
8565             }
8566             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8567             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
8568         }
8569     }
8570     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
8571     return true;
8572 }
8573 
ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos) const8574 ErrCode BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
8575     std::vector<ExtensionAbilityInfo> &infos) const
8576 {
8577     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8578     for (const auto &item : bundleInfos_) {
8579         const InnerBundleInfo &innerBundleInfo = item.second;
8580         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
8581         if (cloneAppIndexes.empty()) {
8582             continue;
8583         }
8584         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8585         for (int32_t appIndex: cloneAppIndexes) {
8586             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
8587                 LOG_D(BMS_TAG_QUERY,
8588                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
8589                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
8590                 continue;
8591             }
8592             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8593             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
8594         }
8595     }
8596     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
8597     return ERR_OK;
8598 }
8599 
GetAppIdByBundleName( const std::string &bundleName, std::string &appId) const8600 ErrCode BundleDataMgr::GetAppIdByBundleName(
8601     const std::string &bundleName, std::string &appId) const
8602 {
8603     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
8604     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8605     auto item = bundleInfos_.find(bundleName);
8606     if (item == bundleInfos_.end()) {
8607         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8608     }
8609 
8610     appId = item->second.GetBaseBundleInfo().appId;
8611     return ERR_OK;
8612 }
8613 
GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const8614 ErrCode BundleDataMgr::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const
8615 {
8616     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8617     auto item = bundleInfos_.find(bundleName);
8618     if (item == bundleInfos_.end()) {
8619         LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
8620         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8621     }
8622     const InnerBundleInfo &innerBundleInfo = item->second;
8623     signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
8624     signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
8625     signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
8626     return ERR_OK;
8627 }
8628 
UpdateAppEncryptedStatus( const std::string &bundleName, bool isExisted, int32_t appIndex)8629 ErrCode BundleDataMgr::UpdateAppEncryptedStatus(
8630     const std::string &bundleName, bool isExisted, int32_t appIndex)
8631 {
8632     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8633     auto item = bundleInfos_.find(bundleName);
8634     if (item == bundleInfos_.end()) {
8635         LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
8636         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8637     }
8638     auto res = item->second.UpdateAppEncryptedStatus(bundleName, isExisted, appIndex);
8639     if (res != ERR_OK) {
8640         LOG_E(BMS_TAG_DEFAULT, "UpdateAppEncryptedStatus failed %{public}s %{public}d", bundleName.c_str(), res);
8641         return res;
8642     }
8643     if (dataStorage_ == nullptr) {
8644         LOG_E(BMS_TAG_DEFAULT, "dataStorage_ nullptr");
8645         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8646     }
8647     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
8648         APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", bundleName.c_str());
8649         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8650     }
8651     return ERR_OK;
8652 }
8653 
AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)8654 ErrCode BundleDataMgr::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
8655 {
8656     int32_t requestUserId = GetUserId(userId);
8657     if (requestUserId == Constants::INVALID_USERID) {
8658         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
8659         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8660     }
8661     bool isEnabled = false;
8662     ErrCode ret = IsApplicationEnabled(shortcutInfo.bundleName, shortcutInfo.appIndex, isEnabled, userId);
8663     if (ret != ERR_OK) {
8664         APP_LOGD("IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
8665             ret, shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
8666         return ret;
8667     }
8668     if (!isEnabled) {
8669         APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
8670             shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
8671         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
8672     }
8673     bool isIdIllegal = false;
8674     if (!shortcutStorage_->AddDesktopShortcutInfo(shortcutInfo, userId, isIdIllegal)) {
8675         if (isIdIllegal) {
8676             return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
8677         }
8678         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
8679     }
8680     return ERR_OK;
8681 }
8682 
DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)8683 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
8684 {
8685     int32_t requestUserId = GetUserId(userId);
8686     if (requestUserId == Constants::INVALID_USERID) {
8687         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
8688         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8689     }
8690     if (!shortcutStorage_->DeleteDesktopShortcutInfo(shortcutInfo, userId)) {
8691         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
8692     }
8693     return ERR_OK;
8694 }
8695 
GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)8696 ErrCode BundleDataMgr::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
8697 {
8698     int32_t requestUserId = GetUserId(userId);
8699     if (requestUserId == Constants::INVALID_USERID) {
8700         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
8701         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8702     }
8703     std::vector<ShortcutInfo> datas;
8704     shortcutStorage_->GetAllDesktopShortcutInfo(userId, datas);
8705     for (const auto &data : datas) {
8706         bool isEnabled = false;
8707         ErrCode ret = IsApplicationEnabled(data.bundleName, data.appIndex, isEnabled, userId);
8708         if (ret != ERR_OK) {
8709             APP_LOGD(
8710                 "IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
8711                 ret, data.bundleName.c_str(), data.appIndex, userId);
8712             continue;
8713         }
8714         if (!isEnabled) {
8715             APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
8716                 data.bundleName.c_str(), data.appIndex, userId);
8717             continue;
8718         }
8719         shortcutInfos.emplace_back(data);
8720     }
8721     return ERR_OK;
8722 }
8723 
DeleteDesktopShortcutInfo(const std::string &bundleName)8724 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName)
8725 {
8726     APP_LOGD("DeleteDesktopShortcutInfo by uninstall, bundleName:%{public}s", bundleName.c_str());
8727     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName)) {
8728         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
8729     }
8730     return ERR_OK;
8731 }
8732 
DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)8733 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
8734 {
8735     APP_LOGD(
8736         "DeleteDesktopShortcutInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
8737         bundleName.c_str(), userId, appIndex);
8738     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName, userId, appIndex)) {
8739         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
8740     }
8741     return ERR_OK;
8742 }
8743 
GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const8744 void BundleDataMgr::GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const
8745 {
8746     if (bundleInfos.empty()) {
8747         APP_LOGD("bundleInfos is empty");
8748         return;
8749     }
8750     bundleInfos.erase(std::remove_if(bundleInfos.begin(), bundleInfos.end(), [](BundleInfo bundleInfo) {
8751         for (auto abilityInfo : bundleInfo.abilityInfos) {
8752             if (abilityInfo.continuable) {
8753                 return false;
8754             }
8755         }
8756         return true;
8757         }), bundleInfos.end());
8758 }
8759 
GetContinueBundleNames( const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)8760 ErrCode BundleDataMgr::GetContinueBundleNames(
8761     const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
8762 {
8763     auto requestUserId = GetUserId(userId);
8764     if (requestUserId == Constants::INVALID_USERID) {
8765         APP_LOGE("Input invalid userid, userId:%{public}d", userId);
8766         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8767     }
8768     if (continueBundleName.empty()) {
8769         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
8770     }
8771 
8772     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8773     for (const auto &[key, innerInfo] : bundleInfos_) {
8774         if (CheckInnerBundleInfoWithFlags(
8775             innerInfo, BundleFlag::GET_BUNDLE_WITH_ABILITIES, innerInfo.GetResponseUserId(requestUserId)) != ERR_OK) {
8776             continue;
8777         }
8778         for (const auto &[key, abilityInfo] : innerInfo.GetInnerAbilityInfos()) {
8779             if (abilityInfo.continueBundleNames.find(continueBundleName) != abilityInfo.continueBundleNames.end()) {
8780                 bundleNames.emplace_back(abilityInfo.bundleName);
8781                 break;
8782             }
8783         }
8784     }
8785 
8786     APP_LOGD("The number of found continue packs, size:[%{public}d]", static_cast<int32_t>(bundleNames.size()));
8787     return ERR_OK;
8788 }
8789 
IsBundleInstalled(const std::string &bundleName, int32_t userId, int32_t appIndex, bool &isInstalled)8790 ErrCode BundleDataMgr::IsBundleInstalled(const std::string &bundleName, int32_t userId,
8791     int32_t appIndex, bool &isInstalled)
8792 {
8793     int32_t requestUserId = GetUserId(userId);
8794     if (requestUserId == Constants::INVALID_USERID) {
8795         APP_LOGE("name %{public}s invalid userid :%{public}d", bundleName.c_str(), userId);
8796         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8797     }
8798     if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
8799         APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
8800         return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX;
8801     }
8802     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8803     auto item = bundleInfos_.find(bundleName);
8804     if (item == bundleInfos_.end()) {
8805         isInstalled = false;
8806         return ERR_OK;
8807     }
8808     if (item->second.GetInstallMark().status == InstallExceptionStatus::INSTALL_START) {
8809         APP_LOGW("name %{public}s is installing", bundleName.c_str());
8810         isInstalled = false;
8811         return ERR_OK;
8812     }
8813     if ((item->second.GetApplicationBundleType() == BundleType::SHARED) ||
8814         ((item->second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) &&
8815         item->second.GetInnerBundleUserInfos().empty())) {
8816         isInstalled = true;
8817         return ERR_OK;
8818     }
8819     int32_t responseUserId = item->second.GetResponseUserId(requestUserId);
8820     if (responseUserId == Constants::INVALID_USERID) {
8821         isInstalled = false;
8822         return ERR_OK;
8823     }
8824     if (appIndex == 0) {
8825         isInstalled = true;
8826         return ERR_OK;
8827     }
8828     InnerBundleUserInfo innerBundleUserInfo;
8829     if (item->second.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
8830         if (innerBundleUserInfo.cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) !=
8831             innerBundleUserInfo.cloneInfos.end()) {
8832             isInstalled = true;
8833             return ERR_OK;
8834         }
8835     }
8836     isInstalled = false;
8837     return ERR_OK;
8838 }
8839 
UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)8840 void BundleDataMgr::UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)
8841 {
8842     APP_LOGD("UpdateIsPreInstallApp %{public}s", bundleName.c_str());
8843     if (bundleName.empty()) {
8844         APP_LOGW("bundleName is empty");
8845         return;
8846     }
8847 
8848     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8849     auto infoItem = bundleInfos_.find(bundleName);
8850     if (infoItem == bundleInfos_.end()) {
8851         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
8852         return;
8853     }
8854 
8855     if (infoItem->second.IsPreInstallApp() != isPreInstallApp) {
8856         infoItem->second.SetIsPreInstallApp(isPreInstallApp);
8857         SaveInnerBundleInfo(infoItem->second);
8858     }
8859 }
8860 }  // namespace AppExecFwk
8861 }  // namespace OHOS
8862