diff --git a/bundle.json b/bundle.json index cdf2edd62d7b5f86a27279b9109f18e557ff7eef..4e7165f5544fcdeeb367592619845ad6c115b446 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 8ff409c3642dc1b7fe3a7968b0e21f226269faba..f3795ce655083c8522dbbcd62b18baba5581bf6b --- 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 e2d6fa35a3049c842131b1ec47e6802362711217..78b528ecd53571b212f265578ec718b3e7c7a4f7 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 7f6154cc77f4fa34388595b620db067dea848798..3a2955bc6e32697e38408e0244e182edc9c6c0a4 --- 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 ce3c973a2e79f4bb0717fe04aa93af16a23a5e23..96e9a20a75edd22545c60ad85785a052123699b0 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 21686710fa83ba5ba14faf823c9547803b426cb6..ef42b7285b547e5d75f708b1f53e7892b2a59ab4 --- 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 6b2022082156a675d0f55451b0e99151ab56eb19..1d1fd203dc6bda3aff68ac3aeeb426846b7c79cc --- 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 bd19f1970ca464a3f087e42b9899dbf59212ff9b..3bccea20208cdc094dbab8a399dc0b156427177d 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 85e6f3ac5417bd1f71b93dd9d78911a2c9f1a14e..a6288cef9a51a595290c6cb5f5a11d31d1da7f71 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 2cdc99fd89233c721a20c72ac2bf092d91d425a1..97724d87a52b08a74d7656a8553c17880106bdfb 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 b7dbfe73dc3ab0fe514a656c9a52fbb04c345568..067ab0072c2d7962e2a1e97097c1548da91ac6ea --- 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 2ccffc75aed23a5135d968f17329c3abd7ffcbf9..47a848e29302856c49a1aa2ba58373826648422d 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 2bf75c1f4b25b4691f0540cafd099461418aae96..9a897de950105cbb5c21de3ea51d7e087f80e717 --- 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 30a6da77cf41197ef71635f5b4b8f8ca2b8f287d..4a5721a216aa9c60f0cca4121243ac91485e4854 --- 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 b66a49b4d303b544e9e3dad8035999d0c248b7c5..92a4bd45f029c43f7fdb5b333ec1a90cb5aa7a26 --- 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