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