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}