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, ¤tOA->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 ¤tOA->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