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