1115cd2caSopenharmony_ci/* 2115cd2caSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3115cd2caSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4115cd2caSopenharmony_ci * you may not use this file except in compliance with the License. 5115cd2caSopenharmony_ci * You may obtain a copy of the License at 6115cd2caSopenharmony_ci * 7115cd2caSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8115cd2caSopenharmony_ci * 9115cd2caSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10115cd2caSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11115cd2caSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12115cd2caSopenharmony_ci * See the License for the specific language governing permissions and 13115cd2caSopenharmony_ci * limitations under the License. 14115cd2caSopenharmony_ci */ 15115cd2caSopenharmony_ci 16115cd2caSopenharmony_ci#include "contacts_telephony_permission.h" 17115cd2caSopenharmony_ci 18115cd2caSopenharmony_ci#include "accesstoken_kit.h" 19115cd2caSopenharmony_ci#include "bundle_mgr_interface.h" 20115cd2caSopenharmony_ci#include "hilog_wrapper.h" 21115cd2caSopenharmony_ci#include "iservice_registry.h" 22115cd2caSopenharmony_ci#include "if_system_ability_manager.h" 23115cd2caSopenharmony_ci#include "ipc_skeleton.h" 24115cd2caSopenharmony_ci#include "system_ability_definition.h" 25115cd2caSopenharmony_ci#include "privacy_kit.h" 26115cd2caSopenharmony_ci#include "tokenid_kit.h" 27115cd2caSopenharmony_ci#include "system_ability_definition.h" 28115cd2caSopenharmony_ci 29115cd2caSopenharmony_cinamespace OHOS { 30115cd2caSopenharmony_cinamespace ContactsApi { 31115cd2caSopenharmony_ci 32115cd2caSopenharmony_ciusing namespace Security::AccessToken; 33115cd2caSopenharmony_ci 34115cd2caSopenharmony_ciContactsTelephonyPermission::ContactsTelephonyPermission(void) 35115cd2caSopenharmony_ci{ 36115cd2caSopenharmony_ci} 37115cd2caSopenharmony_ci 38115cd2caSopenharmony_ciContactsTelephonyPermission::~ContactsTelephonyPermission() 39115cd2caSopenharmony_ci{ 40115cd2caSopenharmony_ci} 41115cd2caSopenharmony_ci 42115cd2caSopenharmony_ci/** 43115cd2caSopenharmony_ci * @brief Permission check by callingUid. 44115cd2caSopenharmony_ci * @param permissionName permission name. 45115cd2caSopenharmony_ci * @return Returns true on success, false on failure. 46115cd2caSopenharmony_ci */ 47115cd2caSopenharmony_cibool ContactsTelephonyPermission::CheckPermission(const std::string &permissionName) 48115cd2caSopenharmony_ci{ 49115cd2caSopenharmony_ci if (permissionName.empty()) { 50115cd2caSopenharmony_ci HILOG_ERROR("ContactsTelephonyPermission check failed, permission name is empty."); 51115cd2caSopenharmony_ci return false; 52115cd2caSopenharmony_ci } 53115cd2caSopenharmony_ci 54115cd2caSopenharmony_ci auto callerToken = IPCSkeleton::GetCallingTokenID(); 55115cd2caSopenharmony_ci auto callerPid = IPCSkeleton::GetCallingPid(); 56115cd2caSopenharmony_ci HILOG_INFO("contactsCheckPermission, get callerPid = %{public}d, permission = %{public}s", 57115cd2caSopenharmony_ci callerPid, permissionName.c_str()); 58115cd2caSopenharmony_ci auto tokenType = AccessTokenKit::GetTokenTypeFlag(callerToken); 59115cd2caSopenharmony_ci int result = PermissionState::PERMISSION_DENIED; 60115cd2caSopenharmony_ci if (tokenType == ATokenTypeEnum::TOKEN_NATIVE) { 61115cd2caSopenharmony_ci result = PermissionState::PERMISSION_GRANTED; 62115cd2caSopenharmony_ci } else if (tokenType == ATokenTypeEnum::TOKEN_HAP) { 63115cd2caSopenharmony_ci result = AccessTokenKit::VerifyAccessToken(callerToken, permissionName); 64115cd2caSopenharmony_ci } else { 65115cd2caSopenharmony_ci HILOG_ERROR("ContactsCheckPermission check failed"); 66115cd2caSopenharmony_ci } 67115cd2caSopenharmony_ci 68115cd2caSopenharmony_ci if (permissionName == Permission::READ_CALL_LOG 69115cd2caSopenharmony_ci || permissionName == Permission::READ_CONTACTS || permissionName == Permission::WRITE_CONTACTS 70115cd2caSopenharmony_ci || permissionName == Permission::OHOS_PERMISSION_MANAGE_VOICEMAIL) { 71115cd2caSopenharmony_ci if (tokenType == ATokenTypeEnum::TOKEN_HAP) { 72115cd2caSopenharmony_ci bool status = result == PermissionState::PERMISSION_GRANTED; 73115cd2caSopenharmony_ci int32_t successCount = status ? 1 : 0; 74115cd2caSopenharmony_ci int32_t failCount = status ? 0 : 1; 75115cd2caSopenharmony_ci int32_t ret = PrivacyKit::AddPermissionUsedRecord(callerToken, permissionName, successCount, failCount); 76115cd2caSopenharmony_ci if (ret != 0) { 77115cd2caSopenharmony_ci HILOG_ERROR("AddPermissionUsedRecord failed, permissionName = %{public}s, callerPid = %{public}d," 78115cd2caSopenharmony_ci "successCount = %{public}d, failCount = %{public}d, ret = %{public}d", permissionName.c_str(), 79115cd2caSopenharmony_ci callerPid, successCount, failCount, ret); 80115cd2caSopenharmony_ci } 81115cd2caSopenharmony_ci } 82115cd2caSopenharmony_ci } 83115cd2caSopenharmony_ci 84115cd2caSopenharmony_ci if (result != PermissionState::PERMISSION_GRANTED) { 85115cd2caSopenharmony_ci HILOG_ERROR("ContactsTelephonyPermission check failed"); 86115cd2caSopenharmony_ci return false; 87115cd2caSopenharmony_ci } 88115cd2caSopenharmony_ci return true; 89115cd2caSopenharmony_ci} 90115cd2caSopenharmony_ci} // namespace Telephony 91115cd2caSopenharmony_ci} // namespace OHOS