1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "permission_helper.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include "ipc_skeleton.h" 19c29fa5a6Sopenharmony_ci#include "tokenid_kit.h" 20c29fa5a6Sopenharmony_ci 21c29fa5a6Sopenharmony_ci#include "mmi_log.h" 22c29fa5a6Sopenharmony_ci#include "proto.h" 23c29fa5a6Sopenharmony_ci 24c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN 25c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_SERVER 26c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 27c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "PermissionHelper" 28c29fa5a6Sopenharmony_ci 29c29fa5a6Sopenharmony_cinamespace OHOS { 30c29fa5a6Sopenharmony_cinamespace MMI { 31c29fa5a6Sopenharmony_cibool PermissionHelper::VerifySystemApp() 32c29fa5a6Sopenharmony_ci{ 33c29fa5a6Sopenharmony_ci MMI_HILOGD("Verify system App"); 34c29fa5a6Sopenharmony_ci auto callerToken = IPCSkeleton::GetCallingTokenID(); 35c29fa5a6Sopenharmony_ci auto tokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken); 36c29fa5a6Sopenharmony_ci MMI_HILOGD("Token type is %{public}d", static_cast<int32_t>(tokenType)); 37c29fa5a6Sopenharmony_ci if (tokenType == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE 38c29fa5a6Sopenharmony_ci || tokenType == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL) { 39c29fa5a6Sopenharmony_ci MMI_HILOGD("Called tokenType is native, verify success"); 40c29fa5a6Sopenharmony_ci return true; 41c29fa5a6Sopenharmony_ci } 42c29fa5a6Sopenharmony_ci uint64_t accessTokenIdEx = IPCSkeleton::GetCallingFullTokenID(); 43c29fa5a6Sopenharmony_ci if (!OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIdEx)) { 44c29fa5a6Sopenharmony_ci MMI_HILOGE("System api is called by non-system app"); 45c29fa5a6Sopenharmony_ci return false; 46c29fa5a6Sopenharmony_ci } 47c29fa5a6Sopenharmony_ci return true; 48c29fa5a6Sopenharmony_ci} 49c29fa5a6Sopenharmony_ci 50c29fa5a6Sopenharmony_cibool PermissionHelper::CheckMonitor() 51c29fa5a6Sopenharmony_ci{ 52c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 53c29fa5a6Sopenharmony_ci std::string monitorPermissionCode = "ohos.permission.INPUT_MONITORING"; 54c29fa5a6Sopenharmony_ci return CheckHapPermission(monitorPermissionCode); 55c29fa5a6Sopenharmony_ci} 56c29fa5a6Sopenharmony_ci 57c29fa5a6Sopenharmony_cibool PermissionHelper::CheckInterceptor() 58c29fa5a6Sopenharmony_ci{ 59c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 60c29fa5a6Sopenharmony_ci std::string interceptorPermissionCode = "ohos.permission.INTERCEPT_INPUT_EVENT"; 61c29fa5a6Sopenharmony_ci return CheckHapPermission(interceptorPermissionCode); 62c29fa5a6Sopenharmony_ci} 63c29fa5a6Sopenharmony_ci 64c29fa5a6Sopenharmony_cibool PermissionHelper::CheckInfraredEmmit() 65c29fa5a6Sopenharmony_ci{ 66c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 67c29fa5a6Sopenharmony_ci std::string infraredEmmitPermissionCode = "ohos.permission.MANAGE_INPUT_INFRARED_EMITTER"; 68c29fa5a6Sopenharmony_ci return CheckHapPermission(infraredEmmitPermissionCode); 69c29fa5a6Sopenharmony_ci} 70c29fa5a6Sopenharmony_ci 71c29fa5a6Sopenharmony_cibool PermissionHelper::CheckAuthorize() 72c29fa5a6Sopenharmony_ci{ 73c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 74c29fa5a6Sopenharmony_ci std::string injectPermissionCode = "ohos.permission.INJECT_INPUT_EVENT"; 75c29fa5a6Sopenharmony_ci return CheckHapPermission(injectPermissionCode); 76c29fa5a6Sopenharmony_ci} 77c29fa5a6Sopenharmony_ci 78c29fa5a6Sopenharmony_cibool PermissionHelper::CheckHapPermission(const std::string permissionCode) 79c29fa5a6Sopenharmony_ci{ 80c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 81c29fa5a6Sopenharmony_ci auto tokenId = IPCSkeleton::GetCallingTokenID(); 82c29fa5a6Sopenharmony_ci auto tokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId); 83c29fa5a6Sopenharmony_ci if ((tokenType == OHOS::Security::AccessToken::TOKEN_HAP) || 84c29fa5a6Sopenharmony_ci (tokenType == OHOS::Security::AccessToken::TOKEN_NATIVE)) { 85c29fa5a6Sopenharmony_ci int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, permissionCode); 86c29fa5a6Sopenharmony_ci if (ret != OHOS::Security::AccessToken::PERMISSION_GRANTED) { 87c29fa5a6Sopenharmony_ci MMI_HILOGE("Check permission failed ret:%{public}d permission:%{public}s", ret, permissionCode.c_str()); 88c29fa5a6Sopenharmony_ci return false; 89c29fa5a6Sopenharmony_ci } 90c29fa5a6Sopenharmony_ci MMI_HILOGD("Check interceptor permission success permission:%{public}s", permissionCode.c_str()); 91c29fa5a6Sopenharmony_ci return true; 92c29fa5a6Sopenharmony_ci } else if (tokenType == OHOS::Security::AccessToken::TOKEN_SHELL) { 93c29fa5a6Sopenharmony_ci MMI_HILOGI("Token type is shell"); 94c29fa5a6Sopenharmony_ci return true; 95c29fa5a6Sopenharmony_ci } else { 96c29fa5a6Sopenharmony_ci MMI_HILOGE("Unsupported token type:%{public}d", tokenType); 97c29fa5a6Sopenharmony_ci return false; 98c29fa5a6Sopenharmony_ci } 99c29fa5a6Sopenharmony_ci} 100c29fa5a6Sopenharmony_ci 101c29fa5a6Sopenharmony_cibool PermissionHelper::CheckHapPermission(uint32_t tokenId, const std::string permissionCode) 102c29fa5a6Sopenharmony_ci{ 103c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 104c29fa5a6Sopenharmony_ci auto tokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId); 105c29fa5a6Sopenharmony_ci if ((tokenType == OHOS::Security::AccessToken::TOKEN_HAP) || 106c29fa5a6Sopenharmony_ci (tokenType == OHOS::Security::AccessToken::TOKEN_NATIVE)) { 107c29fa5a6Sopenharmony_ci } else if (tokenType == OHOS::Security::AccessToken::TOKEN_SHELL) { 108c29fa5a6Sopenharmony_ci MMI_HILOGI("Token type is shell"); 109c29fa5a6Sopenharmony_ci return true; 110c29fa5a6Sopenharmony_ci } else { 111c29fa5a6Sopenharmony_ci MMI_HILOGE("Unsupported token type:%{public}d", tokenType); 112c29fa5a6Sopenharmony_ci return false; 113c29fa5a6Sopenharmony_ci } 114c29fa5a6Sopenharmony_ci std::string context = "For CheckPerm. PermiCode" + permissionCode + ";appId:" + std::to_string(tokenId); 115c29fa5a6Sopenharmony_ci int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, permissionCode); 116c29fa5a6Sopenharmony_ci if (ret != OHOS::Security::AccessToken::PERMISSION_GRANTED) { 117c29fa5a6Sopenharmony_ci MMI_HILOGE("Check Permi: %{public}s fail for appId:%{public}d, and ret:%{public}d", 118c29fa5a6Sopenharmony_ci permissionCode.c_str(), tokenId, ret); 119c29fa5a6Sopenharmony_ci return false; 120c29fa5a6Sopenharmony_ci } 121c29fa5a6Sopenharmony_ci MMI_HILOGD("Check permission( %{public}s) permission success", permissionCode.c_str()); 122c29fa5a6Sopenharmony_ci return true; 123c29fa5a6Sopenharmony_ci} 124c29fa5a6Sopenharmony_ci 125c29fa5a6Sopenharmony_cibool PermissionHelper::CheckDispatchControl() 126c29fa5a6Sopenharmony_ci{ 127c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 128c29fa5a6Sopenharmony_ci std::string inputDispatchControl = "ohos.permission.INPUT_CONTROL_DISPATCHING"; 129c29fa5a6Sopenharmony_ci return CheckHapPermission(inputDispatchControl); 130c29fa5a6Sopenharmony_ci} 131c29fa5a6Sopenharmony_ci 132c29fa5a6Sopenharmony_ciint32_t PermissionHelper::GetTokenType() 133c29fa5a6Sopenharmony_ci{ 134c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 135c29fa5a6Sopenharmony_ci auto tokenId = IPCSkeleton::GetCallingTokenID(); 136c29fa5a6Sopenharmony_ci auto tokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId); 137c29fa5a6Sopenharmony_ci if (tokenType == OHOS::Security::AccessToken::TOKEN_HAP) { 138c29fa5a6Sopenharmony_ci uint64_t accessTokenIdEx = IPCSkeleton::GetCallingFullTokenID(); 139c29fa5a6Sopenharmony_ci if (OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIdEx)) { 140c29fa5a6Sopenharmony_ci return TokenType::TOKEN_SYSTEM_HAP; 141c29fa5a6Sopenharmony_ci } 142c29fa5a6Sopenharmony_ci return TokenType::TOKEN_HAP; 143c29fa5a6Sopenharmony_ci } else if (tokenType == OHOS::Security::AccessToken::TOKEN_NATIVE) { 144c29fa5a6Sopenharmony_ci return TokenType::TOKEN_NATIVE; 145c29fa5a6Sopenharmony_ci } else if (tokenType == OHOS::Security::AccessToken::TOKEN_SHELL) { 146c29fa5a6Sopenharmony_ci return TokenType::TOKEN_SHELL; 147c29fa5a6Sopenharmony_ci } else { 148c29fa5a6Sopenharmony_ci MMI_HILOGW("Unsupported token type:%{public}d", tokenType); 149c29fa5a6Sopenharmony_ci return TokenType::TOKEN_INVALID; 150c29fa5a6Sopenharmony_ci } 151c29fa5a6Sopenharmony_ci} 152c29fa5a6Sopenharmony_ci 153c29fa5a6Sopenharmony_cibool PermissionHelper::RequestFromShell() 154c29fa5a6Sopenharmony_ci{ 155c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 156c29fa5a6Sopenharmony_ci auto tokenId = IPCSkeleton::GetCallingTokenID(); 157c29fa5a6Sopenharmony_ci auto tokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId); 158c29fa5a6Sopenharmony_ci MMI_HILOGD("Token type is %{public}d", static_cast<int32_t>(tokenType)); 159c29fa5a6Sopenharmony_ci return tokenType == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL; 160c29fa5a6Sopenharmony_ci} 161c29fa5a6Sopenharmony_ci 162c29fa5a6Sopenharmony_cibool PermissionHelper::CheckMouseCursor() 163c29fa5a6Sopenharmony_ci{ 164c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 165c29fa5a6Sopenharmony_ci std::string mousePermissionCode = "ohos.permission.MANAGE_MOUSE_CURSOR"; 166c29fa5a6Sopenharmony_ci return CheckHapPermission(mousePermissionCode); 167c29fa5a6Sopenharmony_ci} 168c29fa5a6Sopenharmony_ci 169c29fa5a6Sopenharmony_cibool PermissionHelper::CheckInputEventFilter() 170c29fa5a6Sopenharmony_ci{ 171c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 172c29fa5a6Sopenharmony_ci std::string filterPermissionCode = "ohos.permission.FILTER_INPUT_EVENT"; 173c29fa5a6Sopenharmony_ci return CheckHapPermission(filterPermissionCode); 174c29fa5a6Sopenharmony_ci} 175c29fa5a6Sopenharmony_ci} // namespace MMI 176c29fa5a6Sopenharmony_ci} // namespace OHOS 177