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