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