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