1 /*
2 * Copyright (c) 2022 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 "useridentity_manager.h"
17 #include <securec.h>
18 #include <iremote_broker.h>
19 #include "callback.h"
20 #include "auth_common.h"
21 #include "useridm_hilog_wrapper.h"
22 #include "napi/native_api.h"
23 #include "napi/native_common.h"
24 #include "authface_userIDM_helper.h"
25
26 namespace OHOS {
27 namespace UserIAM {
28 namespace UserIDM {
29 namespace {
30 const size_t ARGC = 2;
31 }
32
UserIdentityManager()33 UserIdentityManager::UserIdentityManager()
34 {
35 }
36
~UserIdentityManager()37 UserIdentityManager::~UserIdentityManager()
38 {
39 }
40
NAPI_OpenSession(napi_env env,napi_callback_info info)41 napi_value UserIdentityManager::NAPI_OpenSession(napi_env env, napi_callback_info info)
42 {
43 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
44 AsyncOpenSession *asyncInfo = OCreateAsyncInfo(env);
45 if (asyncInfo == nullptr) {
46 return nullptr;
47 }
48 napi_value ret = OpenSessionWrap(env, info, asyncInfo);
49 if (ret == nullptr) {
50 if (asyncInfo != nullptr) {
51 delete asyncInfo;
52 asyncInfo = nullptr;
53 }
54 }
55 return ret;
56 }
57
OpenSessionWrap(napi_env env,napi_callback_info info,AsyncOpenSession * asyncInfo)58 napi_value UserIdentityManager::OpenSessionWrap(napi_env env, napi_callback_info info, AsyncOpenSession *asyncInfo)
59 {
60 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
61 if (asyncInfo == nullptr) {
62 return nullptr;
63 }
64 size_t argc = ARGS_MAX_COUNT;
65 size_t callbackIndex = ZERO_PARAMETER;
66 napi_value argv[ARGS_MAX_COUNT] = {nullptr};
67 napi_value ret = 0;
68 napi_valuetype valuetype = napi_undefined;
69 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
70 if (argc == 0) {
71 NAPI_CALL(env, napi_create_promise(env, &asyncInfo->deferred, &asyncInfo->promise));
72 ret = OpenSessionPromise(env, argv, argc, asyncInfo);
73 } else {
74 callbackIndex = argc - 1;
75 NAPI_CALL(env, napi_typeof(env, argv[callbackIndex], &valuetype));
76 if (valuetype == napi_function) {
77 NAPI_CALL(env, napi_create_reference(env, argv[callbackIndex], 1, &asyncInfo->callback));
78 ret = OpenSessionCallback(env, argv, argc, asyncInfo);
79 } else {
80 NAPI_CALL(env, napi_create_promise(env, &asyncInfo->deferred, &asyncInfo->promise));
81 ret = OpenSessionPromise(env, argv, argc, asyncInfo);
82 }
83 }
84 return ret;
85 }
86
OpenSessionRet(napi_env env,AsyncOpenSession * asyncOpenSession)87 napi_value OpenSessionRet(napi_env env, AsyncOpenSession* asyncOpenSession)
88 {
89 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
90 if (asyncOpenSession == nullptr) {
91 USERIDM_HILOGE(MODULE_JS_NAPI, "OpenSessionRet asyncOpenSession is nullptr");
92 return nullptr;
93 }
94 void* data = nullptr;
95 napi_value arrayBuffer = nullptr;
96 size_t bufferSize = sizeof(asyncOpenSession->openSession);
97 NAPI_CALL(env, napi_create_arraybuffer(env, bufferSize, &data, &arrayBuffer));
98 if (memcpy_s(data, bufferSize, reinterpret_cast<const void*>(&asyncOpenSession->openSession),
99 bufferSize) != EOK) {
100 USERIDM_HILOGE(MODULE_JS_NAPI, "memcpy_s fail.");
101 return nullptr;
102 }
103 napi_value result = nullptr;
104 NAPI_CALL(env, napi_create_typedarray(env, napi_uint8_array, bufferSize, arrayBuffer, 0, &result));
105 return result;
106 }
107
108
OpenSessionCallback(napi_env env,napi_value * argv,size_t argc,AsyncOpenSession * asyncInfo)109 napi_value UserIdentityManager::OpenSessionCallback(napi_env env, napi_value *argv, size_t argc,
110 AsyncOpenSession *asyncInfo)
111 {
112 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
113 if (argv == nullptr || asyncInfo == nullptr) {
114 return nullptr;
115 }
116 napi_value result = nullptr;
117 NAPI_CALL(env, napi_get_null(env, &result));
118 napi_value resourceName = nullptr;
119 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
120 NAPI_CALL(env, napi_create_async_work(
121 env, nullptr, resourceName,
122 [](napi_env env, void *data) {
123 AsyncOpenSession *asyncInfo = (AsyncOpenSession*)data;
124 if (asyncInfo != nullptr) {
125 asyncInfo->openSession = UserIDMClient::GetInstance().OpenSession();
126 }
127 },
128 [](napi_env env, napi_status status, void *data) {
129 AsyncOpenSession *asyncInfo = (AsyncOpenSession*)data;
130 if (asyncInfo != nullptr) {
131 napi_value result[1] = {0};
132 napi_value callback = nullptr;
133 napi_value undefined = nullptr;
134 napi_value callResult = nullptr;
135 result[0] = OpenSessionRet(env, asyncInfo);
136 if (result[0] == nullptr) {
137 USERIDM_HILOGE(MODULE_JS_NAPI, "translate uint64 to uint8Array failed");
138 }
139 napi_get_undefined(env, &undefined);
140 napi_get_reference_value(env, asyncInfo->callback, &callback);
141 napi_call_function(env, undefined, callback, 1, result, &callResult);
142 napi_delete_reference(env, asyncInfo->callback);
143 napi_delete_async_work(env, asyncInfo->asyncWork);
144 delete asyncInfo;
145 asyncInfo = nullptr;
146 }
147 },
148 (void *)asyncInfo, &asyncInfo->asyncWork));
149 NAPI_CALL(env, napi_queue_async_work(env, asyncInfo->asyncWork));
150 return result;
151 }
152
OpenSessionPromise(napi_env env,napi_value * argv,size_t argc,AsyncOpenSession * asyncInfo)153 napi_value UserIdentityManager::OpenSessionPromise(napi_env env, napi_value *argv, size_t argc,
154 AsyncOpenSession *asyncInfo)
155 {
156 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
157 if (asyncInfo == nullptr) {
158 return nullptr;
159 }
160 napi_value resourceName = nullptr;
161 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
162 NAPI_CALL(env, napi_create_async_work(
163 env, nullptr, resourceName,
164 [](napi_env env, void *data) {
165 AsyncOpenSession *asyncInfo = (AsyncOpenSession*)data;
166 if (asyncInfo != nullptr) {
167 asyncInfo->openSession = UserIDMClient::GetInstance().OpenSession();
168 }
169 },
170 [](napi_env env, napi_status status, void *data) {
171 AsyncOpenSession *asyncInfo = (AsyncOpenSession*)data;
172 if (asyncInfo != nullptr) {
173 napi_value retPromise = nullptr;
174 retPromise = OpenSessionRet(env, asyncInfo);
175 if (retPromise == nullptr) {
176 USERIDM_HILOGE(MODULE_JS_NAPI, "translate uint64 to uint8Array failed");
177 }
178 napi_resolve_deferred(asyncInfo->env, asyncInfo->deferred, retPromise);
179 napi_delete_async_work(env, asyncInfo->asyncWork);
180 delete asyncInfo;
181 asyncInfo = nullptr;
182 }
183 },
184 (void *)asyncInfo, &asyncInfo->asyncWork));
185 NAPI_CALL(env, napi_queue_async_work(env, asyncInfo->asyncWork));
186 return asyncInfo->promise;
187 }
188
AddCredentialExecute(napi_env env,void * data)189 void UserIdentityManager::AddCredentialExecute(napi_env env, void *data)
190 {
191 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
192 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
193 if (asyncHolder == nullptr) {
194 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
195 return;
196 }
197 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
198 if (asyncCallbackContext == nullptr) {
199 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncCallbackContext nullptr", __func__);
200 return;
201 }
202 AddCredInfo addCredInfo;
203 addCredInfo.authType = asyncCallbackContext->authType;
204 addCredInfo.authSubType = asyncCallbackContext->authSubType;
205 addCredInfo.token.assign(asyncCallbackContext->token.begin(), asyncCallbackContext->token.end());
206 std::shared_ptr<IDMCallback> iidmCallback = std::make_shared<IIdmCallback>(asyncCallbackContext);
207 UserIDMClient::GetInstance().AddCredential(addCredInfo, iidmCallback);
208 }
209
AddCredentialComplete(napi_env env,napi_status status,void * data)210 void UserIdentityManager::AddCredentialComplete(napi_env env, napi_status status, void *data)
211 {
212 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
213 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
214 if (asyncHolder == nullptr) {
215 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
216 return;
217 }
218 napi_delete_async_work(env, asyncHolder->asyncWork);
219 delete asyncHolder;
220 }
221
BuildAddCredentialInfo(napi_env env,napi_callback_info info,AsyncHolder * asyncHolder)222 napi_value UserIdentityManager::BuildAddCredentialInfo(napi_env env, napi_callback_info info, AsyncHolder *asyncHolder)
223 {
224 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
225 if (asyncCallbackContext == nullptr) {
226 USERIDM_HILOGE(MODULE_JS_NAPI, "BuildAddCredentialInfo asyncCallbackContext nullptr");
227 return nullptr;
228 }
229 if (AuthCommon::JudgeObjectType(env, info, asyncCallbackContext) != napi_ok) {
230 USERIDM_HILOGE(MODULE_JS_NAPI, "BuildAddCredentialInfo JudgeObjectType fail");
231 return nullptr;
232 }
233 napi_value result = nullptr;
234 NAPI_CALL(env, napi_get_null(env, &result));
235 napi_value resourceName = nullptr;
236 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
237 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, AddCredentialExecute, AddCredentialComplete,
238 (void *)asyncHolder, &asyncHolder->asyncWork));
239 NAPI_CALL(env, napi_queue_async_work(env, asyncHolder->asyncWork));
240 return result;
241 }
242
NAPI_AddCredential(napi_env env,napi_callback_info info)243 napi_value UserIdentityManager::NAPI_AddCredential(napi_env env, napi_callback_info info)
244 {
245 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
246 AsyncHolder *asyncHolder = new (std::nothrow) AsyncHolder();
247 if (asyncHolder == nullptr) {
248 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_AddCredential asyncHolder nullptr");
249 return nullptr;
250 }
251 AsyncCallbackContext *asyncCallbackContext = new (std::nothrow) AsyncCallbackContext();
252 if (asyncCallbackContext == nullptr) {
253 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_AddCredential asyncCallbackContext nullptr");
254 delete asyncHolder;
255 return nullptr;
256 }
257 asyncHolder->data = asyncCallbackContext;
258 asyncCallbackContext->env = env;
259 napi_value ret = BuildAddCredentialInfo(env, info, asyncHolder);
260 if (ret == nullptr) {
261 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_AddCredential BuildAddCredentialInfo fail");
262 delete asyncCallbackContext;
263 if (asyncHolder->asyncWork != nullptr) {
264 napi_delete_async_work(env, asyncHolder->asyncWork);
265 }
266 delete asyncHolder;
267 }
268 return ret;
269 }
270
UpdateCredentialExecute(napi_env env,void * data)271 void UserIdentityManager::UpdateCredentialExecute(napi_env env, void *data)
272 {
273 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
274 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
275 if (asyncHolder == nullptr) {
276 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
277 return;
278 }
279 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
280 if (asyncCallbackContext == nullptr) {
281 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncCallbackContext nullptr", __func__);
282 return;
283 }
284 AddCredInfo addCredInfo;
285 addCredInfo.authType = asyncCallbackContext->authType;
286 addCredInfo.authSubType = asyncCallbackContext->authSubType;
287 addCredInfo.token.assign(asyncCallbackContext->token.begin(), asyncCallbackContext->token.end());
288 std::shared_ptr<IDMCallback> iidmCallback = std::make_shared<IIdmCallback>(asyncCallbackContext);
289 UserIDMClient::GetInstance().UpdateCredential(addCredInfo, iidmCallback);
290 }
291
UpdateCredentialComplete(napi_env env,napi_status status,void * data)292 void UserIdentityManager::UpdateCredentialComplete(napi_env env, napi_status status, void *data)
293 {
294 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
295 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
296 if (asyncHolder == nullptr) {
297 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
298 return;
299 }
300 napi_delete_async_work(env, asyncHolder->asyncWork);
301 delete asyncHolder;
302 }
303
BuildUpdateCredentialInfo(napi_env env,napi_callback_info info,AsyncHolder * asyncHolder)304 napi_value UserIdentityManager::BuildUpdateCredentialInfo(
305 napi_env env, napi_callback_info info, AsyncHolder *asyncHolder)
306 {
307 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
308 if (asyncCallbackContext == nullptr) {
309 USERIDM_HILOGE(MODULE_JS_NAPI, "BuildUpdateCredentialInfo asyncCallbackContext nullptr");
310 return nullptr;
311 }
312
313 if (AuthCommon::JudgeObjectType(env, info, asyncCallbackContext) != napi_ok) {
314 USERIDM_HILOGE(MODULE_JS_NAPI, "BuildUpdateCredentialInfo JudgeObjectType fail");
315 return nullptr;
316 }
317 napi_value result = nullptr;
318 NAPI_CALL(env, napi_get_null(env, &result));
319 napi_value resourceName = nullptr;
320 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
321 NAPI_CALL(env, napi_create_async_work(
322 env, nullptr, resourceName, UpdateCredentialExecute, UpdateCredentialComplete,
323 (void *)asyncHolder, &asyncHolder->asyncWork));
324 NAPI_CALL(env, napi_queue_async_work(env, asyncHolder->asyncWork));
325 return result;
326 }
327
NAPI_UpdateCredential(napi_env env,napi_callback_info info)328 napi_value UserIdentityManager::NAPI_UpdateCredential(napi_env env, napi_callback_info info)
329 {
330 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
331 AsyncHolder *asyncHolder = new (std::nothrow) AsyncHolder();
332 if (asyncHolder == nullptr) {
333 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_UpdateCredential asyncHolder nullptr");
334 return nullptr;
335 }
336 AsyncCallbackContext *asyncCallbackContext = new (std::nothrow) AsyncCallbackContext();
337 if (asyncCallbackContext == nullptr) {
338 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_UpdateCredential asyncCallbackContext nullptr");
339 delete asyncHolder;
340 return nullptr;
341 }
342 asyncHolder->data = asyncCallbackContext;
343 asyncCallbackContext->env = env;
344 napi_value ret = BuildUpdateCredentialInfo(env, info, asyncHolder);
345 if (ret == nullptr) {
346 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_UpdateCredential BuildAddCredentialInfo fail");
347 delete asyncCallbackContext;
348 if (asyncHolder->asyncWork != nullptr) {
349 napi_delete_async_work(env, asyncHolder->asyncWork);
350 }
351 delete asyncHolder;
352 }
353 return ret;
354 }
355
NAPI_CloseSession(napi_env env,napi_callback_info info)356 napi_value UserIdentityManager::NAPI_CloseSession(napi_env env, napi_callback_info info)
357 {
358 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
359 napi_value result = nullptr;
360 int32_t retCloseSession = 0;
361 UserIDMClient::GetInstance().CloseSession();
362 NAPI_CALL(env, napi_create_int32(env, retCloseSession, &result));
363 return result;
364 }
365
NAPI_Cancel(napi_env env,napi_callback_info info)366 napi_value UserIdentityManager::NAPI_Cancel(napi_env env, napi_callback_info info)
367 {
368 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
369 napi_value result = nullptr;
370 size_t argc = ONE_PARAMETER;
371 napi_value argv[ONE_PARAMETER] = {0};
372 SyncCancelContext *syncCancelContext = new (std::nothrow) SyncCancelContext();
373 if (syncCancelContext == nullptr) {
374 USERIDM_HILOGE(MODULE_JS_NAPI, "syncCancelContext is nullptr");
375 return result;
376 }
377
378 syncCancelContext->env = env;
379 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
380 syncCancelContext->challenge = AuthCommon::JudgeArryType(env, ZERO_PARAMETER, argv);
381 if (syncCancelContext->challenge.empty() || syncCancelContext->challenge.size() < sizeof(uint64_t)) {
382 USERIDM_HILOGE(MODULE_JS_NAPI, "syncCancelContext->challenge is null or size is wrong!");
383 delete syncCancelContext;
384 syncCancelContext = nullptr;
385 return result;
386 }
387 uint8_t tmp[sizeof(uint64_t)];
388 for (uint32_t i = 0; i < sizeof(uint64_t); i++) {
389 tmp[i] = syncCancelContext->challenge[i];
390 }
391 uint64_t *challenge = static_cast<uint64_t *>(static_cast<void *>(tmp));
392 int32_t ret = UserIDMClient::GetInstance().Cancel(*challenge);
393 NAPI_CALL(env, napi_create_int32(env, ret, &result));
394 delete syncCancelContext;
395 syncCancelContext = nullptr;
396 return result;
397 }
398
DelUserExecute(napi_env env,void * data)399 void UserIdentityManager::DelUserExecute(napi_env env, void *data)
400 {
401 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
402 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
403 if (asyncHolder == nullptr) {
404 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
405 return;
406 }
407 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
408 if (asyncCallbackContext == nullptr) {
409 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncCallbackContext nullptr", __func__);
410 return;
411 }
412 std::shared_ptr<IDMCallback> iidmCallback = std::make_shared<IIdmCallback>(asyncCallbackContext);
413 UserIDMClient::GetInstance().DelUser(asyncCallbackContext->token, iidmCallback);
414 }
415
DelUserComplete(napi_env env,napi_status status,void * data)416 void UserIdentityManager::DelUserComplete(napi_env env, napi_status status, void *data)
417 {
418 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
419 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
420 if (asyncHolder == nullptr) {
421 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
422 return;
423 }
424 napi_delete_async_work(env, asyncHolder->asyncWork);
425 delete asyncHolder;
426 }
427
DoDelUser(napi_env env,napi_callback_info info,AsyncHolder * asyncHolder)428 napi_value UserIdentityManager::DoDelUser(napi_env env, napi_callback_info info, AsyncHolder *asyncHolder)
429 {
430 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
431 if (asyncCallbackContext == nullptr) {
432 USERIDM_HILOGE(MODULE_JS_NAPI, "DoDelUser asyncCallbackContext nullptr");
433 return nullptr;
434 }
435 napi_value result = nullptr;
436 NAPI_CALL(env, napi_get_null(env, &result));
437 AuthCommon::JudgeDelUserType(env, info, asyncCallbackContext);
438 napi_value resourceName = nullptr;
439 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
440 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, DelUserExecute, DelUserComplete,
441 (void *)asyncHolder, &asyncHolder->asyncWork));
442 NAPI_CALL(env, napi_queue_async_work(env, asyncHolder->asyncWork));
443 return result;
444 }
445
NAPI_DelUser(napi_env env,napi_callback_info info)446 napi_value UserIdentityManager::NAPI_DelUser(napi_env env, napi_callback_info info)
447 {
448 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
449 AsyncHolder *asyncHolder = new (std::nothrow) AsyncHolder();
450 if (asyncHolder == nullptr) {
451 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_DelUser asyncHolder nullptr");
452 return nullptr;
453 }
454 AsyncCallbackContext *asyncCallbackContext = new (std::nothrow) AsyncCallbackContext();
455 if (asyncCallbackContext == nullptr) {
456 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_DelUser asyncCallbackContext nullptr");
457 delete asyncHolder;
458 return nullptr;
459 }
460 asyncHolder->data = asyncCallbackContext;
461 asyncCallbackContext->env = env;
462 napi_value ret = DoDelUser(env, info, asyncHolder);
463 if (ret == nullptr) {
464 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_DelUser DoDelUser fail");
465 delete asyncCallbackContext;
466 if (asyncHolder->asyncWork != nullptr) {
467 napi_delete_async_work(env, asyncHolder->asyncWork);
468 }
469 delete asyncHolder;
470 }
471 return ret;
472 }
473
DelCredExecute(napi_env env,void * data)474 void UserIdentityManager::DelCredExecute(napi_env env, void *data)
475 {
476 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
477 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
478 if (asyncHolder == nullptr) {
479 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
480 return;
481 }
482 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
483 if (asyncCallbackContext == nullptr) {
484 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncCallbackContext nullptr", __func__);
485 return;
486 }
487 uint8_t tmp[sizeof(uint64_t)];
488 for (uint32_t i = 0; i < sizeof(uint64_t); i++) {
489 tmp[i] = asyncCallbackContext->credentialId[i];
490 }
491 uint64_t *tempCredentialId = static_cast<uint64_t *>(static_cast<void *>(tmp));
492 std::shared_ptr<IDMCallback> iidmCallback = std::make_shared<IIdmCallback>(asyncCallbackContext);
493 UserIDMClient::GetInstance().DelCred(*tempCredentialId, asyncCallbackContext->token, iidmCallback);
494 }
495
DelCredComplete(napi_env env,napi_status status,void * data)496 void UserIdentityManager::DelCredComplete(napi_env env, napi_status status, void *data)
497 {
498 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
499 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
500 if (asyncHolder == nullptr) {
501 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
502 return;
503 }
504 napi_delete_async_work(env, asyncHolder->asyncWork);
505 delete asyncHolder;
506 }
507
DoDelCred(napi_env env,napi_callback_info info,AsyncHolder * asyncHolder)508 napi_value UserIdentityManager::DoDelCred(napi_env env, napi_callback_info info, AsyncHolder *asyncHolder)
509 {
510 AsyncCallbackContext *asyncCallbackContext = reinterpret_cast<AsyncCallbackContext *>(asyncHolder->data);
511 AuthCommon::JudgeDelCredType(env, info, asyncCallbackContext);
512 napi_value result = nullptr;
513 NAPI_CALL(env, napi_get_null(env, &result));
514 napi_value resourceName = nullptr;
515 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
516 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, DelCredExecute, DelCredComplete,
517 (void *)asyncHolder, &asyncHolder->asyncWork));
518 NAPI_CALL(env, napi_queue_async_work(env, asyncHolder->asyncWork));
519 return result;
520 }
521
NAPI_DelCred(napi_env env,napi_callback_info info)522 napi_value UserIdentityManager::NAPI_DelCred(napi_env env, napi_callback_info info)
523 {
524 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
525 AsyncHolder *asyncHolder = new (std::nothrow) AsyncHolder();
526 if (asyncHolder == nullptr) {
527 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_DelCred asyncHolder nullptr");
528 return nullptr;
529 }
530 AsyncCallbackContext *asyncCallbackContext = new (std::nothrow) AsyncCallbackContext();
531 if (asyncCallbackContext == nullptr) {
532 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_DelCred asyncCallbackContext nullptr");
533 delete asyncHolder;
534 return nullptr;
535 }
536 asyncHolder->data = asyncCallbackContext;
537 asyncCallbackContext->env = env;
538 napi_value ret = DoDelCred(env, info, asyncHolder);
539 if (ret == nullptr) {
540 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_DelCred DoDelCred fail");
541 delete asyncCallbackContext;
542 if (asyncHolder->asyncWork != nullptr) {
543 napi_delete_async_work(env, asyncHolder->asyncWork);
544 }
545 delete asyncHolder;
546 }
547 return ret;
548 }
549
NAPI_GetAuthInfo(napi_env env,napi_callback_info info)550 napi_value UserIdentityManager::NAPI_GetAuthInfo(napi_env env, napi_callback_info info)
551 {
552 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
553 AsyncHolder *asyncHolder = new (std::nothrow) AsyncHolder();
554 if (asyncHolder == nullptr) {
555 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_GetAuthInfo asyncHolder nullptr");
556 return nullptr;
557 }
558 AsyncGetAuthInfo *asyncGetAuthInfo = GCreateAsyncInfo(env);
559 if (asyncGetAuthInfo == nullptr) {
560 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_GetAuthInfo asyncGetAuthInfo nullptr");
561 delete asyncHolder;
562 return nullptr;
563 }
564 asyncHolder->data = asyncGetAuthInfo;
565 napi_value ret = GetAuthInfoWrap(env, info, asyncHolder);
566 if (ret == nullptr) {
567 USERIDM_HILOGE(MODULE_JS_NAPI, "NAPI_GetAuthInfo GetAuthInfoWrap fail");
568 delete asyncGetAuthInfo;
569 if (asyncHolder->asyncWork != nullptr) {
570 napi_delete_async_work(env, asyncHolder->asyncWork);
571 }
572 delete asyncHolder;
573 }
574 return ret;
575 }
576
GetAuthInfoWrap(napi_env env,napi_callback_info info,AsyncHolder * asyncHolder)577 napi_value UserIdentityManager::GetAuthInfoWrap(napi_env env, napi_callback_info info, AsyncHolder *asyncHolder)
578 {
579 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
580 AsyncGetAuthInfo *asyncGetAuthInfo = reinterpret_cast<AsyncGetAuthInfo *>(asyncHolder->data);
581 if (asyncGetAuthInfo == nullptr) {
582 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncGetAuthInfo nullptr", __func__);
583 return 0;
584 }
585 size_t argc = ARGS_MAX_COUNT;
586 size_t callbackIndex = ZERO_PARAMETER;
587 napi_value argv[ARGS_MAX_COUNT] = {nullptr};
588 napi_value ret = 0;
589 napi_valuetype valueType = napi_undefined;
590 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
591 if (argc == 0) {
592 NAPI_CALL(env, napi_create_promise(env, &asyncGetAuthInfo->deferred, &asyncGetAuthInfo->promise));
593 ret = GetAuthInfoPromise(env, argv, argc, asyncHolder);
594 } else {
595 callbackIndex = argc - 1;
596 NAPI_CALL(env, napi_typeof(env, argv[callbackIndex], &valueType));
597 if (valueType == napi_function) {
598 NAPI_CALL(env, napi_create_reference(env, argv[callbackIndex], 1, &asyncGetAuthInfo->callback));
599 ret = GetAuthInfoCallback(env, argv, argc, asyncHolder);
600 } else {
601 NAPI_CALL(env, napi_create_promise(env, &asyncGetAuthInfo->deferred, &asyncGetAuthInfo->promise));
602 ret = GetAuthInfoPromise(env, argv, argc, asyncHolder);
603 }
604 }
605 return ret;
606 }
607
GetAuthInfoExecute(napi_env env,void * data)608 void UserIdentityManager::GetAuthInfoExecute(napi_env env, void *data)
609 {
610 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
611 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
612 if (asyncHolder == nullptr) {
613 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
614 return;
615 }
616 AsyncGetAuthInfo *asyncGetAuthInfo = reinterpret_cast<AsyncGetAuthInfo *>(asyncHolder->data);
617 if (asyncGetAuthInfo == nullptr) {
618 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncGetAuthInfo nullptr", __func__);
619 return;
620 }
621 std::shared_ptr<GetInfoCallback> getInfoCallbackIDM = std::make_shared<GetInfoCallbackIDM>(asyncGetAuthInfo);
622 UserIDMClient::GetInstance().GetAuthInfo(asyncGetAuthInfo->authType, getInfoCallbackIDM);
623 }
624
GetAuthInfoComplete(napi_env env,napi_status status,void * data)625 void UserIdentityManager::GetAuthInfoComplete(napi_env env, napi_status status, void *data)
626 {
627 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
628 AsyncHolder *asyncHolder = reinterpret_cast<AsyncHolder *>(data);
629 if (asyncHolder == nullptr) {
630 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncHolder nullptr", __func__);
631 return;
632 }
633 napi_delete_async_work(env, asyncHolder->asyncWork);
634 delete asyncHolder;
635 }
636
GetAuthInfoCallback(napi_env env,napi_value * argv,size_t argc,AsyncHolder * asyncHolder)637 napi_value UserIdentityManager::GetAuthInfoCallback(napi_env env, napi_value *argv, size_t argc,
638 AsyncHolder *asyncHolder)
639 {
640 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
641 AsyncGetAuthInfo *asyncGetAuthInfo = reinterpret_cast<AsyncGetAuthInfo *>(asyncHolder->data);
642 if (asyncGetAuthInfo == nullptr) {
643 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncGetAuthInfo nullptr", __func__);
644 return nullptr;
645 }
646
647 if (argc == ARGC) {
648 napi_valuetype valuetype = napi_undefined;
649 NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype));
650 if (valuetype == napi_number) {
651 int32_t authType_ = 0;
652 NAPI_CALL(env, napi_get_value_int32(env, argv[0], &authType_));
653 asyncGetAuthInfo->authType = static_cast<AuthType>(authType_);
654 } else {
655 asyncGetAuthInfo->authType = static_cast<AuthType>(0);
656 }
657 }
658 napi_value result = nullptr;
659 NAPI_CALL(env, napi_get_null(env, &result));
660 napi_value resourceName = nullptr;
661 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
662 NAPI_CALL(env, napi_create_async_work(
663 env, nullptr, resourceName, GetAuthInfoExecute, GetAuthInfoComplete,
664 (void *)asyncHolder, &asyncHolder->asyncWork));
665 NAPI_CALL(env, napi_queue_async_work(env, asyncHolder->asyncWork));
666 return result;
667 }
668
GetAuthInfoPromise(napi_env env,napi_value * argv,size_t argc,AsyncHolder * asyncHolder)669 napi_value UserIdentityManager::GetAuthInfoPromise(napi_env env, napi_value *argv, size_t argc,
670 AsyncHolder *asyncHolder)
671 {
672 USERIDM_HILOGI(MODULE_JS_NAPI, "%{public}s, start", __func__);
673 AsyncGetAuthInfo *asyncGetAuthInfo = reinterpret_cast<AsyncGetAuthInfo *>(asyncHolder->data);
674 if (asyncGetAuthInfo == nullptr) {
675 USERIDM_HILOGE(MODULE_JS_NAPI, "%{public}s asyncGetAuthInfo nullptr", __func__);
676 return nullptr;
677 }
678
679 napi_valuetype valueType = napi_undefined;
680 NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
681 if (argv[0] != nullptr && valueType == napi_number) {
682 int32_t jsAuthType = 0;
683 NAPI_CALL(env, napi_get_value_int32(env, argv[0], &jsAuthType));
684 asyncGetAuthInfo->authType = static_cast<AuthType>(jsAuthType);
685 } else {
686 asyncGetAuthInfo->authType = static_cast<AuthType>(0);
687 }
688 napi_value resourceName = nullptr;
689 NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName));
690 NAPI_CALL(env, napi_create_async_work(
691 env, nullptr, resourceName,
692 GetAuthInfoExecute, GetAuthInfoComplete,
693 (void *)asyncHolder, &asyncHolder->asyncWork));
694 NAPI_CALL(env, napi_queue_async_work(env, asyncHolder->asyncWork));
695 return asyncGetAuthInfo->promise;
696 }
697
Init(napi_env env,napi_value exports)698 static napi_value Init(napi_env env, napi_value exports)
699 {
700 napi_value val = AuthFaceInit(env, exports);
701 val = EnumExport(env, val);
702 return val;
703 }
704
RegisterModule(void)705 extern "C" __attribute__((constructor)) void RegisterModule(void)
706 {
707 napi_module module = {
708 .nm_version = 1,
709 .nm_flags = 0,
710 .nm_filename = nullptr,
711 .nm_register_func = Init,
712 .nm_modname = "UserIDM",
713 .nm_priv = ((void *)0),
714 .reserved = {0}
715 };
716 napi_module_register(&module);
717 }
718 } // namespace UserIDM
719 } // namespace UserIAM
720 } // namespace OHOS
721