12dc7c57fSopenharmony_ci/* 22dc7c57fSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 32dc7c57fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 42dc7c57fSopenharmony_ci * you may not use this file except in compliance with the License. 52dc7c57fSopenharmony_ci * You may obtain a copy of the License at 62dc7c57fSopenharmony_ci * 72dc7c57fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 82dc7c57fSopenharmony_ci * 92dc7c57fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 102dc7c57fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 112dc7c57fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122dc7c57fSopenharmony_ci * See the License for the specific language governing permissions and 132dc7c57fSopenharmony_ci * limitations under the License. 142dc7c57fSopenharmony_ci */ 152dc7c57fSopenharmony_ci 162dc7c57fSopenharmony_ci#include "bundle_manager_helper.h" 172dc7c57fSopenharmony_ci 182dc7c57fSopenharmony_ci#include "bundle_constants.h" 192dc7c57fSopenharmony_ci#include "bundle_mgr_client.h" 202dc7c57fSopenharmony_ci#include "event_log_wrapper.h" 212dc7c57fSopenharmony_ci#include "ipc_skeleton.h" 222dc7c57fSopenharmony_ci#include "iservice_registry.h" 232dc7c57fSopenharmony_ci#include "nlohmann/json.hpp" 242dc7c57fSopenharmony_ci#include "os_account_manager_helper.h" 252dc7c57fSopenharmony_ci#include "system_ability_definition.h" 262dc7c57fSopenharmony_ci 272dc7c57fSopenharmony_cinamespace OHOS { 282dc7c57fSopenharmony_cinamespace EventFwk { 292dc7c57fSopenharmony_ciconst std::string META_NAME_STATIC_SUBSCRIBER = "ohos.extension.staticSubscriber"; 302dc7c57fSopenharmony_ci 312dc7c57fSopenharmony_ciusing namespace OHOS::AppExecFwk::Constants; 322dc7c57fSopenharmony_ci 332dc7c57fSopenharmony_ciBundleManagerHelper::BundleManagerHelper() : sptrBundleMgr_(nullptr), bmsDeath_(nullptr) 342dc7c57fSopenharmony_ci{} 352dc7c57fSopenharmony_ci 362dc7c57fSopenharmony_ciBundleManagerHelper::~BundleManagerHelper() 372dc7c57fSopenharmony_ci{} 382dc7c57fSopenharmony_ci 392dc7c57fSopenharmony_cistd::string BundleManagerHelper::GetBundleName(const uid_t uid) 402dc7c57fSopenharmony_ci{ 412dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 422dc7c57fSopenharmony_ci 432dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 442dc7c57fSopenharmony_ci std::string bundleName = ""; 452dc7c57fSopenharmony_ci 462dc7c57fSopenharmony_ci if (!GetBundleMgrProxyAsync()) { 472dc7c57fSopenharmony_ci EVENT_LOGE_LIMIT("failed to get bms proxy"); 482dc7c57fSopenharmony_ci return bundleName; 492dc7c57fSopenharmony_ci } 502dc7c57fSopenharmony_ci std::string identity = IPCSkeleton::ResetCallingIdentity(); 512dc7c57fSopenharmony_ci sptrBundleMgr_->GetNameForUid(uid, bundleName); 522dc7c57fSopenharmony_ci IPCSkeleton::SetCallingIdentity(identity); 532dc7c57fSopenharmony_ci return bundleName; 542dc7c57fSopenharmony_ci} 552dc7c57fSopenharmony_ci 562dc7c57fSopenharmony_cibool BundleManagerHelper::QueryExtensionInfos(std::vector<AppExecFwk::ExtensionAbilityInfo> &extensionInfos, 572dc7c57fSopenharmony_ci const int32_t &userId) 582dc7c57fSopenharmony_ci{ 592dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 602dc7c57fSopenharmony_ci 612dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 622dc7c57fSopenharmony_ci 632dc7c57fSopenharmony_ci if (!GetBundleMgrProxy()) { 642dc7c57fSopenharmony_ci EVENT_LOGE("failed to get bms proxy"); 652dc7c57fSopenharmony_ci return false; 662dc7c57fSopenharmony_ci } 672dc7c57fSopenharmony_ci 682dc7c57fSopenharmony_ci return sptrBundleMgr_->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::STATICSUBSCRIBER, 692dc7c57fSopenharmony_ci userId, extensionInfos); 702dc7c57fSopenharmony_ci} 712dc7c57fSopenharmony_ci 722dc7c57fSopenharmony_cibool BundleManagerHelper::QueryExtensionInfos(std::vector<AppExecFwk::ExtensionAbilityInfo> &extensionInfos) 732dc7c57fSopenharmony_ci{ 742dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 752dc7c57fSopenharmony_ci 762dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 772dc7c57fSopenharmony_ci 782dc7c57fSopenharmony_ci if (!GetBundleMgrProxy()) { 792dc7c57fSopenharmony_ci EVENT_LOGE("failed to get bms proxy"); 802dc7c57fSopenharmony_ci return false; 812dc7c57fSopenharmony_ci } 822dc7c57fSopenharmony_ci std::vector<int> osAccountIds; 832dc7c57fSopenharmony_ci if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->QueryActiveOsAccountIds(osAccountIds) != ERR_OK) { 842dc7c57fSopenharmony_ci EVENT_LOGE("failed to QueryActiveOsAccountIds!"); 852dc7c57fSopenharmony_ci return false; 862dc7c57fSopenharmony_ci } 872dc7c57fSopenharmony_ci if (osAccountIds.size() == 0) { 882dc7c57fSopenharmony_ci EVENT_LOGE("no os account acquired!"); 892dc7c57fSopenharmony_ci return false; 902dc7c57fSopenharmony_ci } 912dc7c57fSopenharmony_ci for (auto userId : osAccountIds) { 922dc7c57fSopenharmony_ci EVENT_LOGD("active userId = %{public}d", userId); 932dc7c57fSopenharmony_ci sptrBundleMgr_->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::STATICSUBSCRIBER, 942dc7c57fSopenharmony_ci userId, extensionInfos); 952dc7c57fSopenharmony_ci } 962dc7c57fSopenharmony_ci return true; 972dc7c57fSopenharmony_ci} 982dc7c57fSopenharmony_ci 992dc7c57fSopenharmony_cibool BundleManagerHelper::GetResConfigFile(const AppExecFwk::ExtensionAbilityInfo &extension, 1002dc7c57fSopenharmony_ci std::vector<std::string> &profileInfos) 1012dc7c57fSopenharmony_ci{ 1022dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 1032dc7c57fSopenharmony_ci 1042dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 1052dc7c57fSopenharmony_ci 1062dc7c57fSopenharmony_ci if (!GetBundleMgrProxy()) { 1072dc7c57fSopenharmony_ci EVENT_LOGE("failed to get bms proxy"); 1082dc7c57fSopenharmony_ci return false; 1092dc7c57fSopenharmony_ci } 1102dc7c57fSopenharmony_ci 1112dc7c57fSopenharmony_ci AppExecFwk::BundleMgrClient client; 1122dc7c57fSopenharmony_ci return client.GetResConfigFile(extension, META_NAME_STATIC_SUBSCRIBER, profileInfos); 1132dc7c57fSopenharmony_ci} 1142dc7c57fSopenharmony_ci 1152dc7c57fSopenharmony_cibool BundleManagerHelper::CheckIsSystemAppByUid(const uid_t uid) 1162dc7c57fSopenharmony_ci{ 1172dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 1182dc7c57fSopenharmony_ci 1192dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 1202dc7c57fSopenharmony_ci 1212dc7c57fSopenharmony_ci bool isSystemApp = false; 1222dc7c57fSopenharmony_ci 1232dc7c57fSopenharmony_ci if (!GetBundleMgrProxy()) { 1242dc7c57fSopenharmony_ci EVENT_LOGE("failed to get bms proxy"); 1252dc7c57fSopenharmony_ci return isSystemApp; 1262dc7c57fSopenharmony_ci } 1272dc7c57fSopenharmony_ci 1282dc7c57fSopenharmony_ci isSystemApp = sptrBundleMgr_->CheckIsSystemAppByUid(uid); 1292dc7c57fSopenharmony_ci 1302dc7c57fSopenharmony_ci return isSystemApp; 1312dc7c57fSopenharmony_ci} 1322dc7c57fSopenharmony_ci 1332dc7c57fSopenharmony_cibool BundleManagerHelper::CheckIsSystemAppByBundleName(const std::string &bundleName, const int32_t &userId) 1342dc7c57fSopenharmony_ci{ 1352dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 1362dc7c57fSopenharmony_ci 1372dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 1382dc7c57fSopenharmony_ci 1392dc7c57fSopenharmony_ci bool isSystemApp = false; 1402dc7c57fSopenharmony_ci 1412dc7c57fSopenharmony_ci if (!GetBundleMgrProxy()) { 1422dc7c57fSopenharmony_ci return isSystemApp; 1432dc7c57fSopenharmony_ci } 1442dc7c57fSopenharmony_ci std::string identity = IPCSkeleton::ResetCallingIdentity(); 1452dc7c57fSopenharmony_ci int32_t uid = sptrBundleMgr_->GetUidByBundleName(bundleName, userId); 1462dc7c57fSopenharmony_ci IPCSkeleton::SetCallingIdentity(identity); 1472dc7c57fSopenharmony_ci if (uid < 0) { 1482dc7c57fSopenharmony_ci EVENT_LOGW("get invalid uid from bundle %{public}s of userId %{public}d", bundleName.c_str(), userId); 1492dc7c57fSopenharmony_ci } 1502dc7c57fSopenharmony_ci isSystemApp = sptrBundleMgr_->CheckIsSystemAppByUid(uid); 1512dc7c57fSopenharmony_ci 1522dc7c57fSopenharmony_ci return isSystemApp; 1532dc7c57fSopenharmony_ci} 1542dc7c57fSopenharmony_ci 1552dc7c57fSopenharmony_cibool BundleManagerHelper::GetBundleMgrProxyAsync() 1562dc7c57fSopenharmony_ci{ 1572dc7c57fSopenharmony_ci return GetBundleMgrProxyInner(true); 1582dc7c57fSopenharmony_ci} 1592dc7c57fSopenharmony_ci 1602dc7c57fSopenharmony_cibool BundleManagerHelper::GetBundleMgrProxy() 1612dc7c57fSopenharmony_ci{ 1622dc7c57fSopenharmony_ci return GetBundleMgrProxyInner(false); 1632dc7c57fSopenharmony_ci} 1642dc7c57fSopenharmony_ci 1652dc7c57fSopenharmony_cibool BundleManagerHelper::GetBundleMgrProxyInner(bool isAsync) 1662dc7c57fSopenharmony_ci{ 1672dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 1682dc7c57fSopenharmony_ci sptr<IRemoteObject> remoteObject; 1692dc7c57fSopenharmony_ci 1702dc7c57fSopenharmony_ci if (!sptrBundleMgr_) { 1712dc7c57fSopenharmony_ci sptr<ISystemAbilityManager> systemAbilityManager = 1722dc7c57fSopenharmony_ci SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 1732dc7c57fSopenharmony_ci if (!systemAbilityManager) { 1742dc7c57fSopenharmony_ci EVENT_LOGE("Failed to get system ability mgr."); 1752dc7c57fSopenharmony_ci return false; 1762dc7c57fSopenharmony_ci } 1772dc7c57fSopenharmony_ci 1782dc7c57fSopenharmony_ci if (isAsync) { 1792dc7c57fSopenharmony_ci remoteObject = systemAbilityManager->CheckSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); 1802dc7c57fSopenharmony_ci } else { 1812dc7c57fSopenharmony_ci remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); 1822dc7c57fSopenharmony_ci } 1832dc7c57fSopenharmony_ci 1842dc7c57fSopenharmony_ci if (!remoteObject) { 1852dc7c57fSopenharmony_ci EVENT_LOGE("Failed to get bundle manager service."); 1862dc7c57fSopenharmony_ci return false; 1872dc7c57fSopenharmony_ci } 1882dc7c57fSopenharmony_ci 1892dc7c57fSopenharmony_ci sptrBundleMgr_ = iface_cast<IBundleMgr>(remoteObject); 1902dc7c57fSopenharmony_ci if ((!sptrBundleMgr_) || (!sptrBundleMgr_->AsObject())) { 1912dc7c57fSopenharmony_ci EVENT_LOGE("Failed to get system bundle manager services ability"); 1922dc7c57fSopenharmony_ci return false; 1932dc7c57fSopenharmony_ci } 1942dc7c57fSopenharmony_ci 1952dc7c57fSopenharmony_ci bmsDeath_ = new (std::nothrow) BMSDeathRecipient(); 1962dc7c57fSopenharmony_ci if (!bmsDeath_) { 1972dc7c57fSopenharmony_ci EVENT_LOGE("Failed to create death Recipient ptr BMSDeathRecipient"); 1982dc7c57fSopenharmony_ci return false; 1992dc7c57fSopenharmony_ci } 2002dc7c57fSopenharmony_ci if (!sptrBundleMgr_->AsObject()->AddDeathRecipient(bmsDeath_)) { 2012dc7c57fSopenharmony_ci EVENT_LOGW("Failed to add death recipient"); 2022dc7c57fSopenharmony_ci } 2032dc7c57fSopenharmony_ci } 2042dc7c57fSopenharmony_ci 2052dc7c57fSopenharmony_ci return true; 2062dc7c57fSopenharmony_ci} 2072dc7c57fSopenharmony_ci 2082dc7c57fSopenharmony_civoid BundleManagerHelper::ClearBundleManagerHelper() 2092dc7c57fSopenharmony_ci{ 2102dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 2112dc7c57fSopenharmony_ci 2122dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 2132dc7c57fSopenharmony_ci 2142dc7c57fSopenharmony_ci if ((sptrBundleMgr_ != nullptr) && (sptrBundleMgr_->AsObject() != nullptr)) { 2152dc7c57fSopenharmony_ci sptrBundleMgr_->AsObject()->RemoveDeathRecipient(bmsDeath_); 2162dc7c57fSopenharmony_ci } 2172dc7c57fSopenharmony_ci sptrBundleMgr_ = nullptr; 2182dc7c57fSopenharmony_ci} 2192dc7c57fSopenharmony_ci 2202dc7c57fSopenharmony_cibool BundleManagerHelper::GetApplicationInfos(const AppExecFwk::ApplicationFlag &flag, 2212dc7c57fSopenharmony_ci std::vector<AppExecFwk::ApplicationInfo> &appInfos) 2222dc7c57fSopenharmony_ci{ 2232dc7c57fSopenharmony_ci EVENT_LOGD("enter"); 2242dc7c57fSopenharmony_ci 2252dc7c57fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 2262dc7c57fSopenharmony_ci 2272dc7c57fSopenharmony_ci std::vector<int> osAccountIds {}; 2282dc7c57fSopenharmony_ci if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->QueryActiveOsAccountIds(osAccountIds) != ERR_OK 2292dc7c57fSopenharmony_ci || osAccountIds.empty()) { 2302dc7c57fSopenharmony_ci EVENT_LOGE("failed to QueryActiveOsAccountIds!"); 2312dc7c57fSopenharmony_ci return false; 2322dc7c57fSopenharmony_ci } 2332dc7c57fSopenharmony_ci 2342dc7c57fSopenharmony_ci if (!GetBundleMgrProxy()) { 2352dc7c57fSopenharmony_ci EVENT_LOGE("failed to get bms proxy"); 2362dc7c57fSopenharmony_ci return false; 2372dc7c57fSopenharmony_ci } 2382dc7c57fSopenharmony_ci 2392dc7c57fSopenharmony_ci return sptrBundleMgr_->GetApplicationInfos(flag, osAccountIds[0], appInfos); 2402dc7c57fSopenharmony_ci} 2412dc7c57fSopenharmony_ci} // namespace EventFwk 2422dc7c57fSopenharmony_ci} // namespace OHOS