From 9317a1ad35d9660062e914a10e32dd3ad9a47cf6 Mon Sep 17 00:00:00 2001 From: hellohyh001 Date: Tue, 22 Feb 2022 21:18:57 +0800 Subject: [PATCH 1/2] Signed-off-by:hellohyh001 Signed-off-by: hellohyh001 --- bundle.json | 2 +- .../sensor/include/sensor_agent_proxy.h | 9 +- interfaces/native/BUILD.gn | 2 - interfaces/native/include/sensor_algorithm.h | 8 +- services/sensor/BUILD.gn | 2 +- services/sensor/include/client_info.h | 8 +- services/sensor/include/sensor_service_stub.h | 3 - services/sensor/src/client_info.cpp | 60 +++++------- services/sensor/src/sensor_data_processer.cpp | 4 +- services/sensor/src/sensor_service.cpp | 4 +- services/sensor/src/sensor_service_stub.cpp | 44 ++------- utils/BUILD.gn | 2 +- utils/include/app_thread_info.h | 7 +- utils/include/permission_util.h | 25 +---- utils/src/permission_util.cpp | 97 ++++--------------- 15 files changed, 78 insertions(+), 199 deletions(-) mode change 100755 => 100644 frameworks/native/sensor/include/sensor_agent_proxy.h mode change 100755 => 100644 interfaces/native/include/sensor_algorithm.h mode change 100755 => 100644 services/sensor/include/client_info.h mode change 100755 => 100644 services/sensor/include/sensor_service_stub.h mode change 100755 => 100644 services/sensor/src/sensor_service_stub.cpp mode change 100755 => 100644 utils/include/app_thread_info.h mode change 100755 => 100644 utils/include/permission_util.h mode change 100755 => 100644 utils/src/permission_util.cpp diff --git a/bundle.json b/bundle.json index cdf2edd6..4e7165f5 100644 --- a/bundle.json +++ b/bundle.json @@ -16,13 +16,13 @@ "ram": "~4096KB", "deps": { "components": [ + "access_token", "hiviewdfx_hilog_native", "ipc", "safwk", "samgr_standard", "utils_base", "appexecfwk_standard", - "permission_standard", "napi", "hisysevent_native", "sensor_device_driver" diff --git a/frameworks/native/sensor/include/sensor_agent_proxy.h b/frameworks/native/sensor/include/sensor_agent_proxy.h old mode 100755 new mode 100644 index 8ff409c3..f3795ce6 --- a/frameworks/native/sensor/include/sensor_agent_proxy.h +++ b/frameworks/native/sensor/include/sensor_agent_proxy.h @@ -34,12 +34,6 @@ public: SensorAgentProxy(); ~SensorAgentProxy(); static const SensorAgentProxy *GetSensorsObj(); - int32_t CreateSensorDataChannel() const; - int32_t DestroySensorDataChannel() const; - int32_t GetSensorId(struct SensorIdList *sensorId, uint32_t sensorGroup, uint32_t sensorType) const; - int32_t GetDefaultSensorId(uint32_t sensorGroup, uint32_t sensorType) const; - int64_t GetSensorMinSamplePeriod(uint32_t sensorId) const; - int32_t ChanageSensorInterval(uint32_t sensorId, int64_t sampingPeriodNs, int64_t maxReportDelay) const; int32_t ActivateSensor(int32_t sensorId, const SensorUser *user) const; int32_t DeactivateSensor(int32_t sensorId, const SensorUser *user) const; int32_t SetBatch(int32_t sensorId, const SensorUser *user, int64_t samplingInterval, int64_t reportInterval) const; @@ -50,8 +44,9 @@ public: int32_t GetAllSensors(SensorInfo **sensorInfo, int32_t *count) const; private: + int32_t CreateSensorDataChannel() const; + int32_t DestroySensorDataChannel() const; static void HandleSensorData(SensorEvent *events, int32_t num, void *data); - static void FillSensorAccuracy(struct SensorNativeData &data, SensorEvent &event); static OHOS::sptr sensorObj_; static std::mutex subscribeMutex_; static std::mutex chanelMutex_; diff --git a/interfaces/native/BUILD.gn b/interfaces/native/BUILD.gn index e2d6fa35..78b528ec 100644 --- a/interfaces/native/BUILD.gn +++ b/interfaces/native/BUILD.gn @@ -36,8 +36,6 @@ ohos_shared_library("sensor_interface_native") { "//utils/system/safwk/native/include", "$SUBSYSTEM_DIR/frameworks/native/sensor/include", "$SUBSYSTEM_DIR/utils/include", - - #"//drivers/peripheral/sensor/interfaces/include", "$SUBSYSTEM_DIR/interfaces/native/include", "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include", "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler/include", diff --git a/interfaces/native/include/sensor_algorithm.h b/interfaces/native/include/sensor_algorithm.h old mode 100755 new mode 100644 index 7f6154cc..3a2955bc --- a/interfaces/native/include/sensor_algorithm.h +++ b/interfaces/native/include/sensor_algorithm.h @@ -23,10 +23,6 @@ class SensorAlgorithm { public: SensorAlgorithm() = default; ~SensorAlgorithm() = default; - static constexpr int32_t QUATERNION_LENGTH = 4; - static constexpr int32_t ROTATION_VECTOR_LENGTH = 3; - static constexpr int32_t THREE_DIMENSIONAL_MATRIX_LENGTH = 9; - static constexpr int32_t FOUR_DIMENSIONAL_MATRIX_LENGTH = 16; int32_t createQuaternion(std::vector rotationVector, std::vector &quaternion); @@ -49,6 +45,10 @@ public: private: int32_t transformCoordinateSystemImpl(std::vector inRotationMatrix, int32_t axisX, int32_t axisY, std::vector &outRotationMatrix); + static constexpr int32_t QUATERNION_LENGTH = 4; + static constexpr int32_t ROTATION_VECTOR_LENGTH = 3; + static constexpr int32_t THREE_DIMENSIONAL_MATRIX_LENGTH = 9; + static constexpr int32_t FOUR_DIMENSIONAL_MATRIX_LENGTH = 16; static constexpr float GRAVITATIONAL_ACCELERATION = 9.81f; static constexpr float RECIPROCAL_COEFFICIENT = 5.255f; static constexpr float ZERO_PRESSURE_ALTITUDE = 44330.0f; diff --git a/services/sensor/BUILD.gn b/services/sensor/BUILD.gn index ce3c973a..96e9a20a 100644 --- a/services/sensor/BUILD.gn +++ b/services/sensor/BUILD.gn @@ -49,10 +49,10 @@ ohos_shared_library("libsensor_service") { deps = [ "$SUBSYSTEM_DIR/sensor/utils:libsensor_utils" ] external_deps = [ + "access_token:libaccesstoken_sdk", "hisysevent_native:libhisysevent", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", - "permission_standard:libpermissionsdk_standard", "safwk:system_ability_fwk", "samgr_standard:samgr_proxy", "sensor_device_driver:libsensor_proxy_1.0", diff --git a/services/sensor/include/client_info.h b/services/sensor/include/client_info.h old mode 100755 new mode 100644 index 21686710..ef42b728 --- a/services/sensor/include/client_info.h +++ b/services/sensor/include/client_info.h @@ -24,6 +24,7 @@ #include "refbase.h" #include "singleton.h" +#include "accesstoken_kit.h" #include "app_thread_info.h" #include "iremote_object.h" #include "nocopyable.h" @@ -34,6 +35,7 @@ namespace OHOS { namespace Sensors { +using Security::AccessToken::AccessTokenID; class ClientInfo : public Singleton { public: ClientInfo() = default; @@ -48,11 +50,11 @@ public: bool UpdateSensorInfo(uint32_t sensorId, int32_t pid, const SensorBasicInfo &sensorInfo); void RemoveSubscriber(uint32_t sensorId, uint32_t pid); bool UpdateSensorChannel(int32_t pid, const sptr &channel); - bool UpdateUid(int32_t pid, int32_t uid); + bool UpdateAppThreadInfo(int32_t pid, int32_t uid, AccessTokenID callerToken); bool ClearSensorInfo(uint32_t sensorId); void ClearCurPidSensorInfo(uint32_t sensorId, int32_t pid); bool DestroySensorChannel(int32_t pid); - bool DestroyUid(int32_t pid); + void DestroyAppThreadInfo(int32_t pid); SensorBasicInfo GetCurPidSensorInfo(uint32_t sensorId, int32_t pid); uint64_t ComputeBestPeriodCount(uint32_t sensorId, sptr &channel); uint64_t ComputeBestFifoCount(uint32_t sensorId, sptr &channel); @@ -85,7 +87,7 @@ private: std::unordered_map> clientMap_; std::unordered_map> channelMap_; std::unordered_map storedEvent_; - std::unordered_map uidMap_; + std::unordered_map appThreadInfoMap_; std::map, int32_t> clientPidMap_; std::unordered_map>> cmdMap_; std::unordered_map> dataQueue_; diff --git a/services/sensor/include/sensor_service_stub.h b/services/sensor/include/sensor_service_stub.h old mode 100755 new mode 100644 index 6b202208..1d1fd203 --- a/services/sensor/include/sensor_service_stub.h +++ b/services/sensor/include/sensor_service_stub.h @@ -42,10 +42,7 @@ private: ErrCode GetAllSensorsInner(MessageParcel &data, MessageParcel &reply); ErrCode CreateDataChannelInner(MessageParcel &data, MessageParcel &reply); ErrCode DestroyDataChannelInner(MessageParcel &data, MessageParcel &reply); - - bool CheckSensorPermission(uint32_t sensorId); std::unordered_map baseFuncs_; - static std::unordered_map sensorIdPermissions_; }; } // namespace Sensors } // namespace OHOS diff --git a/services/sensor/src/client_info.cpp b/services/sensor/src/client_info.cpp index bd19f197..3bccea20 100644 --- a/services/sensor/src/client_info.cpp +++ b/services/sensor/src/client_info.cpp @@ -122,7 +122,7 @@ bool ClientInfo::OnlyCurPidSensorEnabled(uint32_t sensorId, int32_t pid) return ret; } -bool ClientInfo::UpdateUid(int32_t pid, int32_t uid) +bool ClientInfo::UpdateAppThreadInfo(int32_t pid, int32_t uid, AccessTokenID callerToken) { HiLog::Debug(LABEL, "%{public}s begin, pid : %{public}d, uid : %{public}d", __func__, pid, uid); if ((uid == INVALID_UID) || (pid <= INVALID_PID)) { @@ -130,48 +130,35 @@ bool ClientInfo::UpdateUid(int32_t pid, int32_t uid) return false; } std::lock_guard uidLock(uidMutex_); - auto uidIt = uidMap_.find(pid); - if (uidIt == uidMap_.end()) { - if (uidMap_.size() == MAX_SUPPORT_CHANNEL) { + AppThreadInfo appThreadInfo(pid, uid, callerToken); + auto appThreadInfoItr = appThreadInfoMap_.find(pid); + if (appThreadInfoItr == appThreadInfoMap_.end()) { + if (appThreadInfoMap_.size() == MAX_SUPPORT_CHANNEL) { HiLog::Error(LABEL, "%{public}s max support channel size is %{public}u", __func__, MAX_SUPPORT_CHANNEL); return false; } - auto ret = uidMap_.insert(std::make_pair(pid, uid)); - HiLog::Debug(LABEL, "%{public}s insert uid ret.second : %{public}d", __func__, ret.second); + auto ret = appThreadInfoMap_.insert(std::make_pair(pid, appThreadInfo)); return ret.second; } - uidMap_[pid] = uid; + appThreadInfoMap_[pid] = appThreadInfo; HiLog::Debug(LABEL, "%{public}s end", __func__); return true; } -bool ClientInfo::DestroyUid(int32_t pid) +void ClientInfo::DestroyAppThreadInfo(int32_t pid) { HiLog::Debug(LABEL, "%{public}s begin, pid : %{public}d", __func__, pid); if (pid == INVALID_PID) { HiLog::Error(LABEL, "%{public}s pid is invalid", __func__); - return false; + return; } std::lock_guard uidLock(uidMutex_); - auto uidIt = uidMap_.find(pid); - if (uidIt == uidMap_.end()) { + auto appThreadInfoItr = appThreadInfoMap_.find(pid); + if (appThreadInfoItr == appThreadInfoMap_.end()) { HiLog::Debug(LABEL, "%{public}s uid not exist, no need to destroy it", __func__); - return true; - } - int32_t uid = uidIt->second; - uidMap_.erase(uidIt); - for (const auto &it : uidMap_) { - if (it.second == uid) { - return true; - } + return; } - AppThreadInfo appThreadInfo; - appThreadInfo.uid = uid; - appThreadInfo.pid = 0; - PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); - permissionUtil.UnregistPermissionChanged(appThreadInfo); - HiLog::Debug(LABEL, "%{public}s end", __func__); - return true; + appThreadInfoMap_.erase(appThreadInfoItr); } std::vector> ClientInfo::GetSensorChannelByUid(int32_t uid) @@ -183,12 +170,12 @@ std::vector> ClientInfo::GetSensorChannelByUid(int3 } std::vector> sensorChannel; std::lock_guard uidLock(uidMutex_); - for (const auto &uidIt : uidMap_) { - if (uid != uidIt.second) { + for (const auto &appThreadInfoIt : appThreadInfoMap_) { + if (uid != appThreadInfoIt.second.uid) { continue; } std::lock_guard channelLock(channelMutex_); - auto channelIt = channelMap_.find(uidIt.first); + auto channelIt = channelMap_.find(appThreadInfoIt.first); if (channelIt == channelMap_.end()) { continue; } @@ -363,7 +350,7 @@ bool ClientInfo::DestroySensorChannel(int32_t pid) } it = clientMap_.erase(it); } - DestroyUid(pid); + DestroyAppThreadInfo(pid); std::lock_guard channelLock(channelMutex_); auto it = channelMap_.find(pid); if (it == channelMap_.end()) { @@ -593,9 +580,10 @@ AppThreadInfo ClientInfo::GetAppInfoByChannel(const sptr } { std::lock_guard uidLock(uidMutex_); - auto it = uidMap_.find(appThreadInfo.pid); - if (it != uidMap_.end()) { - appThreadInfo.uid = it->second; + auto it = appThreadInfoMap_.find(appThreadInfo.pid); + if (it != appThreadInfoMap_.end()) { + appThreadInfo.uid = it->second.uid; + appThreadInfo.callerToken = it->second.callerToken; } } return appThreadInfo; @@ -630,11 +618,11 @@ void ClientInfo::GetSensorChannelInfo(std::vector &channelInf int32_t ClientInfo::GetUidByPid(int32_t pid) { std::lock_guard uidLock(uidMutex_); - auto uidIt = uidMap_.find(pid); - if (uidIt == uidMap_.end()) { + auto appThreadInfoIt = appThreadInfoMap_.find(pid); + if (appThreadInfoIt == appThreadInfoMap_.end()) { return INVALID_UID; } - return uidIt->second; + return appThreadInfoIt->second.uid; } void ClientInfo::UpdateCmd(uint32_t sensorId, int32_t uid, int32_t cmdType) diff --git a/services/sensor/src/sensor_data_processer.cpp b/services/sensor/src/sensor_data_processer.cpp index 85e6f3ac..a6288cef 100644 --- a/services/sensor/src/sensor_data_processer.cpp +++ b/services/sensor/src/sensor_data_processer.cpp @@ -223,7 +223,9 @@ bool SensorDataProcesser::ReportNotContinuousData(std::unordered_map channel, uint32_t sensorId) { - return true; + AppThreadInfo appThreadInfo = clientInfo_.GetAppInfoByChannel(channel); + PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); + return permissionUtil.CheckSensorPermission(appThreadInfo.callerToken, sensorId); } void SensorDataProcesser::SendRawData(std::unordered_map &cacheBuf, diff --git a/services/sensor/src/sensor_service.cpp b/services/sensor/src/sensor_service.cpp index 2cdc99fd..97724d87 100644 --- a/services/sensor/src/sensor_service.cpp +++ b/services/sensor/src/sensor_service.cpp @@ -372,7 +372,8 @@ ErrCode SensorService::TransferDataChannel(const sptr &s } auto pid = this->GetCallingPid(); auto uid = this->GetCallingUid(); - if (!clientInfo_.UpdateUid(pid, uid)) { + auto callerToken = this->GetCallingTokenID(); + if (!clientInfo_.UpdateAppThreadInfo(pid, uid, callerToken)) { HiLog::Error(LABEL, "%{public}s UpdateUid failed", __func__); return UPDATE_UID_ERR; } @@ -380,7 +381,6 @@ ErrCode SensorService::TransferDataChannel(const sptr &s HiLog::Error(LABEL, "%{public}s UpdateSensorChannel failed", __func__); return UPDATE_SENSOR_CHANNEL_ERR; } - AppThreadInfo appThreadInfo(pid, uid); sensorBasicDataChannel->SetSensorStatus(true); RegisterClientDeathRecipient(sensorClient, pid); return ERR_OK; diff --git a/services/sensor/src/sensor_service_stub.cpp b/services/sensor/src/sensor_service_stub.cpp old mode 100755 new mode 100644 index b7dbfe73..be8574cc --- a/services/sensor/src/sensor_service_stub.cpp +++ b/services/sensor/src/sensor_service_stub.cpp @@ -33,31 +33,8 @@ using namespace OHOS::HiviewDFX; namespace { constexpr HiLogLabel LABEL = { LOG_CORE, SensorsLogDomain::SENSOR_SERVICE, "SensorServiceStub" }; -constexpr uint32_t SENSOR_ACCELEROMETER_ID = 256; -constexpr uint32_t SENSOR_ACCELEROMETER_UNCALIBRATED_ID = 65792; -constexpr uint32_t SENSOR_LINEAR_ACCELERATION_ID = 131328; -constexpr uint32_t SENSOR_GYROSCOPE_ID = 262400; -constexpr uint32_t SENSOR_GYROSCOPE_UNCALIBRATED_ID = 327936; -constexpr uint32_t SENSOR_PEDOMETER_DETECTION_ID = 524544; -constexpr uint32_t SENSOR_PEDOMETER_ID = 590080; -constexpr uint32_t SENSOR_HEART_RATE_ID = 83886336; -const std::string ACCELEROMETER_PERMISSION = "ohos.permission.ACCELEROMETER"; -const std::string GYROSCOPE_PERMISSION = "ohos.permission.GYROSCOPE"; -const std::string ACTIVITY_MOTION_PERMISSION = "ohos.permission.ACTIVITY_MOTION"; -const std::string READ_HEALTH_DATA_PERMISSION = "ohos.permission.READ_HEALTH_DATA"; } // namespace -std::unordered_map SensorServiceStub::sensorIdPermissions_ = { - { SENSOR_ACCELEROMETER_ID, ACCELEROMETER_PERMISSION }, - { SENSOR_ACCELEROMETER_UNCALIBRATED_ID, ACCELEROMETER_PERMISSION }, - { SENSOR_LINEAR_ACCELERATION_ID, ACCELEROMETER_PERMISSION }, - { SENSOR_GYROSCOPE_ID, GYROSCOPE_PERMISSION }, - { SENSOR_GYROSCOPE_UNCALIBRATED_ID, GYROSCOPE_PERMISSION }, - { SENSOR_PEDOMETER_DETECTION_ID, ACTIVITY_MOTION_PERMISSION }, - { SENSOR_PEDOMETER_ID, ACTIVITY_MOTION_PERMISSION }, - { SENSOR_HEART_RATE_ID, READ_HEALTH_DATA_PERMISSION } -}; - SensorServiceStub::SensorServiceStub() { HiLog::Info(LABEL, "%{public}s begin, %{public}p", __func__, this); @@ -97,20 +74,12 @@ int32_t SensorServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, M return IPCObjectStub::OnRemoteRequest(code, data, reply, option); } -bool SensorServiceStub::CheckSensorPermission(uint32_t sensorId) -{ - auto permissionIt = sensorIdPermissions_.find(sensorId); - if (permissionIt == sensorIdPermissions_.end()) { - return true; - } - return true; -} - ErrCode SensorServiceStub::SensorEnableInner(MessageParcel &data, MessageParcel &reply) { (void)reply; uint32_t sensorId = data.ReadUint32(); - if (!CheckSensorPermission(sensorId)) { + PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } @@ -121,7 +90,8 @@ ErrCode SensorServiceStub::SensorDisableInner(MessageParcel &data, MessageParcel { (void)reply; uint32_t sensorId = data.ReadUint32(); - if (!CheckSensorPermission(sensorId)) { + PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } @@ -132,7 +102,8 @@ ErrCode SensorServiceStub::GetSensorStateInner(MessageParcel &data, MessageParce { (void)reply; uint32_t sensorId = data.ReadUint32(); - if (!CheckSensorPermission(sensorId)) { + PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } @@ -143,7 +114,8 @@ ErrCode SensorServiceStub::RunCommandInner(MessageParcel &data, MessageParcel &r { (void)reply; uint32_t sensorId = data.ReadUint32(); - if (!CheckSensorPermission(sensorId)) { + PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 2ccffc75..47a848e2 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -31,10 +31,10 @@ ohos_shared_library("libsensor_utils") { "//utils/system/safwk/native/include", "//drivers/peripheral/sensor/interfaces/include", "$SUBSYSTEM_DIR/sensor/interfaces/native/include", - "//foundation/communication/ipc/interfaces/innerkits/ipc_core/include/message_parcel.h", ] external_deps = [ + "access_token:libaccesstoken_sdk", "hisysevent_native:libhisysevent", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", diff --git a/utils/include/app_thread_info.h b/utils/include/app_thread_info.h old mode 100755 new mode 100644 index 2bf75c1f..ac4c77c7 --- a/utils/include/app_thread_info.h +++ b/utils/include/app_thread_info.h @@ -15,14 +15,17 @@ #ifndef APP_THREAD_INFO_H #define APP_THREAD_INFO_H - +#include "accesstoken_kit.h" namespace OHOS { namespace Sensors { +using Security::AccessToken::AccessTokenID; struct AppThreadInfo { int32_t pid; int32_t uid; + AccessTokenID callerToken; AppThreadInfo() : pid(0), uid(0) {}; - AppThreadInfo(int32_t pid, int32_t uid) : pid(pid), uid(uid) {}; + AppThreadInfo(int32_t pid, int32_t uid, AccessTokenID callerToken) : + pid(pid), uid(uid), callerToken(callerToken) {}; }; } // namespace Sensors } // namespace OHOS diff --git a/utils/include/permission_util.h b/utils/include/permission_util.h old mode 100755 new mode 100644 index 30a6da77..4a5721a2 --- a/utils/include/permission_util.h +++ b/utils/include/permission_util.h @@ -17,39 +17,22 @@ #define PERMISSION_UTIL_H #include -#include #include #include - -#include "app_thread_info.h" +#include "accesstoken_kit.h" #include "refbase.h" #include "singleton.h" namespace OHOS { namespace Sensors { -// using namespace OHOS::AppExecFwk; - -// Callback registered with BMS to listen APP permission changes. -// class PermissionChangedCallback : public OnPermissionChangedHost { -// public: - -// private: - +using namespace Security::AccessToken; class PermissionUtil : public Singleton { public: PermissionUtil() = default; - virtual ~PermissionUtil(); - /* check local caller's permission by permission name */ - bool CheckCallingPermission(const std::string &permissionName); - bool RegistPermissionChanged(const AppThreadInfo &appThreadInfo); - void UnregistPermissionChanged(const AppThreadInfo &appThreadInfo); - void UpdatePermissionStatus(int32_t uid, const std::string &permissionName, bool permissionStatus); + virtual ~PermissionUtil() {}; + bool CheckSensorPermission(AccessTokenID callerToken, int32_t sensorTypeId); private: - bool IsPermissionRegisted(int32_t uid); - std::mutex permissionStatusMutex_; - std::unordered_map> appPermissionStatus_; - static std::unordered_map sensorPermissions_; }; } // namespace Sensors diff --git a/utils/src/permission_util.cpp b/utils/src/permission_util.cpp old mode 100755 new mode 100644 index b66a49b4..0c2f2684 --- a/utils/src/permission_util.cpp +++ b/utils/src/permission_util.cpp @@ -16,7 +16,7 @@ #include "permission_util.h" #include - +#include "sensor_agent_type.h" #include "sensors_errors.h" #include "sensors_log_domain.h" @@ -26,16 +26,6 @@ using namespace OHOS::HiviewDFX; namespace { constexpr HiLogLabel LABEL = { LOG_CORE, SensorsLogDomain::SENSOR_UTILS, "PermissionUtil" }; -constexpr uint32_t SENSOR_ACCELEROMETER_ID = 256; -constexpr uint32_t SENSOR_ACCELEROMETER_UNCALIBRATED_ID = 65792; -constexpr uint32_t SENSOR_LINEAR_ACCELERATION_ID = 131328; -constexpr uint32_t SENSOR_GYROSCOPE_ID = 262400; -constexpr uint32_t SENSOR_GYROSCOPE_UNCALIBRATED_ID = 327936; -constexpr uint32_t SENSOR_PEDOMETER_DETECTION_ID = 524544; -constexpr uint32_t SENSOR_PEDOMETER_ID = 590080; -constexpr uint32_t SENSOR_HEART_RATE_ID = 83886336; -constexpr int32_t GET_SERVICE_MAX_COUNT = 30; -constexpr uint32_t WAIT_MS = 200; const std::string ACCELEROMETER_PERMISSION = "ohos.permission.ACCELEROMETER"; const std::string GYROSCOPE_PERMISSION = "ohos.permission.GYROSCOPE"; const std::string ACTIVITY_MOTION_PERMISSION = "ohos.permission.ACTIVITY_MOTION"; @@ -43,81 +33,30 @@ const std::string READ_HEALTH_DATA_PERMISSION = "ohos.permission.READ_HEALTH_DAT } // namespace std::unordered_map PermissionUtil::sensorPermissions_ = { - { SENSOR_ACCELEROMETER_ID, ACCELEROMETER_PERMISSION }, - { SENSOR_ACCELEROMETER_UNCALIBRATED_ID, ACCELEROMETER_PERMISSION }, - { SENSOR_LINEAR_ACCELERATION_ID, ACCELEROMETER_PERMISSION }, - { SENSOR_GYROSCOPE_ID, GYROSCOPE_PERMISSION }, - { SENSOR_GYROSCOPE_UNCALIBRATED_ID, GYROSCOPE_PERMISSION }, - { SENSOR_PEDOMETER_DETECTION_ID, ACTIVITY_MOTION_PERMISSION }, - { SENSOR_PEDOMETER_ID, ACTIVITY_MOTION_PERMISSION }, - { SENSOR_HEART_RATE_ID, READ_HEALTH_DATA_PERMISSION } + { SENSOR_TYPE_ID_ACCELEROMETER, ACCELEROMETER_PERMISSION }, + { SENSOR_TYPE_ID_ACCELEROMETER_UNCALIBRATED, ACCELEROMETER_PERMISSION }, + { SENSOR_TYPE_ID_LINEAR_ACCELERATION, ACCELEROMETER_PERMISSION }, + { SENSOR_TYPE_ID_GYROSCOPE, GYROSCOPE_PERMISSION }, + { SENSOR_TYPE_ID_GYROSCOPE_UNCALIBRATED, GYROSCOPE_PERMISSION }, + { SENSOR_TYPE_ID_PEDOMETER_DETECTION, ACTIVITY_MOTION_PERMISSION }, + { SENSOR_TYPE_ID_PEDOMETER, ACTIVITY_MOTION_PERMISSION }, + { SENSOR_TYPE_ID_HEART_RATE, READ_HEALTH_DATA_PERMISSION } }; -PermissionUtil::~PermissionUtil() -{ - appPermissionStatus_.clear(); -} - -bool PermissionUtil::IsPermissionRegisted(int32_t uid) -{ - HiLog::Debug(LABEL, "%{public}s appPermissionStatus_.size : %{public}d", __func__, - int32_t { appPermissionStatus_.size() }); - std::lock_guard permissionLock(permissionStatusMutex_); - auto permissionIt = appPermissionStatus_.find(uid); - if (permissionIt != appPermissionStatus_.end()) { - HiLog::Debug(LABEL, "%{public}s uid : %{public}d permission has registered", __func__, uid); - return true; - } - return false; -} - -bool PermissionUtil::RegistPermissionChanged(const AppThreadInfo &appThreadInfo) +bool PermissionUtil::CheckSensorPermission(AccessTokenID callerToken, int32_t sensorTypeId) { - HiLog::Debug(LABEL, "%{public}s begin, uid : %{public}d, pid : %{public}d", __func__, appThreadInfo.uid, - appThreadInfo.pid); - // Avoid registering callback functions repeatedly - if (IsPermissionRegisted(appThreadInfo.uid)) { - HiLog::Debug(LABEL, "%{public}s uid : %{public}d permission has registered", __func__, appThreadInfo.uid); + if (sensorPermissions_.find(sensorTypeId) == sensorPermissions_.end()) { return true; } - int32_t retry = 0; - while (retry < GET_SERVICE_MAX_COUNT) { - std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_MS)); - HiLog::Error(LABEL, "%{public}s registered failed, retry : %{public}d", __func__, retry); - retry++; + std::string permissionName = sensorPermissions_[sensorTypeId]; + int32_t result = AccessTokenKit::VerifyAccessToken(callerToken, permissionName); + if (result == PERMISSION_GRANTED) { + HiLog::Error(LABEL, "%{public}s sensorid: %{public}d grant failed, result: %{public}d", + __func__, sensorTypeId, result); + return false; } - HiLog::Debug(LABEL, "%{public}s end", __func__); + HiLog::Debug(LABEL, "%{public}s sensorid: %{public}d grant success", __func__, sensorTypeId); return true; } - -void PermissionUtil::UnregistPermissionChanged(const AppThreadInfo &appThreadInfo) -{ - HiLog::Debug(LABEL, "%{public}s begin, uid : %{public}d, pid : %{public}d", __func__, appThreadInfo.uid, - appThreadInfo.pid); - std::lock_guard permissionLock(permissionStatusMutex_); - auto permissionIt = appPermissionStatus_.find(appThreadInfo.uid); - if (permissionIt != appPermissionStatus_.end()) { - HiLog::Debug(LABEL, "%{public}s erase uid : %{public}d permission", __func__, appThreadInfo.uid); - appPermissionStatus_.erase(permissionIt); - return; - } - HiLog::Debug(LABEL, "%{public}s end", __func__); -} - -void PermissionUtil::UpdatePermissionStatus(int32_t uid, const std::string &permissionName, bool permissionStatus) -{ - HiLog::Debug(LABEL, "%{public}s begin", __func__); - std::lock_guard permissionLock(permissionStatusMutex_); - auto permissionIt = appPermissionStatus_.find(uid); - if (permissionIt == appPermissionStatus_.end()) { - std::unordered_map permissionMap; - permissionMap.insert(std::make_pair(permissionName, permissionStatus)); - appPermissionStatus_.insert(std::make_pair(uid, permissionMap)); - HiLog::Debug(LABEL, "%{public}s end", __func__); - return; - } - permissionIt->second[permissionName] = permissionStatus; - HiLog::Debug(LABEL, "%{public}s end", __func__); -} } // namespace Sensors } // namespace OHOS -- Gitee From f54d8ccb15d10507ed45ad877097a12c166de903 Mon Sep 17 00:00:00 2001 From: hellohyh001 Date: Tue, 22 Feb 2022 21:33:35 +0800 Subject: [PATCH 2/2] Signed-off-by:hellohyh001 Signed-off-by: hellohyh001 --- services/sensor/src/sensor_service_stub.cpp | 8 ++++---- utils/include/app_thread_info.h | 4 ++-- utils/src/permission_util.cpp | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/sensor/src/sensor_service_stub.cpp b/services/sensor/src/sensor_service_stub.cpp index be8574cc..067ab007 100644 --- a/services/sensor/src/sensor_service_stub.cpp +++ b/services/sensor/src/sensor_service_stub.cpp @@ -79,7 +79,7 @@ ErrCode SensorServiceStub::SensorEnableInner(MessageParcel &data, MessageParcel (void)reply; uint32_t sensorId = data.ReadUint32(); PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); - if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID(), sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } @@ -91,7 +91,7 @@ ErrCode SensorServiceStub::SensorDisableInner(MessageParcel &data, MessageParcel (void)reply; uint32_t sensorId = data.ReadUint32(); PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); - if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID(), sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } @@ -103,7 +103,7 @@ ErrCode SensorServiceStub::GetSensorStateInner(MessageParcel &data, MessageParce (void)reply; uint32_t sensorId = data.ReadUint32(); PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); - if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID(), sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } @@ -115,7 +115,7 @@ ErrCode SensorServiceStub::RunCommandInner(MessageParcel &data, MessageParcel &r (void)reply; uint32_t sensorId = data.ReadUint32(); PermissionUtil &permissionUtil = PermissionUtil::GetInstance(); - if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID() ,sensorId)) { + if (!permissionUtil.CheckSensorPermission(this->GetCallingTokenID(), sensorId)) { HiLog::Error(LABEL, "%{public}s permission denied", __func__); return ERR_PERMISSION_DENIED; } diff --git a/utils/include/app_thread_info.h b/utils/include/app_thread_info.h index ac4c77c7..9a897de9 100644 --- a/utils/include/app_thread_info.h +++ b/utils/include/app_thread_info.h @@ -24,8 +24,8 @@ struct AppThreadInfo { int32_t uid; AccessTokenID callerToken; AppThreadInfo() : pid(0), uid(0) {}; - AppThreadInfo(int32_t pid, int32_t uid, AccessTokenID callerToken) : - pid(pid), uid(uid), callerToken(callerToken) {}; + AppThreadInfo(int32_t pid, int32_t uid, AccessTokenID callerToken) + : pid(pid), uid(uid), callerToken(callerToken) {}; }; } // namespace Sensors } // namespace OHOS diff --git a/utils/src/permission_util.cpp b/utils/src/permission_util.cpp index 0c2f2684..92a4bd45 100644 --- a/utils/src/permission_util.cpp +++ b/utils/src/permission_util.cpp @@ -51,11 +51,11 @@ bool PermissionUtil::CheckSensorPermission(AccessTokenID callerToken, int32_t se std::string permissionName = sensorPermissions_[sensorTypeId]; int32_t result = AccessTokenKit::VerifyAccessToken(callerToken, permissionName); if (result == PERMISSION_GRANTED) { - HiLog::Error(LABEL, "%{public}s sensorid: %{public}d grant failed, result: %{public}d", - __func__, sensorTypeId, result); + HiLog::Error(LABEL, "%{public}s sensorId: %{public}d grant failed, result: %{public}d", + __func__, sensorTypeId, result); return false; } - HiLog::Debug(LABEL, "%{public}s sensorid: %{public}d grant success", __func__, sensorTypeId); + HiLog::Debug(LABEL, "%{public}s sensorId: %{public}d grant success", __func__, sensorTypeId); return true; } } // namespace Sensors -- Gitee