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