• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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