• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 <algorithm>
19 #include <chrono>
20 #include <cinttypes>
21 #include <sstream>
22 
23 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
24 #ifdef ACCOUNT_ENABLE
25 #include "os_account_info.h"
26 #endif
27 #endif
28 #include "account_helper.h"
29 #include "app_log_wrapper.h"
30 #include "app_provision_info_manager.h"
31 #include "bms_extension_data_mgr.h"
32 #include "bundle_constants.h"
33 #include "bundle_data_storage_rdb.h"
34 #include "preinstall_data_storage_rdb.h"
35 #include "bundle_event_callback_death_recipient.h"
36 #include "bundle_mgr_service.h"
37 #include "bundle_permission_mgr.h"
38 #include "bundle_status_callback_death_recipient.h"
39 #include "bundle_util.h"
40 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
41 #include "default_app_mgr.h"
42 #endif
43 #include "installd_client.h"
44 #include "ipc_skeleton.h"
45 #include "json_serializer.h"
46 #ifdef GLOBAL_I18_ENABLE
47 #include "locale_config.h"
48 #include "locale_info.h"
49 #endif
50 #include "mime_type_mgr.h"
51 #include "nlohmann/json.hpp"
52 #include "free_install_params.h"
53 #include "parameters.h"
54 #include "singleton.h"
55 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
56 #include "bundle_overlay_data_manager.h"
57 #endif
58 #include "bundle_extractor.h"
59 
60 namespace OHOS {
61 namespace AppExecFwk {
62 namespace {
63 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
64 constexpr int32_t DATA_GROUP_INDEX_START = 1;
65 constexpr int32_t UUID_LENGTH = 36;
66 constexpr int32_t PROFILE_PREFIX_LENGTH = 9;
67 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
68 // freeInstall action
69 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
70 // share action
71 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
72 const std::string WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
73 const std::string SUMMARY_TOTAL_COUNT = "totalCount";
74 const std::string WANT_PARAM_SUMMARY = "summary";
75 constexpr int32_t DEFAULT_SUMMARY_COUNT = 0;
76 // data share
77 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
78 constexpr int32_t DATA_PROXY_URI_PREFIX_LEN = 17;
79 // profile path
80 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
81 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
82 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
83 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
84 constexpr const char* PROFILE_PATH = "resources/base/profile/";
85 constexpr const char* PROFILE_PREFIX = "$profile:";
86 constexpr const char* JSON_SUFFIX = ".json";
87 const std::string BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
88 
89 const std::map<ProfileType, std::string> PROFILE_TYPE_MAP = {
90     { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
91     { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
92     { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
93     { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH}
94 };
95 }
96 
BundleDataMgr()97 BundleDataMgr::BundleDataMgr()
98 {
99     InitStateTransferMap();
100     dataStorage_ = std::make_shared<BundleDataStorageRdb>();
101     preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
102     sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
103     bundleStateStorage_ = std::make_shared<BundleStateStorage>();
104     baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
105     if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= Constants::MAX_APP_UID) {
106         baseAppUid_ = Constants::BASE_APP_UID;
107     }
108     APP_LOGI("BundleDataMgr instance is created");
109 }
110 
~BundleDataMgr()111 BundleDataMgr::~BundleDataMgr()
112 {
113     APP_LOGI("BundleDataMgr instance is destroyed");
114     installStates_.clear();
115     transferStates_.clear();
116     bundleInfos_.clear();
117 }
118 
LoadDataFromPersistentStorage()119 bool BundleDataMgr::LoadDataFromPersistentStorage()
120 {
121     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
122     // Judge whether bundleState json db exists.
123     // If it does not exist, create it and return the judgment result.
124     bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
125     if (!dataStorage_->LoadAllData(bundleInfos_)) {
126         APP_LOGW("LoadAllData failed");
127         return false;
128     }
129 
130     if (bundleInfos_.empty()) {
131         APP_LOGW("persistent data is empty");
132         return false;
133     }
134 
135     for (const auto &item : bundleInfos_) {
136         std::lock_guard<std::mutex> stateLock(stateMutex_);
137         installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
138         AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
139     }
140 
141     RestoreUidAndGid();
142     if (!bundleStateDbExist) {
143         // Compatible old bundle status in kV db
144         CompatibleOldBundleStateInKvDb();
145     } else {
146         ResetBundleStateData();
147         // Load all bundle status from json db.
148         LoadAllBundleStateDataFromJsonDb();
149     }
150 
151     SetInitialUserFlag(true);
152 
153     RestoreSandboxUidAndGid(bundleIdMap_);
154     return true;
155 }
156 
CompatibleOldBundleStateInKvDb()157 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
158 {
159     for (auto& bundleInfoItem : bundleInfos_) {
160         for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
161             auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
162             if (bundleUserInfo.IsInitialState()) {
163                 continue;
164             }
165 
166             // save old bundle state to json db
167             bundleStateStorage_->SaveBundleStateStorage(
168                 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
169         }
170     }
171 }
172 
LoadAllBundleStateDataFromJsonDb()173 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
174 {
175     APP_LOGD("Load all bundle state start");
176     std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
177     if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
178         APP_LOGW("Load all bundle state failed");
179         return;
180     }
181 
182     for (auto& bundleState : bundleStateInfos) {
183         auto infoItem = bundleInfos_.find(bundleState.first);
184         if (infoItem == bundleInfos_.end()) {
185             APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
186             continue;
187         }
188 
189         InnerBundleInfo& newInfo = infoItem->second;
190         for (auto& bundleUserState : bundleState.second) {
191             auto& tempUserInfo = bundleUserState.second;
192             newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.first);
193             for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
194                 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
195             }
196         }
197     }
198 
199     APP_LOGD("Load all bundle state end");
200 }
201 
ResetBundleStateData()202 void BundleDataMgr::ResetBundleStateData()
203 {
204     for (auto& bundleInfoItem : bundleInfos_) {
205         bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
206     }
207 }
208 
UpdateBundleInstallState(const std::string & bundleName,const InstallState state)209 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName, const InstallState state)
210 {
211     if (bundleName.empty()) {
212         APP_LOGW("update result:fail, reason:bundle name is empty");
213         return false;
214     }
215     // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
216     std::unique_lock<std::shared_mutex> lck(bundleInfoMutex_);
217     std::lock_guard<std::mutex> lock(stateMutex_);
218     auto item = installStates_.find(bundleName);
219     if (item == installStates_.end()) {
220         if (state == InstallState::INSTALL_START) {
221             installStates_.emplace(bundleName, state);
222             APP_LOGD("update result:success, state:INSTALL_START");
223             return true;
224         }
225         APP_LOGW("update result:fail, reason:incorrect state, bundleName: %{public}s", bundleName.c_str());
226         return false;
227     }
228 
229     auto stateRange = transferStates_.equal_range(state);
230     for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
231         if (item->second == previousState->second) {
232             APP_LOGD("update result:success, current:%{public}d, state:%{public}d", previousState->second, state);
233             if (IsDeleteDataState(state)) {
234                 installStates_.erase(item);
235                 DeleteBundleInfo(bundleName, state);
236                 return true;
237             }
238             item->second = state;
239             return true;
240         }
241     }
242     APP_LOGW("bundleName: %{public}s, update result:fail, reason:incorrect current:%{public}d, state:%{public}d",
243         bundleName.c_str(), item->second, state);
244     return false;
245 }
246 
AddInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)247 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
248 {
249     APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
250     if (bundleName.empty()) {
251         APP_LOGW("save info fail, empty bundle name");
252         return false;
253     }
254 
255     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
256     auto infoItem = bundleInfos_.find(bundleName);
257     if (infoItem != bundleInfos_.end()) {
258         APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
259         return false;
260     }
261     std::lock_guard<std::mutex> stateLock(stateMutex_);
262     auto statusItem = installStates_.find(bundleName);
263     if (statusItem == installStates_.end()) {
264         APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
265         return false;
266     }
267     if (statusItem->second == InstallState::INSTALL_START) {
268         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
269         if (info.GetBaseApplicationInfo().needAppDetail) {
270             AddAppDetailAbilityInfo(info);
271         }
272 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
273         if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
274             InnerBundleInfo newInfo = info;
275             std::string targetBundleName = newInfo.GetTargetBundleName();
276             auto targetInfoItem = bundleInfos_.find(targetBundleName);
277             if (targetInfoItem != bundleInfos_.end()) {
278                 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
279                 // storage target bundle info
280                 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
281             }
282         }
283         if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
284             info.SetOverlayModuleState(info.GetCurrentModulePackage(), OverlayState::OVERLAY_INVALID,
285                 info.GetUserId());
286         }
287         if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
288             // build overlay connection for external overlay
289             BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
290         }
291 #endif
292         if (dataStorage_->SaveStorageBundleInfo(info)) {
293             APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
294             bundleInfos_.emplace(bundleName, info);
295             AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
296             return true;
297         }
298     }
299     return false;
300 }
301 
AddNewModuleInfo(const std::string & bundleName,const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)302 bool BundleDataMgr::AddNewModuleInfo(
303     const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
304 {
305     APP_LOGD("add new module info module name %{public}s ", newInfo.GetCurrentModulePackage().c_str());
306     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
307     auto infoItem = bundleInfos_.find(bundleName);
308     if (infoItem == bundleInfos_.end()) {
309         APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
310         return false;
311     }
312     std::lock_guard<std::mutex> stateLock(stateMutex_);
313     auto statusItem = installStates_.find(bundleName);
314     if (statusItem == installStates_.end()) {
315         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
316         return false;
317     }
318     if (statusItem->second == InstallState::UPDATING_SUCCESS) {
319         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
320         if (newInfo.GetAsanEnabled()) {
321             oldInfo.SetAsanEnabled(true);
322         }
323         if (newInfo.GetGwpAsanEnabled()) {
324             oldInfo.SetGwpAsanEnabled(true);
325         }
326         if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
327             oldInfo.SetAsanEnabled(newInfo.GetAsanEnabled());
328             oldInfo.SetGwpAsanEnabled(newInfo.GetGwpAsanEnabled());
329         }
330         if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
331             oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
332             oldInfo.UpdateBaseApplicationInfo(newInfo.GetBaseApplicationInfo(), newInfo.HasEntry());
333             oldInfo.UpdateRemovable(newInfo.GetIsPreInstallApp(), newInfo.GetRemovable());
334         }
335         if (oldInfo.GetOldAppIds().empty()) {
336             oldInfo.AddOldAppId(oldInfo.GetAppId());
337         }
338         oldInfo.SetProvisionId(newInfo.GetProvisionId());
339         oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
340         oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
341         oldInfo.AddOldAppId(newInfo.GetAppId());
342         oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
343         oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
344         oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
345         oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
346         oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
347         oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
348         oldInfo.AddModuleInfo(newInfo);
349         oldInfo.UpdateAppDetailAbilityAttrs();
350         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
351         oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
352 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
353         if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
354             oldInfo.SetOverlayType(newInfo.GetOverlayType());
355         }
356         if (!UpdateOverlayInfo(newInfo, oldInfo)) {
357             APP_LOGD("bundleName: %{public}s : update overlay info failed", bundleName.c_str());
358             return false;
359         }
360 #endif
361         if (dataStorage_->SaveStorageBundleInfo(oldInfo)) {
362             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
363             bundleInfos_.at(bundleName) = oldInfo;
364             return true;
365         }
366     }
367     return false;
368 }
369 
RemoveModuleInfo(const std::string & bundleName,const std::string & modulePackage,InnerBundleInfo & oldInfo)370 bool BundleDataMgr::RemoveModuleInfo(
371     const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo)
372 {
373     APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
374     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
375     auto infoItem = bundleInfos_.find(bundleName);
376     if (infoItem == bundleInfos_.end()) {
377         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
378         return false;
379     }
380     std::lock_guard<std::mutex> stateLock(stateMutex_);
381     auto statusItem = installStates_.find(bundleName);
382     if (statusItem == installStates_.end()) {
383         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
384         return false;
385     }
386     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
387         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
388 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
389         std::string targetBundleName = oldInfo.GetTargetBundleName();
390         InnerBundleInfo targetInnerBundleInfo;
391         if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
392             targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
393         }
394         OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
395             targetInnerBundleInfo);
396         if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
397             // save target innerBundleInfo
398             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
399                 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
400                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
401             }
402         }
403         // remove target module and overlay module state will change to OVERLAY_INVALID
404         if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
405             ResetExternalOverlayModuleState(bundleName, modulePackage);
406         }
407 #endif
408         oldInfo.RemoveModuleInfo(modulePackage);
409         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
410         if (!oldInfo.isExistedOverlayModule()) {
411             oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
412         }
413         if (dataStorage_->SaveStorageBundleInfo(oldInfo)) {
414             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
415             bundleInfos_.at(bundleName) = oldInfo;
416             return true;
417         }
418         APP_LOGD("after delete modulePackage:%{public}s info", modulePackage.c_str());
419     }
420     return true;
421 }
422 
RemoveHspModuleByVersionCode(int32_t versionCode,InnerBundleInfo & info)423 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
424 {
425     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
426     std::string bundleName = info.GetBundleName();
427     auto infoItem = bundleInfos_.find(bundleName);
428     if (infoItem == bundleInfos_.end()) {
429         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
430         return false;
431     }
432     std::lock_guard<std::mutex> stateLock(stateMutex_);
433     auto statusItem = installStates_.find(bundleName);
434     if (statusItem == installStates_.end()) {
435         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
436         return false;
437     }
438     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
439         info.DeleteHspModuleByVersion(versionCode);
440         info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
441         if (dataStorage_->SaveStorageBundleInfo(info)) {
442             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
443             bundleInfos_.at(bundleName) = info;
444             return true;
445         }
446     }
447     return true;
448 }
449 
AddInnerBundleUserInfo(const std::string & bundleName,const InnerBundleUserInfo & newUserInfo)450 bool BundleDataMgr::AddInnerBundleUserInfo(
451     const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
452 {
453     APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
454     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
455     auto infoItem = bundleInfos_.find(bundleName);
456     if (infoItem == bundleInfos_.end()) {
457         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
458         return false;
459     }
460 
461     std::lock_guard<std::mutex> stateLock(stateMutex_);
462     auto& info = bundleInfos_.at(bundleName);
463     info.AddInnerBundleUserInfo(newUserInfo);
464     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
465     if (!dataStorage_->SaveStorageBundleInfo(info)) {
466         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
467         return false;
468     }
469     return true;
470 }
471 
RemoveInnerBundleUserInfo(const std::string & bundleName,int32_t userId)472 bool BundleDataMgr::RemoveInnerBundleUserInfo(
473     const std::string &bundleName, int32_t userId)
474 {
475     APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
476     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
477     auto infoItem = bundleInfos_.find(bundleName);
478     if (infoItem == bundleInfos_.end()) {
479         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
480         return false;
481     }
482 
483     std::lock_guard<std::mutex> stateLock(stateMutex_);
484     auto& info = bundleInfos_.at(bundleName);
485     info.RemoveInnerBundleUserInfo(userId);
486     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
487     if (!dataStorage_->SaveStorageBundleInfo(info)) {
488         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
489         return false;
490     }
491 
492     bundleStateStorage_->DeleteBundleState(bundleName, userId);
493     return true;
494 }
495 
UpdateInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)496 bool BundleDataMgr::UpdateInnerBundleInfo(
497     const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
498 {
499     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
500     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
501     auto infoItem = bundleInfos_.find(bundleName);
502     if (infoItem == bundleInfos_.end()) {
503         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
504         return false;
505     }
506     std::lock_guard<std::mutex> stateLock(stateMutex_);
507     auto statusItem = installStates_.find(bundleName);
508     if (statusItem == installStates_.end()) {
509         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
510         return false;
511     }
512     // ROLL_BACK and USER_CHANGE should not be here
513     if (statusItem->second == InstallState::UPDATING_SUCCESS
514         || statusItem->second == InstallState::ROLL_BACK
515         || statusItem->second == InstallState::USER_CHANGE) {
516         APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
517             bundleName.c_str(), newInfo.GetCurrentModulePackage().c_str());
518         bool needAppDetail = oldInfo.GetBaseApplicationInfo().needAppDetail;
519         if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
520             oldInfo.KeepOldOverlayConnection(newInfo);
521         }
522         oldInfo.UpdateModuleInfo(newInfo);
523         if (newInfo.GetAsanEnabled()) {
524             oldInfo.SetAsanEnabled(true);
525         }
526         if (newInfo.GetGwpAsanEnabled()) {
527             oldInfo.SetGwpAsanEnabled(true);
528         }
529         if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
530             oldInfo.SetAsanEnabled(newInfo.GetAsanEnabled());
531             oldInfo.SetGwpAsanEnabled(newInfo.GetGwpAsanEnabled());
532         }
533         // 1.exist entry, update entry.
534         // 2.only exist feature, update feature.
535         if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
536             oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
537             oldInfo.UpdateBaseApplicationInfo(
538                 newInfo.GetBaseApplicationInfo(), newInfo.HasEntry());
539             oldInfo.UpdateRemovable(
540                 newInfo.GetIsPreInstallApp(), newInfo.GetRemovable());
541             oldInfo.SetAppType(newInfo.GetAppType());
542             oldInfo.SetAppFeature(newInfo.GetAppFeature());
543         }
544         oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
545         if (oldInfo.GetOldAppIds().empty()) {
546             oldInfo.AddOldAppId(oldInfo.GetAppId());
547         }
548         oldInfo.AddOldAppId(newInfo.GetAppId());
549         oldInfo.SetProvisionId(newInfo.GetProvisionId());
550         oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
551         oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
552         oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
553         oldInfo.UpdateAppDetailAbilityAttrs();
554         oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
555         if (!needAppDetail && oldInfo.GetBaseApplicationInfo().needAppDetail) {
556             AddAppDetailAbilityInfo(oldInfo);
557         }
558         oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
559         oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
560         oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
561         oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
562         oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
563         // clear apply quick fix frequency
564         oldInfo.ResetApplyQuickFixFrequency();
565         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
566         oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
567         oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
568 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
569         if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
570             if (!UpdateOverlayInfo(newInfo, oldInfo)) {
571                 APP_LOGD("update overlay info failed");
572                 return false;
573             }
574         }
575 
576         if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
577             APP_LOGD("update overlay info failed");
578             return false;
579         }
580 #endif
581         if (!dataStorage_->SaveStorageBundleInfo(oldInfo)) {
582             APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
583             return false;
584         }
585         APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
586         bundleInfos_.at(bundleName) = oldInfo;
587         return true;
588     }
589     return false;
590 }
591 
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const592 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
593     int32_t appIndex) const
594 {
595     int32_t requestUserId = GetUserId(userId);
596     if (requestUserId == Constants::INVALID_USERID) {
597         return false;
598     }
599 
600     ElementName element = want.GetElement();
601     std::string bundleName = element.GetBundleName();
602     std::string abilityName = element.GetAbilityName();
603     APP_LOGD("QueryAbilityInfo bundle name:%{public}s, ability name:%{public}s",
604         bundleName.c_str(), abilityName.c_str());
605     // explicit query
606     if (!bundleName.empty() && !abilityName.empty()) {
607         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
608         if (!ret) {
609             APP_LOGD("explicit queryAbilityInfo error, bundleName: %{public}s, abilityName: %{public}s",
610                 bundleName.c_str(), abilityName.c_str());
611             return false;
612         }
613         return true;
614     }
615     std::vector<AbilityInfo> abilityInfos;
616     bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
617     if (!ret) {
618         APP_LOGD("implicit queryAbilityInfos error. action:%{public}s, uri:%{private}s, type:%{public}s",
619             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
620         return false;
621     }
622     if (abilityInfos.size() == 0) {
623         APP_LOGW("no matching abilityInfo. action:%{public}s, uri:%{private}s, type:%{public}s",
624             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
625         return false;
626     }
627     abilityInfo = abilityInfos[0];
628     return true;
629 }
630 
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const631 bool BundleDataMgr::QueryAbilityInfos(
632     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
633 {
634     int32_t requestUserId = GetUserId(userId);
635     if (requestUserId == Constants::INVALID_USERID) {
636         return false;
637     }
638 
639     ElementName element = want.GetElement();
640     std::string bundleName = element.GetBundleName();
641     std::string abilityName = element.GetAbilityName();
642     APP_LOGD("QueryAbilityInfos bundle name:%{public}s, ability name:%{public}s",
643         bundleName.c_str(), abilityName.c_str());
644     // explicit query
645     if (!bundleName.empty() && !abilityName.empty()) {
646         AbilityInfo abilityInfo;
647         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
648         if (!ret) {
649             APP_LOGD("explicit queryAbilityInfo error, bundleName:%{public}s, abilityName:%{public}s",
650                 bundleName.c_str(), abilityName.c_str());
651             return false;
652         }
653         abilityInfos.emplace_back(abilityInfo);
654         return true;
655     }
656     // implicit query
657     bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
658     if (!ret) {
659         APP_LOGD("implicit queryAbilityInfos error. action:%{public}s, uri:%{private}s, type:%{public}s",
660             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
661         return false;
662     }
663     if (abilityInfos.size() == 0) {
664         APP_LOGW("no matching abilityInfo. action:%{public}s, uri:%{private}s, type:%{public}s",
665             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
666         return false;
667     }
668     return true;
669 }
670 
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const671 ErrCode BundleDataMgr::QueryAbilityInfosV9(
672     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
673 {
674     int32_t requestUserId = GetUserId(userId);
675     if (requestUserId == Constants::INVALID_USERID) {
676         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
677     }
678 
679     ElementName element = want.GetElement();
680     std::string bundleName = element.GetBundleName();
681     std::string abilityName = element.GetAbilityName();
682     APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
683         bundleName.c_str(), abilityName.c_str());
684     // explicit query
685     if (!bundleName.empty() && !abilityName.empty()) {
686         AbilityInfo abilityInfo;
687         ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
688         if (ret != ERR_OK) {
689             APP_LOGD("explicit queryAbilityInfoV9 error bundleName:%{public}s, abilityName:%{public}s",
690                 bundleName.c_str(), abilityName.c_str());
691             return ret;
692         }
693         abilityInfos.emplace_back(abilityInfo);
694         return ERR_OK;
695     }
696     // implicit query
697     ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
698     if (ret != ERR_OK) {
699         APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
700             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
701         return ret;
702     }
703     if (abilityInfos.empty()) {
704         APP_LOGW("no matching abilityInfo. action:%{public}s, uri:%{private}s, type:%{public}s",
705             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
706         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
707     }
708     return ERR_OK;
709 }
710 
ExplicitQueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const711 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
712     AbilityInfo &abilityInfo, int32_t appIndex) const
713 {
714     ElementName element = want.GetElement();
715     std::string bundleName = element.GetBundleName();
716     std::string abilityName = element.GetAbilityName();
717     std::string moduleName = element.GetModuleName();
718     APP_LOGD("ExplicitQueryAbilityInfo bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
719         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
720     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
721 
722     int32_t requestUserId = GetUserId(userId);
723     if (requestUserId == Constants::INVALID_USERID) {
724         return false;
725     }
726 
727     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
728     InnerBundleInfo innerBundleInfo;
729     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
730         APP_LOGD("ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
731         return false;
732     }
733     // explict query from sandbox manager
734     if (appIndex > 0) {
735         if (sandboxAppHelper_ == nullptr) {
736             APP_LOGW("sandboxAppHelper_ is nullptr");
737             return false;
738         }
739         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
740         if (ret != ERR_OK) {
741             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
742                 ret, bundleName.c_str());
743             return false;
744         }
745     }
746 
747     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
748     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
749     if (!ability) {
750         APP_LOGE("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
751             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
752         return false;
753     }
754     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
755 }
756 
ExplicitQueryAbilityInfoV9(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const757 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
758     AbilityInfo &abilityInfo, int32_t appIndex) const
759 {
760     ElementName element = want.GetElement();
761     std::string bundleName = element.GetBundleName();
762     std::string abilityName = element.GetAbilityName();
763     std::string moduleName = element.GetModuleName();
764     APP_LOGD("ExplicitQueryAbilityInfoV9 bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
765         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
766     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
767     int32_t requestUserId = GetUserId(userId);
768     if (requestUserId == Constants::INVALID_USERID) {
769         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
770     }
771     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
772     InnerBundleInfo innerBundleInfo;
773     if (appIndex == 0) {
774         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
775         if (ret != ERR_OK) {
776             APP_LOGD("ExplicitQueryAbilityInfoV9 failed, bundleName:%{public}s", bundleName.c_str());
777             return ret;
778         }
779     }
780     // explict query from sandbox manager
781     if (appIndex > 0) {
782         if (sandboxAppHelper_ == nullptr) {
783             APP_LOGW("sandboxAppHelper_ is nullptr");
784             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
785         }
786         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
787         if (ret != ERR_OK) {
788             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
789                 ret, bundleName.c_str());
790             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
791         }
792     }
793 
794     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
795     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
796     if (!ability) {
797         APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
798             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
799         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
800     }
801 
802     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
803 }
804 
FilterAbilityInfosByModuleName(const std::string & moduleName,std::vector<AbilityInfo> & abilityInfos) const805 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
806     std::vector<AbilityInfo> &abilityInfos) const
807 {
808     APP_LOGD("BundleDataMgr::FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
809     if (moduleName.empty()) {
810         return;
811     }
812     for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
813         if (iter->moduleName != moduleName) {
814             iter = abilityInfos.erase(iter);
815         } else {
816             ++iter;
817         }
818     }
819 }
820 
ImplicitQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const821 bool BundleDataMgr::ImplicitQueryAbilityInfos(
822     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
823 {
824     int32_t requestUserId = GetUserId(userId);
825     if (requestUserId == Constants::INVALID_USERID) {
826         return false;
827     }
828 
829     if (want.GetAction().empty() && want.GetEntities().empty()
830         && want.GetUriString().empty() && want.GetType().empty()) {
831         APP_LOGE("param invalid");
832         return false;
833     }
834     APP_LOGD("action:%{public}s, uri:%{private}s, type:%{public}s",
835         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
836     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
837     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
838     if (bundleInfos_.empty()) {
839         APP_LOGW("bundleInfos_ is empty");
840         return false;
841     }
842     std::string bundleName = want.GetElement().GetBundleName();
843     if (!bundleName.empty()) {
844         // query in current bundleName
845         if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
846             APP_LOGD("ImplicitQueryCurAbilityInfos failed, bundleName: %{public}s", bundleName.c_str());
847             return false;
848         }
849     } else {
850         // query all
851         ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
852     }
853     // sort by priority, descending order.
854     if (abilityInfos.size() > 1) {
855         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
856             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
857     }
858     return true;
859 }
860 
ImplicitQueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const861 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
862     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
863 {
864     int32_t requestUserId = GetUserId(userId);
865     if (requestUserId == Constants::INVALID_USERID) {
866         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
867     }
868 
869     if (want.GetAction().empty() && want.GetEntities().empty()
870         && want.GetUriString().empty() && want.GetType().empty()) {
871         APP_LOGE("param invalid");
872         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
873     }
874     APP_LOGD("action:%{public}s, uri:%{private}s, type:%{public}s",
875         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
876     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
877     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
878     if (bundleInfos_.empty()) {
879         APP_LOGW("bundleInfos_ is empty");
880         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
881     }
882     std::string bundleName = want.GetElement().GetBundleName();
883     if (!bundleName.empty()) {
884         // query in current bundleName
885         ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
886         if (ret != ERR_OK) {
887             APP_LOGD("ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s", bundleName.c_str());
888             return ret;
889         }
890     } else {
891         // query all
892         ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
893     }
894     // sort by priority, descending order.
895     if (abilityInfos.size() > 1) {
896         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
897             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
898     }
899     return ERR_OK;
900 }
901 
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info) const902 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
903     const InnerBundleInfo &innerBundleInfo, AbilityInfo &info) const
904 {
905     APP_LOGD("begin to QueryAbilityInfoWithFlags.");
906     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
907         !innerBundleInfo.IsSystemApp()) {
908         APP_LOGW("no system app ability info for this calling");
909         return false;
910     }
911     if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
912         if (!innerBundleInfo.IsAbilityEnabled((*option), userId)) {
913             APP_LOGW("bundleName:%{public}s, ability:%{public}s is disabled", option->bundleName.c_str(),
914                 option->name.c_str());
915             return false;
916         }
917     }
918     info = (*option);
919     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
920         info.permissions.clear();
921     }
922     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
923         info.metaData.customizeData.clear();
924         info.metadata.clear();
925     }
926     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
927         innerBundleInfo.GetApplicationInfo(
928             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
929     }
930     // set uid for NAPI cache use
931     InnerBundleUserInfo innerBundleUserInfo;
932     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
933         info.uid = innerBundleUserInfo.uid;
934     }
935     return true;
936 }
937 
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info) const938 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
939     int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info) const
940 {
941     APP_LOGD("begin to QueryAbilityInfoWithFlagsV9.");
942     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
943         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
944         !innerBundleInfo.IsSystemApp()) {
945         APP_LOGW("target not system app");
946         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
947     }
948     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
949         if (!innerBundleInfo.IsAbilityEnabled((*option), userId)) {
950             APP_LOGW("bundleName:%{public}s, ability:%{public}s is disabled", option->bundleName.c_str(),
951                 option->name.c_str());
952             return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
953         }
954     }
955     info = (*option);
956     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
957         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
958         info.permissions.clear();
959     }
960     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
961         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
962         info.metaData.customizeData.clear();
963         info.metadata.clear();
964     }
965     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
966         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
967         innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
968             userId, info.applicationInfo);
969     }
970     // set uid for NAPI cache use
971     InnerBundleUserInfo innerBundleUserInfo;
972     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
973         info.uid = innerBundleUserInfo.uid;
974     }
975     return ERR_OK;
976 }
977 
ImplicitQueryCurAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const978 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
979     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
980 {
981     APP_LOGD("begin to ImplicitQueryCurAbilityInfos.");
982     std::string bundleName = want.GetElement().GetBundleName();
983     InnerBundleInfo innerBundleInfo;
984     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
985         APP_LOGW("ImplicitQueryCurAbilityInfos failed, bundleName:%{public}s", bundleName.c_str());
986         return false;
987     }
988     if (appIndex > 0) {
989         if (sandboxAppHelper_ == nullptr) {
990             APP_LOGW("sandboxAppHelper_ is nullptr");
991             return false;
992         }
993         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
994         if (ret != ERR_OK) {
995             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName: %{public}s",
996                 ret, bundleName.c_str());
997             return false;
998         }
999     }
1000     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1001     GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos);
1002     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1003     return true;
1004 }
1005 
ImplicitQueryCurAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1006 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1007     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1008 {
1009     APP_LOGD("begin to ImplicitQueryCurAbilityInfosV9.");
1010     std::string bundleName = want.GetElement().GetBundleName();
1011     InnerBundleInfo innerBundleInfo;
1012     if (appIndex == 0) {
1013         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1014         if (ret != ERR_OK) {
1015             APP_LOGD("ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s", bundleName.c_str());
1016             return ret;
1017         }
1018     }
1019     if (appIndex > 0) {
1020         if (sandboxAppHelper_ == nullptr) {
1021             APP_LOGW("sandboxAppHelper_ is nullptr");
1022             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1023         }
1024         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1025         if (ret != ERR_OK) {
1026             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
1027                 ret, bundleName.c_str());
1028             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1029         }
1030     }
1031     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1032     GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos);
1033     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1034     return ERR_OK;
1035 }
1036 
ImplicitQueryAllAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1037 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1038     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1039 {
1040     APP_LOGD("begin to ImplicitQueryAllAbilityInfos.");
1041     int32_t requestUserId = GetUserId(userId);
1042     if (requestUserId == Constants::INVALID_USERID) {
1043         APP_LOGW("invalid userId");
1044         return;
1045     }
1046 
1047     // query from bundleInfos_
1048     if (appIndex == 0) {
1049         for (const auto &item : bundleInfos_) {
1050             const InnerBundleInfo &innerBundleInfo = item.second;
1051             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1052             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1053                 APP_LOGD("ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1054                     innerBundleInfo.GetBundleName().c_str(), responseUserId);
1055                 continue;
1056             }
1057 
1058             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos);
1059         }
1060     } else {
1061         // query from sandbox manager for sandbox bundle
1062         if (sandboxAppHelper_ == nullptr) {
1063             APP_LOGW("sandboxAppHelper_ is nullptr");
1064             return;
1065         }
1066         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1067         for (const auto &item : sandboxMap) {
1068             InnerBundleInfo info;
1069             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1070             if (pos == std::string::npos) {
1071                 APP_LOGD("sandbox map contains invalid element");
1072                 continue;
1073             }
1074             std::string innerBundleName = item.first.substr(pos + 1);
1075             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1076                 APP_LOGD("obtain innerBundleInfo of sandbox app failed");
1077                 continue;
1078             }
1079 
1080             int32_t responseUserId = info.GetResponseUserId(userId);
1081             GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos);
1082         }
1083     }
1084     APP_LOGD("finish to ImplicitQueryAllAbilityInfos.");
1085 }
1086 
ImplicitQueryAllAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1087 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1088     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1089 {
1090     APP_LOGD("begin to ImplicitQueryAllAbilityInfosV9.");
1091     // query from bundleInfos_
1092     if (appIndex == 0) {
1093         for (const auto &item : bundleInfos_) {
1094             InnerBundleInfo innerBundleInfo;
1095             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
1096             if (ret != ERR_OK) {
1097                 APP_LOGW("ImplicitQueryAllAbilityInfosV9 failed, bundleName:%{public}s", item.first.c_str());
1098                 continue;
1099             }
1100 
1101             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1102             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos);
1103         }
1104     } else {
1105         // query from sandbox manager for sandbox bundle
1106         if (sandboxAppHelper_ == nullptr) {
1107             APP_LOGW("sandboxAppHelper_ is nullptr");
1108             return;
1109         }
1110         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1111         for (const auto &item : sandboxMap) {
1112             InnerBundleInfo info;
1113             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1114             if (pos == std::string::npos) {
1115                 APP_LOGW("sandbox map contains invalid element");
1116                 continue;
1117             }
1118             std::string innerBundleName = item.first.substr(pos + 1);
1119             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1120                 APP_LOGD("obtain innerBundleInfo of sandbox app failed");
1121                 continue;
1122             }
1123 
1124             int32_t responseUserId = info.GetResponseUserId(userId);
1125             GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos);
1126         }
1127     }
1128     APP_LOGD("finish to ImplicitQueryAllAbilityInfosV9.");
1129 }
1130 
GetMatchAbilityInfos(const Want & want,int32_t flags,const InnerBundleInfo & info,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1131 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags,
1132     const InnerBundleInfo &info, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1133 {
1134     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1135         !info.IsSystemApp()) {
1136         return;
1137     }
1138     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1139     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1140         bool isPrivateType = MatchPrivateType(
1141             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes);
1142         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1143         if (skillsPair == skillInfos.end()) {
1144             continue;
1145         }
1146         for (const Skill &skill : skillsPair->second) {
1147             if (isPrivateType || skill.Match(want)) {
1148                 AbilityInfo abilityinfo = abilityInfoPair.second;
1149                 AddAbilitySkillUrisInfo(flags, skill, abilityinfo);
1150                 if (abilityinfo.name == Constants::APP_DETAIL_ABILITY) {
1151                     continue;
1152                 }
1153                 if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1154                     if (!info.IsAbilityEnabled(abilityinfo, GetUserId(userId))) {
1155                         APP_LOGW("GetMatchAbilityInfos %{public}s is disabled", abilityinfo.name.c_str());
1156                         continue;
1157                     }
1158                 }
1159                 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) ==
1160                     GET_ABILITY_INFO_WITH_APPLICATION) {
1161                     info.GetApplicationInfo(
1162                         ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
1163                         abilityinfo.applicationInfo);
1164                 }
1165                 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) !=
1166                     GET_ABILITY_INFO_WITH_PERMISSION) {
1167                     abilityinfo.permissions.clear();
1168                 }
1169                 if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1170                     abilityinfo.metaData.customizeData.clear();
1171                     abilityinfo.metadata.clear();
1172                 }
1173                 abilityInfos.emplace_back(abilityinfo);
1174                 break;
1175             }
1176         }
1177     }
1178 }
1179 
AddAbilitySkillUrisInfo(int32_t flags,const Skill & skill,AbilityInfo & abilityInfo) const1180 void BundleDataMgr::AddAbilitySkillUrisInfo(int32_t flags, const Skill &skill, AbilityInfo &abilityInfo) const
1181 {
1182     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL_URI) == GET_ABILITY_INFO_WITH_SKILL_URI) {
1183         std::vector<SkillUriForAbilityAndExtension> skillUriTmp;
1184         for (const SkillUri &uri : skill.uris) {
1185             SkillUriForAbilityAndExtension skillinfo;
1186             skillinfo.scheme = uri.scheme;
1187             skillinfo.host = uri.host;
1188             skillinfo.port = uri.port;
1189             skillinfo.path = uri.path;
1190             skillinfo.pathStartWith = uri.pathStartWith;
1191             skillinfo.pathRegex = uri.pathRegex;
1192             skillinfo.type = uri.type;
1193             skillinfo.utd = uri.utd;
1194             skillinfo.maxFileSupported = uri.maxFileSupported;
1195             skillUriTmp.emplace_back(skillinfo);
1196         }
1197         abilityInfo.skillUri = skillUriTmp;
1198     }
1199 }
1200 
EmplaceAbilityInfo(const InnerBundleInfo & info,AbilityInfo & abilityInfo,int32_t flags,int32_t userId,std::vector<AbilityInfo> & infos) const1201 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, AbilityInfo &abilityInfo,
1202     int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos) const
1203 {
1204     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1205         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1206         if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId))) {
1207             APP_LOGW("GetMatchAbilityInfos %{public}s is disabled", abilityInfo.name.c_str());
1208             return;
1209         }
1210     }
1211     if ((static_cast<uint32_t>(flags) &
1212         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1213         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1214         info.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1215             userId, abilityInfo.applicationInfo);
1216     }
1217     if ((static_cast<uint32_t>(flags) &
1218         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1219         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1220         abilityInfo.permissions.clear();
1221     }
1222     if ((static_cast<uint32_t>(flags) &
1223         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1224         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1225         abilityInfo.metaData.customizeData.clear();
1226         abilityInfo.metadata.clear();
1227     }
1228     infos.emplace_back(abilityInfo);
1229 }
1230 
GetMatchAbilityInfosV9(const Want & want,int32_t flags,const InnerBundleInfo & info,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1231 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags,
1232     const InnerBundleInfo &info, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1233 {
1234     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1235         static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1236         APP_LOGW("target not system app");
1237         return;
1238     }
1239     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1240     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1241         AbilityInfo abilityinfo = abilityInfoPair.second;
1242         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1243         if (skillsPair == skillInfos.end()) {
1244             continue;
1245         }
1246         bool isPrivateType = MatchPrivateType(
1247             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes);
1248         if (isPrivateType) {
1249             EmplaceAbilityInfo(info, abilityinfo, flags, userId, abilityInfos);
1250             continue;
1251         }
1252         if (want.GetAction() == SHARE_ACTION) {
1253             if (!MatchShare(want, skillsPair->second)) {
1254                 continue;
1255             }
1256             EmplaceAbilityInfo(info, abilityinfo, flags, userId, abilityInfos);
1257             continue;
1258         }
1259         for (const Skill &skill : skillsPair->second) {
1260             if (skill.Match(want)) {
1261                 if (abilityinfo.name == Constants::APP_DETAIL_ABILITY) {
1262                     continue;
1263                 }
1264                 EmplaceAbilityInfo(info, abilityinfo, flags, userId, abilityInfos);
1265                 break;
1266             }
1267         }
1268     }
1269 }
1270 
MatchShare(const Want & want,const std::vector<Skill> & skills) const1271 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1272 {
1273     if (want.GetAction() != SHARE_ACTION) {
1274         return false;
1275     }
1276     auto wantParams = want.GetParams();
1277     auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1278     int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1279     if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1280         APP_LOGW("Invalid total count");
1281     }
1282     auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1283     auto utds = shareSummary.KeySet();
1284     for (const auto &utd : utds) {
1285         int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1286         if (count <= DEFAULT_SUMMARY_COUNT) {
1287             APP_LOGW("invalid utd count");
1288             return false;
1289         }
1290         bool match = false;
1291         for (const auto &skill : skills) {
1292             auto &actions = skill.actions;
1293             auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1294                 return SHARE_ACTION == action;
1295             });
1296             if (matchAction == actions.end()) {
1297                 continue;
1298             }
1299             if (skill.MatchUtd(utd, count)) {
1300                 match = true;
1301                 break;
1302             }
1303         }
1304         if (!match) {
1305             APP_LOGD("match failed");
1306             return false;
1307         }
1308     }
1309     return true;
1310 }
1311 
ModifyLauncherAbilityInfo(bool isStage,AbilityInfo & abilityInfo) const1312 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1313 {
1314     if (abilityInfo.labelId == 0) {
1315         if (isStage) {
1316             abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1317             abilityInfo.label = abilityInfo.applicationInfo.label;
1318         } else {
1319             abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1320             abilityInfo.label = abilityInfo.bundleName;
1321         }
1322     }
1323 
1324     if (abilityInfo.iconId == 0) {
1325         if (isStage) {
1326             abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1327         } else {
1328             auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
1329             if (iter != bundleInfos_.end()) {
1330                 abilityInfo.iconId = iter->second.GetBaseApplicationInfo().iconId;
1331             }
1332         }
1333     }
1334 }
1335 
GetMatchLauncherAbilityInfos(const Want & want,const InnerBundleInfo & info,std::vector<AbilityInfo> & abilityInfos,int64_t installTime,int32_t userId) const1336 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1337     const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1338     int64_t installTime, int32_t userId) const
1339 {
1340     int32_t requestUserId = GetUserId(userId);
1341     if (requestUserId == Constants::INVALID_USERID) {
1342         return;
1343     }
1344     int32_t responseUserId = info.GetResponseUserId(requestUserId);
1345     if (responseUserId == Constants::INVALID_USERID) {
1346         return;
1347     }
1348     bool isExist = false;
1349     bool isStage = info.GetIsNewVersion();
1350     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1351     for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
1352         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1353         if (skillsPair == skillInfos.end()) {
1354             continue;
1355         }
1356         for (const Skill& skill : skillsPair->second) {
1357             if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
1358                 isExist = true;
1359                 AbilityInfo abilityinfo = abilityInfoPair.second;
1360                 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1361                     responseUserId, abilityinfo.applicationInfo);
1362                 abilityinfo.installTime = installTime;
1363                 // fix labelId or iconId is equal 0
1364                 ModifyLauncherAbilityInfo(isStage, abilityinfo);
1365                 abilityInfos.emplace_back(abilityinfo);
1366                 break;
1367             }
1368         }
1369     }
1370     // add app detail ability
1371     if (!isExist && info.GetBaseApplicationInfo().needAppDetail) {
1372         APP_LOGD("bundleName: %{public}s add detail ability info.", info.GetBundleName().c_str());
1373         std::string moduleName = "";
1374         auto ability = info.FindAbilityInfo(moduleName, Constants::APP_DETAIL_ABILITY, responseUserId);
1375         if (!ability) {
1376             APP_LOGD("bundleName: %{public}s can not find app detail ability.", info.GetBundleName().c_str());
1377             return;
1378         }
1379         if (!info.GetIsNewVersion()) {
1380             ability->applicationInfo.label = info.GetBundleName();
1381         }
1382         ability->installTime = installTime;
1383         abilityInfos.emplace_back(*ability);
1384     }
1385 }
1386 
AddAppDetailAbilityInfo(InnerBundleInfo & info) const1387 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
1388 {
1389     AbilityInfo appDetailAbility;
1390     appDetailAbility.name = Constants::APP_DETAIL_ABILITY;
1391     appDetailAbility.bundleName = info.GetBundleName();
1392     std::vector<std::string> moduleNameVec;
1393     info.GetModuleNames(moduleNameVec);
1394     if (!moduleNameVec.empty()) {
1395         appDetailAbility.moduleName = moduleNameVec[0];
1396     } else {
1397         APP_LOGD("AddAppDetailAbilityInfo error: %{public}s has no module.", appDetailAbility.bundleName.c_str());
1398     }
1399     appDetailAbility.enabled = true;
1400     appDetailAbility.type = AbilityType::PAGE;
1401     appDetailAbility.package = info.GetCurrentModulePackage();
1402     appDetailAbility.isNativeAbility = true;
1403 
1404     ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
1405     appDetailAbility.applicationName = applicationInfo.name;
1406     appDetailAbility.labelId = applicationInfo.labelId;
1407     if (!info.GetIsNewVersion()) {
1408         appDetailAbility.labelId = 0;
1409         appDetailAbility.label = info.GetBundleName();
1410     }
1411     appDetailAbility.iconId = applicationInfo.iconId;
1412     if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
1413         APP_LOGD("AddAppDetailAbilityInfo appDetailAbility.iconId is 0.");
1414         // get system resource icon Id
1415         auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
1416         if (iter != bundleInfos_.end()) {
1417             APP_LOGD("AddAppDetailAbilityInfo get system resource iconId");
1418             appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
1419         } else {
1420             APP_LOGW("AddAppDetailAbilityInfo error: ohos.global.systemres does not exist.");
1421         }
1422     }
1423     // not show in the mission list
1424     appDetailAbility.removeMissionAfterTerminate = true;
1425     // set hapPath, for label resource
1426     auto hapModuleInfo = info.FindHapModuleInfo(appDetailAbility.package);
1427     if (hapModuleInfo) {
1428         appDetailAbility.hapPath = hapModuleInfo->hapPath;
1429     }
1430 
1431     std::string keyName;
1432     keyName.append(appDetailAbility.bundleName).append(".")
1433         .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
1434     info.InsertAbilitiesInfo(keyName, appDetailAbility);
1435 }
1436 
GetAllLauncherAbility(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const1437 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
1438     const int32_t userId, const int32_t requestUserId) const
1439 {
1440     for (const auto &item : bundleInfos_) {
1441         const InnerBundleInfo &info = item.second;
1442         if (info.IsDisabled()) {
1443             APP_LOGW("app %{public}s is disabled", info.GetBundleName().c_str());
1444             continue;
1445         }
1446         if (info.GetBaseApplicationInfo().hideDesktopIcon) {
1447             APP_LOGD("Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
1448             continue;
1449         }
1450         if (info.GetBaseBundleInfo().entryInstallationFree) {
1451             APP_LOGD("Bundle(%{public}s) is atomic service, hide desktop icon", info.GetBundleName().c_str());
1452             continue;
1453         }
1454 
1455         // get installTime from innerBundleUserInfo
1456         int64_t installTime = 0;
1457         std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
1458         std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
1459         auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
1460             [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
1461             return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
1462         });
1463         if (iter != info.GetInnerBundleUserInfos().end()) {
1464             installTime = iter->second.installTime;
1465         }
1466         GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
1467     }
1468 }
1469 
GetLauncherAbilityByBundleName(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const1470 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
1471     const int32_t userId, const int32_t requestUserId) const
1472 {
1473     ElementName element = want.GetElement();
1474     std::string bundleName = element.GetBundleName();
1475     const auto &item = bundleInfos_.find(bundleName);
1476     if (item == bundleInfos_.end()) {
1477         APP_LOGW("no bundleName %{public}s found", bundleName.c_str());
1478         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1479     }
1480     const InnerBundleInfo &info = item->second;
1481     if (info.IsDisabled()) {
1482         APP_LOGW("app %{public}s is disabled", info.GetBundleName().c_str());
1483         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
1484     }
1485     if (info.GetBaseApplicationInfo().hideDesktopIcon) {
1486         APP_LOGD("Bundle(%{public}s) hide desktop icon", bundleName.c_str());
1487         return ERR_OK;
1488     }
1489     if (info.GetBaseBundleInfo().entryInstallationFree) {
1490         APP_LOGD("Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
1491         return ERR_OK;
1492     }
1493     // get installTime from innerBundleUserInfo
1494     int64_t installTime = 0;
1495     std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
1496     std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
1497     auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
1498         [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
1499         return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
1500     });
1501     if (iter != info.GetInnerBundleUserInfos().end()) {
1502         installTime = iter->second.installTime;
1503     }
1504     GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
1505     FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
1506     return ERR_OK;
1507 }
1508 
QueryLauncherAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1509 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
1510     const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1511 {
1512     int32_t requestUserId = GetUserId(userId);
1513     if (requestUserId == Constants::INVALID_USERID) {
1514         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1515     }
1516     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1517     if (bundleInfos_.empty()) {
1518         APP_LOGW("bundleInfos_ is empty");
1519         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1520     }
1521 
1522     ElementName element = want.GetElement();
1523     std::string bundleName = element.GetBundleName();
1524     if (bundleName.empty()) {
1525         // query all launcher ability
1526         GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
1527         return ERR_OK;
1528     }
1529     // query definite abilities by bundle name
1530     ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
1531     if (ret == ERR_OK) {
1532         APP_LOGD("ability infos have been found");
1533     }
1534     return ret;
1535 }
1536 
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo) const1537 bool BundleDataMgr::QueryAbilityInfoByUri(
1538     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
1539 {
1540     APP_LOGD("abilityUri is %{private}s", abilityUri.c_str());
1541     int32_t requestUserId = GetUserId(userId);
1542     if (requestUserId == Constants::INVALID_USERID) {
1543         return false;
1544     }
1545 
1546     if (abilityUri.empty()) {
1547         return false;
1548     }
1549     if (abilityUri.find(Constants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
1550         return false;
1551     }
1552     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1553     if (bundleInfos_.empty()) {
1554         APP_LOGW("bundleInfos_ data is empty");
1555         return false;
1556     }
1557     std::string noPpefixUri = abilityUri.substr(strlen(Constants::DATA_ABILITY_URI_PREFIX));
1558     auto posFirstSeparator = noPpefixUri.find(Constants::DATA_ABILITY_URI_SEPARATOR);
1559     if (posFirstSeparator == std::string::npos) {
1560         return false;
1561     }
1562     auto posSecondSeparator = noPpefixUri.find(Constants::DATA_ABILITY_URI_SEPARATOR, posFirstSeparator + 1);
1563     std::string uri;
1564     if (posSecondSeparator == std::string::npos) {
1565         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
1566     } else {
1567         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
1568     }
1569     for (const auto &item : bundleInfos_) {
1570         const InnerBundleInfo &info = item.second;
1571         if (info.IsDisabled()) {
1572             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
1573             continue;
1574         }
1575 
1576         int32_t responseUserId = info.GetResponseUserId(requestUserId);
1577         if (!info.GetApplicationEnabled(responseUserId)) {
1578             continue;
1579         }
1580 
1581         auto ability = info.FindAbilityInfoByUri(uri);
1582         if (!ability) {
1583             continue;
1584         }
1585 
1586         abilityInfo = (*ability);
1587         info.GetApplicationInfo(
1588             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
1589             abilityInfo.applicationInfo);
1590         return true;
1591     }
1592 
1593     APP_LOGW("query abilityUri(%{private}s) failed.", abilityUri.c_str());
1594     return false;
1595 }
1596 
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)1597 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
1598 {
1599     APP_LOGD("abilityUri is %{private}s", abilityUri.c_str());
1600     if (abilityUri.empty()) {
1601         return false;
1602     }
1603     if (abilityUri.find(Constants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
1604         return false;
1605     }
1606     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1607     if (bundleInfos_.empty()) {
1608         APP_LOGW("bundleInfos_ data is empty");
1609         return false;
1610     }
1611     std::string noPpefixUri = abilityUri.substr(strlen(Constants::DATA_ABILITY_URI_PREFIX));
1612     auto posFirstSeparator = noPpefixUri.find(Constants::DATA_ABILITY_URI_SEPARATOR);
1613     if (posFirstSeparator == std::string::npos) {
1614         return false;
1615     }
1616     auto posSecondSeparator = noPpefixUri.find(Constants::DATA_ABILITY_URI_SEPARATOR, posFirstSeparator + 1);
1617     std::string uri;
1618     if (posSecondSeparator == std::string::npos) {
1619         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
1620     } else {
1621         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
1622     }
1623 
1624     for (auto &item : bundleInfos_) {
1625         InnerBundleInfo &info = item.second;
1626         if (info.IsDisabled()) {
1627             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
1628             continue;
1629         }
1630         info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
1631     }
1632     if (abilityInfos.size() == 0) {
1633         return false;
1634     }
1635 
1636     return true;
1637 }
1638 
GetApplicationInfo(const std::string & appName,int32_t flags,const int userId,ApplicationInfo & appInfo) const1639 bool BundleDataMgr::GetApplicationInfo(
1640     const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
1641 {
1642     int32_t requestUserId = GetUserId(userId);
1643     if (requestUserId == Constants::INVALID_USERID) {
1644         return false;
1645     }
1646 
1647     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1648     InnerBundleInfo innerBundleInfo;
1649     if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
1650         APP_LOGD("GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
1651         return false;
1652     }
1653 
1654     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1655     innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
1656     return true;
1657 }
1658 
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo) const1659 ErrCode BundleDataMgr::GetApplicationInfoV9(
1660     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo) const
1661 {
1662     int32_t requestUserId = GetUserId(userId);
1663     if (requestUserId == Constants::INVALID_USERID) {
1664         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1665     }
1666 
1667     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1668     InnerBundleInfo innerBundleInfo;
1669     int32_t flag = 0;
1670     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
1671         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
1672         flag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
1673     }
1674     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
1675     if (ret != ERR_OK) {
1676         APP_LOGE("GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
1677             appName.c_str(), requestUserId);
1678         return ret;
1679     }
1680 
1681     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1682     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
1683     if (ret != ERR_OK) {
1684         APP_LOGE("GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
1685             appName.c_str(), responseUserId);
1686         return ret;
1687     }
1688     return ret;
1689 }
1690 
GetApplicationInfoWithResponseId(const std::string & appName,int32_t flags,int32_t & userId,ApplicationInfo & appInfo) const1691 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
1692     const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
1693 {
1694     int32_t requestUserId = GetUserId(userId);
1695     if (requestUserId == Constants::INVALID_USERID) {
1696         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1697     }
1698 
1699     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1700     InnerBundleInfo innerBundleInfo;
1701     int32_t flag = 0;
1702     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
1703         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
1704         flag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
1705     }
1706     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
1707     if (ret != ERR_OK) {
1708         APP_LOGD("GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
1709             appName.c_str(), requestUserId);
1710         return ret;
1711     }
1712 
1713     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1714     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
1715     if (ret != ERR_OK) {
1716         APP_LOGD("GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
1717             appName.c_str(), responseUserId);
1718         return ret;
1719     }
1720     userId = responseUserId;
1721     return ret;
1722 }
1723 
GetApplicationInfos(int32_t flags,const int userId,std::vector<ApplicationInfo> & appInfos) const1724 bool BundleDataMgr::GetApplicationInfos(
1725     int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
1726 {
1727     int32_t requestUserId = GetUserId(userId);
1728     if (requestUserId == Constants::INVALID_USERID) {
1729         return false;
1730     }
1731 
1732     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1733     if (bundleInfos_.empty()) {
1734         APP_LOGW("bundleInfos_ data is empty");
1735         return false;
1736     }
1737 
1738     bool find = false;
1739     for (const auto &item : bundleInfos_) {
1740         const InnerBundleInfo &info = item.second;
1741         if (info.IsDisabled()) {
1742             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
1743             continue;
1744         }
1745         int32_t responseUserId = info.GetResponseUserId(requestUserId);
1746         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
1747             && !info.GetApplicationEnabled(responseUserId)) {
1748             APP_LOGD("bundleName: %{public}s userId: %{public}d incorrect",
1749                 info.GetBundleName().c_str(), responseUserId);
1750             continue;
1751         }
1752         ApplicationInfo appInfo;
1753         info.GetApplicationInfo(flags, responseUserId, appInfo);
1754         appInfos.emplace_back(appInfo);
1755         find = true;
1756     }
1757     APP_LOGD("get installed bundles success");
1758     return find;
1759 }
1760 
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos) const1761 ErrCode BundleDataMgr::GetApplicationInfosV9(
1762     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
1763 {
1764     int32_t requestUserId = GetUserId(userId);
1765     if (requestUserId == Constants::INVALID_USERID) {
1766         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1767     }
1768 
1769     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1770     if (bundleInfos_.empty()) {
1771         APP_LOGW("bundleInfos_ data is empty");
1772         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1773     }
1774     for (const auto &item : bundleInfos_) {
1775         const InnerBundleInfo &info = item.second;
1776         if (info.IsDisabled()) {
1777             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
1778             continue;
1779         }
1780         int32_t responseUserId = info.GetResponseUserId(requestUserId);
1781         if (!(static_cast<uint32_t>(flags) &
1782             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
1783             && !info.GetApplicationEnabled(responseUserId)) {
1784             APP_LOGD("bundleName: %{public}s userId: %{public}d incorrect",
1785                 info.GetBundleName().c_str(), responseUserId);
1786             continue;
1787         }
1788         ApplicationInfo appInfo;
1789         if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) != ERR_OK) {
1790             continue;
1791         }
1792         appInfos.emplace_back(appInfo);
1793     }
1794     APP_LOGD("get installed bundles success");
1795     return ERR_OK;
1796 }
1797 
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const1798 bool BundleDataMgr::GetBundleInfo(
1799     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
1800 {
1801     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
1802     if (userId == Constants::ANY_USERID) {
1803         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
1804             APP_LOGW("no userInfos for this bundle(%{public}s)", bundleName.c_str());
1805             return false;
1806         }
1807         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
1808     }
1809 
1810     int32_t requestUserId = GetUserId(userId);
1811     if (requestUserId == Constants::INVALID_USERID) {
1812         return false;
1813     }
1814     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1815     InnerBundleInfo innerBundleInfo;
1816     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
1817         APP_LOGW("GetBundleInfo failed, bundleName:%{public}s, requestUserId:%{public}d",
1818             bundleName.c_str(), requestUserId);
1819         return false;
1820     }
1821 
1822     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1823     innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
1824 
1825     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
1826         ProcessBundleMenu(bundleInfo, flags, false);
1827     }
1828     APP_LOGD("get bundleInfo(%{public}s) successfully in user(%{public}d)", bundleName.c_str(), userId);
1829     return true;
1830 }
1831 
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const1832 ErrCode BundleDataMgr::GetBundleInfoV9(
1833     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
1834 {
1835     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
1836     if (userId == Constants::ANY_USERID) {
1837         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
1838             APP_LOGW("no userInfos for this bundle(%{public}s)", bundleName.c_str());
1839             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1840         }
1841         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
1842     }
1843 
1844     int32_t requestUserId = GetUserId(userId);
1845     if (requestUserId == Constants::INVALID_USERID) {
1846         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1847     }
1848     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1849     InnerBundleInfo innerBundleInfo;
1850 
1851     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
1852     if (ret != ERR_OK) {
1853         APP_LOGD("GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s", ret, bundleName.c_str());
1854         return ret;
1855     }
1856 
1857     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1858     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId);
1859 
1860     ProcessBundleMenu(bundleInfo, flags, true);
1861     APP_LOGD("get bundleInfo(%{public}s) successfully in user(%{public}d)", bundleName.c_str(), userId);
1862     return ERR_OK;
1863 }
1864 
ProcessBundleMenu(BundleInfo & bundleInfo,int32_t flags,bool clearData) const1865 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
1866 {
1867     if (clearData) {
1868         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
1869             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
1870             return ERR_OK;
1871         }
1872         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
1873             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
1874             APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
1875             std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
1876                 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
1877             });
1878             return ERR_OK;
1879         }
1880     }
1881     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
1882         std::string menuProfile = hapModuleInfo.fileContextMenu;
1883         auto pos = menuProfile.find(PROFILE_PREFIX);
1884         if (pos == std::string::npos) {
1885             APP_LOGW("invalid menu profile");
1886             continue;
1887         }
1888         std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
1889         std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
1890 
1891         std::string menuProfileContent;
1892         GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
1893         hapModuleInfo.fileContextMenu = menuProfileContent;
1894     }
1895     return ERR_OK;
1896 }
1897 
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,GetDependentBundleInfoFlag flag) const1898 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
1899     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
1900 {
1901     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
1902     if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
1903         (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
1904         // for app service hsp
1905         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1906         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
1907         for (const std::string &hspName : appServiceHspBundleName_) {
1908             APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
1909             auto infoItem = bundleInfos_.find(hspName);
1910             if (infoItem == bundleInfos_.end()) {
1911                 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
1912                 continue;
1913             }
1914             ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
1915         }
1916     }
1917     if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
1918         flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
1919         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1920         auto infoItem = bundleInfos_.find(bundleName);
1921         if (infoItem == bundleInfos_.end()) {
1922             APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
1923             return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
1924                 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
1925         }
1926         const InnerBundleInfo &innerBundleInfo = infoItem->second;
1927         std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
1928         for (const auto &item : dependencies) {
1929             BaseSharedBundleInfo baseSharedBundleInfo;
1930             if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
1931                 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
1932             }
1933         }
1934     }
1935     APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
1936     return ERR_OK;
1937 }
1938 
GetBaseSharedBundleInfo(const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const1939 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
1940     BaseSharedBundleInfo &baseSharedBundleInfo) const
1941 {
1942     auto infoItem = bundleInfos_.find(dependency.bundleName);
1943     if (infoItem == bundleInfos_.end()) {
1944         APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
1945             dependency.bundleName.c_str());
1946         return false;
1947     }
1948     const InnerBundleInfo &innerBundleInfo = infoItem->second;
1949     if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
1950         innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
1951     } else {
1952         APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
1953             innerBundleInfo.GetApplicationBundleType());
1954         return false;
1955     }
1956     APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
1957     return true;
1958 }
1959 
DeleteSharedBundleInfo(const std::string & bundleName)1960 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
1961 {
1962     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
1963     auto infoItem = bundleInfos_.find(bundleName);
1964     if (infoItem != bundleInfos_.end()) {
1965         APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
1966         const InnerBundleInfo &innerBundleInfo = infoItem->second;
1967         bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
1968         if (!ret) {
1969             APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
1970         }
1971         bundleInfos_.erase(bundleName);
1972         return ret;
1973     }
1974     return false;
1975 }
1976 
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId) const1977 ErrCode BundleDataMgr::GetBundlePackInfo(
1978     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
1979 {
1980     APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
1981     int32_t requestUserId;
1982     if (userId == Constants::UNSPECIFIED_USERID) {
1983         requestUserId = GetUserIdByCallingUid();
1984     } else {
1985         requestUserId = userId;
1986     }
1987 
1988     if (requestUserId == Constants::INVALID_USERID) {
1989         APP_LOGW("getBundlePackInfo userId is invalid");
1990         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1991     }
1992     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1993     InnerBundleInfo innerBundleInfo;
1994     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
1995         APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
1996         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1997     }
1998     BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
1999     if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
2000         bundlePackInfo.packages = innerBundlePackInfo.packages;
2001         return ERR_OK;
2002     }
2003     if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
2004         bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
2005         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
2006         return ERR_OK;
2007     }
2008     if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
2009         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
2010         return ERR_OK;
2011     }
2012     bundlePackInfo = innerBundlePackInfo;
2013     return ERR_OK;
2014 }
2015 
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos) const2016 bool BundleDataMgr::GetBundleInfosByMetaData(
2017     const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
2018 {
2019     if (metaData.empty()) {
2020         APP_LOGW("bundle name is empty");
2021         return false;
2022     }
2023 
2024     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2025     if (bundleInfos_.empty()) {
2026         APP_LOGW("bundleInfos_ data is empty");
2027         return false;
2028     }
2029 
2030     bool find = false;
2031     int32_t requestUserId = GetUserId();
2032     for (const auto &item : bundleInfos_) {
2033         const InnerBundleInfo &info = item.second;
2034         if (info.IsDisabled()) {
2035             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2036             continue;
2037         }
2038         if (info.CheckSpecialMetaData(metaData)) {
2039             BundleInfo bundleInfo;
2040             int32_t responseUserId = info.GetResponseUserId(requestUserId);
2041             info.GetBundleInfo(
2042                 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
2043             bundleInfos.emplace_back(bundleInfo);
2044             find = true;
2045         }
2046     }
2047     return find;
2048 }
2049 
GetBundleList(std::vector<std::string> & bundleNames,int32_t userId) const2050 bool BundleDataMgr::GetBundleList(
2051     std::vector<std::string> &bundleNames, int32_t userId) const
2052 {
2053     int32_t requestUserId = GetUserId(userId);
2054     if (requestUserId == Constants::INVALID_USERID) {
2055         return false;
2056     }
2057 
2058     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2059     if (bundleInfos_.empty()) {
2060         APP_LOGW("bundleInfos_ data is empty");
2061         return false;
2062     }
2063 
2064     bool find = false;
2065     for (const auto &infoItem : bundleInfos_) {
2066         const InnerBundleInfo &innerBundleInfo = infoItem.second;
2067         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2068         if (CheckInnerBundleInfoWithFlags(
2069             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
2070             continue;
2071         }
2072 
2073         bundleNames.emplace_back(infoItem.first);
2074         find = true;
2075     }
2076     APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
2077     return find;
2078 }
2079 
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2080 bool BundleDataMgr::GetBundleInfos(
2081     int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2082 {
2083     if (userId == Constants::ALL_USERID) {
2084         return GetAllBundleInfos(flags, bundleInfos);
2085     }
2086 
2087     int32_t requestUserId = GetUserId(userId);
2088     if (requestUserId == Constants::INVALID_USERID) {
2089         return false;
2090     }
2091 
2092     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2093     if (bundleInfos_.empty()) {
2094         APP_LOGW("bundleInfos_ data is empty");
2095         return false;
2096     }
2097 
2098     bool find = false;
2099     for (const auto &item : bundleInfos_) {
2100         const InnerBundleInfo &innerBundleInfo = item.second;
2101         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
2102             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", innerBundleInfo.GetBundleName().c_str());
2103             continue;
2104         }
2105 
2106         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2107         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
2108             continue;
2109         }
2110 
2111         BundleInfo bundleInfo;
2112         if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
2113             continue;
2114         }
2115 
2116         bundleInfos.emplace_back(bundleInfo);
2117         find = true;
2118     }
2119 
2120     APP_LOGD("get bundleInfos result(%{public}d) in user(%{public}d).", find, userId);
2121     return find;
2122 }
2123 
CheckInnerBundleInfoWithFlags(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId) const2124 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
2125     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId) const
2126 {
2127     if (userId == Constants::INVALID_USERID) {
2128         APP_LOGD("userId is invalid");
2129         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2130     }
2131 
2132     if (innerBundleInfo.IsDisabled()) {
2133         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
2134         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2135     }
2136 
2137     if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
2138         && !innerBundleInfo.GetApplicationEnabled(userId)) {
2139         APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
2140             innerBundleInfo.GetBundleName().c_str(), userId);
2141         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
2142     }
2143 
2144     return ERR_OK;
2145 }
2146 
GetAllBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos) const2147 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
2148 {
2149     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2150     if (bundleInfos_.empty()) {
2151         APP_LOGW("bundleInfos_ data is empty");
2152         return false;
2153     }
2154 
2155     bool find = false;
2156     for (const auto &item : bundleInfos_) {
2157         const InnerBundleInfo &info = item.second;
2158         if (info.IsDisabled()) {
2159             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2160             continue;
2161         }
2162         if (info.GetApplicationBundleType() == BundleType::SHARED) {
2163             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
2164             continue;
2165         }
2166         BundleInfo bundleInfo;
2167         info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
2168         bundleInfos.emplace_back(bundleInfo);
2169         find = true;
2170     }
2171 
2172     APP_LOGD("get all bundleInfos result(%{public}d).", find);
2173     return find;
2174 }
2175 
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2176 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2177 {
2178     if (userId == Constants::ALL_USERID) {
2179         return GetAllBundleInfosV9(flags, bundleInfos);
2180     }
2181 
2182     int32_t requestUserId = GetUserId(userId);
2183     if (requestUserId == Constants::INVALID_USERID) {
2184         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2185     }
2186 
2187     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2188     if (bundleInfos_.empty()) {
2189         APP_LOGW("bundleInfos_ data is empty");
2190         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2191     }
2192 
2193     for (const auto &item : bundleInfos_) {
2194         const InnerBundleInfo &innerBundleInfo = item.second;
2195         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
2196             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", innerBundleInfo.GetBundleName().c_str());
2197             continue;
2198         }
2199 
2200         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2201         auto flag = GET_BASIC_APPLICATION_INFO;
2202         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
2203             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
2204             flag = GET_APPLICATION_INFO_WITH_DISABLE;
2205         }
2206         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
2207             continue;
2208         }
2209 
2210         BundleInfo bundleInfo;
2211         if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
2212             continue;
2213         }
2214         auto ret = ProcessBundleMenu(bundleInfo, flags, true);
2215         if (ret == ERR_OK) {
2216             bundleInfos.emplace_back(bundleInfo);
2217         }
2218     }
2219     if (bundleInfos.empty()) {
2220         APP_LOGW("bundleInfos is empty");
2221     }
2222     return ERR_OK;
2223 }
2224 
GetAllBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos) const2225 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
2226 {
2227     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2228     if (bundleInfos_.empty()) {
2229         APP_LOGW("bundleInfos_ data is empty");
2230         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2231     }
2232 
2233     for (const auto &item : bundleInfos_) {
2234         const InnerBundleInfo &info = item.second;
2235         if (info.IsDisabled()) {
2236             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2237             continue;
2238         }
2239         if (info.GetApplicationBundleType() == BundleType::SHARED) {
2240             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
2241             continue;
2242         }
2243         BundleInfo bundleInfo;
2244         info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
2245         auto ret = ProcessBundleMenu(bundleInfo, flags, true);
2246         if (ret == ERR_OK) {
2247             bundleInfos.emplace_back(bundleInfo);
2248         }
2249     }
2250     if (bundleInfos.empty()) {
2251         APP_LOGW("bundleInfos is empty");
2252     }
2253     return ERR_OK;
2254 }
2255 
GetBundleNameForUid(const int uid,std::string & bundleName) const2256 bool BundleDataMgr::GetBundleNameForUid(const int uid, std::string &bundleName) const
2257 {
2258     InnerBundleInfo innerBundleInfo;
2259     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2260         if (sandboxAppHelper_ == nullptr) {
2261             return false;
2262         }
2263         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2264             return false;
2265         }
2266     }
2267 
2268     bundleName = innerBundleInfo.GetBundleName();
2269     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s", uid, bundleName.c_str());
2270     return true;
2271 }
2272 
GetInnerBundleInfoByUid(const int uid,InnerBundleInfo & innerBundleInfo) const2273 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int uid, InnerBundleInfo &innerBundleInfo) const
2274 {
2275     if (uid < Constants::BASE_APP_UID) {
2276         APP_LOGD("the uid(%{public}d) is not an application.", uid);
2277         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2278     }
2279     int32_t userId = GetUserIdByUid(uid);
2280     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
2281 
2282     std::string bundleName;
2283     {
2284         std::lock_guard<std::mutex> bundleIdLock(bundleIdMapMutex_);
2285         auto bundleIdIter = bundleIdMap_.find(bundleId);
2286         if (bundleIdIter == bundleIdMap_.end()) {
2287             APP_LOGW("uid %{public}d is not existed.", uid);
2288             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2289         }
2290         bundleName = bundleIdIter->second;
2291     }
2292 
2293     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2294     auto bundleInfoIter = bundleInfos_.find(bundleName);
2295     if (bundleInfoIter == bundleInfos_.end()) {
2296         APP_LOGE("bundleName %{public}s is not existed in bundleInfos_.", bundleName.c_str());
2297         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2298     }
2299 
2300     if (bundleInfoIter->second.IsDisabled()) {
2301         APP_LOGD("app %{public}s is disabled", bundleInfoIter->second.GetBundleName().c_str());
2302         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2303     }
2304     if (bundleInfoIter->second.GetUid(userId) == uid) {
2305         innerBundleInfo = bundleInfoIter->second;
2306         return ERR_OK;
2307     }
2308 
2309     APP_LOGW("the uid(%{public}d) is not exists.", uid);
2310     return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2311 }
2312 
GetRecoverablePreInstallBundleInfos()2313 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
2314 {
2315     std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
2316     int32_t userId = AccountHelper::GetCurrentActiveUserId();
2317     if (userId == Constants::INVALID_USERID) {
2318         APP_LOGW("userId %{public}d is invalid", userId);
2319         return recoverablePreInstallBundleInfos;
2320     }
2321     std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
2322     for (auto preInstallBundleInfo: preInstallBundleInfos) {
2323         if (!preInstallBundleInfo.GetRemovable()) {
2324             continue;
2325         }
2326         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2327         auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
2328         if (infoItem == bundleInfos_.end()) {
2329             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
2330             continue;
2331         }
2332         if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
2333             !infoItem->second.HasInnerBundleUserInfo(userId)) {
2334             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
2335         }
2336     }
2337     return recoverablePreInstallBundleInfos;
2338 }
2339 
IsBundleExist(const std::string & bundleName) const2340 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
2341 {
2342     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2343     return bundleInfos_.find(bundleName) != bundleInfos_.end();
2344 }
2345 
HasUserInstallInBundle(const std::string & bundleName,const int32_t userId) const2346 bool BundleDataMgr::HasUserInstallInBundle(
2347     const std::string &bundleName, const int32_t userId) const
2348 {
2349     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2350     auto infoItem = bundleInfos_.find(bundleName);
2351     if (infoItem == bundleInfos_.end()) {
2352         return false;
2353     }
2354 
2355     return infoItem->second.HasInnerBundleUserInfo(userId);
2356 }
2357 
GetBundleStats(const std::string & bundleName,const int32_t userId,std::vector<int64_t> & bundleStats) const2358 bool BundleDataMgr::GetBundleStats(
2359     const std::string &bundleName, const int32_t userId, std::vector<int64_t> &bundleStats) const
2360 {
2361     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2362     auto infoItem = bundleInfos_.find(bundleName);
2363     if (infoItem == bundleInfos_.end()) {
2364         return false;
2365     }
2366     int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
2367     int32_t uid = infoItem->second.GetUid(responseUserId);
2368     if (InstalldClient::GetInstance()->GetBundleStats(bundleName, responseUserId, bundleStats, uid) != ERR_OK) {
2369         APP_LOGW("bundle%{public}s GetBundleStats failed ", bundleName.c_str());
2370         return false;
2371     }
2372     if (infoItem->second.GetIsPreInstallApp() && !bundleStats.empty()) {
2373         for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
2374             bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
2375         }
2376     }
2377     return true;
2378 }
2379 
GetAllBundleStats(const int32_t userId,std::vector<int64_t> & bundleStats) const2380 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
2381 {
2382     std::vector<std::string> bundleNames;
2383     std::vector<int32_t> uids;
2384     int32_t responseUserId = userId;
2385     GetBundleList(bundleNames, userId);
2386     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2387     for (const auto &bundleName : bundleNames) {
2388         auto infoItem = bundleInfos_.find(bundleName);
2389         if (infoItem == bundleInfos_.end()) {
2390             return false;
2391         }
2392         responseUserId = infoItem->second.GetResponseUserId(userId);
2393         int32_t uid = infoItem->second.GetUid(responseUserId);
2394         uids.emplace_back(uid);
2395     }
2396     if (InstalldClient::GetInstance()->GetAllBundleStats(bundleNames, responseUserId, bundleStats, uids) != ERR_OK) {
2397         APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
2398         return false;
2399     }
2400     if (bundleStats.empty()) {
2401         return true;
2402     }
2403     for (const auto &bundleName : bundleNames) {
2404         auto infoItem = bundleInfos_.find(bundleName);
2405         if (infoItem == bundleInfos_.end()) {
2406             return false;
2407         }
2408         if (infoItem->second.GetIsPreInstallApp()) {
2409             for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
2410                 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
2411             }
2412         }
2413     }
2414     return true;
2415 }
2416 
2417 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string & bundleName) const2418 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
2419 {
2420     return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
2421 }
2422 
GetBundleSpaceSize(const std::string & bundleName,int32_t userId) const2423 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
2424 {
2425     int64_t spaceSize = 0;
2426     if (userId != Constants::ALL_USERID) {
2427         std::vector<int64_t> bundleStats;
2428         if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
2429             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
2430             return spaceSize;
2431         }
2432 
2433         spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
2434         return spaceSize;
2435     }
2436 
2437     for (const auto &iterUserId : GetAllUser()) {
2438         std::vector<int64_t> bundleStats;
2439         if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
2440             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
2441             continue;
2442         }
2443 
2444         auto startIter = bundleStats.begin();
2445         auto endIter = bundleStats.end();
2446         if (spaceSize == 0) {
2447             spaceSize = std::accumulate(startIter, endIter, spaceSize);
2448         } else {
2449             spaceSize = std::accumulate(++startIter, endIter, spaceSize);
2450         }
2451     }
2452 
2453     return spaceSize;
2454 }
2455 
GetAllFreeInstallBundleSpaceSize() const2456 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
2457 {
2458     int64_t allSize = 0;
2459     std::map<std::string, std::vector<std::string>> freeInstallModules;
2460     if (!GetFreeInstallModules(freeInstallModules)) {
2461         APP_LOGW("no removable bundles");
2462         return allSize;
2463     }
2464 
2465     for (const auto &iter : freeInstallModules) {
2466         APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
2467         allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
2468     }
2469 
2470     APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
2471     return allSize;
2472 }
2473 
GetFreeInstallModules(std::map<std::string,std::vector<std::string>> & freeInstallModules) const2474 bool BundleDataMgr::GetFreeInstallModules(
2475     std::map<std::string, std::vector<std::string>> &freeInstallModules) const
2476 {
2477     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2478     if (bundleInfos_.empty()) {
2479         APP_LOGW("bundleInfos_ is data is empty.");
2480         return false;
2481     }
2482 
2483     for (const auto &iter : bundleInfos_) {
2484         std::vector<std::string> modules;
2485         if (!iter.second.GetFreeInstallModules(modules)) {
2486             continue;
2487         }
2488 
2489         freeInstallModules.emplace(iter.first, modules);
2490     }
2491 
2492     return !freeInstallModules.empty();
2493 }
2494 #endif
2495 
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames) const2496 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
2497 {
2498     InnerBundleInfo innerBundleInfo;
2499     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2500         APP_LOGD("get innerBundleInfo by uid :%{public}d failed.", uid);
2501         return false;
2502     }
2503 
2504     bundleNames.emplace_back(innerBundleInfo.GetBundleName());
2505     return true;
2506 }
2507 
GetNameForUid(const int uid,std::string & name) const2508 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
2509 {
2510     InnerBundleInfo innerBundleInfo;
2511     ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
2512     if (ret != ERR_OK) {
2513         APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed.");
2514         if (sandboxAppHelper_ == nullptr) {
2515             APP_LOGW("sandboxAppHelper_ is nullptr");
2516             return ERR_BUNDLE_MANAGER_INVALID_UID;
2517         }
2518         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2519             return ERR_BUNDLE_MANAGER_INVALID_UID;
2520         }
2521     }
2522 
2523     name = innerBundleInfo.GetBundleName();
2524     return ERR_OK;
2525 }
2526 
GetBundleGids(const std::string & bundleName,std::vector<int> & gids) const2527 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
2528 {
2529     int32_t requestUserId = GetUserId();
2530     InnerBundleUserInfo innerBundleUserInfo;
2531     if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
2532         APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) .",
2533             requestUserId, bundleName.c_str());
2534         return false;
2535     }
2536 
2537     gids = innerBundleUserInfo.gids;
2538     return true;
2539 }
2540 
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids) const2541 bool BundleDataMgr::GetBundleGidsByUid(
2542     const std::string &bundleName, const int &uid, std::vector<int> &gids) const
2543 {
2544     return true;
2545 }
2546 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos) const2547 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
2548 {
2549     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2550     if (bundleInfos_.empty()) {
2551         APP_LOGW("bundleInfos_ data is empty");
2552         return false;
2553     }
2554 
2555     int32_t requestUserId = GetUserId();
2556     for (const auto &info : bundleInfos_) {
2557         if (info.second.IsDisabled()) {
2558             APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
2559             continue;
2560         }
2561         if (info.second.GetIsKeepAlive()) {
2562             BundleInfo bundleInfo;
2563             int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
2564             info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
2565             if (bundleInfo.name == "") {
2566                 continue;
2567             }
2568             bundleInfos.emplace_back(bundleInfo);
2569         }
2570     }
2571     return !(bundleInfos.empty());
2572 }
2573 
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label) const2574 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
2575     const std::string &abilityName, std::string &label) const
2576 {
2577 #ifdef GLOBAL_RESMGR_ENABLE
2578     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2579     int32_t requestUserId = GetUserId();
2580     if (requestUserId == Constants::INVALID_USERID) {
2581         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2582     }
2583     InnerBundleInfo innerBundleInfo;
2584     ErrCode ret =
2585         GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
2586     if (ret != ERR_OK) {
2587         return ret;
2588     }
2589     AbilityInfo abilityInfo;
2590     ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
2591     if (ret != ERR_OK) {
2592         APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
2593             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
2594         return ret;
2595     }
2596     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2597     bool isEnable = false;
2598     ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
2599     if (ret != ERR_OK) {
2600         return ret;
2601     }
2602     if (!isEnable) {
2603         APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
2604         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
2605     }
2606     if (abilityInfo.labelId == 0) {
2607         label = abilityInfo.label;
2608         return ERR_OK;
2609     }
2610     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
2611         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
2612     if (resourceManager == nullptr) {
2613         APP_LOGW("InitResourceManager failed");
2614         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2615     }
2616     auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
2617     if (state != OHOS::Global::Resource::RState::SUCCESS) {
2618         APP_LOGW("ResourceManager GetStringById failed");
2619         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2620     }
2621     return ERR_OK;
2622 #else
2623     APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
2624     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
2625 #endif
2626 }
2627 
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo,int32_t userId) const2628 bool BundleDataMgr::GetHapModuleInfo(
2629     const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
2630 {
2631     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2632     int32_t requestUserId = GetUserId(userId);
2633     if (requestUserId == Constants::INVALID_USERID) {
2634         return false;
2635     }
2636 
2637     if (bundleInfos_.empty()) {
2638         APP_LOGW("bundleInfos_ data is empty");
2639         return false;
2640     }
2641 
2642     APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
2643     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
2644     if (infoItem == bundleInfos_.end()) {
2645         return false;
2646     }
2647 
2648     const InnerBundleInfo &innerBundleInfo = infoItem->second;
2649     if (innerBundleInfo.IsDisabled()) {
2650         APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
2651         return false;
2652     }
2653 
2654     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2655     auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
2656     if (!module) {
2657         APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
2658             abilityInfo.bundleName.c_str());
2659         return false;
2660     }
2661     hapModuleInfo = *module;
2662     return true;
2663 }
2664 
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId) const2665 ErrCode BundleDataMgr::GetLaunchWantForBundle(
2666     const std::string &bundleName, Want &want, int32_t userId) const
2667 {
2668     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2669     InnerBundleInfo innerBundleInfo;
2670     ErrCode ret = GetInnerBundleInfoWithFlagsV9(
2671         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
2672     if (ret != ERR_OK) {
2673         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
2674         return ret;
2675     }
2676 
2677     std::string mainAbility = innerBundleInfo.GetMainAbility();
2678     if (mainAbility.empty()) {
2679         APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
2680         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2681     }
2682 
2683     want.SetElementName("", bundleName, mainAbility);
2684     want.SetAction(Constants::ACTION_HOME);
2685     want.AddEntity(Constants::ENTITY_HOME);
2686     return ERR_OK;
2687 }
2688 
CheckIsSystemAppByUid(const int uid) const2689 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
2690 {
2691     // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
2692     // the uid should be the system uid.
2693     if (uid == Constants::ROOT_UID || uid == Constants::BMS_UID) {
2694         return true;
2695     }
2696 
2697     InnerBundleInfo innerBundleInfo;
2698     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2699         return false;
2700     }
2701 
2702     return innerBundleInfo.IsSystemApp();
2703 }
2704 
InitStateTransferMap()2705 void BundleDataMgr::InitStateTransferMap()
2706 {
2707     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
2708     transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
2709     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
2710     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
2711     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
2712     transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
2713     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
2714     transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
2715     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
2716     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
2717     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
2718     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
2719     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
2720     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
2721     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
2722     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
2723     transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
2724     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
2725     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
2726     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
2727     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
2728     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
2729     transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
2730     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
2731     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
2732     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
2733     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
2734     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
2735 }
2736 
IsDeleteDataState(const InstallState state) const2737 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
2738 {
2739     return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
2740             state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
2741 }
2742 
IsDisableState(const InstallState state) const2743 bool BundleDataMgr::IsDisableState(const InstallState state) const
2744 {
2745     if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
2746         return true;
2747     }
2748     return false;
2749 }
2750 
DeleteBundleInfo(const std::string & bundleName,const InstallState state)2751 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state)
2752 {
2753     if (InstallState::INSTALL_FAIL == state) {
2754         APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
2755         return;
2756     }
2757 
2758     auto infoItem = bundleInfos_.find(bundleName);
2759     if (infoItem == bundleInfos_.end()) {
2760         APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
2761         return;
2762     }
2763 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
2764     // remove external overlay bundle info and connection
2765     RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
2766 #endif
2767     APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
2768     const InnerBundleInfo &innerBundleInfo = infoItem->second;
2769     RecycleUidAndGid(innerBundleInfo);
2770     bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
2771     if (!ret) {
2772         APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
2773     }
2774     bundleInfos_.erase(bundleName);
2775     std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
2776     if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
2777         appServiceHspBundleName_.erase(bundleName);
2778     }
2779 }
2780 
IsAppOrAbilityInstalled(const std::string & bundleName) const2781 bool BundleDataMgr::IsAppOrAbilityInstalled(const std::string &bundleName) const
2782 {
2783     if (bundleName.empty()) {
2784         APP_LOGW("IsAppOrAbilityInstalled bundleName empty");
2785         return false;
2786     }
2787 
2788     std::lock_guard<std::mutex> lock(stateMutex_);
2789     auto statusItem = installStates_.find(bundleName);
2790     if (statusItem == installStates_.end()) {
2791         APP_LOGW("name:%{public}s not find", bundleName.c_str());
2792         return false;
2793     }
2794 
2795     if (statusItem->second == InstallState::INSTALL_SUCCESS) {
2796         return true;
2797     }
2798 
2799     APP_LOGW("name:%{public}s not install success", bundleName.c_str());
2800     return false;
2801 }
2802 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const2803 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
2804     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
2805 {
2806     if (bundleName.empty()) {
2807         return false;
2808     }
2809     int32_t requestUserId = GetUserId(userId);
2810     if (requestUserId == Constants::INVALID_USERID) {
2811         return false;
2812     }
2813 
2814     if (bundleInfos_.empty()) {
2815         APP_LOGW("bundleInfos_ data is empty");
2816         return false;
2817     }
2818     APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
2819     auto item = bundleInfos_.find(bundleName);
2820     if (item == bundleInfos_.end()) {
2821         APP_LOGW("GetInnerBundleInfoWithFlags: bundleName %{public}s not find", bundleName.c_str());
2822         return false;
2823     }
2824     const InnerBundleInfo &innerBundleInfo = item->second;
2825     if (innerBundleInfo.IsDisabled()) {
2826         APP_LOGD("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
2827         return false;
2828     }
2829 
2830     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2831     if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
2832         && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
2833         APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
2834             innerBundleInfo.GetBundleName().c_str(), requestUserId);
2835         return false;
2836     }
2837     info = innerBundleInfo;
2838     return true;
2839 }
2840 
GetInnerBundleInfoWithFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const2841 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
2842     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
2843 {
2844     int32_t requestUserId = GetUserId(userId);
2845     if (requestUserId == Constants::INVALID_USERID) {
2846         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2847     }
2848 
2849     if (bundleInfos_.empty()) {
2850         APP_LOGD("bundleInfos_ data is empty");
2851         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2852     }
2853     APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
2854     auto item = bundleInfos_.find(bundleName);
2855     if (item == bundleInfos_.end()) {
2856         APP_LOGD("GetInnerBundleInfoWithFlagsV9: bundleName %{public}s not find", bundleName.c_str());
2857         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2858     }
2859     const InnerBundleInfo &innerBundleInfo = item->second;
2860     if (innerBundleInfo.IsDisabled()) {
2861         APP_LOGD("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
2862         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2863     }
2864 
2865     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2866     bool isEnabled = false;
2867     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
2868     if (ret != ERR_OK) {
2869         return ret;
2870     }
2871     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
2872         && !isEnabled) {
2873         APP_LOGD("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
2874         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
2875     }
2876     info = innerBundleInfo;
2877     return ERR_OK;
2878 }
2879 
GetInnerBundleInfoWithBundleFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const2880 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
2881     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
2882 {
2883     if (bundleName.empty()) {
2884         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2885     }
2886     int32_t requestUserId = GetUserId(userId);
2887     if (requestUserId == Constants::INVALID_USERID) {
2888         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2889     }
2890 
2891     if (bundleInfos_.empty()) {
2892         APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
2893         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2894     }
2895     APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
2896     auto item = bundleInfos_.find(bundleName);
2897     if (item == bundleInfos_.end()) {
2898         APP_LOGW("GetInnerBundleInfoWithFlagsV9: bundleName %{public}s not find", bundleName.c_str());
2899         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2900     }
2901     const InnerBundleInfo &innerBundleInfo = item->second;
2902     if (innerBundleInfo.IsDisabled()) {
2903         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
2904         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2905     }
2906 
2907     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2908     bool isEnabled = false;
2909     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
2910     if (ret != ERR_OK) {
2911         return ret;
2912     }
2913     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
2914         && !isEnabled) {
2915         APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
2916         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
2917     }
2918     info = innerBundleInfo;
2919     return ERR_OK;
2920 }
2921 
GetInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)2922 bool BundleDataMgr::GetInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
2923 {
2924     APP_LOGD("GetInnerBundleInfo %{public}s", bundleName.c_str());
2925     if (bundleName.empty()) {
2926         APP_LOGW("bundleName is empty");
2927         return false;
2928     }
2929 
2930     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2931     auto infoItem = bundleInfos_.find(bundleName);
2932     if (infoItem == bundleInfos_.end()) {
2933         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2934         return false;
2935     }
2936     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
2937     info = infoItem->second;
2938     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
2939     return true;
2940 }
2941 
DisableBundle(const std::string & bundleName)2942 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
2943 {
2944     APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
2945     if (bundleName.empty()) {
2946         APP_LOGW("bundleName empty");
2947         return false;
2948     }
2949 
2950     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2951     auto infoItem = bundleInfos_.find(bundleName);
2952     if (infoItem == bundleInfos_.end()) {
2953         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2954         return false;
2955     }
2956     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
2957     return true;
2958 }
2959 
EnableBundle(const std::string & bundleName)2960 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
2961 {
2962     APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
2963     if (bundleName.empty()) {
2964         APP_LOGW("bundleName empty");
2965         return false;
2966     }
2967 
2968     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2969     auto infoItem = bundleInfos_.find(bundleName);
2970     if (infoItem == bundleInfos_.end()) {
2971         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2972         return false;
2973     }
2974     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
2975     return true;
2976 }
2977 
IsApplicationEnabled(const std::string & bundleName,bool & isEnabled) const2978 ErrCode BundleDataMgr::IsApplicationEnabled(const std::string &bundleName, bool &isEnabled) const
2979 {
2980     APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
2981     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2982     auto infoItem = bundleInfos_.find(bundleName);
2983     if (infoItem == bundleInfos_.end()) {
2984         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2985         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2986     }
2987     int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId());
2988     ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
2989     if (ret != ERR_OK) {
2990         APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
2991     }
2992     return ret;
2993 }
2994 
SetApplicationEnabled(const std::string & bundleName,bool isEnable,int32_t userId)2995 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName, bool isEnable, int32_t userId)
2996 {
2997     APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
2998     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2999     int32_t requestUserId = GetUserId(userId);
3000     if (requestUserId == Constants::INVALID_USERID) {
3001         APP_LOGW("Request userId is invalid, bundleName:%{public}s", bundleName.c_str());
3002         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3003     }
3004     auto infoItem = bundleInfos_.find(bundleName);
3005     if (infoItem == bundleInfos_.end()) {
3006         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3007         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3008     }
3009 
3010     InnerBundleInfo& newInfo = infoItem->second;
3011     auto ret = newInfo.SetApplicationEnabled(isEnable, requestUserId);
3012     if (ret != ERR_OK) {
3013         return ret;
3014     }
3015     InnerBundleUserInfo innerBundleUserInfo;
3016     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
3017         APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
3018         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3019     }
3020 
3021     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
3022         bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
3023     } else {
3024         bundleStateStorage_->SaveBundleStateStorage(
3025             bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
3026     }
3027     return ERR_OK;
3028 }
3029 
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)3030 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
3031 {
3032     if (bundleName.empty() || moduleName.empty()) {
3033         APP_LOGW("bundleName or moduleName is empty");
3034         return false;
3035     }
3036     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3037     if (userId == Constants::INVALID_USERID) {
3038         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
3039         return false;
3040     }
3041     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
3042         bundleName.c_str(), moduleName.c_str(), userId);
3043     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
3044     auto infoItem = bundleInfos_.find(bundleName);
3045     if (infoItem == bundleInfos_.end()) {
3046         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3047         return false;
3048     }
3049     InnerBundleInfo newInfo = infoItem->second;
3050     bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
3051     if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
3052         ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
3053 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
3054         if (isEnable) {
3055             // call clean task
3056             APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
3057                 bundleName.c_str(), isEnable, ret);
3058             DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
3059                 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
3060         }
3061 #endif
3062         return ret;
3063     } else {
3064         APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
3065         return false;
3066     }
3067 }
3068 
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable) const3069 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
3070     bool &isRemovable) const
3071 {
3072     if (bundleName.empty() || moduleName.empty()) {
3073         APP_LOGW("bundleName or moduleName is empty");
3074         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
3075     }
3076     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3077     if (userId == Constants::INVALID_USERID) {
3078         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
3079         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
3080     }
3081     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
3082         bundleName.c_str(), moduleName.c_str(), userId);
3083     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3084     auto infoItem = bundleInfos_.find(bundleName);
3085     if (infoItem == bundleInfos_.end()) {
3086         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3087         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3088     }
3089     InnerBundleInfo newInfo = infoItem->second;
3090     return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
3091 }
3092 
IsAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable) const3093 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable) const
3094 {
3095     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3096     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
3097     if (infoItem == bundleInfos_.end()) {
3098         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
3099         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3100     }
3101     InnerBundleInfo innerBundleInfo = infoItem->second;
3102     auto ability = innerBundleInfo.FindAbilityInfoV9(
3103         abilityInfo.moduleName, abilityInfo.name);
3104     if (!ability) {
3105         APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
3106             abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
3107         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3108     }
3109     int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
3110     return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable);
3111 }
3112 
SetAbilityEnabled(const AbilityInfo & abilityInfo,bool isEnabled,int32_t userId)3113 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, bool isEnabled, int32_t userId)
3114 {
3115     APP_LOGD("SetAbilityEnabled %{public}s", abilityInfo.name.c_str());
3116     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
3117     int32_t requestUserId = GetUserId(userId);
3118     if (requestUserId == Constants::INVALID_USERID) {
3119         APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
3120             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
3121         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3122     }
3123     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
3124     if (infoItem == bundleInfos_.end()) {
3125         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
3126         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3127     }
3128     InnerBundleInfo& newInfo = infoItem->second;
3129     ErrCode ret = newInfo.SetAbilityEnabled(
3130         abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
3131     if (ret != ERR_OK) {
3132         return ret;
3133     }
3134     InnerBundleUserInfo innerBundleUserInfo;
3135     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
3136         APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
3137             requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
3138         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3139     }
3140 
3141     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
3142         bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
3143     } else {
3144         bundleStateStorage_->SaveBundleStateStorage(
3145             abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
3146     }
3147     return ERR_OK;
3148 }
3149 
GetSandboxAppHelper() const3150 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
3151 {
3152     return sandboxAppHelper_;
3153 }
3154 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)3155 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
3156 {
3157     APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
3158     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
3159     callbackList_.emplace_back(bundleStatusCallback);
3160     if (bundleStatusCallback->AsObject() != nullptr) {
3161         sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
3162             new (std::nothrow) BundleStatusCallbackDeathRecipient();
3163         if (deathRecipient == nullptr) {
3164             APP_LOGW("deathRecipient is null");
3165             return false;
3166         }
3167         bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
3168     }
3169     return true;
3170 }
3171 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)3172 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
3173 {
3174     if (bundleEventCallback == nullptr) {
3175         APP_LOGW("bundleEventCallback is null");
3176         return false;
3177     }
3178     std::lock_guard lock(eventCallbackMutex_);
3179     if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
3180         APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
3181         return false;
3182     }
3183     if (bundleEventCallback->AsObject() != nullptr) {
3184         sptr<BundleEventCallbackDeathRecipient> deathRecipient =
3185             new (std::nothrow) BundleEventCallbackDeathRecipient();
3186         if (deathRecipient == nullptr) {
3187             APP_LOGW("deathRecipient is null");
3188             return false;
3189         }
3190         bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
3191     }
3192     eventCallbackList_.emplace_back(bundleEventCallback);
3193     return true;
3194 }
3195 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)3196 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
3197 {
3198     APP_LOGD("begin to UnregisterBundleEventCallback");
3199     if (bundleEventCallback == nullptr) {
3200         APP_LOGW("bundleEventCallback is null");
3201         return false;
3202     }
3203     std::lock_guard lock(eventCallbackMutex_);
3204     eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
3205         [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
3206             return callback->AsObject() == bundleEventCallback->AsObject();
3207         }), eventCallbackList_.end());
3208     return true;
3209 }
3210 
NotifyBundleEventCallback(const EventFwk::CommonEventData & eventData) const3211 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
3212 {
3213     APP_LOGD("begin to NotifyBundleEventCallback");
3214     std::lock_guard lock(eventCallbackMutex_);
3215     for (const auto &callback : eventCallbackList_) {
3216         callback->OnReceiveEvent(eventData);
3217     }
3218     APP_LOGD("finish to NotifyBundleEventCallback");
3219 }
3220 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)3221 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
3222 {
3223     APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
3224     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
3225     callbackList_.erase(std::remove_if(callbackList_.begin(),
3226         callbackList_.end(),
3227         [&](const sptr<IBundleStatusCallback> &callback) {
3228             return callback->AsObject() == bundleStatusCallback->AsObject();
3229         }),
3230         callbackList_.end());
3231     return true;
3232 }
3233 
UnregisterBundleStatusCallback()3234 bool BundleDataMgr::UnregisterBundleStatusCallback()
3235 {
3236     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
3237     callbackList_.clear();
3238     return true;
3239 }
3240 
GenerateUidAndGid(InnerBundleUserInfo & innerBundleUserInfo)3241 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
3242 {
3243     if (innerBundleUserInfo.bundleName.empty()) {
3244         APP_LOGW("bundleName is null.");
3245         return false;
3246     }
3247 
3248     int32_t bundleId = Constants::INVALID_BUNDLEID;
3249     if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
3250         APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
3251         return false;
3252     }
3253 
3254     innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
3255         + bundleId % Constants::BASE_USER_RANGE;
3256     innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
3257     return true;
3258 }
3259 
GenerateBundleId(const std::string & bundleName,int32_t & bundleId)3260 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
3261 {
3262     std::lock_guard<std::mutex> lock(bundleIdMapMutex_);
3263     if (bundleIdMap_.empty()) {
3264         APP_LOGD("first app install");
3265         bundleId = baseAppUid_;
3266         bundleIdMap_.emplace(bundleId, bundleName);
3267         return true;
3268     }
3269 
3270     for (const auto &innerBundleId : bundleIdMap_) {
3271         if (innerBundleId.second == bundleName) {
3272             bundleId = innerBundleId.first;
3273             return true;
3274         }
3275     }
3276 
3277     for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
3278         if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
3279             APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
3280             bundleId = i;
3281             bundleIdMap_.emplace(bundleId, bundleName);
3282             BundleUtil::MakeFsConfig(bundleName, bundleId, Constants::HMDFS_CONFIG_PATH);
3283             BundleUtil::MakeFsConfig(bundleName, bundleId, Constants::SHAREFS_CONFIG_PATH);
3284             return true;
3285         }
3286     }
3287 
3288     if (bundleIdMap_.rbegin()->first == Constants::MAX_APP_UID) {
3289         APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
3290         return false;
3291     }
3292 
3293     bundleId = bundleIdMap_.rbegin()->first + 1;
3294     bundleIdMap_.emplace(bundleId, bundleName);
3295     BundleUtil::MakeFsConfig(bundleName, bundleId, Constants::HMDFS_CONFIG_PATH);
3296     BundleUtil::MakeFsConfig(bundleName, bundleId, Constants::SHAREFS_CONFIG_PATH);
3297     return true;
3298 }
3299 
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,const int32_t upgradeFlag)3300 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
3301     const std::string &moduleName, const int32_t upgradeFlag)
3302 {
3303     APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
3304     if (bundleName.empty() || moduleName.empty()) {
3305         APP_LOGW("bundleName or moduleName is empty");
3306         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
3307     }
3308     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
3309     auto infoItem = bundleInfos_.find(bundleName);
3310     if (infoItem == bundleInfos_.end()) {
3311         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3312     }
3313     InnerBundleInfo &newInfo = infoItem->second;
3314     ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
3315     if (setFlag == ERR_OK) {
3316         if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
3317             return ERR_OK;
3318         }
3319         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
3320     }
3321     APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
3322     return setFlag;
3323 }
3324 
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName) const3325 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
3326 {
3327     APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
3328     if (bundleName.empty() || moduleName.empty()) {
3329         APP_LOGW("bundleName or moduleName is empty");
3330         return false;
3331     }
3332     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3333     auto infoItem = bundleInfos_.find(bundleName);
3334     if (infoItem == bundleInfos_.end()) {
3335         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3336         return false;
3337     }
3338     InnerBundleInfo newInfo = infoItem->second;
3339     return newInfo.GetModuleUpgradeFlag(moduleName);
3340 }
3341 
RecycleUidAndGid(const InnerBundleInfo & info)3342 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
3343 {
3344     auto userInfos = info.GetInnerBundleUserInfos();
3345     if (userInfos.empty()) {
3346         return;
3347     }
3348 
3349     auto innerBundleUserInfo = userInfos.begin()->second;
3350     int32_t bundleId = innerBundleUserInfo.uid -
3351         innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
3352     std::lock_guard<std::mutex> lock(bundleIdMapMutex_);
3353     auto infoItem = bundleIdMap_.find(bundleId);
3354     if (infoItem == bundleIdMap_.end()) {
3355         return;
3356     }
3357 
3358     bundleIdMap_.erase(bundleId);
3359     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, Constants::HMDFS_CONFIG_PATH);
3360     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, Constants::SHAREFS_CONFIG_PATH);
3361 }
3362 
RestoreUidAndGid()3363 bool BundleDataMgr::RestoreUidAndGid()
3364 {
3365     for (const auto &info : bundleInfos_) {
3366         bool onlyInsertOne = false;
3367         for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
3368             auto innerBundleUserInfo = infoItem.second;
3369             AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
3370             if (!onlyInsertOne) {
3371                 onlyInsertOne = true;
3372                 int32_t bundleId = innerBundleUserInfo.uid -
3373                     innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
3374                 std::lock_guard<std::mutex> lock(bundleIdMapMutex_);
3375                 auto item = bundleIdMap_.find(bundleId);
3376                 if (item == bundleIdMap_.end()) {
3377                     bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
3378                 } else {
3379                     bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
3380                 }
3381                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, Constants::HMDFS_CONFIG_PATH);
3382                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, Constants::SHAREFS_CONFIG_PATH);
3383             }
3384         }
3385     }
3386     return true;
3387 }
3388 
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)3389 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
3390 {
3391     if (sandboxAppHelper_ != nullptr) {
3392         std::lock_guard<std::mutex> lock(bundleIdMapMutex_);
3393         sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
3394     }
3395 }
3396 
GetBundleMutex(const std::string & bundleName)3397 std::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
3398 {
3399     bundleMutex_.lock_shared();
3400     auto it = bundleMutexMap_.find(bundleName);
3401     if (it == bundleMutexMap_.end()) {
3402         bundleMutex_.unlock_shared();
3403         std::unique_lock lock {bundleMutex_};
3404         return bundleMutexMap_[bundleName];
3405     }
3406     bundleMutex_.unlock_shared();
3407     return it->second;
3408 }
3409 
GetProvisionId(const std::string & bundleName,std::string & provisionId) const3410 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
3411 {
3412     APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
3413     if (bundleName.empty()) {
3414         APP_LOGW("bundleName empty");
3415         return false;
3416     }
3417     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3418     auto infoItem = bundleInfos_.find(bundleName);
3419     if (infoItem == bundleInfos_.end()) {
3420         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3421         return false;
3422     }
3423     provisionId = infoItem->second.GetProvisionId();
3424     return true;
3425 }
3426 
GetAppFeature(const std::string & bundleName,std::string & appFeature) const3427 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
3428 {
3429     APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
3430     if (bundleName.empty()) {
3431         APP_LOGW("bundleName empty");
3432         return false;
3433     }
3434     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3435     auto infoItem = bundleInfos_.find(bundleName);
3436     if (infoItem == bundleInfos_.end()) {
3437         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3438         return false;
3439     }
3440     appFeature = infoItem->second.GetAppFeature();
3441     return true;
3442 }
3443 
SetInitialUserFlag(bool flag)3444 void BundleDataMgr::SetInitialUserFlag(bool flag)
3445 {
3446     APP_LOGD("SetInitialUserFlag %{public}d", flag);
3447     if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
3448         bundlePromise_->NotifyAllTasksExecuteFinished();
3449     }
3450 
3451     initialUserFlag_ = flag;
3452 }
3453 
GetDataStorage() const3454 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
3455 {
3456     return dataStorage_;
3457 }
3458 
GetAllFormsInfo(std::vector<FormInfo> & formInfos) const3459 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
3460 {
3461     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3462     if (bundleInfos_.empty()) {
3463         APP_LOGW("bundleInfos_ data is empty");
3464         return false;
3465     }
3466     auto result = false;
3467     for (const auto &item : bundleInfos_) {
3468         if (item.second.IsDisabled()) {
3469             APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
3470             continue;
3471         }
3472         item.second.GetFormsInfoByApp(formInfos);
3473         result = true;
3474     }
3475     APP_LOGD("all the form infos find success");
3476     return result;
3477 }
3478 
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos) const3479 bool BundleDataMgr::GetFormsInfoByModule(
3480     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
3481 {
3482     if (bundleName.empty()) {
3483         APP_LOGW("bundle name is empty");
3484         return false;
3485     }
3486     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3487     if (bundleInfos_.empty()) {
3488         APP_LOGW("bundleInfos_ data is empty");
3489         return false;
3490     }
3491     auto infoItem = bundleInfos_.find(bundleName);
3492     if (infoItem == bundleInfos_.end()) {
3493         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
3494         return false;
3495     }
3496     if (infoItem->second.IsDisabled()) {
3497         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
3498         return false;
3499     }
3500     infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
3501     if (formInfos.empty()) {
3502         return false;
3503     }
3504     APP_LOGW("module forminfo find success");
3505     return true;
3506 }
3507 
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos) const3508 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
3509 {
3510     if (bundleName.empty()) {
3511         APP_LOGW("bundle name is empty");
3512         return false;
3513     }
3514     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3515     if (bundleInfos_.empty()) {
3516         APP_LOGW("bundleInfos_ data is empty");
3517         return false;
3518     }
3519     auto infoItem = bundleInfos_.find(bundleName);
3520     if (infoItem == bundleInfos_.end()) {
3521         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
3522         return false;
3523     }
3524     if (infoItem->second.IsDisabled()) {
3525         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
3526         return false;
3527     }
3528     infoItem->second.GetFormsInfoByApp(formInfos);
3529     APP_LOGD("App forminfo find success");
3530     return true;
3531 }
3532 
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const3533 bool BundleDataMgr::GetShortcutInfos(
3534     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
3535 {
3536     int32_t requestUserId = GetUserId(userId);
3537     if (requestUserId == Constants::INVALID_USERID) {
3538         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
3539         return false;
3540     }
3541 
3542     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3543     InnerBundleInfo innerBundleInfo;
3544     if (!GetInnerBundleInfoWithFlags(
3545         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
3546         APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
3547             bundleName.c_str(), requestUserId);
3548         return false;
3549     }
3550     innerBundleInfo.GetShortcutInfos(shortcutInfos);
3551     return true;
3552 }
3553 
GetShortcutInfoV9(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const3554 ErrCode BundleDataMgr::GetShortcutInfoV9(
3555     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
3556 {
3557     int32_t requestUserId = GetUserId(userId);
3558     if (requestUserId == Constants::INVALID_USERID) {
3559         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
3560         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3561     }
3562     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3563     InnerBundleInfo innerBundleInfo;
3564     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
3565         BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
3566     if (ret != ERR_OK) {
3567         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
3568             bundleName.c_str(), requestUserId);
3569         return ret;
3570     }
3571 
3572     innerBundleInfo.GetShortcutInfos(shortcutInfos);
3573     return ERR_OK;
3574 }
3575 
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos) const3576 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
3577     std::vector<CommonEventInfo> &commonEventInfos) const
3578 {
3579     if (eventKey.empty()) {
3580         APP_LOGW("event key is empty");
3581         return false;
3582     }
3583     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3584     if (bundleInfos_.empty()) {
3585         APP_LOGW("bundleInfos_ data is empty");
3586         return false;
3587     }
3588     for (const auto &item : bundleInfos_) {
3589         const InnerBundleInfo &info = item.second;
3590         if (info.IsDisabled()) {
3591             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3592             continue;
3593         }
3594         info.GetCommonEvents(eventKey, commonEventInfos);
3595     }
3596     if (commonEventInfos.size() == 0) {
3597         APP_LOGW("commonEventInfos is empty");
3598         return false;
3599     }
3600     APP_LOGE("commonEventInfos find success");
3601     return true;
3602 }
3603 
SavePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)3604 bool BundleDataMgr::SavePreInstallBundleInfo(
3605     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
3606 {
3607     if (preInstallDataStorage_ == nullptr) {
3608         return false;
3609     }
3610 
3611     if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
3612         APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
3613         return true;
3614     }
3615 
3616     return false;
3617 }
3618 
DeletePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)3619 bool BundleDataMgr::DeletePreInstallBundleInfo(
3620     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
3621 {
3622     if (preInstallDataStorage_ == nullptr) {
3623         return false;
3624     }
3625 
3626     if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
3627         APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
3628         return true;
3629     }
3630 
3631     return false;
3632 }
3633 
GetPreInstallBundleInfo(const std::string & bundleName,PreInstallBundleInfo & preInstallBundleInfo)3634 bool BundleDataMgr::GetPreInstallBundleInfo(
3635     const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
3636 {
3637     if (bundleName.empty()) {
3638         APP_LOGW("bundleName is empty");
3639         return false;
3640     }
3641     if (preInstallDataStorage_ == nullptr) {
3642         return false;
3643     }
3644     if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
3645         APP_LOGW("get preInstall bundleInfo failed by bundle(%{public}s).", bundleName.c_str());
3646         return false;
3647     }
3648     return true;
3649 }
3650 
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> & preInstallBundleInfos)3651 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
3652 {
3653     if (preInstallDataStorage_ == nullptr) {
3654         return false;
3655     }
3656 
3657     if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
3658         APP_LOGD("load all storage success");
3659         return true;
3660     }
3661 
3662     return false;
3663 }
3664 
SaveInnerBundleInfo(const InnerBundleInfo & info) const3665 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
3666 {
3667     APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
3668     if (dataStorage_->SaveStorageBundleInfo(info)) {
3669         APP_LOGD("save install InnerBundleInfo successfully");
3670         return true;
3671     }
3672     APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
3673     return false;
3674 }
3675 
GetInnerBundleUserInfoByUserId(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo) const3676 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
3677     int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
3678 {
3679     APP_LOGD("get user info start: bundleName: (%{public}s)  userId: (%{public}d) ",
3680         bundleName.c_str(), userId);
3681     int32_t requestUserId = GetUserId(userId);
3682     if (requestUserId == Constants::INVALID_USERID) {
3683         return false;
3684     }
3685 
3686     if (bundleName.empty()) {
3687         APP_LOGW("bundle name is empty");
3688         return false;
3689     }
3690 
3691     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3692     if (bundleInfos_.empty()) {
3693         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
3694         return false;
3695     }
3696 
3697     auto infoItem = bundleInfos_.find(bundleName);
3698     if (infoItem == bundleInfos_.end()) {
3699         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
3700         return false;
3701     }
3702     if (infoItem->second.IsDisabled()) {
3703         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
3704         return false;
3705     }
3706 
3707     return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
3708 }
3709 
GetUserId(int32_t userId) const3710 int32_t BundleDataMgr::GetUserId(int32_t userId) const
3711 {
3712     if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
3713         return userId;
3714     }
3715 
3716     if (userId == Constants::UNSPECIFIED_USERID) {
3717         userId = GetUserIdByCallingUid();
3718     }
3719 
3720     if (!HasUserId(userId)) {
3721         APP_LOGD("user is not existed.");
3722         userId = Constants::INVALID_USERID;
3723     }
3724 
3725     return userId;
3726 }
3727 
GetUserIdByUid(int32_t uid) const3728 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
3729 {
3730     return BundleUtil::GetUserIdByUid(uid);
3731 }
3732 
AddUserId(int32_t userId)3733 void BundleDataMgr::AddUserId(int32_t userId)
3734 {
3735     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
3736     auto item = multiUserIdsSet_.find(userId);
3737     if (item != multiUserIdsSet_.end()) {
3738         return;
3739     }
3740 
3741     multiUserIdsSet_.insert(userId);
3742 }
3743 
RemoveUserId(int32_t userId)3744 void BundleDataMgr::RemoveUserId(int32_t userId)
3745 {
3746     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
3747     auto item = multiUserIdsSet_.find(userId);
3748     if (item == multiUserIdsSet_.end()) {
3749         return;
3750     }
3751 
3752     multiUserIdsSet_.erase(item);
3753 }
3754 
HasUserId(int32_t userId) const3755 bool BundleDataMgr::HasUserId(int32_t userId) const
3756 {
3757     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
3758     return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
3759 }
3760 
GetUserIdByCallingUid() const3761 int32_t BundleDataMgr::GetUserIdByCallingUid() const
3762 {
3763     return BundleUtil::GetUserIdByCallingUid();
3764 }
3765 
GetAllUser() const3766 std::set<int32_t> BundleDataMgr::GetAllUser() const
3767 {
3768     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
3769     return multiUserIdsSet_;
3770 }
3771 
GetInnerBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos) const3772 bool BundleDataMgr::GetInnerBundleUserInfos(
3773     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
3774 {
3775     APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
3776     if (bundleName.empty()) {
3777         APP_LOGW("bundle name is empty");
3778         return false;
3779     }
3780 
3781     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3782     if (bundleInfos_.empty()) {
3783         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
3784         return false;
3785     }
3786 
3787     auto infoItem = bundleInfos_.find(bundleName);
3788     if (infoItem == bundleInfos_.end()) {
3789         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
3790         return false;
3791     }
3792     if (infoItem->second.IsDisabled()) {
3793         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
3794         return false;
3795     }
3796 
3797     for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
3798         innerBundleUserInfos.emplace_back(userInfo.second);
3799     }
3800 
3801     return !innerBundleUserInfos.empty();
3802 }
3803 
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)3804 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
3805 {
3806     APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
3807     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3808     InnerBundleInfo info;
3809     if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
3810         return Constants::EMPTY_STRING;
3811     }
3812 
3813     return info.GetAppPrivilegeLevel();
3814 }
3815 
QueryExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const3816 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
3817     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
3818 {
3819     int32_t requestUserId = GetUserId(userId);
3820     if (requestUserId == Constants::INVALID_USERID) {
3821         return false;
3822     }
3823 
3824     ElementName element = want.GetElement();
3825     std::string bundleName = element.GetBundleName();
3826     std::string extensionName = element.GetAbilityName();
3827     APP_LOGD("bundle name:%{public}s, extension name:%{public}s",
3828         bundleName.c_str(), extensionName.c_str());
3829     // explicit query
3830     if (!bundleName.empty() && !extensionName.empty()) {
3831         ExtensionAbilityInfo info;
3832         bool ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
3833         if (!ret) {
3834             APP_LOGD("explicit queryExtensionInfo error, bundleName:%{public}s, extensionName:%{public}s",
3835                 bundleName.c_str(), extensionName.c_str());
3836             return false;
3837         }
3838         extensionInfos.emplace_back(info);
3839         return true;
3840     }
3841 
3842     bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
3843     if (!ret) {
3844         APP_LOGD("implicit queryExtensionAbilityInfos error, action:%{public}s, uri:%{private}s, type:%{public}s",
3845             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
3846         return false;
3847     }
3848     if (extensionInfos.size() == 0) {
3849         APP_LOGW("no matching abilityInfo, action:%{public}s, uri:%{private}s, type:%{public}s",
3850             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
3851         return false;
3852     }
3853     APP_LOGD("query extensionAbilityInfo successfully");
3854     return true;
3855 }
3856 
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const3857 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
3858     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
3859 {
3860     int32_t requestUserId = GetUserId(userId);
3861     if (requestUserId == Constants::INVALID_USERID) {
3862         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3863     }
3864 
3865     ElementName element = want.GetElement();
3866     std::string bundleName = element.GetBundleName();
3867     std::string extensionName = element.GetAbilityName();
3868     APP_LOGD("bundle name:%{public}s, extension name:%{public}s",
3869         bundleName.c_str(), extensionName.c_str());
3870     // explicit query
3871     if (!bundleName.empty() && !extensionName.empty()) {
3872         ExtensionAbilityInfo info;
3873         ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
3874         if (ret != ERR_OK) {
3875             APP_LOGD("explicit queryExtensionInfo error");
3876             return ret;
3877         }
3878         extensionInfos.emplace_back(info);
3879         return ERR_OK;
3880     }
3881     ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
3882     if (ret != ERR_OK) {
3883         APP_LOGD("ImplicitQueryExtensionInfosV9 error");
3884         return ret;
3885     }
3886     if (extensionInfos.empty()) {
3887         APP_LOGW("no matching abilityInfo");
3888         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3889     }
3890     APP_LOGD("QueryExtensionAbilityInfosV9 success");
3891     return ERR_OK;
3892 }
3893 
QueryExtensionAbilityInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const3894 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
3895     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
3896 {
3897     int32_t requestUserId = GetUserId(userId);
3898     if (requestUserId == Constants::INVALID_USERID) {
3899         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3900     }
3901 
3902     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3903     ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
3904     if (ret != ERR_OK) {
3905         APP_LOGD("QueryExtensionAbilityInfos error");
3906         return ret;
3907     }
3908     if (extensionInfos.empty()) {
3909         APP_LOGW("no matching abilityInfo");
3910         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3911     }
3912     APP_LOGD("QueryExtensionAbilityInfos success");
3913     return ERR_OK;
3914 }
3915 
ExplicitQueryExtensionInfo(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const3916 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
3917     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
3918 {
3919     ElementName element = want.GetElement();
3920     std::string bundleName = element.GetBundleName();
3921     std::string moduleName = element.GetModuleName();
3922     std::string extensionName = element.GetAbilityName();
3923     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
3924         bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
3925     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
3926     int32_t requestUserId = GetUserId(userId);
3927     if (requestUserId == Constants::INVALID_USERID) {
3928         return false;
3929     }
3930     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3931     InnerBundleInfo innerBundleInfo;
3932     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
3933         APP_LOGW("ExplicitQueryExtensionInfo failed");
3934         return false;
3935     }
3936     if (appIndex > 0) {
3937         if (sandboxAppHelper_ == nullptr) {
3938             APP_LOGW("sandboxAppHelper_ is nullptr");
3939             return false;
3940         }
3941         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
3942         if (ret != ERR_OK) {
3943             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d", ret);
3944             return false;
3945         }
3946     }
3947     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
3948     if (!extension) {
3949         APP_LOGW("extensionAbility not found or disabled");
3950         return false;
3951     }
3952     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
3953         extension->permissions.clear();
3954     }
3955     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
3956         extension->metadata.clear();
3957     }
3958     extensionInfo = (*extension);
3959     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
3960         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3961         innerBundleInfo.GetApplicationInfo(
3962             ApplicationFlag::GET_BASIC_APPLICATION_INFO |
3963             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
3964             extensionInfo.applicationInfo);
3965     }
3966     return true;
3967 }
3968 
ExplicitQueryExtensionInfoV9(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const3969 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
3970     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
3971 {
3972     ElementName element = want.GetElement();
3973     std::string bundleName = element.GetBundleName();
3974     std::string moduleName = element.GetModuleName();
3975     std::string extensionName = element.GetAbilityName();
3976     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
3977         bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
3978     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
3979     int32_t requestUserId = GetUserId(userId);
3980     if (requestUserId == Constants::INVALID_USERID) {
3981         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3982     }
3983     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3984     InnerBundleInfo innerBundleInfo;
3985     if (appIndex == 0) {
3986         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
3987         if (ret != ERR_OK) {
3988             APP_LOGD("ExplicitQueryExtensionInfoV9 failed");
3989             return ret;
3990         }
3991     }
3992     if (appIndex > 0) {
3993         if (sandboxAppHelper_ == nullptr) {
3994             APP_LOGW("sandboxAppHelper_ is nullptr");
3995             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3996         }
3997         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
3998         if (ret != ERR_OK) {
3999             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d", ret);
4000             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4001         }
4002     }
4003     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
4004     if (!extension) {
4005         APP_LOGW("extensionAbility not found or disabled");
4006         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4007     }
4008     if ((static_cast<uint32_t>(flags) &
4009         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
4010         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
4011         extension->permissions.clear();
4012     }
4013     if ((static_cast<uint32_t>(flags) &
4014         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
4015         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
4016         extension->metadata.clear();
4017     }
4018     extensionInfo = (*extension);
4019     if ((static_cast<uint32_t>(flags) &
4020         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
4021         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
4022         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4023         innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(
4024             GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), responseUserId, extensionInfo.applicationInfo);
4025     }
4026     // set uid for NAPI cache use
4027     InnerBundleUserInfo innerBundleUserInfo;
4028     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
4029         extensionInfo.uid = innerBundleUserInfo.uid;
4030     }
4031     return ERR_OK;
4032 }
4033 
FilterExtensionAbilityInfosByModuleName(const std::string & moduleName,std::vector<ExtensionAbilityInfo> & extensionInfos) const4034 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
4035     std::vector<ExtensionAbilityInfo> &extensionInfos) const
4036 {
4037     APP_LOGD("BundleDataMgr::FilterExtensionAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
4038     if (moduleName.empty()) {
4039         return;
4040     }
4041     for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
4042         if (iter->moduleName != moduleName) {
4043             iter = extensionInfos.erase(iter);
4044         } else {
4045             ++iter;
4046         }
4047     }
4048 }
4049 
ImplicitQueryExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const4050 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
4051     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
4052 {
4053     if (want.GetAction().empty() && want.GetEntities().empty()
4054         && want.GetUriString().empty() && want.GetType().empty()) {
4055         APP_LOGW("param invalid");
4056         return false;
4057     }
4058     APP_LOGD("action:%{public}s, uri:%{private}s, type:%{public}s",
4059         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
4060     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
4061 
4062     int32_t requestUserId = GetUserId(userId);
4063     if (requestUserId == Constants::INVALID_USERID) {
4064         return false;
4065     }
4066     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4067     std::string bundleName = want.GetElement().GetBundleName();
4068     if (!bundleName.empty()) {
4069         // query in current bundle
4070         if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
4071             APP_LOGD("ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s", bundleName.c_str());
4072             return false;
4073         }
4074     } else {
4075         // query all
4076         ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
4077     }
4078     // sort by priority, descending order.
4079     if (extensionInfos.size() > 1) {
4080         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
4081             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
4082     }
4083     return true;
4084 }
4085 
ImplicitQueryExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const4086 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
4087     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
4088 {
4089     if (want.GetAction().empty() && want.GetEntities().empty()
4090         && want.GetUriString().empty() && want.GetType().empty()) {
4091         APP_LOGW("param invalid");
4092         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4093     }
4094     APP_LOGD("action:%{public}s, uri:%{private}s, type:%{public}s",
4095         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
4096     APP_LOGD("flags:%{public}d, userId:%{public}d", flags, userId);
4097 
4098     int32_t requestUserId = GetUserId(userId);
4099     if (requestUserId == Constants::INVALID_USERID) {
4100         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4101     }
4102     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4103     std::string bundleName = want.GetElement().GetBundleName();
4104     if (!bundleName.empty()) {
4105         // query in current bundle
4106         ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
4107         if (ret != ERR_OK) {
4108             APP_LOGD("ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s", bundleName.c_str());
4109             return ret;
4110         }
4111     } else {
4112         // query all
4113         ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
4114     }
4115     // sort by priority, descending order.
4116     if (extensionInfos.size() > 1) {
4117         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
4118             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
4119     }
4120     return ERR_OK;
4121 }
4122 
ImplicitQueryCurExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const4123 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
4124     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
4125 {
4126     APP_LOGD("begin to ImplicitQueryCurExtensionInfos");
4127     std::string bundleName = want.GetElement().GetBundleName();
4128     InnerBundleInfo innerBundleInfo;
4129     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
4130         APP_LOGD("ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s", bundleName.c_str());
4131         return false;
4132     }
4133     if (appIndex > 0) {
4134         if (sandboxAppHelper_ == nullptr) {
4135             APP_LOGW("sandboxAppHelper_ is nullptr");
4136             return false;
4137         }
4138         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
4139         if (ret != ERR_OK) {
4140             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d", ret);
4141             return false;
4142         }
4143     }
4144     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
4145     GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
4146     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
4147     APP_LOGD("finish to ImplicitQueryCurExtensionInfos");
4148     return true;
4149 }
4150 
ImplicitQueryCurExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const4151 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
4152     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
4153 {
4154     APP_LOGD("begin to ImplicitQueryCurExtensionInfosV9");
4155     std::string bundleName = want.GetElement().GetBundleName();
4156     InnerBundleInfo innerBundleInfo;
4157     if (appIndex == 0) {
4158         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
4159         if (ret != ERR_OK) {
4160             APP_LOGW("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
4161             return ret;
4162         }
4163     }
4164     if (appIndex > 0) {
4165         if (sandboxAppHelper_ == nullptr) {
4166             APP_LOGW("sandboxAppHelper_ is nullptr");
4167             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4168         }
4169         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
4170         if (ret != ERR_OK) {
4171             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d", ret);
4172             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4173         }
4174     }
4175     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
4176     GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
4177     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
4178     APP_LOGD("finish to ImplicitQueryCurExtensionInfosV9");
4179     return ERR_OK;
4180 }
4181 
ImplicitQueryAllExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const4182 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
4183     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
4184 {
4185     APP_LOGD("begin to ImplicitQueryAllExtensionInfos");
4186     int32_t requestUserId = GetUserId(userId);
4187     if (requestUserId == Constants::INVALID_USERID) {
4188         APP_LOGE("invalid userId, userId:%{public}d", userId);
4189         return;
4190     }
4191 
4192     // query from bundleInfos_
4193     if (appIndex == 0) {
4194         for (const auto &item : bundleInfos_) {
4195             const InnerBundleInfo &innerBundleInfo = item.second;
4196             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4197             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
4198                 continue;
4199             }
4200             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
4201         }
4202     } else {
4203         // query from sandbox manager for sandbox bundle
4204         if (sandboxAppHelper_ == nullptr) {
4205             APP_LOGW("sandboxAppHelper_ is nullptr");
4206             return;
4207         }
4208         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
4209         for (const auto &item : sandboxMap) {
4210             InnerBundleInfo info;
4211             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
4212             if (pos == std::string::npos) {
4213                 APP_LOGW("sandbox map contains invalid element");
4214                 continue;
4215             }
4216             std::string innerBundleName = item.first.substr(pos + 1);
4217             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
4218                 APP_LOGD("obtain innerBundleInfo of sandbox app failed");
4219                 continue;
4220             }
4221 
4222             int32_t responseUserId = info.GetResponseUserId(userId);
4223             GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
4224         }
4225     }
4226     APP_LOGD("finish to ImplicitQueryAllExtensionInfos");
4227 }
4228 
ImplicitQueryAllExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const4229 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
4230     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
4231 {
4232     APP_LOGD("begin to ImplicitQueryAllExtensionInfosV9");
4233     // query from bundleInfos_
4234     if (appIndex == 0) {
4235         for (const auto &item : bundleInfos_) {
4236             InnerBundleInfo innerBundleInfo;
4237             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
4238             if (ret != ERR_OK) {
4239                 APP_LOGD("ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s", item.first.c_str());
4240                 continue;
4241             }
4242             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
4243             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
4244         }
4245     } else {
4246         // query from sandbox manager for sandbox bundle
4247         if (sandboxAppHelper_ == nullptr) {
4248             APP_LOGW("sandboxAppHelper_ is nullptr");
4249             return;
4250         }
4251         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
4252         for (const auto &item : sandboxMap) {
4253             InnerBundleInfo info;
4254             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
4255             if (pos == std::string::npos) {
4256                 APP_LOGW("sandbox map contains invalid element");
4257                 continue;
4258             }
4259             std::string innerBundleName = item.first.substr(pos + 1);
4260             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
4261                 APP_LOGD("obtain innerBundleInfo of sandbox app failed");
4262                 continue;
4263             }
4264 
4265             int32_t responseUserId = info.GetResponseUserId(userId);
4266             GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
4267         }
4268     }
4269     APP_LOGD("finish to ImplicitQueryAllExtensionInfosV9");
4270 }
4271 
ImplicitQueryAllExtensionInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const4272 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
4273     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
4274 {
4275     APP_LOGD("begin to ImplicitQueryAllExtensionInfos");
4276     // query from bundleInfos_
4277     if (appIndex == 0) {
4278         for (const auto &item : bundleInfos_) {
4279             InnerBundleInfo innerBundleInfo;
4280             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
4281             if (ret != ERR_OK) {
4282                 APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", item.first.c_str());
4283                 continue;
4284             }
4285             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
4286             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
4287         }
4288     } else {
4289         // query from sandbox manager for sandbox bundle
4290         if (sandboxAppHelper_ == nullptr) {
4291             APP_LOGW("sandboxAppHelper_ is nullptr");
4292             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4293         }
4294         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
4295         for (const auto &item : sandboxMap) {
4296             InnerBundleInfo info;
4297             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
4298             if (pos == std::string::npos) {
4299                 APP_LOGW("sandbox map contains invalid element");
4300                 continue;
4301             }
4302             std::string innerBundleName = item.first.substr(pos + 1);
4303             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
4304                 APP_LOGD("obtain innerBundleInfo of sandbox app failed");
4305                 continue;
4306             }
4307             int32_t responseUserId = info.GetResponseUserId(userId);
4308             GetAllExtensionInfos(flags, responseUserId, info, infos);
4309         }
4310     }
4311     APP_LOGD("finish to ImplicitQueryAllExtensionInfos");
4312     return ERR_OK;
4313 }
4314 
GetMatchExtensionInfos(const Want & want,int32_t flags,const int32_t & userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos) const4315 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
4316     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos) const
4317 {
4318     auto extensionSkillInfos = info.GetExtensionSkillInfos();
4319     auto extensionInfos = info.GetInnerExtensionInfos();
4320     for (const auto &skillInfos : extensionSkillInfos) {
4321         for (const auto &skill : skillInfos.second) {
4322             if (!skill.Match(want)) {
4323                 continue;
4324             }
4325             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
4326                 APP_LOGW("cannot find the extension info with %{public}s", skillInfos.first.c_str());
4327                 break;
4328             }
4329             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
4330             AddExtensionSkillUrisInfo(flags, skill, extensionInfo);
4331             if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) ==
4332                 GET_ABILITY_INFO_WITH_APPLICATION) {
4333                 info.GetApplicationInfo(
4334                     ApplicationFlag::GET_BASIC_APPLICATION_INFO |
4335                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
4336                     extensionInfo.applicationInfo);
4337             }
4338             if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) !=
4339                 GET_ABILITY_INFO_WITH_PERMISSION) {
4340                 extensionInfo.permissions.clear();
4341             }
4342             if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
4343                 extensionInfo.metadata.clear();
4344             }
4345             infos.emplace_back(extensionInfo);
4346             break;
4347         }
4348     }
4349 }
4350 
AddExtensionSkillUrisInfo(int32_t flags,const Skill & skill,ExtensionAbilityInfo & extensionAbilityInfo) const4351 void BundleDataMgr::AddExtensionSkillUrisInfo(int32_t flags, const Skill &skill,
4352     ExtensionAbilityInfo &extensionAbilityInfo) const
4353 {
4354     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL_URI) == GET_ABILITY_INFO_WITH_SKILL_URI) {
4355         std::vector<SkillUriForAbilityAndExtension> skillUriTmp;
4356         for (const SkillUri &uri : skill.uris) {
4357             SkillUriForAbilityAndExtension skillinfo;
4358             skillinfo.scheme = uri.scheme;
4359             skillinfo.host = uri.host;
4360             skillinfo.port = uri.port;
4361             skillinfo.path = uri.path;
4362             skillinfo.pathStartWith = uri.pathStartWith;
4363             skillinfo.pathRegex = uri.pathRegex;
4364             skillinfo.type = uri.type;
4365             skillinfo.utd = uri.utd;
4366             skillinfo.maxFileSupported = uri.maxFileSupported;
4367             skillUriTmp.emplace_back(skillinfo);
4368         }
4369         extensionAbilityInfo.skillUri = skillUriTmp;
4370     }
4371 }
4372 
EmplaceExtensionInfo(const InnerBundleInfo & info,ExtensionAbilityInfo & extensionInfo,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const4373 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, ExtensionAbilityInfo &extensionInfo,
4374     int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos) const
4375 {
4376     if ((static_cast<uint32_t>(flags) &
4377         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
4378         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
4379         info.GetApplicationInfoV9(static_cast<int32_t>(
4380             GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo);
4381     }
4382     if ((static_cast<uint32_t>(flags) &
4383         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
4384         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
4385         extensionInfo.permissions.clear();
4386     }
4387     if ((static_cast<uint32_t>(flags) &
4388         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
4389         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
4390         extensionInfo.metadata.clear();
4391     }
4392     infos.emplace_back(extensionInfo);
4393 }
4394 
GetMatchExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos) const4395 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
4396     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos) const
4397 {
4398     auto extensionSkillInfos = info.GetExtensionSkillInfos();
4399     auto extensionInfos = info.GetInnerExtensionInfos();
4400     for (const auto &skillInfos : extensionSkillInfos) {
4401         if (want.GetAction() == SHARE_ACTION) {
4402             if (!MatchShare(want, skillInfos.second)) {
4403                 continue;
4404             }
4405             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
4406                 APP_LOGW("cannot find the extension info with %{public}s", skillInfos.first.c_str());
4407                 continue;
4408             }
4409             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
4410             EmplaceExtensionInfo(info, extensionInfo, flags, userId, infos);
4411             continue;
4412         }
4413         for (const auto &skill : skillInfos.second) {
4414             if (!skill.Match(want)) {
4415                 continue;
4416             }
4417             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
4418                 APP_LOGW("cannot find the extension info with %{public}s", skillInfos.first.c_str());
4419                 break;
4420             }
4421             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
4422             EmplaceExtensionInfo(info, extensionInfo, flags, userId, infos);
4423             break;
4424         }
4425     }
4426 }
4427 
GetAllExtensionInfos(uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos) const4428 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
4429     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos) const
4430 {
4431     auto extensionInfos = info.GetInnerExtensionInfos();
4432     for (const auto &extensionAbilityInfo : extensionInfos) {
4433         ExtensionAbilityInfo extensionInfo = extensionAbilityInfo.second;
4434         if ((flags &
4435             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
4436             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
4437             info.GetApplicationInfoV9(static_cast<int32_t>(
4438                 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo);
4439         }
4440         if ((flags &
4441             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
4442             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
4443             extensionInfo.permissions.clear();
4444         }
4445         if ((flags &
4446             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
4447             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
4448             extensionInfo.metadata.clear();
4449         }
4450         infos.emplace_back(extensionInfo);
4451     }
4452 }
4453 
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos) const4454 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
4455     std::vector<ExtensionAbilityInfo> &extensionInfos) const
4456 {
4457     int32_t requestUserId = GetUserId(userId);
4458     if (requestUserId == Constants::INVALID_USERID) {
4459         return false;
4460     }
4461     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4462     for (const auto &item : bundleInfos_) {
4463         const InnerBundleInfo &innerBundleInfo = item.second;
4464         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4465         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
4466             continue;
4467         }
4468         auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
4469         for (const auto &info : innerExtensionInfos) {
4470             if (info.second.type == extensionType) {
4471                 ExtensionAbilityInfo extensionAbilityInfo = info.second;
4472                 innerBundleInfo.GetApplicationInfo(
4473                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
4474                     extensionAbilityInfo.applicationInfo);
4475                 extensionInfos.emplace_back(extensionAbilityInfo);
4476             }
4477         }
4478     }
4479     return true;
4480 }
4481 
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo) const4482 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
4483     ExtensionAbilityInfo &extensionAbilityInfo) const
4484 {
4485     int32_t requestUserId = GetUserId(userId);
4486     if (requestUserId == Constants::INVALID_USERID) {
4487         APP_LOGW("invalid userId -1");
4488         return false;
4489     }
4490     if (uri.empty()) {
4491         APP_LOGW("uri empty");
4492         return false;
4493     }
4494     std::string convertUri = uri;
4495     // example of valid param uri : fileShare:///com.example.FileShare/person/10
4496     // example of convertUri : fileShare://com.example.FileShare
4497     size_t schemePos = uri.find(Constants::PARAM_URI_SEPARATOR);
4498     if (schemePos != uri.npos) {
4499         // 1. cut string
4500         size_t cutPos = uri.find(Constants::SEPARATOR, schemePos + Constants::PARAM_URI_SEPARATOR_LEN);
4501         if (cutPos != uri.npos) {
4502             convertUri = uri.substr(0, cutPos);
4503         }
4504         // 2. replace :/// with ://
4505         convertUri.replace(schemePos, Constants::PARAM_URI_SEPARATOR_LEN, Constants::URI_SEPARATOR);
4506     } else {
4507         if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
4508             APP_LOGW("invalid uri : %{private}s", uri.c_str());
4509             return false;
4510         }
4511     }
4512     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4513     if (bundleInfos_.empty()) {
4514         APP_LOGW("bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
4515         return false;
4516     }
4517     for (const auto &item : bundleInfos_) {
4518         const InnerBundleInfo &info = item.second;
4519         if (info.IsDisabled()) {
4520             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
4521             continue;
4522         }
4523 
4524         int32_t responseUserId = info.GetResponseUserId(requestUserId);
4525         if (!info.GetApplicationEnabled(responseUserId)) {
4526             continue;
4527         }
4528 
4529         bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
4530         if (!ret) {
4531             continue;
4532         }
4533         info.GetApplicationInfo(
4534             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
4535             extensionAbilityInfo.applicationInfo);
4536         return true;
4537     }
4538     APP_LOGW("QueryExtensionAbilityInfoByUri (%{private}s) failed.", uri.c_str());
4539     return false;
4540 }
4541 
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)4542 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
4543     uint32_t resId, int32_t userId, const std::string &localeInfo)
4544 {
4545     APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
4546 #ifdef GLOBAL_RESMGR_ENABLE
4547     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4548     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
4549         GetResourceManager(bundleName, moduleName, userId);
4550     if (resourceManager == nullptr) {
4551         APP_LOGW("InitResourceManager failed");
4552         return Constants::EMPTY_STRING;
4553     }
4554     std::string label;
4555     OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
4556     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
4557         APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
4558         return Constants::EMPTY_STRING;
4559     }
4560     return label;
4561 #else
4562     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
4563     return Constants::EMPTY_STRING;
4564 #endif
4565 }
4566 
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)4567 std::string BundleDataMgr::GetIconById(
4568     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
4569 {
4570     APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
4571         bundleName.c_str(), moduleName.c_str(), resId, density);
4572 #ifdef GLOBAL_RESMGR_ENABLE
4573     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4574     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
4575         GetResourceManager(bundleName, moduleName, userId);
4576     if (resourceManager == nullptr) {
4577         APP_LOGW("InitResourceManager failed");
4578         return Constants::EMPTY_STRING;
4579     }
4580     std::string base64;
4581     OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
4582     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
4583         APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
4584         return Constants::EMPTY_STRING;
4585     }
4586     return base64;
4587 #else
4588     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
4589     return Constants::EMPTY_STRING;
4590 #endif
4591 }
4592 
4593 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & bundleName,const std::string & moduleName,int32_t userId,const std::string & localeInfo) const4594 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
4595     const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
4596 {
4597     InnerBundleInfo innerBundleInfo;
4598     if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
4599         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4600         return nullptr;
4601     }
4602     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
4603     BundleInfo bundleInfo;
4604     innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
4605     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
4606     for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
4607         std::string moduleResPath;
4608         if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
4609             moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
4610         }
4611         if (!moduleResPath.empty()) {
4612             APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
4613             if (!resourceManager->AddResource(moduleResPath.c_str())) {
4614                 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
4615             }
4616         }
4617     }
4618 
4619     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
4620 #ifdef GLOBAL_I18_ENABLE
4621     std::map<std::string, std::string> configs;
4622     OHOS::Global::I18n::LocaleInfo locale(
4623         localeInfo.empty() ? Global::I18n::LocaleConfig::GetSystemLocale() : localeInfo, configs);
4624     resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
4625 #endif
4626     resourceManager->UpdateResConfig(*resConfig);
4627     return resourceManager;
4628 }
4629 #endif
4630 
GetAllPreInstallBundleInfos()4631 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
4632 {
4633     std::vector<PreInstallBundleInfo> preInstallBundleInfos;
4634     LoadAllPreInstallBundleInfos(preInstallBundleInfos);
4635     return preInstallBundleInfos;
4636 }
4637 
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo) const4638 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
4639     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
4640 {
4641     int32_t requestUserId = GetUserId(userId);
4642     if (requestUserId == Constants::INVALID_USERID) {
4643         APP_LOGW("invalid userId");
4644         return false;
4645     }
4646     std::vector<AbilityInfo> abilityInfos;
4647     bool abilityValid =
4648         ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
4649     std::vector<ExtensionAbilityInfo> extensionInfos;
4650     bool extensionValid =
4651         ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
4652     if (!abilityValid && !extensionValid) {
4653         // both invalid
4654         APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
4655         return false;
4656     }
4657     if (abilityValid && extensionValid) {
4658         // both valid
4659         if (abilityInfos[0].priority >= extensionInfos[0].priority) {
4660             APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
4661             abilityInfo = abilityInfos[0];
4662         } else {
4663             APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
4664                 extensionInfos[0].name.c_str());
4665             extensionInfo = extensionInfos[0];
4666         }
4667     } else if (abilityValid) {
4668         // only ability valid
4669         APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
4670         abilityInfo = abilityInfos[0];
4671     } else {
4672         // only extension valid
4673         APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
4674         extensionInfo = extensionInfos[0];
4675     }
4676     return true;
4677 }
4678 
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos,bool & findDefaultApp)4679 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
4680     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
4681 {
4682     APP_LOGI("want : %{public}s, flags : %{public}d, userId : %{public}d, withDefault(bool) : %{public}d",
4683         want.ToString().c_str(), flags, userId, withDefault);
4684 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
4685     // step1 : find default infos
4686     if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
4687         APP_LOGI("find target default application");
4688         findDefaultApp = true;
4689         return true;
4690     }
4691     // step2 : find backup default infos
4692     if (withDefault &&
4693         DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
4694         APP_LOGI("find target backup default application");
4695         findDefaultApp = true;
4696         return true;
4697     }
4698 #endif
4699     // step3 : implicit query infos
4700     bool abilityRet =
4701         ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
4702     APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
4703 
4704     bool extensionRet =
4705         ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
4706     APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
4707     return abilityRet || extensionRet;
4708 }
4709 
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)4710 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
4711     std::vector<std::string> &dependentModuleNames)
4712 {
4713     APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
4714         bundleName.c_str(), moduleName.c_str());
4715     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4716     auto item = bundleInfos_.find(bundleName);
4717     if (item == bundleInfos_.end()) {
4718         APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
4719         return false;
4720     }
4721     const InnerBundleInfo &innerBundleInfo = item->second;
4722     return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
4723 }
4724 
UpdateRemovable(const std::string & bundleName,bool removable)4725 void BundleDataMgr::UpdateRemovable(
4726     const std::string &bundleName, bool removable)
4727 {
4728     APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
4729     if (bundleName.empty()) {
4730         APP_LOGW("bundleName is empty");
4731         return;
4732     }
4733 
4734     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4735     auto infoItem = bundleInfos_.find(bundleName);
4736     if (infoItem == bundleInfos_.end()) {
4737         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4738         return;
4739     }
4740 
4741     if (infoItem->second.GetRemovable() != removable) {
4742         infoItem->second.UpdateRemovable(true, removable);
4743         SaveInnerBundleInfo(infoItem->second);
4744     }
4745 }
4746 
UpdatePrivilegeCapability(const std::string & bundleName,const ApplicationInfo & appInfo)4747 void BundleDataMgr::UpdatePrivilegeCapability(
4748     const std::string &bundleName, const ApplicationInfo &appInfo)
4749 {
4750     APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
4751     if (bundleName.empty()) {
4752         APP_LOGW("bundleName is empty");
4753         return;
4754     }
4755 
4756     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4757     auto infoItem = bundleInfos_.find(bundleName);
4758     if (infoItem == bundleInfos_.end()) {
4759         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4760         return;
4761     }
4762 
4763     infoItem->second.UpdatePrivilegeCapability(appInfo);
4764 }
4765 
FetchInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)4766 bool BundleDataMgr::FetchInnerBundleInfo(
4767     const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
4768 {
4769     APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
4770     if (bundleName.empty()) {
4771         APP_LOGW("bundleName is empty");
4772         return false;
4773     }
4774 
4775     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4776     auto infoItem = bundleInfos_.find(bundleName);
4777     if (infoItem == bundleInfos_.end()) {
4778         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4779         return false;
4780     }
4781 
4782     innerBundleInfo = infoItem->second;
4783     return true;
4784 }
4785 
4786 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId,const Element & element,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo,std::vector<Skill> & skills) const4787 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
4788     AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
4789 {
4790     APP_LOGD("begin to QueryInfoAndSkillsByElement.");
4791     const std::string& bundleName = element.bundleName;
4792     const std::string& moduleName = element.moduleName;
4793     const std::string& abilityName = element.abilityName;
4794     const std::string& extensionName = element.extensionName;
4795     Want want;
4796     ElementName elementName("", bundleName, abilityName, moduleName);
4797     want.SetElement(elementName);
4798     bool isAbility = !element.abilityName.empty();
4799     bool ret = false;
4800     if (isAbility) {
4801         // get ability info
4802         ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
4803         if (!ret) {
4804             APP_LOGD("ExplicitQueryAbilityInfo failed, abilityName:%{public}s", element.abilityName.c_str());
4805             return false;
4806         }
4807     } else {
4808         // get extension info
4809         elementName.SetAbilityName(extensionName);
4810         want.SetElement(elementName);
4811         ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
4812         if (!ret) {
4813             APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
4814             return false;
4815         }
4816     }
4817 
4818     // get skills info
4819     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4820     if (bundleInfos_.empty()) {
4821         APP_LOGW("bundleInfos_ is empty.");
4822         return false;
4823     }
4824     auto item = bundleInfos_.find(bundleName);
4825     if (item == bundleInfos_.end()) {
4826         APP_LOGW("can't find bundleName : %{public}s.", bundleName.c_str());
4827         return false;
4828     }
4829     const InnerBundleInfo& innerBundleInfo = item->second;
4830     if (isAbility) {
4831         std::string key;
4832         key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
4833         APP_LOGD("begin to find ability skills, key : %{public}s.", key.c_str());
4834         for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
4835             if (infoItem.first == key) {
4836                 skills = infoItem.second;
4837                 APP_LOGD("find ability skills success.");
4838                 break;
4839             }
4840         }
4841     } else {
4842         std::string key;
4843         key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
4844         APP_LOGD("begin to find extension skills, key : %{public}s.", key.c_str());
4845         for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
4846             if (infoItem.first == key) {
4847                 skills = infoItem.second;
4848                 APP_LOGD("find extension skills success.");
4849                 break;
4850             }
4851         }
4852     }
4853     APP_LOGD("QueryInfoAndSkillsByElement success.");
4854     return true;
4855 }
4856 
GetElement(int32_t userId,const ElementName & elementName,Element & element) const4857 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
4858 {
4859     APP_LOGD("begin to GetElement.");
4860     const std::string& bundleName = elementName.GetBundleName();
4861     const std::string& moduleName = elementName.GetModuleName();
4862     const std::string& abilityName = elementName.GetAbilityName();
4863     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
4864         APP_LOGW("bundleName or moduleName or abilityName is empty.");
4865         return false;
4866     }
4867     Want want;
4868     want.SetElement(elementName);
4869     AbilityInfo abilityInfo;
4870     bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
4871     if (ret) {
4872         APP_LOGD("ElementName is ability.");
4873         element.bundleName = bundleName;
4874         element.moduleName = moduleName;
4875         element.abilityName = abilityName;
4876         return true;
4877     }
4878 
4879     ExtensionAbilityInfo extensionInfo;
4880     ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
4881     if (ret) {
4882         APP_LOGD("ElementName is extension.");
4883         element.bundleName = bundleName;
4884         element.moduleName = moduleName;
4885         element.extensionName = abilityName;
4886         return true;
4887     }
4888 
4889     APP_LOGW("ElementName doesn't exist.");
4890     return false;
4891 }
4892 #endif
4893 
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) const4894 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
4895     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
4896 {
4897     APP_LOGI("begin to GetMediaData.");
4898 #ifdef GLOBAL_RESMGR_ENABLE
4899     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4900     int32_t requestUserId = GetUserId(userId);
4901     if (requestUserId == Constants::INVALID_USERID) {
4902         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4903     }
4904     InnerBundleInfo innerBundleInfo;
4905     ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
4906         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
4907     if (errCode != ERR_OK) {
4908         return errCode;
4909     }
4910     AbilityInfo abilityInfo;
4911     errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
4912     if (errCode != ERR_OK) {
4913         return errCode;
4914     }
4915     bool isEnable = false;
4916     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4917     errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
4918     if (errCode != ERR_OK) {
4919         return errCode;
4920     }
4921     if (!isEnable) {
4922         APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
4923         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
4924     }
4925     std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
4926         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
4927     if (resourceManager == nullptr) {
4928         APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
4929         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4930     }
4931     OHOS::Global::Resource::RState ret =
4932         resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
4933     if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
4934         APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
4935         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4936     }
4937     return ERR_OK;
4938 #else
4939     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
4940 #endif
4941 }
4942 
GetStatusCallbackMutex()4943 std::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
4944 {
4945     return callbackMutex_;
4946 }
4947 
GetCallBackList() const4948 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
4949 {
4950     return callbackList_;
4951 }
4952 
UpdateQuickFixInnerBundleInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)4953 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
4954     const InnerBundleInfo &innerBundleInfo)
4955 {
4956     APP_LOGD("to update info:%{public}s", bundleName.c_str());
4957     if (bundleName.empty()) {
4958         APP_LOGW("update info fail, empty bundle name");
4959         return false;
4960     }
4961 
4962     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4963     auto infoItem = bundleInfos_.find(bundleName);
4964     if (infoItem == bundleInfos_.end()) {
4965         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
4966         return false;
4967     }
4968 
4969     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
4970         bundleInfos_.at(bundleName) = innerBundleInfo;
4971         return true;
4972     }
4973     APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
4974     return false;
4975 }
4976 
UpdateInnerBundleInfo(const InnerBundleInfo & innerBundleInfo)4977 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo)
4978 {
4979     std::string bundleName = innerBundleInfo.GetBundleName();
4980     if (bundleName.empty()) {
4981         APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
4982         return false;
4983     }
4984     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
4985     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4986     auto infoItem = bundleInfos_.find(bundleName);
4987     if (infoItem == bundleInfos_.end()) {
4988         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
4989         return false;
4990     }
4991 
4992     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
4993         bundleInfos_.at(bundleName) = innerBundleInfo;
4994         return true;
4995     }
4996     APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
4997     return false;
4998 }
4999 
QueryOverlayInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)5000 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
5001 {
5002     APP_LOGD("start to query overlay innerBundleInfo");
5003     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5004     if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
5005         info = bundleInfos_.at(bundleName);
5006         return true;
5007     }
5008 
5009     APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5010     return false;
5011 }
5012 
SaveOverlayInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)5013 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
5014 {
5015     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5016     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
5017     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
5018         APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
5019         return;
5020     }
5021     bundleInfos_.at(bundleName) = innerBundleInfo;
5022 }
5023 
GetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)5024 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
5025     AppProvisionInfo &appProvisionInfo)
5026 {
5027     if (!HasUserId(userId)) {
5028         APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
5029         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5030     }
5031     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5032     auto infoItem = bundleInfos_.find(bundleName);
5033     if (infoItem == bundleInfos_.end()) {
5034         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5035         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5036     }
5037     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
5038         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
5039         if (responseUserId == Constants::INVALID_USERID) {
5040             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5041         }
5042     }
5043     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
5044         APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed.", bundleName.c_str());
5045         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
5046     }
5047     return ERR_OK;
5048 }
5049 
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas) const5050 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
5051     std::vector<Metadata> &provisionMetadatas) const
5052 {
5053     // Reserved interface
5054     return ERR_OK;
5055 }
5056 
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles) const5057 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
5058 {
5059     APP_LOGD("GetAllSharedBundleInfo");
5060     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5061 
5062     for (const auto& [key, innerBundleInfo] : bundleInfos_) {
5063         if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
5064             continue;
5065         }
5066         SharedBundleInfo sharedBundleInfo;
5067         innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
5068         sharedBundles.emplace_back(sharedBundleInfo);
5069     }
5070 
5071     return ERR_OK;
5072 }
5073 
GetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)5074 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
5075     std::vector<SharedBundleInfo> &sharedBundles)
5076 {
5077     APP_LOGD("GetSharedBundleInfo");
5078     if (bundleName.empty() || moduleName.empty()) {
5079         APP_LOGW("bundleName or moduleName is empty");
5080         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
5081     }
5082 
5083     std::vector<Dependency> dependencies;
5084     ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
5085     if (errCode != ERR_OK) {
5086         APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
5087             errCode, bundleName.c_str());
5088         return errCode;
5089     }
5090 
5091     for (const auto& dep : dependencies) {
5092         SharedBundleInfo sharedBundleInfo;
5093         errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
5094         if (errCode != ERR_OK) {
5095             APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
5096                 errCode, bundleName.c_str());
5097             return errCode;
5098         }
5099         sharedBundles.emplace_back(sharedBundleInfo);
5100     }
5101 
5102     return ERR_OK;
5103 }
5104 
GetSharedBundleInfoBySelf(const std::string & bundleName,SharedBundleInfo & sharedBundleInfo)5105 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
5106 {
5107     APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
5108     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5109     auto infoItem = bundleInfos_.find(bundleName);
5110     if (infoItem == bundleInfos_.end()) {
5111         APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
5112             bundleName.c_str());
5113         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5114     }
5115     const InnerBundleInfo &innerBundleInfo = infoItem->second;
5116     if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
5117         APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
5118             bundleName.c_str());
5119         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5120     }
5121     innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
5122     APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
5123     return ERR_OK;
5124 }
5125 
GetSharedDependencies(const std::string & bundleName,const std::string & moduleName,std::vector<Dependency> & dependencies)5126 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
5127     std::vector<Dependency> &dependencies)
5128 {
5129     APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
5130         bundleName.c_str(), moduleName.c_str());
5131     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5132     auto item = bundleInfos_.find(bundleName);
5133     if (item == bundleInfos_.end()) {
5134         APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
5135         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5136     }
5137     const InnerBundleInfo &innerBundleInfo = item->second;
5138     if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
5139         APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
5140         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
5141     }
5142     APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
5143         bundleName.c_str(), moduleName.c_str());
5144     return ERR_OK;
5145 }
5146 
CheckHspVersionIsRelied(int32_t versionCode,const InnerBundleInfo & info) const5147 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
5148 {
5149     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5150     std::string hspBundleName = info.GetBundleName();
5151     if (versionCode == Constants::ALL_VERSIONCODE) {
5152         // uninstall hsp bundle, check other bundle denpendency
5153         return CheckHspBundleIsRelied(hspBundleName);
5154     }
5155     std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
5156     // check whether has higher version
5157     std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
5158     for (const auto &item : versionCodes) {
5159         if (item > static_cast<uint32_t>(versionCode)) {
5160             return false;
5161         }
5162     }
5163     // check other bundle denpendency
5164     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
5165         if (bundleName == hspBundleName) {
5166             continue;
5167         }
5168         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
5169         for (const auto &dependencyItem : dependencyList) {
5170             if (dependencyItem.bundleName == hspBundleName &&
5171                 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
5172                 return true;
5173             }
5174         }
5175     }
5176     return false;
5177 }
5178 
CheckHspBundleIsRelied(const std::string & hspBundleName) const5179 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
5180 {
5181     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
5182         if (bundleName == hspBundleName) {
5183             continue;
5184         }
5185         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
5186         for (const auto &dependencyItem : dependencyList) {
5187             if (dependencyItem.bundleName == hspBundleName) {
5188                 return true;
5189             }
5190         }
5191     }
5192     return false;
5193 }
5194 
GetSharedBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo)5195 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
5196 {
5197     if (bundleName.empty()) {
5198         APP_LOGW("bundleName is empty");
5199         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
5200     }
5201 
5202     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5203     auto infoItem = bundleInfos_.find(bundleName);
5204     if (infoItem == bundleInfos_.end()) {
5205         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5206         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5207     }
5208     const InnerBundleInfo &innerBundleInfo = infoItem->second;
5209     innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
5210     return ERR_OK;
5211 }
5212 
IsPreInstallApp(const std::string & bundleName)5213 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
5214 {
5215     APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
5216     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5217     auto item = bundleInfos_.find(bundleName);
5218     if (item == bundleInfos_.end()) {
5219         APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
5220             bundleName.c_str());
5221         return false;
5222     }
5223     return item->second.GetIsPreInstallApp();
5224 }
5225 
GetProxyDataInfos(const std::string & bundleName,const std::string & moduleName,int32_t userId,std::vector<ProxyData> & proxyDatas) const5226 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
5227     int32_t userId, std::vector<ProxyData> &proxyDatas) const
5228 {
5229     InnerBundleInfo info;
5230     auto ret = GetInnerBundleInfoWithBundleFlagsV9(
5231         bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
5232     if (ret != ERR_OK) {
5233         APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
5234         return ret;
5235     }
5236     return info.GetProxyDataInfos(moduleName, proxyDatas);
5237 }
5238 
GetAllProxyDataInfos(int32_t userId,std::vector<ProxyData> & proxyDatas) const5239 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
5240 {
5241     std::vector<BundleInfo> bundleInfos;
5242     auto ret = GetBundleInfosV9(
5243         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
5244     if (ret != ERR_OK) {
5245         APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
5246         return ret;
5247     }
5248     for (const auto &bundleInfo : bundleInfos) {
5249         for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
5250             proxyDatas.insert(
5251                 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
5252         }
5253     }
5254     return ERR_OK;
5255 }
5256 
GetBundleNameByAppId(const std::string & appId) const5257 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
5258 {
5259     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5260     auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
5261         return appId == pair.second.GetAppId();
5262     });
5263     if (it == bundleInfos_.cend()) {
5264         APP_LOGW("invalid appId, can't find bundleName");
5265         return Constants::EMPTY_STRING;
5266     }
5267     return it->second.GetBundleName();
5268 }
5269 
SetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,AOTCompileStatus aotCompileStatus,uint32_t versionCode)5270 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
5271     AOTCompileStatus aotCompileStatus, uint32_t versionCode)
5272 {
5273     APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
5274         bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
5275     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5276     auto item = bundleInfos_.find(bundleName);
5277     if (item == bundleInfos_.end()) {
5278         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5279         (void)InstalldClient::GetInstance()->RemoveDir(Constants::ARK_CACHE_PATH + bundleName);
5280         return;
5281     }
5282     if (item->second.GetVersionCode() != versionCode) {
5283         APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
5284             versionCode, item->second.GetVersionCode(), bundleName.c_str());
5285         return;
5286     }
5287     item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
5288     std::string abi;
5289     std::string path;
5290     if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
5291         abi = Constants::ARM64_V8A;
5292         path = Constants::ARM64 + Constants::PATH_SEPARATOR;
5293     }
5294     item->second.SetArkNativeFileAbi(abi);
5295     item->second.SetArkNativeFilePath(path);
5296     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
5297         APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
5298     }
5299 }
5300 
ResetAOTFlags()5301 void BundleDataMgr::ResetAOTFlags()
5302 {
5303     APP_LOGI("ResetAOTFlags begin");
5304     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5305     std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
5306         item.second.ResetAOTFlags();
5307         if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
5308             APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
5309         }
5310     });
5311     APP_LOGI("ResetAOTFlags end");
5312 }
5313 
ResetAOTFlagsCommand(const std::string & bundleName)5314 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
5315 {
5316     APP_LOGI("ResetAOTFlagsCommand begin");
5317     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5318     auto item = bundleInfos_.find(bundleName);
5319     if (item == bundleInfos_.end()) {
5320         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
5321         return;
5322     }
5323     item->second.ResetAOTFlags();
5324     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
5325         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
5326         return;
5327     }
5328     APP_LOGI("ResetAOTFlagsCommand end");
5329 }
5330 
ResetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,int32_t triggerMode)5331 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
5332     int32_t triggerMode)
5333 {
5334     APP_LOGI("ResetAOTCompileStatus begin");
5335     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5336     auto item = bundleInfos_.find(bundleName);
5337     if (item == bundleInfos_.end()) {
5338         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
5339         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5340     }
5341     ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
5342     if (ret != ERR_OK) {
5343         return ret;
5344     }
5345     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
5346         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
5347         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
5348     }
5349     APP_LOGI("ResetAOTCompileStatus end");
5350     return ERR_OK;
5351 }
5352 
GetAllBundleName() const5353 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
5354 {
5355     APP_LOGD("GetAllBundleName begin");
5356     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5357     std::vector<std::string> bundleNames;
5358     bundleNames.reserve(bundleInfos_.size());
5359     std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
5360         return item.first;
5361     });
5362     return bundleNames;
5363 }
5364 
QueryInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info) const5365 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
5366 {
5367     APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
5368     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5369     auto item = bundleInfos_.find(bundleName);
5370     if (item == bundleInfos_.end()) {
5371         APP_LOGW("QueryInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
5372         return false;
5373     }
5374     info = item->second;
5375     return true;
5376 }
5377 
GetUserIds(const std::string & bundleName) const5378 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
5379 {
5380     APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
5381     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5382     std::vector<int32_t> userIds;
5383     auto infoItem = bundleInfos_.find(bundleName);
5384     if (infoItem == bundleInfos_.end()) {
5385         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
5386         return userIds;
5387     }
5388     auto userInfos = infoItem->second.GetInnerBundleUserInfos();
5389     std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
5390         return item.second.bundleUserInfo.userId;
5391     });
5392     return userIds;
5393 }
5394 
GetSpecifiedDistributionType(const std::string & bundleName,std::string & specifiedDistributionType)5395 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
5396     const std::string &bundleName, std::string &specifiedDistributionType)
5397 {
5398     APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
5399     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5400     auto infoItem = bundleInfos_.find(bundleName);
5401     if (infoItem == bundleInfos_.end()) {
5402         APP_LOGW("bundleName: %{public}s does not exist", bundleName.c_str());
5403         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5404     }
5405     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
5406         int32_t userId = AccountHelper::GetCurrentActiveUserId();
5407         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
5408         if (responseUserId == Constants::INVALID_USERID) {
5409             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
5410             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5411         }
5412     }
5413     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
5414         specifiedDistributionType)) {
5415         APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed.", bundleName.c_str());
5416         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
5417     }
5418     return ERR_OK;
5419 }
5420 
GetAdditionalInfo(const std::string & bundleName,std::string & additionalInfo)5421 ErrCode BundleDataMgr::GetAdditionalInfo(
5422     const std::string &bundleName, std::string &additionalInfo)
5423 {
5424     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
5425     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5426     auto infoItem = bundleInfos_.find(bundleName);
5427     if (infoItem == bundleInfos_.end()) {
5428         APP_LOGW("bundleName: %{public}s does not exist", bundleName.c_str());
5429         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5430     }
5431     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
5432         int32_t userId = AccountHelper::GetCurrentActiveUserId();
5433         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
5434         if (responseUserId == Constants::INVALID_USERID) {
5435             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
5436             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5437         }
5438     }
5439     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
5440         additionalInfo)) {
5441         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed.", bundleName.c_str());
5442         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
5443     }
5444     return ERR_OK;
5445 }
5446 
SetExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)5447 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
5448     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
5449 {
5450     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5451     auto item = bundleInfos_.find(bundleName);
5452     if (item == bundleInfos_.end()) {
5453         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5454         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5455     }
5456     ErrCode ret;
5457     if (!extName.empty()) {
5458         ret = item->second.SetExtName(moduleName, abilityName, extName);
5459         if (ret != ERR_OK) {
5460             APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
5461             return ret;
5462         }
5463     }
5464     if (!mimeType.empty()) {
5465         ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
5466         if (ret != ERR_OK) {
5467             APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
5468             return ret;
5469         }
5470     }
5471     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
5472         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
5473         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
5474     }
5475     return ERR_OK;
5476 }
5477 
DelExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)5478 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
5479     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
5480 {
5481     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5482     auto item = bundleInfos_.find(bundleName);
5483     if (item == bundleInfos_.end()) {
5484         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5485         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5486     }
5487     ErrCode ret;
5488     if (!extName.empty()) {
5489         ret = item->second.DelExtName(moduleName, abilityName, extName);
5490         if (ret != ERR_OK) {
5491             APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
5492             return ret;
5493         }
5494     }
5495     if (!mimeType.empty()) {
5496         ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
5497         if (ret != ERR_OK) {
5498             APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
5499             return ret;
5500         }
5501     }
5502     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
5503         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
5504         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
5505     }
5506     return ERR_OK;
5507 }
5508 
MatchPrivateType(const Want & want,const std::vector<std::string> & supportExtNames,const std::vector<std::string> & supportMimeTypes) const5509 bool BundleDataMgr::MatchPrivateType(const Want &want,
5510     const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes) const
5511 {
5512     APP_LOGD("MatchPrivateType, uri is %{public}s", want.GetUriString().c_str());
5513     std::string uri = want.GetUriString();
5514     auto suffixIndex = uri.rfind('.');
5515     if (suffixIndex == std::string::npos) {
5516         return false;
5517     }
5518     std::string suffix = uri.substr(suffixIndex + 1);
5519     bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
5520         return extName == suffix;
5521     });
5522     if (supportPrivateType) {
5523         APP_LOGI("uri is a supported private-type file");
5524         return true;
5525     }
5526     std::vector<std::string> mimeTypes;
5527     bool ret = MimeTypeMgr::GetMimeTypeByUri(uri, mimeTypes);
5528     if (!ret) {
5529         return false;
5530     }
5531     auto iter = std::find_first_of(
5532         mimeTypes.begin(), mimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
5533     if (iter != mimeTypes.end()) {
5534         APP_LOGI("uri is a supported mime-type file");
5535         return true;
5536     }
5537     return false;
5538 }
5539 
QueryAppGalleryAbilityName(std::string & bundleName,std::string & abilityName)5540 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
5541 {
5542     APP_LOGD("QueryAppGalleryAbilityName called");
5543     AbilityInfo abilityInfo;
5544     ExtensionAbilityInfo extensionInfo;
5545     Want want;
5546     want.SetAction(FREE_INSTALL_ACTION);
5547     if (!ImplicitQueryInfoByPriority(
5548         want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
5549         APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
5550         return false;
5551     }
5552     if (!abilityInfo.name.empty()) {
5553         bundleName = abilityInfo.bundleName;
5554         abilityName = abilityInfo.name;
5555     } else {
5556         bundleName = extensionInfo.bundleName;
5557         abilityName = extensionInfo.name;
5558     }
5559 
5560     if (bundleName.empty() || abilityName.empty()) {
5561         APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
5562             bundleName.c_str(), abilityName.c_str());
5563         return false;
5564     }
5565     APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
5566         bundleName.c_str(), abilityName.c_str());
5567     return true;
5568 }
5569 
GetJsonProfile(ProfileType profileType,const std::string & bundleName,const std::string & moduleName,std::string & profile,int32_t userId) const5570 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
5571     const std::string &moduleName, std::string &profile, int32_t userId) const
5572 {
5573     APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
5574         profileType, bundleName.c_str(), moduleName.c_str());
5575     int32_t requestUserId = GetUserId(userId);
5576     if (requestUserId == Constants::INVALID_USERID) {
5577         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5578     }
5579     auto mapItem = PROFILE_TYPE_MAP.find(profileType);
5580     if (mapItem == PROFILE_TYPE_MAP.end()) {
5581         APP_LOGE("profileType: %{public}d is invalid", profileType);
5582         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
5583     }
5584     std::string profilePath = mapItem->second;
5585     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5586     const auto &item = bundleInfos_.find(bundleName);
5587     if (item == bundleInfos_.end()) {
5588         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
5589         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5590     }
5591     const InnerBundleInfo &bundleInfo = item->second;
5592     bool isEnabled = false;
5593     int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
5594     ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
5595     if (res != ERR_OK) {
5596         APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
5597         return res;
5598     }
5599     if (!isEnabled) {
5600         APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
5601         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
5602     }
5603     std::string moduleNameTmp = moduleName;
5604     if (moduleName.empty()) {
5605         APP_LOGW("moduleName is empty, try to get profile from entry module");
5606         std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
5607         for (const auto &info : moduleInfos) {
5608             if (info.second.isEntry) {
5609                 moduleNameTmp = info.first;
5610                 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
5611                 break;
5612             }
5613         }
5614     }
5615     auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
5616     if (!moduleInfo) {
5617         APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
5618         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
5619     }
5620     return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
5621 }
5622 
GetJsonProfileByExtractor(const std::string & hapPath,const std::string & profilePath,std::string & profile) const5623 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
5624     const std::string &profilePath, std::string &profile) const
5625 {
5626     APP_LOGD("GetJsonProfileByExtractor called");
5627     BundleExtractor bundleExtractor(hapPath);
5628     if (!bundleExtractor.Init()) {
5629         APP_LOGE("bundle extractor init failed");
5630         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
5631     }
5632     if (!bundleExtractor.HasEntry(profilePath)) {
5633         APP_LOGE("profile not exist");
5634         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
5635     }
5636     std::stringstream profileStream;
5637     if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
5638         APP_LOGE("extract profile failed");
5639         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
5640     }
5641     profile = profileStream.str();
5642     return ERR_OK;
5643 }
5644 
QueryDataGroupInfos(const std::string & bundleName,int32_t userId,std::vector<DataGroupInfo> & infos) const5645 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
5646     std::vector<DataGroupInfo> &infos) const
5647 {
5648     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5649     auto infoItem = bundleInfos_.find(bundleName);
5650     if (infoItem == bundleInfos_.end()) {
5651         APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
5652         return false;
5653     }
5654     auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
5655     for (const auto &item : dataGroupInfos) {
5656         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
5657             [userId](const DataGroupInfo &info) {
5658             return info.userId == userId;
5659         });
5660         if (dataGroupIter != std::end(item.second)) {
5661             infos.push_back(*dataGroupIter);
5662         }
5663     }
5664     return true;
5665 }
5666 
GetGroupDir(const std::string & dataGroupId,std::string & dir,int32_t userId) const5667 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
5668 {
5669     if (userId == Constants::UNSPECIFIED_USERID) {
5670         userId = AccountHelper::GetCurrentActiveUserId();
5671     }
5672     std::string uuid;
5673     if (BundlePermissionMgr::IsSystemApp() &&
5674         BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
5675         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5676         for (const auto &item : bundleInfos_) {
5677             const auto &dataGroupInfos = item.second.GetDataGroupInfos();
5678             auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
5679             if (dataGroupInfosIter == dataGroupInfos.end()) {
5680                 continue;
5681             }
5682             auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
5683                 std::end(dataGroupInfosIter->second),
5684                 [userId](const DataGroupInfo &info) { return info.userId == userId; });
5685             if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
5686                 uuid = dataInUserIter->uuid;
5687                 break;
5688             }
5689         }
5690     } else {
5691         int32_t callingUid = IPCSkeleton::GetCallingUid();
5692         InnerBundleInfo innerBundleInfo;
5693         if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
5694             APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
5695             return false;
5696         }
5697         const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
5698         auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
5699         if (dataGroupInfosIter == dataGroupInfos.end()) {
5700             APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
5701             return false;
5702         }
5703         auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
5704             [userId](const DataGroupInfo &info) {
5705             return info.userId == userId;
5706         });
5707         if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
5708             uuid = dataGroupIter->uuid;
5709         }
5710     }
5711     if (uuid.empty()) {
5712         APP_LOGW("get uuid by data group id failed");
5713         return false;
5714     }
5715     dir = Constants::REAL_DATA_PATH + Constants::PATH_SEPARATOR + std::to_string(userId)
5716         + Constants::DATA_GROUP_PATH + uuid;
5717     APP_LOGD("groupDir: %{private}s", dir.c_str());
5718     return true;
5719 }
5720 
GenerateDataGroupUuidAndUid(DataGroupInfo & dataGroupInfo,int32_t userId,std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap) const5721 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
5722     std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap) const
5723 {
5724     std::set<int32_t> indexList;
5725     for (auto iter = dataGroupIndexMap.begin(); iter != dataGroupIndexMap.end(); iter++) {
5726         indexList.emplace(iter->second.first);
5727     }
5728     int32_t index = DATA_GROUP_INDEX_START;
5729     for (int32_t i = DATA_GROUP_INDEX_START; i < Constants::DATA_GROUP_UID_OFFSET; i++) {
5730         if (indexList.find(i) == indexList.end()) {
5731             index = i;
5732             break;
5733         }
5734     }
5735 
5736     int32_t uid = userId * Constants::BASE_USER_RANGE + index + Constants::DATA_GROUP_UID_OFFSET;
5737     dataGroupInfo.uid = uid;
5738     dataGroupInfo.gid = uid;
5739 
5740     std::string str = BundleUtil::GenerateDataGroupDirName();
5741     dataGroupInfo.uuid = str;
5742     dataGroupIndexMap[dataGroupInfo.dataGroupId] = std::pair<int32_t, std::string>(index, str);
5743 }
5744 
GenerateDataGroupInfos(InnerBundleInfo & innerBundleInfo,const std::vector<std::string> & dataGroupIdList,int32_t userId) const5745 void BundleDataMgr::GenerateDataGroupInfos(InnerBundleInfo &innerBundleInfo,
5746     const std::vector<std::string> &dataGroupIdList, int32_t userId) const
5747 {
5748     APP_LOGD("GenerateDataGroupInfos called for user: %{public}d", userId);
5749     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
5750     if (dataGroupIdList.empty() || bundleInfos_.empty()) {
5751         APP_LOGW("dataGroupIdList or bundleInfos_ data is empty");
5752         return;
5753     }
5754     std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
5755     GetDataGroupIndexMap(dataGroupIndexMap);
5756     for (const std::string &groupId : dataGroupIdList) {
5757         DataGroupInfo dataGroupInfo;
5758         dataGroupInfo.dataGroupId = groupId;
5759         dataGroupInfo.userId = userId;
5760         auto iter = dataGroupIndexMap.find(groupId);
5761         if (iter != dataGroupIndexMap.end()) {
5762             dataGroupInfo.uuid = iter->second.second;
5763             int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + Constants::DATA_GROUP_UID_OFFSET;
5764             dataGroupInfo.uid = uid;
5765             dataGroupInfo.gid = uid;
5766             innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
5767             continue;
5768         }
5769         GenerateDataGroupUuidAndUid(dataGroupInfo, userId, dataGroupIndexMap);
5770         innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
5771     }
5772 }
5773 
GetDataGroupIndexMap(std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap) const5774 void BundleDataMgr::GetDataGroupIndexMap(
5775     std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap) const
5776 {
5777     for (const auto &bundleInfo : bundleInfos_) {
5778         for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
5779             for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
5780                 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
5781                     - Constants::DATA_GROUP_UID_OFFSET;
5782                 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
5783                     std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
5784             });
5785         }
5786     }
5787 }
5788 
IsShareDataGroupId(const std::string & dataGroupId,int32_t userId) const5789 bool BundleDataMgr::IsShareDataGroupId(const std::string &dataGroupId, int32_t userId) const
5790 {
5791     APP_LOGD("IsShareDataGroupId, dataGroupId is %{public}s", dataGroupId.c_str());
5792     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5793     int32_t count = 0;
5794     for (const auto &info : bundleInfos_) {
5795         auto dataGroupInfos = info.second.GetDataGroupInfos();
5796         auto iter = dataGroupInfos.find(dataGroupId);
5797         if (iter == dataGroupInfos.end()) {
5798             continue;
5799         }
5800 
5801         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
5802             [userId](const DataGroupInfo &dataGroupInfo) {
5803             return dataGroupInfo.userId == userId;
5804         });
5805         if (dataGroupIter == std::end(iter->second)) {
5806             continue;
5807         }
5808         count++;
5809         if (count > 1) {
5810             APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
5811             return true;
5812         }
5813     }
5814     return false;
5815 }
5816 
FindAbilityInfoInBundleInfo(const InnerBundleInfo & innerBundleInfo,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo) const5817 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
5818     const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
5819 {
5820     if (moduleName.empty()) {
5821         auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
5822         if (!ability) {
5823             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5824         }
5825         abilityInfo = *ability;
5826         return ERR_OK;
5827     }
5828 
5829     ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
5830     if (ret != ERR_OK) {
5831         APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
5832     }
5833     return ret;
5834 }
5835 
5836 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)5837 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
5838 {
5839     InnerBundleInfo targetInnerBundleInfo;
5840     std::string targetBundleName = newInfo.GetTargetBundleName();
5841     auto targetInfoItem = bundleInfos_.find(targetBundleName);
5842     if (targetInfoItem != bundleInfos_.end()) {
5843         targetInnerBundleInfo = targetInfoItem->second;
5844     }
5845 
5846     if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
5847         APP_LOGW("update overlay info failed");
5848         return false;
5849     }
5850     // storage target bundle info
5851     if (!targetInnerBundleInfo.GetBundleName().empty() &&
5852         dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
5853         bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
5854     }
5855     // build overlay connection for external overlay
5856     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
5857         const auto &moduleInfos = newInfo.GetInnerModuleInfos();
5858         std::string moduleName = (moduleInfos.begin()->second).moduleName;
5859         BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
5860     }
5861     return true;
5862 }
5863 
ResetExternalOverlayModuleState(const std::string & bundleName,const std::string & modulePackage)5864 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
5865 {
5866     for (auto &info : bundleInfos_) {
5867         if (info.second.GetTargetBundleName() != bundleName) {
5868             continue;
5869         }
5870         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
5871         for (const auto &moduleInfo : innerModuleInfos) {
5872             if (moduleInfo.second.targetModuleName == modulePackage) {
5873                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
5874                 break;
5875             }
5876         }
5877         if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
5878             APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
5879         }
5880     }
5881 }
5882 
BuildExternalOverlayConnection(const std::string & moduleName,InnerBundleInfo & oldInfo,int32_t userId)5883 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
5884     int32_t userId)
5885 {
5886     APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
5887         moduleName.c_str(), userId);
5888     for (auto &info : bundleInfos_) {
5889         if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
5890             continue;
5891         }
5892         // check target bundle is preInstall application
5893         if (!oldInfo.GetIsPreInstallApp()) {
5894             APP_LOGW("target bundle is not preInstall application");
5895             return;
5896         }
5897 
5898         // check fingerprint of current bundle with target bundle
5899         if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
5900             APP_LOGW("target bundle has different fingerprint with current bundle");
5901             return;
5902         }
5903         // external overlay does not support FA model
5904         if (!oldInfo.GetIsNewVersion()) {
5905             APP_LOGW("target bundle is not stage model");
5906             return;
5907         }
5908         // external overlay does not support service
5909         if (oldInfo.GetEntryInstallationFree()) {
5910             APP_LOGW("target bundle is service");
5911             return;
5912         }
5913 
5914         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
5915         std::vector<std::string> overlayModuleVec;
5916         for (const auto &moduleInfo : innerModuleInfos) {
5917             if (moduleInfo.second.targetModuleName != moduleName) {
5918                 continue;
5919             }
5920             OverlayModuleInfo overlayModuleInfo;
5921             overlayModuleInfo.bundleName = info.second.GetBundleName();
5922             overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
5923             overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
5924             overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
5925             overlayModuleInfo.priority = moduleInfo.second.targetPriority;
5926             oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
5927             overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
5928         }
5929         std::string bundleDir;
5930         const std::string &moduleHapPath =
5931             info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
5932         OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
5933         OverlayBundleInfo overlayBundleInfo;
5934         overlayBundleInfo.bundleName = info.second.GetBundleName();
5935         overlayBundleInfo.bundleDir = bundleDir;
5936         overlayBundleInfo.state = info.second.GetOverlayState();
5937         overlayBundleInfo.priority = info.second.GetTargetPriority();
5938         oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
5939         auto userSet = GetAllUser();
5940         for (const auto &innerUserId : userSet) {
5941             for (const auto &overlayModule : overlayModuleVec) {
5942                 int32_t state = OverlayState::OVERLAY_INVALID;
5943                 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
5944                 if (state == OverlayState::OVERLAY_INVALID) {
5945                     info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
5946                 }
5947             }
5948             dataStorage_->SaveStorageBundleInfo(info.second);
5949         }
5950     }
5951 }
5952 
RemoveOverlayInfoAndConnection(const InnerBundleInfo & innerBundleInfo,const std::string & bundleName)5953 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
5954     const std::string &bundleName)
5955 {
5956     if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
5957         std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
5958         auto targetInfoItem = bundleInfos_.find(targetBundleName);
5959         if (targetInfoItem == bundleInfos_.end()) {
5960             APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
5961         } else {
5962             InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
5963             OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
5964             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
5965                 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
5966                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
5967             }
5968         }
5969     }
5970 
5971     if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
5972         for (auto &info : bundleInfos_) {
5973             if (info.second.GetTargetBundleName() != bundleName) {
5974                 continue;
5975             }
5976             const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
5977             for (const auto &moduleInfo : innerModuleInfos) {
5978                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
5979             }
5980             dataStorage_->SaveStorageBundleInfo(info.second);
5981         }
5982     }
5983 }
5984 #endif
5985 
GetOldAppIds(const std::string & bundleName,std::vector<std::string> & appIds) const5986 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
5987 {
5988     if (bundleName.empty()) {
5989         APP_LOGE("bundleName is empty.");
5990         return false;
5991     }
5992     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5993     auto innerBundleInfo = bundleInfos_.find(bundleName);
5994     if (innerBundleInfo == bundleInfos_.end()) {
5995         APP_LOGE("can not find bundle %{public}s.", bundleName.c_str());
5996         return false;
5997     }
5998     appIds = innerBundleInfo->second.GetOldAppIds();
5999     return true;
6000 }
6001 
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo & oldInfo,const InnerBundleInfo & newInfo) const6002 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
6003     const InnerBundleInfo &newInfo) const
6004 {
6005     return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
6006         !oldInfo.HasEntry() || oldInfo.GetEntryInstallationFree() || newInfo.HasEntry();
6007 }
6008 
GetModuleNameByBundleAndAbility(const std::string & bundleName,const std::string & abilityName)6009 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
6010     const std::string& bundleName, const std::string& abilityName)
6011 {
6012     if (bundleName.empty() || abilityName.empty()) {
6013         APP_LOGE("bundleName or abilityName is empty");
6014         return std::string();
6015     }
6016     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6017     auto innerBundleInfo = bundleInfos_.find(bundleName);
6018     if (innerBundleInfo == bundleInfos_.end()) {
6019         APP_LOGE("can not find bundle %{public}s.", bundleName.c_str());
6020         return std::string();
6021     }
6022     auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
6023     if (!abilityInfo) {
6024         APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
6025             bundleName.c_str(), abilityName.c_str());
6026         return std::string();
6027     }
6028     return abilityInfo->moduleName;
6029 }
6030 
SetAdditionalInfo(const std::string & bundleName,const std::string & additionalInfo) const6031 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
6032 {
6033     APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
6034     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6035     auto infoItem = bundleInfos_.find(bundleName);
6036     if (infoItem == bundleInfos_.end()) {
6037         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
6038         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6039     }
6040 
6041     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
6042         int32_t userId = AccountHelper::GetCurrentActiveUserId();
6043         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
6044         if (responseUserId == Constants::INVALID_USERID) {
6045             APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
6046             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6047         }
6048     }
6049 
6050     auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
6051     if (appProvisionInfoManager == nullptr) {
6052         APP_LOGE("Failed, appProvisionInfoManager is nullptr.");
6053         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6054     }
6055 
6056     if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
6057         APP_LOGE("BundleName: %{public}s set additional info failed.", bundleName.c_str());
6058         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6059     }
6060 
6061     ElementName element;
6062     element.SetBundleName(bundleName);
6063     OHOS::AAFwk::Want want;
6064     want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
6065     want.SetElement(element);
6066     EventFwk::CommonEventData commonData { want };
6067     NotifyBundleEventCallback(commonData);
6068     return ERR_OK;
6069 }
6070 
GetAppServiceHspBundleInfo(const std::string & bundleName,BundleInfo & bundleInfo)6071 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
6072 {
6073     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
6074     if (bundleName.empty()) {
6075         APP_LOGE("bundleName is empty");
6076         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
6077     }
6078 
6079     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6080     auto infoItem = bundleInfos_.find(bundleName);
6081     if (infoItem == bundleInfos_.end()) {
6082         APP_LOGD("can not find bundle %{public}s", bundleName.c_str());
6083         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
6084     }
6085     const InnerBundleInfo &innerBundleInfo = infoItem->second;
6086     if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) != ERR_OK) {
6087         APP_LOGD("failed");
6088         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
6089     }
6090     return ERR_OK;
6091 }
6092 
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo & innerBundleInfo,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos) const6093 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
6094     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
6095 {
6096     APP_LOGD("start");
6097     BundleInfo bundleInfo;
6098     if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
6099         APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
6100         for (const auto &hapModule : bundleInfo.hapModuleInfos) {
6101             BaseSharedBundleInfo baseSharedBundleInfo;
6102             baseSharedBundleInfo.bundleName = bundleInfo.name;
6103             baseSharedBundleInfo.moduleName = hapModule.moduleName;
6104             baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
6105             baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
6106             baseSharedBundleInfo.hapPath = hapModule.hapPath;
6107             baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
6108             baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
6109             baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
6110         }
6111         return;
6112     }
6113     APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
6114 }
6115 
AddAppHspBundleName(const BundleType type,const std::string & bundleName)6116 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
6117 {
6118     if (type == BundleType::APP_SERVICE_FWK) {
6119         APP_LOGD("add app hsp bundleName:%{pubcli}s", bundleName.c_str());
6120         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
6121         appServiceHspBundleName_.insert(bundleName);
6122     }
6123 }
6124 
CreateBundleDataDir(int32_t userId) const6125 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId) const
6126 {
6127     APP_LOGI("CreateBundleDataDir with userId %{public}d begin", userId);
6128     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6129     std::vector<CreateDirParam> createDirParams;
6130     for (const auto &item : bundleInfos_) {
6131         const InnerBundleInfo &info = item.second;
6132         int32_t responseUserId = info.GetResponseUserId(userId);
6133         if (responseUserId == Constants::INVALID_USERID) {
6134             APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
6135                 info.GetBundleName().c_str(), userId);
6136             continue;
6137         }
6138         CreateDirParam createDirParam;
6139         createDirParam.bundleName = info.GetBundleName();
6140         createDirParam.userId = responseUserId;
6141         createDirParam.uid = info.GetUid(responseUserId);
6142         createDirParam.gid = info.GetGid(responseUserId);
6143         createDirParam.apl = info.GetAppPrivilegeLevel();
6144         createDirParam.isPreInstallApp = info.GetIsPreInstallApp();
6145         createDirParam.debug = info.GetBaseApplicationInfo().debug;
6146         createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
6147         createDirParams.emplace_back(createDirParam);
6148     }
6149     lock.unlock();
6150     auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
6151     APP_LOGI("CreateBundleDataDir result: %{public}d", res);
6152     return res;
6153 }
6154 }  // namespace AppExecFwk
6155 }  // namespace OHOS