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