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