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