1dfe32fa1Soh_ci/* 2dfe32fa1Soh_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3dfe32fa1Soh_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4dfe32fa1Soh_ci * you may not use this file except in compliance with the License. 5dfe32fa1Soh_ci * You may obtain a copy of the License at 6dfe32fa1Soh_ci * 7dfe32fa1Soh_ci * http://www.apache.org/licenses/LICENSE-2.0 8dfe32fa1Soh_ci * 9dfe32fa1Soh_ci * Unless required by applicable law or agreed to in writing, software 10dfe32fa1Soh_ci * distributed under the License is distributed on an "AS IS" BASIS, 11dfe32fa1Soh_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12dfe32fa1Soh_ci * See the License for the specific language governing permissions and 13dfe32fa1Soh_ci * limitations under the License. 14dfe32fa1Soh_ci */ 15dfe32fa1Soh_ci 16dfe32fa1Soh_ci#include "bms_wrapper.h" 17dfe32fa1Soh_ci 18dfe32fa1Soh_ci#include <cstring> 19dfe32fa1Soh_ci#include "securec.h" 20dfe32fa1Soh_ci 21dfe32fa1Soh_ci#include "accesstoken_kit.h" 22dfe32fa1Soh_ci#include "bundle_mgr_client.h" 23dfe32fa1Soh_ci#include "hap_token_info.h" 24dfe32fa1Soh_ci#include "ipc_skeleton.h" 25dfe32fa1Soh_ci 26dfe32fa1Soh_ci#include "asset_type.h" 27dfe32fa1Soh_ci#include "asset_log.h" 28dfe32fa1Soh_ci 29dfe32fa1Soh_ciusing namespace OHOS; 30dfe32fa1Soh_ciusing namespace AppExecFwk; 31dfe32fa1Soh_ciusing namespace Security::AccessToken; 32dfe32fa1Soh_ci 33dfe32fa1Soh_cinamespace { 34dfe32fa1Soh_ciint32_t GetHapProcessInfo(int32_t userId, uint32_t tokenId, ProcessInfo *processInfo) 35dfe32fa1Soh_ci{ 36dfe32fa1Soh_ci HapTokenInfo hapTokenInfo; 37dfe32fa1Soh_ci int32_t ret = AccessTokenKit::GetHapTokenInfo(tokenId, hapTokenInfo); 38dfe32fa1Soh_ci if (ret != RET_SUCCESS) { 39dfe32fa1Soh_ci LOGE("[FATAL]Get hap token info failed, ret = %{public}d", ret); 40dfe32fa1Soh_ci return ASSET_ACCESS_TOKEN_ERROR; 41dfe32fa1Soh_ci } 42dfe32fa1Soh_ci if (memcpy_s(processInfo->processName, processInfo->processNameLen, hapTokenInfo.bundleName.c_str(), 43dfe32fa1Soh_ci hapTokenInfo.bundleName.size()) != EOK) { 44dfe32fa1Soh_ci LOGE("[FATAL]The processName buffer is too small. Expect size: %{public}zu, actual size: %{public}u", 45dfe32fa1Soh_ci hapTokenInfo.bundleName.size(), processInfo->processNameLen); 46dfe32fa1Soh_ci return ASSET_OUT_OF_MEMORY; 47dfe32fa1Soh_ci } 48dfe32fa1Soh_ci processInfo->processNameLen = hapTokenInfo.bundleName.size(); 49dfe32fa1Soh_ci 50dfe32fa1Soh_ci AppExecFwk::BundleMgrClient bmsClient; 51dfe32fa1Soh_ci AppExecFwk::BundleInfo bundleInfo; 52dfe32fa1Soh_ci if (!bmsClient.GetBundleInfo(hapTokenInfo.bundleName, BundleFlag::GET_BUNDLE_WITH_HASH_VALUE, 53dfe32fa1Soh_ci bundleInfo, userId)) { 54dfe32fa1Soh_ci LOGE("[FATAL]Get bundle info failed!"); 55dfe32fa1Soh_ci return ASSET_BMS_ERROR; 56dfe32fa1Soh_ci } 57dfe32fa1Soh_ci processInfo->hapInfo.appIndex = bundleInfo.appIndex; 58dfe32fa1Soh_ci 59dfe32fa1Soh_ci if (memcpy_s(processInfo->hapInfo.appId, processInfo->hapInfo.appIdLen, bundleInfo.appId.c_str(), 60dfe32fa1Soh_ci bundleInfo.appId.size()) != EOK) { 61dfe32fa1Soh_ci LOGE("[FATAL]The app id buffer is too small. Expect size: %{public}zu, actual size: %{public}u", 62dfe32fa1Soh_ci bundleInfo.appId.size(), processInfo->hapInfo.appIdLen); 63dfe32fa1Soh_ci return ASSET_OUT_OF_MEMORY; 64dfe32fa1Soh_ci } 65dfe32fa1Soh_ci processInfo->hapInfo.appIdLen = bundleInfo.appId.size(); 66dfe32fa1Soh_ci 67dfe32fa1Soh_ci return ASSET_SUCCESS; 68dfe32fa1Soh_ci} 69dfe32fa1Soh_ci 70dfe32fa1Soh_ciint32_t GetNativeProcessInfo(uint32_t tokenId, uint64_t uid, ProcessInfo *processInfo) 71dfe32fa1Soh_ci{ 72dfe32fa1Soh_ci NativeTokenInfo nativeTokenInfo; 73dfe32fa1Soh_ci int32_t ret = AccessTokenKit::GetNativeTokenInfo(tokenId, nativeTokenInfo); 74dfe32fa1Soh_ci if (ret != RET_SUCCESS) { 75dfe32fa1Soh_ci LOGE("[FATAL]Get native token info failed, ret = %{public}d", ret); 76dfe32fa1Soh_ci return ASSET_ACCESS_TOKEN_ERROR; 77dfe32fa1Soh_ci } 78dfe32fa1Soh_ci 79dfe32fa1Soh_ci if (memcpy_s(processInfo->processName, processInfo->processNameLen, nativeTokenInfo.processName.c_str(), 80dfe32fa1Soh_ci nativeTokenInfo.processName.size()) != EOK) { 81dfe32fa1Soh_ci LOGE("[FATAL]The processName buffer is too small. Expect size: %{public}zu, actual size: %{public}u", 82dfe32fa1Soh_ci nativeTokenInfo.processName.size(), processInfo->processNameLen); 83dfe32fa1Soh_ci return ASSET_OUT_OF_MEMORY; 84dfe32fa1Soh_ci } 85dfe32fa1Soh_ci processInfo->processNameLen = nativeTokenInfo.processName.size(); 86dfe32fa1Soh_ci processInfo->nativeInfo.uid = uid; 87dfe32fa1Soh_ci return ASSET_SUCCESS; 88dfe32fa1Soh_ci} 89dfe32fa1Soh_ci} // namespace 90dfe32fa1Soh_ci 91dfe32fa1Soh_ciint32_t GetCallingProcessInfo(uint32_t userId, uint64_t uid, ProcessInfo *processInfo) 92dfe32fa1Soh_ci{ 93dfe32fa1Soh_ci processInfo->userId = userId; 94dfe32fa1Soh_ci auto tokenId = IPCSkeleton::GetCallingTokenID(); 95dfe32fa1Soh_ci ATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(tokenId); 96dfe32fa1Soh_ci int32_t res = ASSET_SUCCESS; 97dfe32fa1Soh_ci switch (tokenType) { 98dfe32fa1Soh_ci case ATokenTypeEnum::TOKEN_HAP: 99dfe32fa1Soh_ci processInfo->ownerType = HAP; 100dfe32fa1Soh_ci res = GetHapProcessInfo(userId, tokenId, processInfo); 101dfe32fa1Soh_ci break; 102dfe32fa1Soh_ci case ATokenTypeEnum::TOKEN_NATIVE: 103dfe32fa1Soh_ci case ATokenTypeEnum::TOKEN_SHELL: 104dfe32fa1Soh_ci processInfo->ownerType = NATIVE; 105dfe32fa1Soh_ci res = GetNativeProcessInfo(tokenId, uid, processInfo); 106dfe32fa1Soh_ci break; 107dfe32fa1Soh_ci default: 108dfe32fa1Soh_ci LOGE("[FATAL]Invalid calling type: %{public}d", tokenType); 109dfe32fa1Soh_ci res = ASSET_INVALID_ARGUMENT; 110dfe32fa1Soh_ci } 111dfe32fa1Soh_ci return res; 112dfe32fa1Soh_ci}