1 /*
2  * Copyright (c) 2022-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 #include "napi_context_common.h"
16 
17 namespace OHOS {
18 namespace Security {
19 namespace AccessToken {
20 namespace {
21 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {
22     LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "AtManagerAsyncWorkData"
23 };
24 }
25 
GetJsErrorCode(int32_t errCode)26 int32_t NapiContextCommon::GetJsErrorCode(int32_t errCode)
27 {
28     int32_t jsCode;
29     switch (errCode) {
30         case RET_SUCCESS:
31             jsCode = JS_OK;
32             break;
33         case ERR_PERMISSION_DENIED:
34             jsCode = JS_ERROR_PERMISSION_DENIED;
35             break;
36         case ERR_NOT_SYSTEM_APP:
37             jsCode = JS_ERROR_NOT_SYSTEM_APP;
38             break;
39         case ERR_PARAM_INVALID:
40             jsCode = JS_ERROR_PARAM_INVALID;
41             break;
42         case ERR_TOKENID_NOT_EXIST:
43             jsCode = JS_ERROR_TOKENID_NOT_EXIST;
44             break;
45         case ERR_PERMISSION_NOT_EXIST:
46             jsCode = JS_ERROR_PERMISSION_NOT_EXIST;
47             break;
48         case ERR_INTERFACE_NOT_USED_TOGETHER:
49         case ERR_CALLBACK_ALREADY_EXIST:
50             jsCode = JS_ERROR_NOT_USE_TOGETHER;
51             break;
52         case ERR_CALLBACKS_EXCEED_LIMITATION:
53             jsCode = JS_ERROR_REGISTERS_EXCEED_LIMITATION;
54             break;
55         case ERR_IDENTITY_CHECK_FAILED:
56             jsCode = JS_ERROR_PERMISSION_OPERATION_NOT_ALLOWED;
57             break;
58         case ERR_SERVICE_ABNORMAL:
59         case ERROR_IPC_REQUEST_FAIL:
60         case ERR_READ_PARCEL_FAILED:
61         case ERR_WRITE_PARCEL_FAILED:
62             jsCode = JS_ERROR_SERVICE_NOT_RUNNING;
63             break;
64         case ERR_MALLOC_FAILED:
65             jsCode = JS_ERROR_OUT_OF_MEMORY;
66             break;
67         default:
68             jsCode = JS_ERROR_INNER;
69             break;
70     }
71     ACCESSTOKEN_LOG_DEBUG(LABEL, "GetJsErrorCode nativeCode(%{public}d) jsCode(%{public}d).", errCode, jsCode);
72     return jsCode;
73 }
74 
AtManagerAsyncWorkData(napi_env envValue)75 AtManagerAsyncWorkData::AtManagerAsyncWorkData(napi_env envValue)
76 {
77     env = envValue;
78 }
79 
~AtManagerAsyncWorkData()80 AtManagerAsyncWorkData::~AtManagerAsyncWorkData()
81 {
82     if (env == nullptr) {
83         ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid env");
84         return;
85     }
86     std::unique_ptr<uv_work_t> workPtr = std::make_unique<uv_work_t>();
87     std::unique_ptr<AtManagerAsyncWorkDataRel> workDataRel = std::make_unique<AtManagerAsyncWorkDataRel>();
88     uv_loop_s *loop = nullptr;
89     napi_get_uv_event_loop(env, &loop);
90     if ((loop == nullptr) || (workPtr == nullptr) || (workDataRel == nullptr)) {
91         ACCESSTOKEN_LOG_ERROR(LABEL, "Fail to init execution environment");
92         return;
93     }
94     workDataRel->env = env;
95     workDataRel->work = work;
96     workDataRel->callbackRef = callbackRef;
97     workPtr->data = reinterpret_cast<void *>(workDataRel.get());
98     NAPI_CALL_RETURN_VOID(env, uv_queue_work_with_qos(loop, workPtr.get(), [] (uv_work_t *work) {},
99         [] (uv_work_t *work, int status) {
100             if (work == nullptr) {
101                 ACCESSTOKEN_LOG_ERROR(LABEL, "Work is nullptr");
102                 return;
103             }
104             auto workDataRel = reinterpret_cast<AtManagerAsyncWorkDataRel *>(work->data);
105             if (workDataRel == nullptr) {
106                 ACCESSTOKEN_LOG_ERROR(LABEL, "WorkDataRel is nullptr");
107                 delete work;
108                 return;
109             }
110             if (workDataRel->work != nullptr) {
111                 napi_delete_async_work(workDataRel->env, workDataRel->work);
112             }
113             if (workDataRel->callbackRef != nullptr) {
114                 napi_delete_reference(workDataRel->env, workDataRel->callbackRef);
115             }
116             delete workDataRel;
117             delete work;
118         }, uv_qos_default));
119     workDataRel.release();
120     workPtr.release();
121 }
122 }  // namespace AccessToken
123 }  // namespace Security
124 }  // namespace OHOS