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 
16 #include "napi_os_account.h"
17 #include "account_permission_manager.h"
18 #include "napi_account_error.h"
19 #include "napi_os_account_common.h"
20 #include "napi/native_common.h"
21 
22 using namespace OHOS::AccountSA;
23 
24 namespace OHOS {
25 namespace AccountJsKit {
26 namespace {
27 const std::string OS_ACCOUNT_CLASS_NAME = "AccountManager";
28 static thread_local napi_ref osAccountRef_ = nullptr;
29 
30 const int OS_ACCOUNT_TYPE_ADMIN = 0;
31 const int OS_ACCOUNT_TYPE_NORMAL = 1;
32 const int OS_ACCOUNT_TYPE_GUEST = 2;
33 const int OS_ACCOUNT_TYPE_PRIVATE = 1024;
34 const int DOMAIN_ACCOUNT_STATUS_NOT_LOGGED_IN = 0;
35 const int DOMAIN_ACCOUNT_STATUS_LOGGED_IN = 1;
36 std::mutex g_lockForOsAccountSubscribers;
37 std::map<OsAccountManager *, std::vector<SubscribeCBInfo *>> g_osAccountSubscribers;
38 static napi_property_descriptor g_osAccountProperties[] = {
39     DECLARE_NAPI_FUNCTION("queryOsAccountById", QueryOsAccountById),
40     DECLARE_NAPI_FUNCTION("removeOsAccount", RemoveOsAccount),
41     DECLARE_NAPI_FUNCTION("setOsAccountName", SetOsAccountName),
42     DECLARE_NAPI_FUNCTION("setOsAccountConstraints", SetOsAccountConstraints),
43     DECLARE_NAPI_FUNCTION("activateOsAccount", ActivateOsAccount),
44     DECLARE_NAPI_FUNCTION("deactivateOsAccount", DeactivateOsAccount),
45     DECLARE_NAPI_FUNCTION("createOsAccount", CreateOsAccount),
46     DECLARE_NAPI_FUNCTION("createOsAccountForDomain", CreateOsAccountForDomain),
47     DECLARE_NAPI_FUNCTION("getCreatedOsAccountsCount", GetCreatedOsAccountsCount),
48     DECLARE_NAPI_FUNCTION("getOsAccountCount", GetOsAccountCount),
49     DECLARE_NAPI_FUNCTION("getDistributedVirtualDeviceId", GetDistributedVirtualDeviceId),
50     DECLARE_NAPI_FUNCTION("queryDistributedVirtualDeviceId", QueryDistributedVirtualDeviceId),
51     DECLARE_NAPI_FUNCTION("getOsAccountAllConstraints", GetOsAccountAllConstraints),
52     DECLARE_NAPI_FUNCTION("getOsAccountConstraints", GetOsAccountConstraints),
53     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdFromProcess", GetOsAccountLocalIdFromProcess),
54     DECLARE_NAPI_FUNCTION("queryOsAccountLocalIdFromProcess", QueryOsAccountLocalIdFromProcess),
55     DECLARE_NAPI_FUNCTION("getOsAccountLocalId", QueryOsAccountLocalIdFromProcess),
56     DECLARE_NAPI_FUNCTION("queryAllCreatedOsAccounts", QueryAllCreatedOsAccounts),
57     DECLARE_NAPI_FUNCTION("queryOsAccountConstraintSourceTypes", QueryOsAccountConstraintSourceTypes),
58     DECLARE_NAPI_FUNCTION("getOsAccountConstraintSourceTypes", QueryOsAccountConstraintSourceTypes),
59     DECLARE_NAPI_FUNCTION("queryActivatedOsAccountIds", QueryActivatedOsAccountIds),
60     DECLARE_NAPI_FUNCTION("getActivatedOsAccountIds", GetActivatedOsAccountIds),
61     DECLARE_NAPI_FUNCTION("getActivatedOsAccountLocalIds", GetActivatedOsAccountIds),
62     DECLARE_NAPI_FUNCTION("getForegroundOsAccountLocalId", GetForegroundOsAccountLocalId),
63     DECLARE_NAPI_FUNCTION("getOsAccountProfilePhoto", GetOsAccountProfilePhoto),
64     DECLARE_NAPI_FUNCTION("getOsAccountName", GetOsAccountName),
65     DECLARE_NAPI_FUNCTION("queryCurrentOsAccount", QueryCurrentOsAccount),
66     DECLARE_NAPI_FUNCTION("getCurrentOsAccount", GetCurrentOsAccount),
67     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdFromUid", GetOsAccountLocalIdFromUid),
68     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForUid", GetOsAccountLocalIdForUid),
69     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForUidSync", GetOsAccountLocalIdForUidSync),
70     DECLARE_NAPI_FUNCTION("getBundleIdFromUid", GetBundleIdFromUid),
71     DECLARE_NAPI_FUNCTION("getBundleIdForUid", GetBundleIdFromUid),
72     DECLARE_NAPI_FUNCTION("getBundleIdForUidSync", GetBundleIdForUidSync),
73     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdFromDomain", GetOsAccountLocalIdFromDomain),
74     DECLARE_NAPI_FUNCTION("queryOsAccountLocalIdFromDomain", QueryOsAccountLocalIdFromDomain),
75     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForDomain", QueryOsAccountLocalIdFromDomain),
76     DECLARE_NAPI_FUNCTION("setOsAccountProfilePhoto", SetOsAccountProfilePhoto),
77     DECLARE_NAPI_FUNCTION("queryMaxOsAccountNumber", QueryMaxOsAccountNumber),
78     DECLARE_NAPI_FUNCTION("queryMaxLoggedInOsAccountNumber", QueryMaxLoggedInOsAccountNumber),
79     DECLARE_NAPI_FUNCTION("isOsAccountActived", IsOsAccountActived),
80     DECLARE_NAPI_FUNCTION("checkOsAccountActivated", CheckOsAccountActivated),
81     DECLARE_NAPI_FUNCTION("isOsAccountConstraintEnable", IsOsAccountConstraintEnable),
82     DECLARE_NAPI_FUNCTION("checkConstraintEnabled", CheckConstraintEnabled),
83     DECLARE_NAPI_FUNCTION("checkOsAccountConstraintEnabled", CheckConstraintEnabled),
84     DECLARE_NAPI_FUNCTION("getOsAccountTypeFromProcess", GetOsAccountTypeFromProcess),
85     DECLARE_NAPI_FUNCTION("getOsAccountType", GetOsAccountType),
86     DECLARE_NAPI_FUNCTION("isMultiOsAccountEnable", IsMultiOsAccountEnable),
87     DECLARE_NAPI_FUNCTION("checkMultiOsAccountEnabled", CheckMultiOsAccountEnabled),
88     DECLARE_NAPI_FUNCTION("isOsAccountVerified", IsOsAccountVerified),
89     DECLARE_NAPI_FUNCTION("checkOsAccountVerified", CheckOsAccountVerified),
90     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdBySerialNumber", GetOsAccountLocalIdBySerialNumber),
91     DECLARE_NAPI_FUNCTION("queryOsAccountLocalIdBySerialNumber", QueryOsAccountLocalIdBySerialNumber),
92     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForSerialNumber", QueryOsAccountLocalIdBySerialNumber),
93     DECLARE_NAPI_FUNCTION("getSerialNumberByOsAccountLocalId", GetSerialNumberByOsAccountLocalId),
94     DECLARE_NAPI_FUNCTION("querySerialNumberByOsAccountLocalId", QuerySerialNumberByOsAccountLocalId),
95     DECLARE_NAPI_FUNCTION("getSerialNumberForOsAccountLocalId", QuerySerialNumberByOsAccountLocalId),
96     DECLARE_NAPI_FUNCTION("isTestOsAccount", IsTestOsAccount),
97     DECLARE_NAPI_FUNCTION("checkOsAccountTestable", CheckOsAccountTestable),
98     DECLARE_NAPI_FUNCTION("isMainOsAccount", IsMainOsAccount),
99     DECLARE_NAPI_FUNCTION("on", Subscribe),
100     DECLARE_NAPI_FUNCTION("off", Unsubscribe),
101     DECLARE_NAPI_FUNCTION("isOsAccountActivated", IsOsAccountActivated),
102     DECLARE_NAPI_FUNCTION("isOsAccountConstraintEnabled", IsOsAccountConstraintEnabled),
103     DECLARE_NAPI_FUNCTION("isOsAccountUnlocked", IsOsAccountUnlocked),
104     DECLARE_NAPI_FUNCTION("getEnabledOsAccountConstraints", GetEnabledOsAccountConstraints),
105     DECLARE_NAPI_FUNCTION("queryOsAccount", QueryOsAccount),
106 };
107 }  // namespace
OsAccountInit(napi_env env,napi_value exports)108 napi_value OsAccountInit(napi_env env, napi_value exports)
109 {
110     napi_property_descriptor descriptor[] = {
111         DECLARE_NAPI_FUNCTION("getAccountManager", GetAccountManager),
112     };
113     NAPI_CALL(
114         env, napi_define_properties(env, exports, sizeof(descriptor) / sizeof(napi_property_descriptor), descriptor));
115 
116     napi_value osAccountType = nullptr;
117     napi_create_object(env, &osAccountType);
118 
119     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_ADMIN, "ADMIN");
120     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_NORMAL, "NORMAL");
121     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_GUEST, "GUEST");
122     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_PRIVATE, "PRIVATE");
123 
124     napi_value constraintSourceType = nullptr;
125     napi_create_object(env, &constraintSourceType);
126     SetEnumProperty(env, constraintSourceType, CONSTRAINT_NOT_EXIST, "CONSTRAINT_NOT_EXIST");
127     SetEnumProperty(env, constraintSourceType, CONSTRAINT_TYPE_BASE, "CONSTRAINT_TYPE_BASE");
128     SetEnumProperty(env, constraintSourceType, CONSTRAINT_TYPE_DEVICE_OWNER, "CONSTRAINT_TYPE_DEVICE_OWNER");
129     SetEnumProperty(env, constraintSourceType, CONSTRAINT_TYPE_PROFILE_OWNER, "CONSTRAINT_TYPE_PROFILE_OWNER");
130 
131     napi_value domainAccountStatus = nullptr;
132     napi_create_object(env, &domainAccountStatus);
133 
134     SetEnumProperty(env, domainAccountStatus, DOMAIN_ACCOUNT_STATUS_NOT_LOGGED_IN, "NOT_LOGGED_IN");
135     SetEnumProperty(env, domainAccountStatus, DOMAIN_ACCOUNT_STATUS_LOGGED_IN, "LOGGED_IN");
136 
137     napi_property_descriptor exportEnum[] = {
138         DECLARE_NAPI_PROPERTY("OsAccountType", osAccountType),
139         DECLARE_NAPI_PROPERTY("ConstraintSourceType", constraintSourceType),
140     };
141     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(exportEnum) / sizeof(*exportEnum), exportEnum));
142     napi_value cons = nullptr;
143     NAPI_CALL(env,
144         napi_define_class(env,
145             OS_ACCOUNT_CLASS_NAME.c_str(),
146             OS_ACCOUNT_CLASS_NAME.size(),
147             OsAccountJsConstructor,
148             nullptr,
149             sizeof(g_osAccountProperties) / sizeof(napi_property_descriptor),
150             g_osAccountProperties,
151             &cons));
152     NAPI_CALL(env, napi_create_reference(env, cons, 1, &osAccountRef_));
153     NAPI_CALL(env, napi_set_named_property(env, exports, OS_ACCOUNT_CLASS_NAME.c_str(), cons));
154 
155     return exports;
156 }
157 
GetAccountManager(napi_env env,napi_callback_info cbInfo)158 napi_value GetAccountManager(napi_env env, napi_callback_info cbInfo)
159 {
160     napi_value instance = nullptr;
161     napi_value cons = nullptr;
162     if (napi_get_reference_value(env, osAccountRef_, &cons) != napi_ok) {
163         return nullptr;
164     }
165 
166     if (napi_new_instance(env, cons, 0, nullptr, &instance) != napi_ok) {
167         return nullptr;
168     }
169 
170     OsAccountManager *objectInfo = new (std::nothrow) OsAccountManager();
171     if (objectInfo == nullptr) {
172         ACCOUNT_LOGE("failed to create OsAccountManager for insufficient memory");
173         return nullptr;
174     }
175     napi_status status = napi_wrap(env, instance, objectInfo,
176         [](napi_env env, void *data, void *hint) {
177             ACCOUNT_LOGI("Js instance release.");
178             delete reinterpret_cast<OsAccountManager *>(data);
179         }, nullptr, nullptr);
180     if (status != napi_ok) {
181         ACCOUNT_LOGE("failed to wrap js instance with native object");
182         delete objectInfo;
183         return nullptr;
184     }
185     return instance;
186 }
187 
OsAccountJsConstructor(napi_env env,napi_callback_info cbinfo)188 napi_value OsAccountJsConstructor(napi_env env, napi_callback_info cbinfo)
189 {
190     napi_value thisVar = nullptr;
191     NAPI_CALL(env, napi_get_cb_info(env, cbinfo, nullptr, nullptr, &thisVar, nullptr));
192     return thisVar;
193 }
194 
SetEnumProperty(napi_env env,napi_value dstObj,const int objValue,const char * propName)195 void SetEnumProperty(napi_env env, napi_value dstObj, const int objValue, const char *propName)
196 {
197     napi_value prop = nullptr;
198     napi_create_int32(env, objValue, &prop);
199     napi_set_named_property(env, dstObj, propName, prop);
200 }
201 
QueryOsAccountById(napi_env env,napi_callback_info cbInfo)202 napi_value QueryOsAccountById(napi_env env, napi_callback_info cbInfo)
203 {
204     auto queryOAByIdCB = std::make_unique<QueryOAByIdAsyncContext>();
205     queryOAByIdCB->env = env;
206     queryOAByIdCB->throwErr = true;
207 
208     if (!ParseParaQueryOAByIdCB(env, cbInfo, queryOAByIdCB.get())) {
209         return nullptr;
210     }
211 
212     napi_value result = nullptr;
213     if (queryOAByIdCB->callbackRef == nullptr) {
214         napi_create_promise(env, &queryOAByIdCB->deferred, &result);
215     } else {
216         napi_get_undefined(env, &result);
217     }
218 
219     napi_value resource = nullptr;
220     napi_create_string_utf8(env, "QueryOsAccountById", NAPI_AUTO_LENGTH, &resource);
221 
222     napi_create_async_work(env,
223         nullptr,
224         resource,
225         QueryOAByIdExecuteCB,
226         QueryOAByIdCallbackCompletedCB,
227         reinterpret_cast<void *>(queryOAByIdCB.get()),
228         &queryOAByIdCB->work);
229 
230     napi_queue_async_work_with_qos(env, queryOAByIdCB->work, napi_qos_default);
231     queryOAByIdCB.release();
232     return result;
233 }
234 
RemoveOsAccount(napi_env env,napi_callback_info cbInfo)235 napi_value RemoveOsAccount(napi_env env, napi_callback_info cbInfo)
236 {
237     auto removeOACB = std::make_unique<RemoveOAAsyncContext>();
238     removeOACB->env = env;
239     removeOACB->throwErr = true;
240 
241     if (!ParseParaRemoveOACB(env, cbInfo, removeOACB.get())) {
242         return nullptr;
243     }
244 
245     napi_value result = nullptr;
246     if (removeOACB->callbackRef == nullptr) {
247         napi_create_promise(env, &removeOACB->deferred, &result);
248     } else {
249         napi_get_undefined(env, &result);
250     }
251 
252     napi_value resource = nullptr;
253     napi_create_string_utf8(env, "RemoveOsAccount", NAPI_AUTO_LENGTH, &resource);
254 
255     napi_create_async_work(env, nullptr, resource, RemoveOAExecuteCB, RemoveOACallbackCompletedCB,
256         reinterpret_cast<void *>(removeOACB.get()), &removeOACB->work);
257 
258     napi_queue_async_work_with_qos(env, removeOACB->work, napi_qos_user_initiated);
259     removeOACB.release();
260     return result;
261 }
262 
SetOsAccountName(napi_env env,napi_callback_info cbInfo)263 napi_value SetOsAccountName(napi_env env, napi_callback_info cbInfo)
264 {
265     auto setOANameCB = std::make_unique<SetOANameAsyncContext>();
266     setOANameCB->env = env;
267     setOANameCB->throwErr = true;
268 
269     if (!ParseParaSetOAName(env, cbInfo, setOANameCB.get())) {
270         return nullptr;
271     }
272 
273     napi_value result = nullptr;
274     if (setOANameCB->callbackRef == nullptr) {
275         napi_create_promise(env, &setOANameCB->deferred, &result);
276     } else {
277         napi_get_undefined(env, &result);
278     }
279 
280     napi_value resource = nullptr;
281     napi_create_string_utf8(env, "SetOsAccountName", NAPI_AUTO_LENGTH, &resource);
282 
283     napi_create_async_work(env,
284         nullptr,
285         resource,
286         SetOANameExecuteCB,
287         SetOANameCallbackCompletedCB,
288         reinterpret_cast<void *>(setOANameCB.get()),
289         &setOANameCB->work);
290 
291     napi_queue_async_work_with_qos(env, setOANameCB->work, napi_qos_user_initiated);
292     setOANameCB.release();
293     return result;
294 }
295 
SetOsAccountConstraints(napi_env env,napi_callback_info cbInfo)296 napi_value SetOsAccountConstraints(napi_env env, napi_callback_info cbInfo)
297 {
298     auto setOAConsCB = std::make_unique<SetOAConsAsyncContext>();
299     setOAConsCB->env = env;
300     setOAConsCB->throwErr = true;
301 
302     if (!ParseParaSetOAConstraints(env, cbInfo, setOAConsCB.get())) {
303         return nullptr;
304     }
305 
306     napi_value result = nullptr;
307     if (setOAConsCB->callbackRef == nullptr) {
308         napi_create_promise(env, &setOAConsCB->deferred, &result);
309     } else {
310         napi_get_undefined(env, &result);
311     }
312 
313     napi_value resource = nullptr;
314     napi_create_string_utf8(env, "SetOsAccountConstraints", NAPI_AUTO_LENGTH, &resource);
315 
316     napi_create_async_work(env,
317         nullptr,
318         resource,
319         SetOAConsExecuteCB,
320         SetOAConsCallbackCompletedCB,
321         reinterpret_cast<void *>(setOAConsCB.get()),
322         &setOAConsCB->work);
323 
324     napi_queue_async_work_with_qos(env, setOAConsCB->work, napi_qos_default);
325     setOAConsCB.release();
326     return result;
327 }
328 
ActivateOsAccount(napi_env env,napi_callback_info cbInfo)329 napi_value ActivateOsAccount(napi_env env, napi_callback_info cbInfo)
330 {
331     auto activeOACB = std::make_unique<ActivateOAAsyncContext>();
332     activeOACB->env = env;
333     activeOACB->throwErr = true;
334 
335     if (!ParseParaActiveOA(env, cbInfo, activeOACB.get())) {
336         return nullptr;
337     }
338 
339     napi_value result = nullptr;
340     if (activeOACB->callbackRef == nullptr) {
341         napi_create_promise(env, &activeOACB->deferred, &result);
342     } else {
343         napi_get_undefined(env, &result);
344     }
345 
346     napi_value resource = nullptr;
347     napi_create_string_utf8(env, "ActivateOsAccount", NAPI_AUTO_LENGTH, &resource);
348 
349     napi_create_async_work(env,
350         nullptr,
351         resource,
352         ActivateOAExecuteCB,
353         ActivateOACallbackCompletedCB,
354         reinterpret_cast<void *>(activeOACB.get()),
355         &activeOACB->work);
356 
357     napi_queue_async_work_with_qos(env, activeOACB->work, napi_qos_user_initiated);
358     activeOACB.release();
359     return result;
360 }
361 
DeactivateOsAccount(napi_env env,napi_callback_info cbInfo)362 napi_value DeactivateOsAccount(napi_env env, napi_callback_info cbInfo)
363 {
364     auto asyncContext = std::make_unique<ActivateOAAsyncContext>();
365     asyncContext->env = env;
366 
367     if (!ParseParaDeactivateOA(env, cbInfo, asyncContext.get())) {
368         return nullptr;
369     }
370 
371     napi_value result = nullptr;
372     NAPI_CALL(env, napi_create_promise(env, &asyncContext->deferred, &result));
373 
374     napi_value resource = nullptr;
375     NAPI_CALL(env, napi_create_string_utf8(env, "DeactivateOsAccount", NAPI_AUTO_LENGTH, &resource));
376 
377     NAPI_CALL(env, napi_create_async_work(env,
378         nullptr,
379         resource,
380         DeactivateOAExecuteCB,
381         DeactivateOACompletedCB,
382         reinterpret_cast<void *>(asyncContext.get()),
383         &asyncContext->work));
384 
385     NAPI_CALL(env, napi_queue_async_work_with_qos(env, asyncContext->work, napi_qos_user_initiated));
386     asyncContext.release();
387     return result;
388 }
389 
CreateOsAccount(napi_env env,napi_callback_info cbInfo)390 napi_value CreateOsAccount(napi_env env, napi_callback_info cbInfo)
391 {
392     auto createOACB = std::make_unique<CreateOAAsyncContext>();
393     createOACB->env = env;
394     createOACB->throwErr = true;
395 
396     if (!ParseParaCreateOA(env, cbInfo, createOACB.get())) {
397         return nullptr;
398     }
399 
400     napi_value result = nullptr;
401     if (createOACB->callbackRef == nullptr) {
402         napi_create_promise(env, &createOACB->deferred, &result);
403     } else {
404         napi_get_undefined(env, &result);
405     }
406 
407     napi_value resource = nullptr;
408     napi_create_string_utf8(env, "CreateOsAccount", NAPI_AUTO_LENGTH, &resource);
409 
410     napi_create_async_work(env, nullptr, resource, CreateOAExecuteCB, CreateOACallbackCompletedCB,
411         reinterpret_cast<void *>(createOACB.get()), &createOACB->work);
412 
413     napi_queue_async_work_with_qos(env, createOACB->work, napi_qos_user_initiated);
414     createOACB.release();
415     return result;
416 }
417 
CreateOsAccountForDomain(napi_env env,napi_callback_info cbInfo)418 napi_value CreateOsAccountForDomain(napi_env env, napi_callback_info cbInfo)
419 {
420     auto createOAForDomainCB = std::make_unique<CreateOAForDomainAsyncContext>();
421     createOAForDomainCB->env = env;
422     createOAForDomainCB->throwErr = true;
423 
424     if (!ParseParaCreateOAForDomain(env, cbInfo, createOAForDomainCB.get())) {
425         return nullptr;
426     }
427 
428     napi_value result = nullptr;
429     if (createOAForDomainCB->callbackRef == nullptr) {
430         napi_create_promise(env, &createOAForDomainCB->deferred, &result);
431     } else {
432         napi_get_undefined(env, &result);
433     }
434 
435     napi_value resource = nullptr;
436     napi_create_string_utf8(env, "CreateOsAccountForDomain", NAPI_AUTO_LENGTH, &resource);
437 
438     napi_create_async_work(env, nullptr, resource, CreateOAForDomainExecuteCB, CreateOAForDomainCompletedCB,
439         createOAForDomainCB.get(), &createOAForDomainCB->work);
440 
441     napi_queue_async_work_with_qos(env, createOAForDomainCB->work, napi_qos_user_initiated);
442     createOAForDomainCB.release();
443     return result;
444 }
445 
GetOsAccountCount(napi_env env,napi_callback_info cbInfo)446 napi_value GetOsAccountCount(napi_env env, napi_callback_info cbInfo)
447 {
448     return GetCreatedOsAccountsCountInner(env, cbInfo, true);
449 }
450 
GetCreatedOsAccountsCount(napi_env env,napi_callback_info cbInfo)451 napi_value GetCreatedOsAccountsCount(napi_env env, napi_callback_info cbInfo)
452 {
453     return GetCreatedOsAccountsCountInner(env, cbInfo, false);
454 }
455 
GetCreatedOsAccountsCountInner(napi_env env,napi_callback_info cbInfo,bool throwErr)456 napi_value GetCreatedOsAccountsCountInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
457 {
458     auto getOACount = std::make_unique<GetOACountAsyncContext>();
459     getOACount->env = env;
460     getOACount->throwErr = throwErr;
461 
462     if (!ParseParaGetOACount(env, cbInfo, getOACount.get()) && throwErr) {
463         return nullptr;
464     }
465 
466     napi_value result = nullptr;
467     if (getOACount->callbackRef == nullptr) {
468         napi_create_promise(env, &getOACount->deferred, &result);
469     } else {
470         napi_get_undefined(env, &result);
471     }
472 
473     napi_value resource = nullptr;
474     napi_create_string_utf8(env, "GetCreatedOsAccountsCountInner", NAPI_AUTO_LENGTH, &resource);
475 
476     napi_create_async_work(env,
477         nullptr,
478         resource,
479         GetOACountExecuteCB,
480         GetOACountCallbackCompletedCB,
481         reinterpret_cast<void *>(getOACount.get()),
482         &getOACount->work);
483 
484     napi_queue_async_work_with_qos(env, getOACount->work, napi_qos_default);
485     getOACount.release();
486     return result;
487 }
488 
QueryDistributedVirtualDeviceId(napi_env env,napi_callback_info cbInfo)489 napi_value QueryDistributedVirtualDeviceId(napi_env env, napi_callback_info cbInfo)
490 {
491     return GetDistributedVirtualDeviceIdInner(env, cbInfo, true);
492 }
493 
GetDistributedVirtualDeviceId(napi_env env,napi_callback_info cbInfo)494 napi_value GetDistributedVirtualDeviceId(napi_env env, napi_callback_info cbInfo)
495 {
496     return GetDistributedVirtualDeviceIdInner(env, cbInfo, false);
497 }
498 
GetDistributedVirtualDeviceIdInner(napi_env env,napi_callback_info cbInfo,bool throwErr)499 napi_value GetDistributedVirtualDeviceIdInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
500 {
501     auto dbDeviceId = std::make_unique<DbDeviceIdAsyncContext>();
502     dbDeviceId->env = env;
503     dbDeviceId->throwErr = throwErr;
504 
505     if (!ParseParaDbDeviceId(env, cbInfo, dbDeviceId.get()) && throwErr) {
506         return nullptr;
507     }
508 
509     napi_value result = nullptr;
510     if (dbDeviceId->callbackRef == nullptr) {
511         napi_create_promise(env, &dbDeviceId->deferred, &result);
512     } else {
513         napi_get_undefined(env, &result);
514     }
515 
516     napi_value resource = nullptr;
517     napi_create_string_utf8(env, "GetDistributedVirtualDeviceIdInner", NAPI_AUTO_LENGTH, &resource);
518 
519     napi_create_async_work(env,
520         nullptr,
521         resource,
522         DbDeviceIdExecuteCB,
523         DbDeviceIdCallbackCompletedCB,
524         reinterpret_cast<void *>(dbDeviceId.get()),
525         &dbDeviceId->work);
526 
527     napi_queue_async_work_with_qos(env, dbDeviceId->work, napi_qos_default);
528     dbDeviceId.release();
529     return result;
530 }
531 
GetOsAccountConstraints(napi_env env,napi_callback_info cbInfo)532 napi_value GetOsAccountConstraints(napi_env env, napi_callback_info cbInfo)
533 {
534     return GetOsAccountAllConstraintsInner(env, cbInfo, true);
535 }
536 
GetOsAccountAllConstraints(napi_env env,napi_callback_info cbInfo)537 napi_value GetOsAccountAllConstraints(napi_env env, napi_callback_info cbInfo)
538 {
539     return GetOsAccountAllConstraintsInner(env, cbInfo, false);
540 }
541 
GetOsAccountAllConstraintsInner(napi_env env,napi_callback_info cbInfo,bool throwErr)542 napi_value GetOsAccountAllConstraintsInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
543 {
544     auto getAllConsCB = std::make_unique<GetAllConsAsyncContext>();
545     getAllConsCB->env = env;
546     getAllConsCB->throwErr = throwErr;
547 
548     if (!ParseParaGetAllCons(env, cbInfo, getAllConsCB.get()) && throwErr) {
549         return nullptr;
550     }
551 
552     napi_value result = nullptr;
553     if (getAllConsCB->callbackRef == nullptr) {
554         napi_create_promise(env, &getAllConsCB->deferred, &result);
555     } else {
556         napi_get_undefined(env, &result);
557     }
558 
559     napi_value resource = nullptr;
560     napi_create_string_utf8(env, "GetOsAccountAllConstraints", NAPI_AUTO_LENGTH, &resource);
561 
562     napi_create_async_work(env,
563         nullptr,
564         resource,
565         GetAllConsExecuteCB,
566         GetAllConsCallbackCompletedCB,
567         reinterpret_cast<void *>(getAllConsCB.get()),
568         &getAllConsCB->work);
569 
570     napi_queue_async_work_with_qos(env, getAllConsCB->work, napi_qos_default);
571     getAllConsCB.release();
572     return result;
573 }
574 
QueryOsAccountLocalIdFromProcess(napi_env env,napi_callback_info cbInfo)575 napi_value QueryOsAccountLocalIdFromProcess(napi_env env, napi_callback_info cbInfo)
576 {
577     return GetOsAccountLocalIdFromProcessInner(env, cbInfo, true);
578 }
579 
GetOsAccountLocalIdFromProcess(napi_env env,napi_callback_info cbInfo)580 napi_value GetOsAccountLocalIdFromProcess(napi_env env, napi_callback_info cbInfo)
581 {
582     return GetOsAccountLocalIdFromProcessInner(env, cbInfo, false);
583 }
584 
GetOsAccountLocalIdFromProcessInner(napi_env env,napi_callback_info cbInfo,bool throwErr)585 napi_value GetOsAccountLocalIdFromProcessInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
586 {
587     auto getIdCB = std::make_unique<GetIdAsyncContext>();
588     getIdCB->env = env;
589     getIdCB->throwErr = throwErr;
590 
591     if (!ParseParaProcessId(env, cbInfo, getIdCB.get()) && throwErr) {
592         return nullptr;
593     }
594 
595     napi_value result = nullptr;
596     if (getIdCB->callbackRef == nullptr) {
597         napi_create_promise(env, &getIdCB->deferred, &result);
598     } else {
599         napi_get_undefined(env, &result);
600     }
601 
602     napi_value resource = nullptr;
603     napi_create_string_utf8(env, "GetOsAccountLocalIdFromProcessInner", NAPI_AUTO_LENGTH, &resource);
604 
605     napi_create_async_work(env,
606         nullptr,
607         resource,
608         GetProcessIdExecuteCB,
609         GetProcessIdCallbackCompletedCB,
610         reinterpret_cast<void *>(getIdCB.get()),
611         &getIdCB->work);
612 
613     napi_queue_async_work_with_qos(env, getIdCB->work, napi_qos_default);
614     getIdCB.release();
615     return result;
616 }
617 
QueryAllCreatedOsAccounts(napi_env env,napi_callback_info cbInfo)618 napi_value QueryAllCreatedOsAccounts(napi_env env, napi_callback_info cbInfo)
619 {
620     auto queryAllOA = std::make_unique<QueryCreateOAAsyncContext>();
621     queryAllOA->env = env;
622     queryAllOA->throwErr = true;
623 
624     if (!ParseQueryAllCreateOA(env, cbInfo, queryAllOA.get())) {
625         return nullptr;
626     }
627 
628     napi_value result = nullptr;
629     if (queryAllOA->callbackRef == nullptr) {
630         napi_create_promise(env, &queryAllOA->deferred, &result);
631     } else {
632         napi_get_undefined(env, &result);
633     }
634 
635     napi_value resource = nullptr;
636     napi_create_string_utf8(env, "QueryAllCreatedOsAccounts", NAPI_AUTO_LENGTH, &resource);
637 
638     napi_create_async_work(env,
639         nullptr,
640         resource,
641         QueryCreateOAExecuteCB,
642         QueryCreateOACallbackCompletedCB,
643         reinterpret_cast<void *>(queryAllOA.get()),
644         &queryAllOA->work);
645 
646     napi_queue_async_work_with_qos(env, queryAllOA->work, napi_qos_default);
647     queryAllOA.release();
648     return result;
649 }
650 
QueryOsAccountConstraintSourceTypes(napi_env env,napi_callback_info cbInfo)651 napi_value QueryOsAccountConstraintSourceTypes(napi_env env, napi_callback_info cbInfo)
652 {
653     auto queryConstraintSource = std::make_unique<QueryOAConstraintSrcTypeContext>();
654     queryConstraintSource->env = env;
655     queryConstraintSource->throwErr = true;
656 
657     if (!ParseQueryOAConstraintSrcTypes(env, cbInfo, queryConstraintSource.get())) {
658         return nullptr;
659     }
660 
661     napi_value result = nullptr;
662     if (queryConstraintSource->callbackRef == nullptr) {
663         napi_create_promise(env, &queryConstraintSource->deferred, &result);
664     } else {
665         napi_get_undefined(env, &result);
666     }
667 
668     napi_value resource = nullptr;
669     napi_create_string_utf8(env, "QueryOsAccountConstraintSourceTypes", NAPI_AUTO_LENGTH, &resource);
670 
671     napi_create_async_work(env,
672         nullptr,
673         resource,
674         QueryOAContSrcTypeExecuteCB,
675         QueryOAContSrcTypeCallbackCompletedCB,
676         reinterpret_cast<void *>(queryConstraintSource.get()),
677         &queryConstraintSource->work);
678 
679     napi_queue_async_work_with_qos(env, queryConstraintSource->work, napi_qos_default);
680     queryConstraintSource.release();
681     return result;
682 }
683 
GetActivatedOsAccountIds(napi_env env,napi_callback_info cbInfo)684 napi_value GetActivatedOsAccountIds(napi_env env, napi_callback_info cbInfo)
685 {
686     return QueryActivatedOsAccountIdsInner(env, cbInfo, true);
687 }
688 
QueryActivatedOsAccountIds(napi_env env,napi_callback_info cbInfo)689 napi_value QueryActivatedOsAccountIds(napi_env env, napi_callback_info cbInfo)
690 {
691     return QueryActivatedOsAccountIdsInner(env, cbInfo, false);
692 }
693 
QueryActivatedOsAccountIdsInner(napi_env env,napi_callback_info cbInfo,bool throwErr)694 napi_value QueryActivatedOsAccountIdsInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
695 {
696     auto queryActiveIds = std::make_unique<QueryActiveIdsAsyncContext>();
697     queryActiveIds->env = env;
698     queryActiveIds->throwErr = throwErr;
699 
700     if (!ParseQueryActiveIds(env, cbInfo, queryActiveIds.get()) && throwErr) {
701         return nullptr;
702     }
703 
704     napi_value result = nullptr;
705     if (queryActiveIds->callbackRef == nullptr) {
706         napi_create_promise(env, &queryActiveIds->deferred, &result);
707     } else {
708         napi_get_undefined(env, &result);
709     }
710 
711     napi_value resource = nullptr;
712     napi_create_string_utf8(env, "QueryActivatedOsAccountIdsInner", NAPI_AUTO_LENGTH, &resource);
713 
714     napi_create_async_work(env,
715         nullptr,
716         resource,
717         QueryActiveIdsExecuteCB,
718         QueryActiveIdsCallbackCompletedCB,
719         reinterpret_cast<void *>(queryActiveIds.get()),
720         &queryActiveIds->work);
721 
722     napi_queue_async_work_with_qos(env, queryActiveIds->work, napi_qos_default);
723     queryActiveIds.release();
724     return result;
725 }
726 
GetForegroundOsAccountLocalId(napi_env env,napi_callback_info cbInfo)727 napi_value GetForegroundOsAccountLocalId(napi_env env, napi_callback_info cbInfo)
728 {
729     auto getForegroundIds = std::make_unique<GetForegroundOALocalIdAsyncContext>();
730     getForegroundIds->env = env;
731     getForegroundIds->throwErr = true;
732 
733     napi_value result = nullptr;
734     NAPI_CALL(env, napi_create_promise(env, &getForegroundIds->deferred, &result));
735 
736     napi_value resource = nullptr;
737     NAPI_CALL(env, napi_create_string_utf8(env, "GetForegroundOsAccountLocalId", NAPI_AUTO_LENGTH, &resource));
738 
739     NAPI_CALL(env, napi_create_async_work(env,
740         nullptr,
741         resource,
742         GetForegroundOALocalIdExecuteCB,
743         GetForegroundOALocalIdCallbackCompletedCB,
744         reinterpret_cast<void *>(getForegroundIds.get()),
745         &getForegroundIds->work));
746 
747     NAPI_CALL(env, napi_queue_async_work_with_qos(env, getForegroundIds->work, napi_qos_default));
748     getForegroundIds.release();
749     return result;
750 }
751 
GetOsAccountName(napi_env env,napi_callback_info cbInfo)752 napi_value GetOsAccountName(napi_env env, napi_callback_info cbInfo)
753 {
754     auto context = std::make_unique<GetOsAccountNameContext>();
755     context->env = env;
756 
757     napi_value result = nullptr;
758     NAPI_CALL(env, napi_create_promise(env, &context->deferred, &result));
759     napi_value resource = nullptr;
760     NAPI_CALL(env, napi_create_string_utf8(env, "GetOsAccountName", NAPI_AUTO_LENGTH, &resource));
761 
762     NAPI_CALL(env, napi_create_async_work(env, nullptr, resource, GetOsAccountNameExecuteCB,
763         GetOsAccountNameCallbackCompletedCB,
764         reinterpret_cast<void *>(context.get()), &context->work));
765 
766     NAPI_CALL(env, napi_queue_async_work_with_qos(env, context->work, napi_qos_default));
767     context.release();
768     return result;
769 }
770 
GetOsAccountProfilePhoto(napi_env env,napi_callback_info cbInfo)771 napi_value GetOsAccountProfilePhoto(napi_env env, napi_callback_info cbInfo)
772 {
773     auto getPhoto = std::make_unique<GetOAPhotoAsyncContext>();
774     getPhoto->env = env;
775     getPhoto->throwErr = true;
776 
777     if (!ParseParaGetPhoto(env, cbInfo, getPhoto.get())) {
778         return nullptr;
779     }
780 
781     napi_value result = nullptr;
782     if (getPhoto->callbackRef == nullptr) {
783         napi_create_promise(env, &getPhoto->deferred, &result);
784     } else {
785         napi_get_undefined(env, &result);
786     }
787 
788     napi_value resource = nullptr;
789     napi_create_string_utf8(env, "GetOsAccountProfilePhoto", NAPI_AUTO_LENGTH, &resource);
790 
791     napi_create_async_work(env, nullptr, resource, GetOAPhotoExecuteCB, GetOAPhotoCallbackCompletedCB,
792         reinterpret_cast<void *>(getPhoto.get()), &getPhoto->work);
793 
794     napi_queue_async_work_with_qos(env, getPhoto->work, napi_qos_default);
795     getPhoto.release();
796     return result;
797 }
798 
GetCurrentOsAccount(napi_env env,napi_callback_info cbInfo)799 napi_value GetCurrentOsAccount(napi_env env, napi_callback_info cbInfo)
800 {
801     return QueryCurrentOsAccountInner(env, cbInfo, true);
802 }
803 
QueryCurrentOsAccount(napi_env env,napi_callback_info cbInfo)804 napi_value QueryCurrentOsAccount(napi_env env, napi_callback_info cbInfo)
805 {
806     return QueryCurrentOsAccountInner(env, cbInfo, false);
807 }
808 
QueryCurrentOsAccountInner(napi_env env,napi_callback_info cbInfo,bool throwErr)809 napi_value QueryCurrentOsAccountInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
810 {
811     auto currentOA = std::make_unique<CurrentOAAsyncContext>();
812     currentOA->env = env;
813     currentOA->throwErr = throwErr;
814 
815     if (!ParseParaCurrentOA(env, cbInfo, currentOA.get()) && throwErr) {
816         return nullptr;
817     }
818 
819     napi_value result = nullptr;
820     if (currentOA->callbackRef == nullptr) {
821         napi_create_promise(env, &currentOA->deferred, &result);
822     } else {
823         napi_get_undefined(env, &result);
824     }
825 
826     napi_value resource = nullptr;
827     napi_create_string_utf8(env, "QueryCurrentOsAccount", NAPI_AUTO_LENGTH, &resource);
828 
829     napi_create_async_work(env,
830         nullptr,
831         resource,
832         QueryCurrentOAExecuteCB,
833         QueryCurrentOACallbackCompletedCB,
834         reinterpret_cast<void *>(currentOA.get()),
835         &currentOA->work);
836 
837     napi_queue_async_work_with_qos(env, currentOA->work, napi_qos_default);
838     currentOA.release();
839     return result;
840 }
841 
GetOsAccountLocalIdFromUidInner(napi_env env,napi_callback_info cbInfo,bool throwErr)842 napi_value GetOsAccountLocalIdFromUidInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
843 {
844     auto idByUid = std::make_unique<GetIdByUidAsyncContext>();
845     idByUid->env = env;
846     idByUid->throwErr = throwErr;
847 
848     if (!ParseParaGetIdByUid(env, cbInfo, idByUid.get()) && throwErr) {
849         return nullptr;
850     }
851 
852     napi_value result = nullptr;
853     if (idByUid->callbackRef == nullptr) {
854         napi_create_promise(env, &idByUid->deferred, &result);
855     } else {
856         napi_get_undefined(env, &result);
857     }
858 
859     napi_value resource = nullptr;
860     napi_create_string_utf8(env, "GetOsAccountLocalIdFromUidInner", NAPI_AUTO_LENGTH, &resource);
861 
862     napi_create_async_work(env, nullptr, resource, GetIdByUidExecuteCB, GetIdByUidCallbackCompletedCB,
863         reinterpret_cast<void *>(idByUid.get()), &idByUid->work);
864 
865     napi_queue_async_work_with_qos(env, idByUid->work, napi_qos_default);
866     idByUid.release();
867     return result;
868 }
869 
GetOsAccountLocalIdFromUid(napi_env env,napi_callback_info cbInfo)870 napi_value GetOsAccountLocalIdFromUid(napi_env env, napi_callback_info cbInfo)
871 {
872     return GetOsAccountLocalIdFromUidInner(env, cbInfo, false);
873 }
874 
GetOsAccountLocalIdForUid(napi_env env,napi_callback_info cbInfo)875 napi_value GetOsAccountLocalIdForUid(napi_env env, napi_callback_info cbInfo)
876 {
877     return GetOsAccountLocalIdFromUidInner(env, cbInfo, true);
878 }
879 
ParseUidFromCbInfo(napi_env env,napi_callback_info cbInfo,int32_t & uid)880 static bool ParseUidFromCbInfo(napi_env env, napi_callback_info cbInfo, int32_t &uid)
881 {
882     size_t argc = ARGS_SIZE_ONE;
883     napi_value argv[ARGS_SIZE_ONE] = {0};
884     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
885     if (argc == 0) {
886         ACCOUNT_LOGE("The number of parameters should be at least 1.");
887         std::string errMsg = "Parameter error. The number of parameters should be at least 1";
888         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
889         return false;
890     }
891     if (!GetIntProperty(env, argv[0], uid)) {
892         ACCOUNT_LOGE("Get uid failed.");
893         std::string errMsg = "Parameter error. The type of \"uid\" must be number";
894         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
895         return false;
896     }
897     return true;
898 }
899 
GetOsAccountLocalIdForUidSync(napi_env env,napi_callback_info cbInfo)900 napi_value GetOsAccountLocalIdForUidSync(napi_env env, napi_callback_info cbInfo)
901 {
902     napi_value napiValue = nullptr;
903     int32_t uid = 0;
904     if (!ParseUidFromCbInfo(env, cbInfo, uid)) {
905         return napiValue;
906     }
907     int32_t localId = 0;
908     ErrCode errCode = OsAccountManager::GetOsAccountLocalIdFromUid(uid, localId);
909     if (errCode != ERR_OK) {
910         AccountNapiThrow(env, errCode);
911         return napiValue;
912     }
913     NAPI_CALL(env, napi_create_int32(env, localId, &napiValue));
914     return napiValue;
915 }
916 
GetBundleIdFromUid(napi_env env,napi_callback_info cbInfo)917 napi_value GetBundleIdFromUid(napi_env env, napi_callback_info cbInfo)
918 {
919     auto bundleIdByUid = std::make_unique<GetIdByUidAsyncContext>();
920     bundleIdByUid->env = env;
921     bundleIdByUid->throwErr = true;
922 
923     if (!ParseParaGetIdByUid(env, cbInfo, bundleIdByUid.get())) {
924         return nullptr;
925     }
926 
927     napi_value result = nullptr;
928     if (bundleIdByUid->callbackRef == nullptr) {
929         napi_create_promise(env, &bundleIdByUid->deferred, &result);
930     } else {
931         napi_get_undefined(env, &result);
932     }
933 
934     napi_value resource = nullptr;
935     napi_create_string_utf8(env, "GetBundleIdFromUid", NAPI_AUTO_LENGTH, &resource);
936 
937     napi_create_async_work(env, nullptr, resource,
938         GetBundleIdByUidExecuteCB,
939         GetBundleIdByUidCallbackCompletedCB,
940         reinterpret_cast<void *>(bundleIdByUid.get()),
941         &bundleIdByUid->work);
942 
943     napi_queue_async_work_with_qos(env, bundleIdByUid->work, napi_qos_default);
944     bundleIdByUid.release();
945     return result;
946 }
947 
GetBundleIdForUidSync(napi_env env,napi_callback_info cbInfo)948 napi_value GetBundleIdForUidSync(napi_env env, napi_callback_info cbInfo)
949 {
950     napi_value retValue = nullptr;
951     int32_t uid = 0;
952     if (!ParseUidFromCbInfo(env, cbInfo, uid)) {
953         return retValue;
954     }
955     int32_t bundleId = 0;
956     ErrCode errCode = OsAccountManager::GetBundleIdFromUid(uid, bundleId);
957     if (errCode != ERR_OK) {
958         AccountNapiThrow(env, errCode);
959         return retValue;
960     }
961     NAPI_CALL(env, napi_create_int32(env, bundleId, &retValue));
962     return retValue;
963 }
964 
QueryOsAccountLocalIdFromDomain(napi_env env,napi_callback_info cbInfo)965 napi_value QueryOsAccountLocalIdFromDomain(napi_env env, napi_callback_info cbInfo)
966 {
967     return GetOsAccountLocalIdFromDomainInner(env, cbInfo, true);
968 }
969 
GetOsAccountLocalIdFromDomain(napi_env env,napi_callback_info cbInfo)970 napi_value GetOsAccountLocalIdFromDomain(napi_env env, napi_callback_info cbInfo)
971 {
972     return GetOsAccountLocalIdFromDomainInner(env, cbInfo, false);
973 }
974 
GetOsAccountLocalIdFromDomainInner(napi_env env,napi_callback_info cbInfo,bool throwErr)975 napi_value GetOsAccountLocalIdFromDomainInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
976 {
977     auto idByDomain = std::make_unique<GetIdByDomainAsyncContext>();
978     idByDomain->env = env;
979     idByDomain->throwErr = throwErr;
980 
981     if (!ParseParaGetIdByDomain(env, cbInfo, idByDomain.get()) && throwErr) {
982         return nullptr;
983     }
984 
985     napi_value result = nullptr;
986     if (idByDomain->callbackRef == nullptr) {
987         napi_create_promise(env, &idByDomain->deferred, &result);
988     } else {
989         napi_get_undefined(env, &result);
990     }
991 
992     napi_value resource = nullptr;
993     napi_create_string_utf8(env, "GetOsAccountLocalIdFromDomainInner", NAPI_AUTO_LENGTH, &resource);
994 
995     napi_create_async_work(env, nullptr, resource, GetIdByDomainExecuteCB, GetIdByDomainCallbackCompletedCB,
996         reinterpret_cast<void *>(idByDomain.get()), &idByDomain->work);
997 
998     napi_queue_async_work_with_qos(env, idByDomain->work, napi_qos_default);
999     idByDomain.release();
1000     return result;
1001 }
1002 
SetOsAccountProfilePhoto(napi_env env,napi_callback_info cbInfo)1003 napi_value SetOsAccountProfilePhoto(napi_env env, napi_callback_info cbInfo)
1004 {
1005     auto setPhoto = std::make_unique<SetOAPhotoAsyncContext>();
1006     setPhoto->env = env;
1007     setPhoto->throwErr = true;
1008 
1009     if (!ParseParaSetPhoto(env, cbInfo, setPhoto.get())) {
1010         return nullptr;
1011     }
1012 
1013     napi_value result = nullptr;
1014     if (setPhoto->callbackRef == nullptr) {
1015         napi_create_promise(env, &setPhoto->deferred, &result);
1016     } else {
1017         napi_get_undefined(env, &result);
1018     }
1019 
1020     napi_value resource = nullptr;
1021     napi_create_string_utf8(env, "SetOsAccountProfilePhoto", NAPI_AUTO_LENGTH, &resource);
1022 
1023     napi_create_async_work(env, nullptr, resource, SetPhotoExecuteCB, SetPhotoCompletedCB,
1024         reinterpret_cast<void *>(setPhoto.get()), &setPhoto->work);
1025 
1026     napi_queue_async_work_with_qos(env, setPhoto->work, napi_qos_user_initiated);
1027     setPhoto.release();
1028     return result;
1029 }
1030 
QueryMaxOsAccountNumber(napi_env env,napi_callback_info cbInfo)1031 napi_value QueryMaxOsAccountNumber(napi_env env, napi_callback_info cbInfo)
1032 {
1033     auto maxNum = std::make_unique<QueryMaxNumAsyncContext>();
1034     maxNum->env = env;
1035     maxNum->throwErr = true;
1036 
1037     if (!ParseParaQueryMaxNum(env, cbInfo, maxNum.get())) {
1038         return nullptr;
1039     }
1040 
1041     napi_value result = nullptr;
1042     if (maxNum->callbackRef == nullptr) {
1043         napi_create_promise(env, &maxNum->deferred, &result);
1044     } else {
1045         napi_get_undefined(env, &result);
1046     }
1047 
1048     napi_value resource = nullptr;
1049     napi_create_string_utf8(env, "QueryMaxOsAccountNumber", NAPI_AUTO_LENGTH, &resource);
1050 
1051     napi_create_async_work(env, nullptr, resource, QueryMaxNumExecuteCB, QueryMaxNumCompletedCB,
1052         reinterpret_cast<void *>(maxNum.get()), &maxNum->work);
1053 
1054     napi_queue_async_work_with_qos(env, maxNum->work, napi_qos_default);
1055     maxNum.release();
1056     return result;
1057 }
1058 
QueryMaxLoggedInOsAccountNumber(napi_env env,napi_callback_info cbInfo)1059 napi_value QueryMaxLoggedInOsAccountNumber(napi_env env, napi_callback_info cbInfo)
1060 {
1061     auto context = std::make_unique<QueryMaxNumAsyncContext>();
1062     napi_value result = nullptr;
1063     NAPI_CALL(env, napi_create_promise(env, &context->deferred, &result));
1064     napi_value resource = nullptr;
1065     NAPI_CALL(env, napi_create_string_utf8(env, "QueryMaxLoggedInOsAccountNumber", NAPI_AUTO_LENGTH, &resource));
1066     NAPI_CALL(env, napi_create_async_work(env, nullptr, resource,
1067         [](napi_env env, void *data) {
1068             auto context = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1069             context->errCode = OsAccountManager::QueryMaxLoggedInOsAccountNumber(context->maxLoggedInNumber);
1070         }, [](napi_env env, napi_status status, void *data) {
1071             auto context = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1072             napi_value errJs = nullptr;
1073             napi_value dataJs = nullptr;
1074             if (context->errCode == napi_ok) {
1075                 napi_create_uint32(env, context->maxLoggedInNumber, &dataJs);
1076             } else {
1077                 errJs = GenerateBusinessError(env, context->errCode);
1078             }
1079             ProcessCallbackOrPromise(env, context, errJs, dataJs);
1080             delete context;
1081         }, reinterpret_cast<void *>(context.get()), &context->work));
1082     NAPI_CALL(env, napi_queue_async_work_with_qos(env, context->work, napi_qos_default));
1083     context.release();
1084     return result;
1085 }
1086 
InnerIsOsAccountActived(napi_env env,napi_callback_info cbInfo,bool throwErr)1087 napi_value InnerIsOsAccountActived(napi_env env, napi_callback_info cbInfo, bool throwErr)
1088 {
1089     auto isActived = std::make_unique<IsActivedAsyncContext>();
1090     isActived->env = env;
1091     isActived->throwErr = throwErr;
1092 
1093     if (!ParseParaIsActived(env, cbInfo, isActived.get()) && throwErr) {
1094         return nullptr;
1095     }
1096 
1097     napi_value result = nullptr;
1098     if (isActived->callbackRef == nullptr) {
1099         napi_create_promise(env, &isActived->deferred, &result);
1100     } else {
1101         napi_get_undefined(env, &result);
1102     }
1103 
1104     napi_value resource = nullptr;
1105     napi_create_string_utf8(env, "IsOsAccountActived", NAPI_AUTO_LENGTH, &resource);
1106 
1107     napi_create_async_work(env, nullptr, resource, IsActivedExecuteCB, IsActivedCompletedCB,
1108         reinterpret_cast<void *>(isActived.get()), &isActived->work);
1109 
1110     napi_queue_async_work_with_qos(env, isActived->work, napi_qos_default);
1111     isActived.release();
1112     return result;
1113 }
1114 
CheckOsAccountActivated(napi_env env,napi_callback_info cbInfo)1115 napi_value CheckOsAccountActivated(napi_env env, napi_callback_info cbInfo)
1116 {
1117     return InnerIsOsAccountActived(env, cbInfo, true);
1118 }
1119 
IsOsAccountActived(napi_env env,napi_callback_info cbInfo)1120 napi_value IsOsAccountActived(napi_env env, napi_callback_info cbInfo)
1121 {
1122     return InnerIsOsAccountActived(env, cbInfo, false);
1123 }
1124 
InnerIsOsAccountConstraintEnable(napi_env env,napi_callback_info cbInfo,bool throwErr)1125 napi_value InnerIsOsAccountConstraintEnable(napi_env env, napi_callback_info cbInfo, bool throwErr)
1126 {
1127     auto isEnable = std::make_unique<IsConEnableAsyncContext>();
1128     isEnable->env = env;
1129     isEnable->throwErr = throwErr;
1130 
1131     if (!ParseParaIsEnable(env, cbInfo, isEnable.get()) && throwErr) {
1132         return nullptr;
1133     }
1134 
1135     napi_value result = nullptr;
1136     if (isEnable->callbackRef == nullptr) {
1137         napi_create_promise(env, &isEnable->deferred, &result);
1138     } else {
1139         napi_get_undefined(env, &result);
1140     }
1141 
1142     napi_value resource = nullptr;
1143     napi_create_string_utf8(env, "IsOsAccountConstraintEnable", NAPI_AUTO_LENGTH, &resource);
1144 
1145     napi_create_async_work(env, nullptr, resource, IsEnableExecuteCB, IsEnableCompletedCB,
1146         reinterpret_cast<void *>(isEnable.get()), &isEnable->work);
1147 
1148     napi_queue_async_work_with_qos(env, isEnable->work, napi_qos_default);
1149     isEnable.release();
1150     return result;
1151 }
1152 
IsOsAccountConstraintEnable(napi_env env,napi_callback_info cbInfo)1153 napi_value IsOsAccountConstraintEnable(napi_env env, napi_callback_info cbInfo)
1154 {
1155     return InnerIsOsAccountConstraintEnable(env, cbInfo, false);
1156 }
1157 
CheckConstraintEnabled(napi_env env,napi_callback_info cbInfo)1158 napi_value CheckConstraintEnabled(napi_env env, napi_callback_info cbInfo)
1159 {
1160     return InnerIsOsAccountConstraintEnable(env, cbInfo, true);
1161 }
1162 
GetOsAccountType(napi_env env,napi_callback_info cbInfo)1163 napi_value GetOsAccountType(napi_env env, napi_callback_info cbInfo)
1164 {
1165     return GetOsAccountTypeFromProcessInner(env, cbInfo, true);
1166 }
1167 
GetOsAccountTypeFromProcess(napi_env env,napi_callback_info cbInfo)1168 napi_value GetOsAccountTypeFromProcess(napi_env env, napi_callback_info cbInfo)
1169 {
1170     return GetOsAccountTypeFromProcessInner(env, cbInfo, false);
1171 }
1172 
GetOsAccountTypeFromProcessInner(napi_env env,napi_callback_info cbInfo,bool throwErr)1173 napi_value GetOsAccountTypeFromProcessInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
1174 {
1175     auto getType = std::make_unique<GetTypeAsyncContext>();
1176     getType->env = env;
1177     getType->throwErr = throwErr;
1178 
1179     if (!ParseParaGetType(env, cbInfo, getType.get()) && throwErr) {
1180         return nullptr;
1181     }
1182 
1183     napi_value result = nullptr;
1184     if (getType->callbackRef == nullptr) {
1185         napi_create_promise(env, &getType->deferred, &result);
1186     } else {
1187         napi_get_undefined(env, &result);
1188     }
1189 
1190     napi_value resource = nullptr;
1191     napi_create_string_utf8(env, "GetOsAccountTypeFromProcessInner", NAPI_AUTO_LENGTH, &resource);
1192 
1193     napi_create_async_work(env, nullptr, resource, GetTypeExecuteCB, GetTypeCompletedCB,
1194         reinterpret_cast<void *>(getType.get()), &getType->work);
1195 
1196     napi_queue_async_work_with_qos(env, getType->work, napi_qos_default);
1197     getType.release();
1198     return result;
1199 }
1200 
IsMultiOsAccountEnable(napi_env env,napi_callback_info cbInfo)1201 napi_value IsMultiOsAccountEnable(napi_env env, napi_callback_info cbInfo)
1202 {
1203     return InnerIsMultiOsAccountEnable(env, cbInfo, false);
1204 }
1205 
CheckMultiOsAccountEnabled(napi_env env,napi_callback_info cbInfo)1206 napi_value CheckMultiOsAccountEnabled(napi_env env, napi_callback_info cbInfo)
1207 {
1208     return InnerIsMultiOsAccountEnable(env, cbInfo, true);
1209 }
1210 
InnerIsMultiOsAccountEnable(napi_env env,napi_callback_info cbInfo,bool throwErr)1211 napi_value InnerIsMultiOsAccountEnable(napi_env env, napi_callback_info cbInfo, bool throwErr)
1212 {
1213     auto multiEn = std::make_unique<IsMultiEnAsyncContext>();
1214     multiEn->env = env;
1215     multiEn->throwErr = throwErr;
1216 
1217     if (!ParseParaIsMultiEn(env, cbInfo, multiEn.get()) && throwErr) {
1218         return nullptr;
1219     }
1220 
1221     napi_value result = nullptr;
1222     if (multiEn->callbackRef == nullptr) {
1223         napi_create_promise(env, &multiEn->deferred, &result);
1224     } else {
1225         napi_get_undefined(env, &result);
1226     }
1227 
1228     napi_value resource = nullptr;
1229     napi_create_string_utf8(env, "IsMultiOsAccountEnable", NAPI_AUTO_LENGTH, &resource);
1230 
1231     napi_create_async_work(env, nullptr, resource, IsMultiEnExecuteCB, IsMultiEnCompletedCB,
1232         reinterpret_cast<void *>(multiEn.get()), &multiEn->work);
1233 
1234     napi_queue_async_work_with_qos(env, multiEn->work, napi_qos_default);
1235     multiEn.release();
1236     return result;
1237 }
1238 
InnerIsOsAccountVerified(napi_env env,napi_callback_info cbInfo,bool throwErr)1239 napi_value InnerIsOsAccountVerified(napi_env env, napi_callback_info cbInfo, bool throwErr)
1240 {
1241     auto isVerified = std::make_unique<IsVerifiedAsyncContext>();
1242     isVerified->env = env;
1243     isVerified->throwErr = throwErr;
1244 
1245     if (!ParseParaIsVerified(env, cbInfo, isVerified.get()) && throwErr) {
1246         return nullptr;
1247     }
1248 
1249     napi_value result = nullptr;
1250     if (isVerified->callbackRef == nullptr) {
1251         napi_create_promise(env, &isVerified->deferred, &result);
1252     } else {
1253         napi_get_undefined(env, &result);
1254     }
1255 
1256     napi_value resource = nullptr;
1257     napi_create_string_utf8(env, "IsOsAccountVerified", NAPI_AUTO_LENGTH, &resource);
1258 
1259     napi_create_async_work(env, nullptr, resource, IsVerifiedExecuteCB, IsVerifiedCompletedCB,
1260         reinterpret_cast<void *>(isVerified.get()), &isVerified->work);
1261 
1262     napi_queue_async_work_with_qos(env, isVerified->work, napi_qos_default);
1263     isVerified.release();
1264     return result;
1265 }
1266 
IsOsAccountVerified(napi_env env,napi_callback_info cbInfo)1267 napi_value IsOsAccountVerified(napi_env env, napi_callback_info cbInfo)
1268 {
1269     return InnerIsOsAccountVerified(env, cbInfo, false);
1270 }
1271 
CheckOsAccountVerified(napi_env env,napi_callback_info cbInfo)1272 napi_value CheckOsAccountVerified(napi_env env, napi_callback_info cbInfo)
1273 {
1274     return InnerIsOsAccountVerified(env, cbInfo, true);
1275 }
1276 
QueryOsAccountLocalIdBySerialNumber(napi_env env,napi_callback_info cbInfo)1277 napi_value QueryOsAccountLocalIdBySerialNumber(napi_env env, napi_callback_info cbInfo)
1278 {
1279     return GetOsAccountLocalIdBySerialNumberInner(env, cbInfo, true);
1280 }
1281 
GetOsAccountLocalIdBySerialNumber(napi_env env,napi_callback_info cbInfo)1282 napi_value GetOsAccountLocalIdBySerialNumber(napi_env env, napi_callback_info cbInfo)
1283 {
1284     return GetOsAccountLocalIdBySerialNumberInner(env, cbInfo, false);
1285 }
1286 
GetOsAccountLocalIdBySerialNumberInner(napi_env env,napi_callback_info cbInfo,bool throwErr)1287 napi_value GetOsAccountLocalIdBySerialNumberInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
1288 {
1289     auto serialNumId = std::make_unique<GetSerialNumIdCBInfo>();
1290     serialNumId->env = env;
1291     serialNumId->throwErr = throwErr;
1292 
1293     if (!ParseParaSerialNumId(env, cbInfo, serialNumId.get()) && throwErr) {
1294         return nullptr;
1295     }
1296 
1297     napi_value result = nullptr;
1298     if (serialNumId->callbackRef == nullptr) {
1299         napi_create_promise(env, &serialNumId->deferred, &result);
1300     } else {
1301         napi_get_undefined(env, &result);
1302     }
1303 
1304     napi_value resource = nullptr;
1305     napi_create_string_utf8(env, "GetOsAccountLocalIdBySerialNumberInner", NAPI_AUTO_LENGTH, &resource);
1306 
1307     napi_create_async_work(env, nullptr, resource, SerialNumIdExecuteCB, SerialNumIdCompletedCB,
1308         reinterpret_cast<void *>(serialNumId.get()), &serialNumId->work);
1309 
1310     napi_queue_async_work_with_qos(env, serialNumId->work, napi_qos_default);
1311     serialNumId.release();
1312     return result;
1313 }
1314 
QuerySerialNumberByOsAccountLocalId(napi_env env,napi_callback_info cbInfo)1315 napi_value QuerySerialNumberByOsAccountLocalId(napi_env env, napi_callback_info cbInfo)
1316 {
1317     return GetSerialNumberByOsAccountLocalIdInner(env, cbInfo, true);
1318 }
1319 
GetSerialNumberByOsAccountLocalId(napi_env env,napi_callback_info cbInfo)1320 napi_value GetSerialNumberByOsAccountLocalId(napi_env env, napi_callback_info cbInfo)
1321 {
1322     return GetSerialNumberByOsAccountLocalIdInner(env, cbInfo, false);
1323 }
1324 
GetSerialNumberByOsAccountLocalIdInner(napi_env env,napi_callback_info cbInfo,bool throwErr)1325 napi_value GetSerialNumberByOsAccountLocalIdInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
1326 {
1327     auto getSerialNum = std::make_unique<GetSerialNumForOAInfo>();
1328     getSerialNum->env = env;
1329     getSerialNum->throwErr = throwErr;
1330 
1331     if (!ParseParaGetSerialNum(env, cbInfo, getSerialNum.get()) && throwErr) {
1332         return nullptr;
1333     }
1334 
1335     napi_value result = nullptr;
1336     if (getSerialNum->callbackRef == nullptr) {
1337         napi_create_promise(env, &getSerialNum->deferred, &result);
1338     } else {
1339         napi_get_undefined(env, &result);
1340     }
1341 
1342     napi_value resource = nullptr;
1343     napi_create_string_utf8(env, "GetSerialNumberByOsAccountLocalId", NAPI_AUTO_LENGTH, &resource);
1344 
1345     napi_create_async_work(env,
1346         nullptr,
1347         resource,
1348         GetSerialNumExecuteCB,
1349         GetSerialNumCompletedCB,
1350         reinterpret_cast<void *>(getSerialNum.get()),
1351         &getSerialNum->work);
1352 
1353     napi_queue_async_work_with_qos(env, getSerialNum->work, napi_qos_default);
1354     getSerialNum.release();
1355     return result;
1356 }
1357 
IsTestOsAccount(napi_env env,napi_callback_info cbInfo)1358 napi_value IsTestOsAccount(napi_env env, napi_callback_info cbInfo)
1359 {
1360     return InnerIsTestOsAccount(env, cbInfo, false);
1361 }
1362 
CheckOsAccountTestable(napi_env env,napi_callback_info cbInfo)1363 napi_value CheckOsAccountTestable(napi_env env, napi_callback_info cbInfo)
1364 {
1365     return InnerIsTestOsAccount(env, cbInfo, true);
1366 }
1367 
InnerIsTestOsAccount(napi_env env,napi_callback_info cbInfo,bool throwErr)1368 napi_value InnerIsTestOsAccount(napi_env env, napi_callback_info cbInfo, bool throwErr)
1369 {
1370     auto isTest = std::make_unique<IsTestOAInfo>();
1371     isTest->env = env;
1372     isTest->throwErr = throwErr;
1373 
1374     if (!ParseParaIsTestOA(env, cbInfo, isTest.get()) && throwErr) {
1375         return nullptr;
1376     }
1377 
1378     napi_value result = nullptr;
1379     if (isTest->callbackRef == nullptr) {
1380         napi_create_promise(env, &isTest->deferred, &result);
1381     } else {
1382         napi_get_undefined(env, &result);
1383     }
1384 
1385     napi_value resource = nullptr;
1386     napi_create_string_utf8(env, "IsTestOsAccount", NAPI_AUTO_LENGTH, &resource);
1387 
1388     napi_create_async_work(env,
1389         nullptr,
1390         resource,
1391         [](napi_env env, void *data) {},
1392         [](napi_env env, napi_status status, void *data) {
1393             ACCOUNT_LOGI("napi_create_async_work complete");
1394             IsTestOAInfo *isTest = reinterpret_cast<IsTestOAInfo *>(data);
1395             isTest->errCode = 0;
1396             isTest->isTestOsAccount = false;
1397             napi_value result[RESULT_COUNT] = {0};
1398             result[PARAMZERO] = GenerateBusinessSuccess(env, isTest->throwErr);
1399             napi_get_boolean(env, isTest->isTestOsAccount, &result[PARAMONE]);
1400             ProcessCallbackOrPromise(env, isTest, result[PARAMZERO], result[PARAMONE]);
1401             delete isTest;
1402         },
1403         reinterpret_cast<void *>(isTest.get()),
1404         &isTest->work);
1405     napi_queue_async_work_with_qos(env, isTest->work, napi_qos_default);
1406     isTest.release();
1407     return result;
1408 }
1409 
IsMainOsAccount(napi_env env,napi_callback_info cbInfo)1410 napi_value IsMainOsAccount(napi_env env, napi_callback_info cbInfo)
1411 {
1412     auto isMain = std::make_unique<IsMainOAInfo>();
1413     isMain->env = env;
1414     isMain->throwErr = true;
1415 
1416     if (!ParseParaIsMainOA(env, cbInfo, isMain.get())) {
1417         return nullptr;
1418     }
1419 
1420     napi_value result = nullptr;
1421     if (isMain->callbackRef == nullptr) {
1422         napi_create_promise(env, &isMain->deferred, &result);
1423     } else {
1424         napi_get_undefined(env, &result);
1425     }
1426 
1427     napi_value resource = nullptr;
1428     napi_create_string_utf8(env, "IsMainOsAccount", NAPI_AUTO_LENGTH, &resource);
1429 
1430     napi_create_async_work(env,
1431         nullptr,
1432         resource,
1433         [](napi_env env, void *data) {
1434             IsMainOAInfo *isMain = reinterpret_cast<IsMainOAInfo *>(data);
1435             isMain->errCode = OsAccountManager::IsMainOsAccount(isMain->isMainOsAccount);
1436             ACCOUNT_LOGD("error code is %{public}d", isMain->errCode);
1437             isMain->status = (isMain->errCode == 0) ? napi_ok : napi_generic_failure;
1438         },
1439         [](napi_env env, napi_status status, void *data) {
1440             ACCOUNT_LOGD("napi_create_async_work complete");
1441             IsMainOAInfo *isMain = reinterpret_cast<IsMainOAInfo *>(data);
1442             napi_value result[RESULT_COUNT] = {0};
1443             result[PARAMZERO] = GenerateBusinessError(env, isMain->errCode);
1444             napi_get_boolean(env, isMain->isMainOsAccount, &result[PARAMONE]);
1445             ProcessCallbackOrPromise(env, isMain, result[PARAMZERO], result[PARAMONE]);
1446             delete isMain;
1447         },
1448         reinterpret_cast<void *>(isMain.get()),
1449         &isMain->work);
1450 
1451     napi_queue_async_work_with_qos(env, isMain->work, napi_qos_default);
1452     isMain.release();
1453     return result;
1454 }
1455 
IsSubscribeInMap(napi_env env,SubscribeCBInfo * subscribeCBInfo)1456 static bool IsSubscribeInMap(napi_env env, SubscribeCBInfo *subscribeCBInfo)
1457 {
1458     std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1459     auto subscribe = g_osAccountSubscribers.find(subscribeCBInfo->osManager);
1460     if (subscribe == g_osAccountSubscribers.end()) {
1461         return false;
1462     }
1463     auto it = subscribe->second.begin();
1464     while (it != subscribe->second.end()) {
1465         if (((*it)->osSubscribeType == subscribeCBInfo->osSubscribeType) &&
1466             (CompareOnAndOffRef(env, (*it)->callbackRef, subscribeCBInfo->callbackRef))) {
1467             return true;
1468         }
1469         it++;
1470     }
1471     return false;
1472 }
1473 
Subscribe(napi_env env,napi_callback_info cbInfo)1474 napi_value Subscribe(napi_env env, napi_callback_info cbInfo)
1475 {
1476     SubscribeCBInfo *subscribeCBInfo = new (std::nothrow) SubscribeCBInfo(env);
1477     if (subscribeCBInfo == nullptr) {
1478         ACCOUNT_LOGE("insufficient memory for subscribeCBInfo!");
1479         return nullptr;
1480     }
1481     subscribeCBInfo->throwErr = true;
1482 
1483     napi_value thisVar = nullptr;
1484 
1485     if (!ParseParaToSubscriber(env, cbInfo, subscribeCBInfo, &thisVar)) {
1486         delete subscribeCBInfo;
1487         ACCOUNT_LOGE("Parse subscribe failed");
1488         return nullptr;
1489     }
1490 
1491     // make osaccount subscribe info
1492     OsAccountSubscribeInfo subscribeInfo(subscribeCBInfo->osSubscribeType, subscribeCBInfo->name);
1493     // make a subscriber
1494     subscribeCBInfo->subscriber = std::make_shared<SubscriberPtr>(subscribeInfo);
1495 
1496     OsAccountManager *objectInfo = nullptr;
1497     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&objectInfo));
1498     subscribeCBInfo->osManager = objectInfo;
1499     subscribeCBInfo->subscriber->SetEnv(env);
1500     subscribeCBInfo->subscriber->SetCallbackRef(subscribeCBInfo->callbackRef);
1501     if (IsSubscribeInMap(env, subscribeCBInfo)) {
1502         delete subscribeCBInfo;
1503         return WrapVoidToJS(env);
1504     }
1505     ErrCode errCode = OsAccountManager::SubscribeOsAccount(subscribeCBInfo->subscriber);
1506     if (errCode != ERR_OK) {
1507         delete subscribeCBInfo;
1508         AccountNapiThrow(env, errCode, true);
1509         return WrapVoidToJS(env);
1510     } else {
1511         std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1512         g_osAccountSubscribers[objectInfo].emplace_back(subscribeCBInfo);
1513     }
1514     return WrapVoidToJS(env);
1515 }
1516 
SubscriberPtr(const OsAccountSubscribeInfo & subscribeInfo)1517 SubscriberPtr::SubscriberPtr(const OsAccountSubscribeInfo &subscribeInfo) : OsAccountSubscriber(subscribeInfo)
1518 {}
1519 
~SubscriberPtr()1520 SubscriberPtr::~SubscriberPtr()
1521 {}
1522 
OnAccountsChanged(const int & id)1523 void SubscriberPtr::OnAccountsChanged(const int &id)
1524 {
1525     OnAccountsSubNotify(id, id);
1526 }
1527 
OnAccountsSwitch(const int & newId,const int & oldId)1528 void SubscriberPtr::OnAccountsSwitch(const int &newId, const int &oldId)
1529 {
1530     OnAccountsSubNotify(newId, oldId);
1531 }
1532 
OnAccountsSubNotify(const int & newId,const int & oldId)1533 void SubscriberPtr::OnAccountsSubNotify(const int &newId, const int &oldId)
1534 {
1535     std::shared_ptr<SubscriberOAWorker> subscriberOAWorker = std::make_shared<SubscriberOAWorker>();
1536     if (subscriberOAWorker == nullptr) {
1537         ACCOUNT_LOGE("insufficient memory for SubscriberAccountsWorker!");
1538         return;
1539     }
1540     subscriberOAWorker->oldId = oldId;
1541     subscriberOAWorker->newId = newId;
1542     subscriberOAWorker->env = env_;
1543     subscriberOAWorker->ref = ref_;
1544     subscriberOAWorker->subscriber = this;
1545     auto task = OnAccountsSubNotifyTask(subscriberOAWorker);
1546     if (napi_ok != napi_send_event(env_, task, napi_eprio_vip)) {
1547         ACCOUNT_LOGE("Post task failed");
1548         return;
1549     }
1550     ACCOUNT_LOGI("Post task finish");
1551 }
1552 
CreateSwitchEventInfoObj(const std::shared_ptr<SubscriberOAWorker> & subscriberOAWorker)1553 static napi_value CreateSwitchEventInfoObj(const std::shared_ptr<SubscriberOAWorker> &subscriberOAWorker)
1554 {
1555     napi_env env = subscriberOAWorker->env;
1556     napi_value objInfo = nullptr;
1557     NAPI_CALL(env, napi_create_object(env, &objInfo));
1558     napi_value fromAccountIdJs;
1559     NAPI_CALL(env, napi_create_int32(env, subscriberOAWorker->oldId, &fromAccountIdJs));
1560     NAPI_CALL(env, napi_set_named_property(env, objInfo, "fromAccountId", fromAccountIdJs));
1561     napi_value toAccountIdJs;
1562     NAPI_CALL(env, napi_create_int32(env, subscriberOAWorker->newId, &toAccountIdJs));
1563     NAPI_CALL(env, napi_set_named_property(env, objInfo, "toAccountId", toAccountIdJs));
1564 
1565     return objInfo;
1566 }
1567 
OnAccountsSubNotifyTask(const std::shared_ptr<SubscriberOAWorker> & subscriberOAWorkerData)1568 std::function<void()> OnAccountsSubNotifyTask(const std::shared_ptr<SubscriberOAWorker> &subscriberOAWorkerData)
1569 {
1570     return [subscriberOAWorkerData] {
1571         ACCOUNT_LOGI("Enter OnAccountsSubNotify task");
1572         napi_handle_scope scope = nullptr;
1573         napi_open_handle_scope(subscriberOAWorkerData->env, &scope);
1574         if (scope == nullptr) {
1575             ACCOUNT_LOGE("Fail to open scope");
1576             return;
1577         }
1578         bool isFound = false;
1579         {
1580             std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1581             SubscriberPtr *subscriber = subscriberOAWorkerData->subscriber;
1582             for (auto subscriberInstance : g_osAccountSubscribers) {
1583                 isFound = std::any_of(subscriberInstance.second.begin(), subscriberInstance.second.end(),
1584                     [subscriber] (const SubscribeCBInfo *item) {
1585                         return item->subscriber.get() == subscriber;
1586                 });
1587                 if (isFound) {
1588                     ACCOUNT_LOGD("OsAccount subscriber has been found.");
1589                     break;
1590                 }
1591             }
1592         }
1593         if (isFound) {
1594             OsAccountSubscribeInfo subscribeInfo;
1595             OS_ACCOUNT_SUBSCRIBE_TYPE osSubscribeType;
1596             subscriberOAWorkerData->subscriber->GetSubscribeInfo(subscribeInfo);
1597             subscribeInfo.GetOsAccountSubscribeType(osSubscribeType);
1598 
1599             napi_value result[ARGS_SIZE_ONE] = { nullptr };
1600             if ((osSubscribeType == SWITCHING || osSubscribeType == SWITCHED)) {
1601                 ACCOUNT_LOGI("Switch condition, return oldId=%{public}d and newId=%{public}d.",
1602                     subscriberOAWorkerData->oldId, subscriberOAWorkerData->newId);
1603                 result[PARAMZERO] = CreateSwitchEventInfoObj(subscriberOAWorkerData);
1604             } else {
1605                 napi_create_int32(subscriberOAWorkerData->env, subscriberOAWorkerData->newId, &result[PARAMZERO]);
1606             }
1607             NapiCallVoidFunction(
1608                 subscriberOAWorkerData->env, &result[PARAMZERO], ARGS_SIZE_ONE, subscriberOAWorkerData->ref);
1609         }
1610         napi_close_handle_scope(subscriberOAWorkerData->env, scope);
1611     };
1612 }
1613 
SetEnv(const napi_env & env)1614 void SubscriberPtr::SetEnv(const napi_env &env)
1615 {
1616     env_ = env;
1617 }
1618 
SetCallbackRef(const napi_ref & ref)1619 void SubscriberPtr::SetCallbackRef(const napi_ref &ref)
1620 {
1621     ref_ = ref;
1622 }
1623 
Unsubscribe(napi_env env,napi_callback_info cbInfo)1624 napi_value Unsubscribe(napi_env env, napi_callback_info cbInfo)
1625 {
1626     UnsubscribeCBInfo *unsubscribeCBInfo = new (std::nothrow) UnsubscribeCBInfo(env);
1627     if (unsubscribeCBInfo == nullptr) {
1628         ACCOUNT_LOGE("insufficient memory for unsubscribeCBInfo!");
1629         return WrapVoidToJS(env);
1630     }
1631     unsubscribeCBInfo->callbackRef = nullptr;
1632     unsubscribeCBInfo->throwErr = true;
1633 
1634     napi_value thisVar = nullptr;
1635 
1636     if (!ParseParaToUnsubscriber(env, cbInfo, unsubscribeCBInfo, &thisVar)) {
1637         delete unsubscribeCBInfo;
1638         ACCOUNT_LOGE("Parse unsubscribe failed");
1639         return nullptr;
1640     }
1641 
1642     OsAccountManager *objectInfo = nullptr;
1643     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&objectInfo));
1644     unsubscribeCBInfo->osManager = objectInfo;
1645 
1646     UnsubscribeSync(env, unsubscribeCBInfo);
1647     delete unsubscribeCBInfo;
1648     return WrapVoidToJS(env);
1649 }
1650 
UnsubscribeSync(napi_env env,UnsubscribeCBInfo * unsubscribeCBInfo)1651 void UnsubscribeSync(napi_env env, UnsubscribeCBInfo *unsubscribeCBInfo)
1652 {
1653     std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1654     auto subscribe = g_osAccountSubscribers.find(unsubscribeCBInfo->osManager);
1655     if (subscribe == g_osAccountSubscribers.end()) {
1656         return;
1657     }
1658     auto item = subscribe->second.begin();
1659     while (item != subscribe->second.end()) {
1660         OsAccountSubscribeInfo subscribeInfo;
1661         OS_ACCOUNT_SUBSCRIBE_TYPE osSubscribeType;
1662         std::string name;
1663         (*item)->subscriber->GetSubscribeInfo(subscribeInfo);
1664         subscribeInfo.GetOsAccountSubscribeType(osSubscribeType);
1665         subscribeInfo.GetName(name);
1666         if (((unsubscribeCBInfo->osSubscribeType != osSubscribeType) || (unsubscribeCBInfo->name != name)) ||
1667             ((unsubscribeCBInfo->callbackRef != nullptr) &&
1668             (!CompareOnAndOffRef(env, (*item)->callbackRef, unsubscribeCBInfo->callbackRef)))) {
1669             item++;
1670             continue;
1671         }
1672         int errCode = OsAccountManager::UnsubscribeOsAccount((*item)->subscriber);
1673         if (errCode != ERR_OK) {
1674             AccountNapiThrow(env, errCode, true);
1675             return;
1676         }
1677         delete (*item);
1678         item = subscribe->second.erase(item);
1679         if (unsubscribeCBInfo->callbackRef != nullptr) {
1680             break;
1681         }
1682     }
1683     if (subscribe->second.empty()) {
1684         g_osAccountSubscribers.erase(subscribe->first);
1685     }
1686 }
1687 
IsOsAccountActivated(napi_env env,napi_callback_info cbInfo)1688 napi_value IsOsAccountActivated(napi_env env, napi_callback_info cbInfo)
1689 {
1690     if (AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1691         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1692         return nullptr;
1693     }
1694     return InnerIsOsAccountActived(env, cbInfo, true);
1695 }
1696 
IsOsAccountConstraintEnabled(napi_env env,napi_callback_info cbInfo)1697 napi_value IsOsAccountConstraintEnabled(napi_env env, napi_callback_info cbInfo)
1698 {
1699     size_t argc = ARGS_SIZE_TWO;
1700     napi_value argv[ARGS_SIZE_TWO] = {0};
1701     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1702 
1703     if (argc == ARGS_SIZE_TWO && AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1704         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1705         return nullptr;
1706     }
1707     return InnerIsOsAccountConstraintEnable(env, cbInfo, true);
1708 }
1709 
IsOsAccountUnlocked(napi_env env,napi_callback_info cbInfo)1710 napi_value IsOsAccountUnlocked(napi_env env, napi_callback_info cbInfo)
1711 {
1712     size_t argc = ARGS_SIZE_TWO;
1713     napi_value argv[ARGS_SIZE_TWO] = {0};
1714     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1715 
1716     if (argc != 0 && AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1717         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1718         return nullptr;
1719     }
1720     return InnerIsOsAccountVerified(env, cbInfo, true);
1721 }
1722 
GetEnabledOsAccountConstraints(napi_env env,napi_callback_info cbInfo)1723 napi_value GetEnabledOsAccountConstraints(napi_env env, napi_callback_info cbInfo)
1724 {
1725     if (AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1726         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1727         return nullptr;
1728     }
1729     return GetOsAccountAllConstraintsInner(env, cbInfo, true);
1730 }
1731 
QueryOsAccount(napi_env env,napi_callback_info cbInfo)1732 napi_value QueryOsAccount(napi_env env, napi_callback_info cbInfo)
1733 {
1734     if (AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1735         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1736         return nullptr;
1737     }
1738     return QueryCurrentOsAccountInner(env, cbInfo, true);
1739 }
1740 }  // namespace AccountJsKit
1741 }  // namespace OHOS