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