1 /* 2 * Copyright (c) 2022-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 16 #ifndef OS_ACCOUNT_INTERFACES_KITS_NAPI_IAM_INCLUDE_NAPI_IAM_COMMON_H 17 #define OS_ACCOUNT_INTERFACES_KITS_NAPI_IAM_INCLUDE_NAPI_IAM_COMMON_H 18 19 #include "account_error_no.h" 20 #include "account_iam_client_callback.h" 21 #include "account_iam_info.h" 22 #ifdef HAS_PIN_AUTH_PART 23 #include "i_inputer.h" 24 #endif 25 #include "napi/native_api.h" 26 #include "napi/native_node_api.h" 27 #include "napi_account_common.h" 28 29 namespace OHOS { 30 namespace AccountJsKit { 31 constexpr size_t ARG_SIZE_ONE = 1; 32 constexpr size_t ARG_SIZE_TWO = 2; 33 constexpr size_t ARG_SIZE_THREE = 3; 34 constexpr size_t ARG_SIZE_FOUR = 4; 35 constexpr size_t ARG_SIZE_FIVE = 5; 36 37 constexpr size_t PARAM_ZERO = 0; 38 constexpr size_t PARAM_ONE = 1; 39 constexpr size_t PARAM_TWO = 2; 40 constexpr size_t PARAM_THREE = 3; 41 constexpr size_t PARAM_FOUR = 4; 42 constexpr size_t PARAM_FIVE = 5; 43 44 int32_t AccountIAMConvertToJSErrCode(int32_t errCode); 45 46 struct JsIAMCallback { JsIAMCallbackJsIAMCallback47 JsIAMCallback(napi_env env) : env(env) {} ~JsIAMCallbackJsIAMCallback48 ~JsIAMCallback() 49 { 50 ReleaseNapiRefArray(env, {onResult, onAcquireInfo}); 51 } 52 bool onResultCalled = false; 53 napi_env env; 54 napi_ref onResult = nullptr; 55 napi_ref onAcquireInfo = nullptr; 56 bool hasOnAcquireInfo = false; 57 }; 58 59 #ifdef HAS_USER_AUTH_PART 60 struct IDMCallbackParam : public CommonAsyncContext { IDMCallbackParamIDMCallbackParam61 explicit IDMCallbackParam(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 62 std::shared_ptr<JsIAMCallback> callback; 63 int32_t result = 0; 64 int32_t module = 0; 65 uint32_t acquire = 0; 66 uint64_t credentialId = 0; 67 std::vector<uint8_t> extraInfo; 68 }; 69 70 struct AuthCallbackParam : public CommonAsyncContext { AuthCallbackParamAuthCallbackParam71 explicit AuthCallbackParam(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 72 int32_t module = 0; 73 uint32_t acquireInfo = 0; 74 std::vector<uint8_t> extraInfo; 75 int32_t resultCode = 0; 76 int32_t remainTimes = -1; 77 int32_t freezingTime = -1; 78 std::vector<uint8_t> token; 79 std::shared_ptr<JsIAMCallback> callback; 80 bool hasNextPhaseFreezingTime = false; 81 bool hasCredentialId = false; 82 bool hasAccountId = false; 83 bool hasPinValidityPeriod = false; 84 int32_t nextPhaseFreezingTime = -1; 85 uint64_t credentialId = 0; 86 int32_t accountId = -1; 87 int64_t pinValidityPeriod = -1; 88 }; 89 90 struct AuthContext { 91 int32_t userId = -1; 92 int32_t authType = -1; 93 int32_t trustLevel = -1; 94 bool throwErr = true; 95 bool parseHasAccountId = false; 96 std::vector<uint8_t> challenge; 97 AccountSA::AuthOptions authOptions; 98 std::shared_ptr<AccountSA::IDMCallback> callback; 99 }; 100 101 struct PrepareRemoteAuthContext : public CommonAsyncContext { PrepareRemoteAuthContextPrepareRemoteAuthContext102 explicit PrepareRemoteAuthContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 103 int32_t result = 0; 104 std::string remoteNetworkId; 105 }; 106 107 class NapiPrepareRemoteAuthCallback : public AccountSA::PreRemoteAuthCallback { 108 public: 109 explicit NapiPrepareRemoteAuthCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred); 110 virtual ~NapiPrepareRemoteAuthCallback(); 111 112 void OnResult(int32_t result) override; 113 114 private: 115 napi_env env_ = nullptr; 116 napi_ref callbackRef_ = nullptr; 117 napi_deferred deferred_ = nullptr; 118 std::mutex mutex_; 119 }; 120 121 struct IDMContext : public CommonAsyncContext { IDMContextIDMContext122 IDMContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 123 bool throwErr = true; 124 std::vector<uint8_t> challenge; 125 uint64_t credentialId = 0; 126 int32_t accountId = -1; 127 bool parseHasAccountId = false; 128 std::vector<uint8_t> token; 129 AccountSA::CredentialParameters addCredInfo; 130 std::shared_ptr<JsIAMCallback> callback; 131 }; 132 133 struct GetAuthInfoContext : public CommonAsyncContext { GetAuthInfoContextGetAuthInfoContext134 explicit GetAuthInfoContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 135 int32_t accountId = -1; 136 bool parseHasAccountId = false; 137 AccountSA::AuthType authType {0}; 138 std::vector<AccountSA::CredentialInfo> credInfo; 139 }; 140 141 struct GetEnrolledIdContext : public CommonAsyncContext { GetEnrolledIdContextGetEnrolledIdContext142 explicit GetEnrolledIdContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 143 int32_t accountId = -1; 144 bool parseHasAccountId = false; 145 AccountSA::AuthType authType {0}; 146 uint64_t enrolledId = 0; 147 }; 148 149 struct GetPropertyContext : public CommonAsyncContext { GetPropertyContextGetPropertyContext150 explicit GetPropertyContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 151 AccountSA::GetPropertyRequest request; 152 int32_t result = 0; 153 int32_t authSubType = 0; 154 int32_t remainTimes = 0; 155 int32_t freezingTime = 0; 156 std::string enrollmentProgress; 157 std::string sensorInfo; 158 int32_t accountId = -1; 159 bool parseHasAccountId = false; 160 int32_t nextPhaseFreezingTime = -1; 161 }; 162 163 struct SetPropertyContext : public CommonAsyncContext { SetPropertyContextSetPropertyContext164 explicit SetPropertyContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {}; 165 AccountSA::SetPropertyRequest request; 166 int32_t result = 0; 167 int32_t accountId = -1; 168 }; 169 170 class NapiIDMCallback : public AccountSA::IDMCallback { 171 public: 172 NapiIDMCallback(napi_env env, const std::shared_ptr<JsIAMCallback> &callback); 173 virtual ~NapiIDMCallback(); 174 175 void OnResult(int32_t result, const AccountSA::Attributes &extraInfo) override; 176 void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const AccountSA::Attributes &extraInfo) override; 177 178 private: 179 napi_env env_; 180 std::shared_ptr<JsIAMCallback> callback_; 181 std::mutex mutex_; 182 }; 183 184 class NapiGetInfoCallback : public AccountSA::GetCredInfoCallback { 185 public: 186 explicit NapiGetInfoCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred); 187 virtual ~NapiGetInfoCallback(); 188 189 void OnCredentialInfo(int32_t result, const std::vector<AccountSA::CredentialInfo> &infoList) override; 190 private: 191 napi_env env_; 192 napi_ref callbackRef_; 193 napi_deferred deferred_; 194 }; 195 196 class NapiGetEnrolledIdCallback : public AccountSA::GetEnrolledIdCallback { 197 public: 198 explicit NapiGetEnrolledIdCallback(napi_env env, napi_deferred deferred); 199 virtual ~NapiGetEnrolledIdCallback(); 200 201 void OnEnrolledId(int32_t result, uint64_t enrolledId) override; 202 private: 203 napi_env env_; 204 napi_deferred deferred_; 205 }; 206 207 class NapiUserAuthCallback : public AccountSA::IDMCallback { 208 public: 209 NapiUserAuthCallback(napi_env env, const std::shared_ptr<JsIAMCallback> &callback); 210 virtual ~NapiUserAuthCallback(); 211 212 void OnResult(int32_t result, const AccountSA::Attributes &extraInfo) override; 213 void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const AccountSA::Attributes &extraInfo) override; 214 215 private: 216 void PrepareAuthResult(int32_t result, const AccountSA::Attributes &extraInfo, AuthCallbackParam ¶m); 217 218 private: 219 napi_env env_; 220 std::shared_ptr<JsIAMCallback> callback_; 221 std::mutex mutex_; 222 }; 223 224 class NapiGetPropCallback : public AccountSA::GetSetPropCallback { 225 public: 226 explicit NapiGetPropCallback( 227 napi_env env, napi_ref callbackRef, napi_deferred deferred, const AccountSA::GetPropertyRequest &request); 228 virtual ~NapiGetPropCallback(); 229 void GetContextParams(const UserIam::UserAuth::Attributes &extraInfo, GetPropertyContext &context); 230 void OnResult(int32_t result, const AccountSA::Attributes &extraInfo) override; 231 private: 232 napi_env env_ = nullptr; 233 napi_ref callbackRef_ = nullptr; 234 napi_deferred deferred_ = nullptr; 235 AccountSA::GetPropertyRequest request_; 236 std::mutex mutex_; 237 }; 238 239 class NapiSetPropCallback : public AccountSA::GetSetPropCallback { 240 public: 241 explicit NapiSetPropCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred); 242 virtual ~NapiSetPropCallback(); 243 244 void OnResult(int32_t result, const AccountSA::Attributes &extraInfo) override; 245 246 private: 247 napi_env env_ = nullptr; 248 napi_ref callbackRef_ = nullptr; 249 napi_deferred deferred_ = nullptr; 250 std::mutex mutex_; 251 }; 252 #endif // HAS_USER_AUTH_PART 253 254 #ifdef HAS_PIN_AUTH_PART 255 struct InputerContext : public CommonAsyncContext { 256 int32_t authSubType = -1; 257 std::vector<uint8_t> challenge; 258 std::shared_ptr<AccountSA::IInputerData> inputerData = nullptr; 259 std::shared_ptr<NapiCallbackRef> callback; 260 }; 261 262 class NapiGetDataCallback : public AccountSA::IInputer { 263 public: 264 NapiGetDataCallback(napi_env env, const std::shared_ptr<NapiCallbackRef> &callback); 265 virtual ~NapiGetDataCallback(); 266 267 void OnGetData(int32_t authSubType, std::vector<uint8_t> challenge, 268 const std::shared_ptr<AccountSA::IInputerData> inputerData) override; 269 270 private: 271 napi_env env_; 272 std::shared_ptr<NapiCallbackRef> callback_; 273 ThreadLockInfo lockInfo_; 274 }; 275 #endif // HAS_PIN_AUTH_PART 276 277 void CallbackAsyncOrPromise(napi_env env, CommonAsyncContext *context, napi_value errJs, napi_value dataJs); 278 napi_value CreateErrorObject(napi_env env, int32_t code); 279 napi_status ParseUInt32Array(napi_env env, napi_value value, std::vector<uint32_t> &data); 280 napi_status ParseIAMCallback(napi_env env, napi_value object, std::shared_ptr<JsIAMCallback> &callback); 281 #ifdef HAS_USER_AUTH_PART 282 napi_status ParseAddCredInfo(napi_env env, napi_value value, IDMContext &context); 283 napi_status ParseGetPropRequest(napi_env env, napi_value object, GetPropertyContext &context); 284 napi_status ParseSetPropRequest(napi_env env, napi_value object, AccountSA::SetPropertyRequest &request); 285 napi_value CreateCredInfoArray(napi_env env, const std::vector<AccountSA::CredentialInfo> &info); 286 napi_value CreateAuthResult(napi_env env, const std::vector<uint8_t> &token, int32_t remainTimes, int32_t freezingTime); 287 bool IsAccountIdValid(int32_t accountId); 288 #endif 289 } // namespace AccountJsKit 290 } // namespace OHOS 291 #endif // OS_ACCOUNT_INTERFACES_KITS_NAPI_IAM_INCLUDE_NAPI_IAM_COMMON_H 292