1/* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "permission_util.h" 17 18#include "accesstoken_kit.h" 19#include "privacy_kit.h" 20#include "sensor_agent_type.h" 21#include "sensor_log.h" 22 23#undef LOG_TAG 24#define LOG_TAG "PermissionUtil" 25 26namespace OHOS { 27namespace Sensors { 28using namespace OHOS::HiviewDFX; 29 30std::unordered_map<int32_t, std::string> PermissionUtil::sensorPermissions_ = { 31 { SENSOR_TYPE_ID_ACCELEROMETER, ACCELEROMETER_PERMISSION }, 32 { SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED, ACCELEROMETER_PERMISSION }, 33 { SENSOR_TYPE_ID_LINEAR_ACCELERATION, ACCELEROMETER_PERMISSION }, 34 { SENSOR_TYPE_ID_GYROSCOPE, GYROSCOPE_PERMISSION }, 35 { SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED, GYROSCOPE_PERMISSION }, 36 { SENSOR_TYPE_ID_PEDOMETER_DETECTION, ACTIVITY_MOTION_PERMISSION }, 37 { SENSOR_TYPE_ID_PEDOMETER, ACTIVITY_MOTION_PERMISSION }, 38 { SENSOR_TYPE_ID_HEART_RATE, READ_HEALTH_DATA_PERMISSION } 39}; 40 41int32_t PermissionUtil::CheckSensorPermission(AccessTokenID callerToken, int32_t sensorTypeId) 42{ 43 if (sensorPermissions_.find(sensorTypeId) == sensorPermissions_.end()) { 44 return PERMISSION_GRANTED; 45 } 46 std::string permissionName = sensorPermissions_[sensorTypeId]; 47 int32_t ret = AccessTokenKit::VerifyAccessToken(callerToken, permissionName); 48 if ((permissionName == ACTIVITY_MOTION_PERMISSION) 49 || (permissionName == READ_HEALTH_DATA_PERMISSION)) { 50 AddPermissionRecord(callerToken, permissionName, (ret == PERMISSION_GRANTED)); 51 } 52 return ret; 53} 54 55void PermissionUtil::AddPermissionRecord(AccessTokenID tokenID, const std::string &permissionName, bool status) 56{ 57 int32_t successCount = status ? 1 : 0; 58 int32_t failCount = status ? 0 : 1; 59 int32_t ret = PrivacyKit::AddPermissionUsedRecord(tokenID, permissionName, successCount, failCount); 60 if (ret != 0) { 61 SEN_HILOGE("AddPermissionUsedRecord fail, permissionName:%{public}s, successCount:%{public}d, failCount:%{public}d", 62 permissionName.c_str(), successCount, failCount); 63 } 64} 65 66bool PermissionUtil::IsNativeToken(AccessTokenID callerToken) 67{ 68 int32_t tokenType = AccessTokenKit::GetTokenTypeFlag(callerToken); 69 if (tokenType != ATokenTypeEnum::TOKEN_NATIVE) { 70 SEN_HILOGE("TokenType is not TOKEN_NATIVE, tokenType:%{public}d", tokenType); 71 return false; 72 } 73 return true; 74} 75 76int32_t PermissionUtil::CheckManageSensorPermission(AccessTokenID callerToken) 77{ 78 int32_t ret = AccessTokenKit::VerifyAccessToken(callerToken, MANAGE_SENSOR_PERMISSION); 79 if (ret != PERMISSION_GRANTED) { 80 SEN_HILOGE("Verify MANAGE_SENSOR permission failed, ret:%{public}d", ret); 81 } 82 return ret; 83} 84} // namespace Sensors 85} // namespace OHOS 86