1 /* 2 * Copyright (c) 2021-2024 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 #ifndef INTERFACES_ACCESSTOKEN_KITS_NAPI_ATMANAGER_H 16 #define INTERFACES_ACCESSTOKEN_KITS_NAPI_ATMANAGER_H 17 18 #include "accesstoken_kit.h" 19 #include "napi_error.h" 20 #include "napi_context_common.h" 21 22 namespace OHOS { 23 namespace Security { 24 namespace AccessToken { 25 const int32_t PARAM_DEFAULT_VALUE = -1; 26 27 enum PermissionStateChangeType { 28 PERMISSION_REVOKED_OPER = 0, 29 PERMISSION_GRANTED_OPER = 1, 30 }; 31 32 static thread_local napi_ref g_atManagerRef_; 33 const std::string ATMANAGER_CLASS_NAME = "atManager"; 34 class RegisterPermStateChangeScopePtr : public std::enable_shared_from_this<RegisterPermStateChangeScopePtr>, 35 public PermStateChangeCallbackCustomize { 36 public: 37 explicit RegisterPermStateChangeScopePtr(const PermStateChangeScope& subscribeInfo); 38 ~RegisterPermStateChangeScopePtr() override; 39 void PermStateChangeCallback(PermStateChangeInfo& result) override; 40 void SetEnv(const napi_env& env); 41 void SetCallbackRef(const napi_ref& ref); 42 void SetValid(bool valid); 43 void DeleteNapiRef(); 44 private: 45 napi_env env_ = nullptr; 46 napi_ref ref_ = nullptr; 47 bool valid_ = true; 48 std::mutex validMutex_; 49 }; 50 51 struct RegisterPermStateChangeWorker { 52 napi_env env = nullptr; 53 napi_ref ref = nullptr; 54 PermStateChangeInfo result; 55 std::shared_ptr<RegisterPermStateChangeScopePtr> subscriber = nullptr; 56 }; 57 58 struct PermStateChangeContext { 59 virtual ~PermStateChangeContext(); 60 napi_env env = nullptr; 61 napi_ref callbackRef = nullptr; 62 int32_t errCode = RET_SUCCESS; 63 std::string permStateChangeType; 64 AccessTokenKit* accessTokenKit = nullptr; 65 std::thread::id threadId_; 66 std::shared_ptr<RegisterPermStateChangeScopePtr> subscriber = nullptr; 67 }; 68 69 typedef PermStateChangeContext RegisterPermStateChangeInfo; 70 71 struct UnregisterPermStateChangeInfo : public PermStateChangeContext { 72 PermStateChangeScope scopeInfo; 73 }; 74 75 struct AtManagerAsyncContext : public AtManagerAsyncWorkData { AtManagerAsyncContextAtManagerAsyncContext76 explicit AtManagerAsyncContext(napi_env env) : AtManagerAsyncWorkData(env) {} 77 78 AccessTokenID tokenId = 0; 79 std::string permissionName; 80 union { 81 uint32_t flag = 0; 82 uint32_t status; 83 }; 84 int32_t result = RET_FAILED; 85 int32_t errorCode = 0; 86 std::string extErrorMsg = ""; 87 }; 88 89 struct AtManagerSyncContext { AtManagerSyncContextAtManagerSyncContext90 explicit AtManagerSyncContext() {} 91 92 napi_env env = nullptr; 93 AccessTokenID tokenId = 0; 94 std::string permissionName; 95 int32_t result = RET_FAILED; 96 int32_t errorCode = 0; 97 PermissionOper permissionsState = PermissionOper::INVALID_OPER; 98 }; 99 100 struct GrantStatusCache { 101 int32_t status; 102 std::string paramValue; 103 }; 104 105 struct PermissionStatusCache { 106 PermissionOper status; 107 std::string paramValue; 108 }; 109 110 struct PermissionParamCache { 111 long long sysCommitIdCache = PARAM_DEFAULT_VALUE; 112 int32_t commitIdCache = PARAM_DEFAULT_VALUE; 113 int32_t handle = PARAM_DEFAULT_VALUE; 114 std::string sysParamCache; 115 }; 116 117 class NapiAtManager { 118 public: 119 static napi_value Init(napi_env env, napi_value exports); 120 121 private: 122 static napi_value JsConstructor(napi_env env, napi_callback_info cbinfo); 123 static napi_value CreateAtManager(napi_env env, napi_callback_info cbInfo); 124 static napi_value VerifyAccessToken(napi_env env, napi_callback_info info); 125 static napi_value VerifyAccessTokenSync(napi_env env, napi_callback_info info); 126 static napi_value GrantUserGrantedPermission(napi_env env, napi_callback_info info); 127 static napi_value RevokeUserGrantedPermission(napi_env env, napi_callback_info info); 128 static napi_value CheckAccessToken(napi_env env, napi_callback_info info); 129 static napi_value GetPermissionFlags(napi_env env, napi_callback_info info); 130 static napi_value GetVersion(napi_env env, napi_callback_info info); 131 static napi_value SetPermissionRequestToggleStatus(napi_env env, napi_callback_info info); 132 static napi_value GetPermissionRequestToggleStatus(napi_env env, napi_callback_info info); 133 static napi_value RequestAppPermOnSetting(napi_env env, napi_callback_info info); 134 static napi_value GetSelfPermissionStatusSync(napi_env env, napi_callback_info info); 135 136 static bool ParseInputVerifyPermissionOrGetFlag(const napi_env env, const napi_callback_info info, 137 AtManagerAsyncContext& asyncContext); 138 static bool ParseInputVerifyPermissionSync(const napi_env env, const napi_callback_info info, 139 AtManagerSyncContext& syncContext); 140 static bool ParseInputSetToggleStatus(const napi_env env, const napi_callback_info info, 141 AtManagerAsyncContext& asyncContext); 142 static bool ParseInputGetToggleStatus(const napi_env env, const napi_callback_info info, 143 AtManagerAsyncContext& asyncContext); 144 static bool ParseInputGetPermStatus(const napi_env env, const napi_callback_info info, 145 AtManagerSyncContext& syncContext); 146 static void VerifyAccessTokenExecute(napi_env env, void *data); 147 static void VerifyAccessTokenComplete(napi_env env, napi_status status, void *data); 148 static void CheckAccessTokenExecute(napi_env env, void* data); 149 static void CheckAccessTokenComplete(napi_env env, napi_status status, void* data); 150 static bool ParseInputGrantOrRevokePermission(const napi_env env, const napi_callback_info info, 151 AtManagerAsyncContext& asyncContext); 152 static void GrantUserGrantedPermissionExecute(napi_env env, void *data); 153 static void GrantUserGrantedPermissionComplete(napi_env env, napi_status status, void *data); 154 static void RevokeUserGrantedPermissionExecute(napi_env env, void *data); 155 static void RevokeUserGrantedPermissionComplete(napi_env env, napi_status status, void *data); 156 static void GetVersionExecute(napi_env env, void *data); 157 static void GetVersionComplete(napi_env env, napi_status status, void *data); 158 static void GetPermissionFlagsExecute(napi_env env, void *data); 159 static void GetPermissionFlagsComplete(napi_env env, napi_status status, void *data); 160 static void SetPermissionRequestToggleStatusExecute(napi_env env, void *data); 161 static void SetPermissionRequestToggleStatusComplete(napi_env env, napi_status status, void *data); 162 static void GetPermissionRequestToggleStatusExecute(napi_env env, void *data); 163 static void GetPermissionRequestToggleStatusComplete(napi_env env, napi_status status, void *data); 164 static void RequestAppPermOnSettingExecute(napi_env env, void *data); 165 static void RequestAppPermOnSettingComplete(napi_env env, napi_status status, void *data); 166 static void SetNamedProperty(napi_env env, napi_value dstObj, const int32_t objValue, const char *propName); 167 static void CreateObjects(napi_env env, napi_value exports); 168 static bool GetPermStateChangeType(const napi_env env, const size_t argc, const napi_value* argv, 169 std::string& type); 170 static bool FillPermStateChangeInfo(const napi_env env, const napi_value* argv, const std::string& type, 171 const napi_value thisVar, RegisterPermStateChangeInfo& registerPermStateChangeInfo); 172 static bool ParseInputToRegister(const napi_env env, const napi_callback_info cbInfo, 173 RegisterPermStateChangeInfo& registerPermStateChangeInfo); 174 static napi_value RegisterPermStateChangeCallback(napi_env env, napi_callback_info cbInfo); 175 static bool IsExistRegister(const napi_env env, const RegisterPermStateChangeInfo* registerPermStateChangeInfo); 176 static bool FillPermStateChangeScope(const napi_env env, const napi_value* argv, 177 const std::string& type, PermStateChangeScope& scopeInfo); 178 static bool ParseInputToUnregister(const napi_env env, napi_callback_info cbInfo, 179 UnregisterPermStateChangeInfo& unregisterPermStateChangeInfo); 180 static napi_value UnregisterPermStateChangeCallback(napi_env env, napi_callback_info cbInfo); 181 static bool FindAndGetSubscriberInVector(UnregisterPermStateChangeInfo* unregisterPermStateChangeInfo, 182 std::vector<RegisterPermStateChangeInfo*>& batchPermStateChangeRegisters, const napi_env env); 183 static void DeleteRegisterFromVector(const PermStateChangeScope& scopeInfo, const napi_env env, 184 napi_ref subscriberRef); 185 static std::string GetPermParamValue(PermissionParamCache& paramCache, const char* paramKey); 186 static void UpdatePermissionCache(AtManagerSyncContext* syncContext); 187 }; 188 } // namespace AccessToken 189 } // namespace Security 190 } // namespace OHOS 191 /* 192 * function for module exports 193 */ 194 static napi_value Init(napi_env env, napi_value exports); 195 196 #endif /* INTERFACES_ACCESSTOKEN_KITS_NAPI_ATMANAGER_H */ 197