1 /*
2 * Copyright (c) 2023 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_common.h"
17 #include <algorithm>
18 #include <unistd.h>
19 #include "dlp_file_kits.h"
20 #include "dlp_permission.h"
21 #include "dlp_permission_log.h"
22 #include "napi_error_msg.h"
23 #include "securec.h"
24 #include "string_wrapper.h"
25 #include "want_params_wrapper.h"
26
27 namespace OHOS {
28 namespace Security {
29 namespace DlpPermission {
30 namespace {
31 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_DLP_PERMISSION, "DlpPermissionCommon"};
32 static const int MAX_FILE_NAME_LEN = 256;
33 const std::string PARAM_UI_EXTENSION_TYPE = "ability.want.params.uiExtensionType";
34 const std::string SYS_COMMON_UI = "sys/commonUI";
35 const std::string DLP_MANAGER_BUNDLENAME = "com.ohos.dlpmanager";
36 const std::string DLP_MANAGER_ABILITYNAME = "MainAbilityEx";
37 const std::string ON_OFF_SANDBOX = "uninstallDLPSandbox";
38
ConvertDlpSandboxChangeInfo(napi_env env,napi_value value,const DlpSandboxCallbackInfo & result)39 static bool ConvertDlpSandboxChangeInfo(napi_env env, napi_value value, const DlpSandboxCallbackInfo &result)
40 {
41 napi_value element;
42 NAPI_CALL_BASE(env, napi_create_int32(env, result.appIndex, &element), false);
43 NAPI_CALL_BASE(env, napi_set_named_property(env, value, "appIndex", element), false);
44 element = nullptr;
45 NAPI_CALL_BASE(env, napi_create_string_utf8(env, result.bundleName.c_str(), NAPI_AUTO_LENGTH, &element), false);
46 NAPI_CALL_BASE(env, napi_set_named_property(env, value, "bundleName", element), false);
47 return true;
48 };
49
UvQueueWorkDlpSandboxChanged(uv_work_t * work,int status)50 static void UvQueueWorkDlpSandboxChanged(uv_work_t *work, int status)
51 {
52 DLP_LOG_INFO(LABEL, "enter UvQueueWorkDlpSandboxChanged");
53 if ((work == nullptr) || (work->data == nullptr)) {
54 DLP_LOG_ERROR(LABEL, "work == nullptr || work->data == nullptr");
55 return;
56 }
57 std::unique_ptr<uv_work_t> uvWorkPtr { work };
58 RegisterDlpSandboxChangeWorker *registerSandboxChangeData =
59 reinterpret_cast<RegisterDlpSandboxChangeWorker *>(work->data);
60 std::unique_ptr<RegisterDlpSandboxChangeWorker> workPtr { registerSandboxChangeData };
61 napi_handle_scope scope = nullptr;
62 napi_open_handle_scope(registerSandboxChangeData->env, &scope);
63 if (scope == nullptr) {
64 DLP_LOG_ERROR(LABEL, "scope is nullptr");
65 return;
66 }
67 napi_value result = { nullptr };
68 NAPI_CALL_RETURN_VOID_WITH_SCOPE(registerSandboxChangeData->env,
69 napi_create_array(registerSandboxChangeData->env, &result), scope);
70 if (!ConvertDlpSandboxChangeInfo(registerSandboxChangeData->env, result, registerSandboxChangeData->result)) {
71 napi_close_handle_scope(registerSandboxChangeData->env, scope);
72 DLP_LOG_ERROR(LABEL, "ConvertDlpSandboxChangeInfo failed");
73 return;
74 }
75
76 napi_value undefined = nullptr;
77 napi_value callback = nullptr;
78 napi_value resultout = nullptr;
79 NAPI_CALL_RETURN_VOID_WITH_SCOPE(registerSandboxChangeData->env,
80 napi_get_undefined(registerSandboxChangeData->env, &undefined), scope);
81 NAPI_CALL_RETURN_VOID_WITH_SCOPE(registerSandboxChangeData->env,
82 napi_get_reference_value(registerSandboxChangeData->env, registerSandboxChangeData->ref, &callback), scope);
83 NAPI_CALL_RETURN_VOID_WITH_SCOPE(registerSandboxChangeData->env,
84 napi_call_function(registerSandboxChangeData->env, undefined, callback, 1, &result, &resultout), scope);
85 napi_close_handle_scope(registerSandboxChangeData->env, scope);
86 DLP_LOG_DEBUG(LABEL, "UvQueueWorkDlpSandboxChanged end");
87 };
88
ConvertOpenDlpFileCallbackInfo(napi_env env,napi_value value,const OpenDlpFileCallbackInfo & result)89 static bool ConvertOpenDlpFileCallbackInfo(napi_env env, napi_value value, const OpenDlpFileCallbackInfo &result)
90 {
91 napi_value element = nullptr;
92 NAPI_CALL_BASE(env, napi_create_string_utf8(env, result.uri.c_str(), NAPI_AUTO_LENGTH, &element), false);
93 NAPI_CALL_BASE(env, napi_set_named_property(env, value, "uri", element), false);
94 element = nullptr;
95 NAPI_CALL_BASE(env, napi_create_bigint_uint64(env, result.timeStamp, &element), false);
96 NAPI_CALL_BASE(env, napi_set_named_property(env, value, "lastOpenTime", element), false);
97 return true;
98 };
99
UvQueueWorkOpenDlpFile(uv_work_t * work,int status)100 static void UvQueueWorkOpenDlpFile(uv_work_t *work, int status)
101 {
102 DLP_LOG_INFO(LABEL, "enter UvQueueWorkOpenDlpFile");
103 if ((work == nullptr) || (work->data == nullptr)) {
104 DLP_LOG_ERROR(LABEL, "work == nullptr || work->data == nullptr");
105 return;
106 }
107 std::unique_ptr<uv_work_t> uvWorkPtr { work };
108 OpenDlpFileSubscriberWorker *oepnDlpFileDate =
109 reinterpret_cast<OpenDlpFileSubscriberWorker *>(work->data);
110 std::unique_ptr<OpenDlpFileSubscriberWorker> workPtr { oepnDlpFileDate };
111 napi_handle_scope scope = nullptr;
112 napi_open_handle_scope(oepnDlpFileDate->env, &scope);
113 if (scope == nullptr) {
114 DLP_LOG_ERROR(LABEL, "scope is nullptr");
115 return;
116 }
117 napi_value result = { nullptr };
118 NAPI_CALL_RETURN_VOID_WITH_SCOPE(oepnDlpFileDate->env,
119 napi_create_array(oepnDlpFileDate->env, &result), scope);
120 if (!ConvertOpenDlpFileCallbackInfo(oepnDlpFileDate->env, result, oepnDlpFileDate->result)) {
121 napi_close_handle_scope(oepnDlpFileDate->env, scope);
122 DLP_LOG_ERROR(LABEL, "ConvertOpenDlpFileCallbackInfo failed");
123 return;
124 }
125
126 napi_value undefined = nullptr;
127 napi_value callback = nullptr;
128 napi_value resultout = nullptr;
129 NAPI_CALL_RETURN_VOID_WITH_SCOPE(oepnDlpFileDate->env,
130 napi_get_undefined(oepnDlpFileDate->env, &undefined), scope);
131 NAPI_CALL_RETURN_VOID_WITH_SCOPE(oepnDlpFileDate->env,
132 napi_get_reference_value(oepnDlpFileDate->env, oepnDlpFileDate->ref, &callback), scope);
133 NAPI_CALL_RETURN_VOID_WITH_SCOPE(oepnDlpFileDate->env,
134 napi_call_function(oepnDlpFileDate->env, undefined, callback, 1, &result, &resultout), scope);
135 napi_close_handle_scope(oepnDlpFileDate->env, scope);
136 DLP_LOG_INFO(LABEL, "UvQueueWorkOpenDlpFile end");
137 };
138 } // namespace
139
RegisterDlpSandboxChangeScopePtr()140 RegisterDlpSandboxChangeScopePtr::RegisterDlpSandboxChangeScopePtr() {}
141
~RegisterDlpSandboxChangeScopePtr()142 RegisterDlpSandboxChangeScopePtr::~RegisterDlpSandboxChangeScopePtr() {}
143
DlpSandboxChangeCallback(DlpSandboxCallbackInfo & result)144 void RegisterDlpSandboxChangeScopePtr::DlpSandboxChangeCallback(DlpSandboxCallbackInfo &result)
145 {
146 DLP_LOG_INFO(LABEL, "enter DlpSandboxChangeCallback");
147 std::lock_guard<std::mutex> lock(validMutex_);
148 if (!valid_) {
149 DLP_LOG_ERROR(LABEL, "object is invalid.");
150 return;
151 }
152 uv_loop_s *loop = nullptr;
153 NAPI_CALL_RETURN_VOID(env_, napi_get_uv_event_loop(env_, &loop));
154 if (loop == nullptr) {
155 DLP_LOG_ERROR(LABEL, "loop instance is nullptr");
156 return;
157 }
158 uv_work_t *work = new (std::nothrow) uv_work_t;
159 if (work == nullptr) {
160 DLP_LOG_ERROR(LABEL, "insufficient memory for work!");
161 return;
162 }
163 std::unique_ptr<uv_work_t> uvWorkPtr { work };
164 RegisterDlpSandboxChangeWorker *registerSandboxChangeWorker = new (std::nothrow) RegisterDlpSandboxChangeWorker();
165 if (registerSandboxChangeWorker == nullptr) {
166 DLP_LOG_ERROR(LABEL, "insufficient memory for RegisterDlpSandboxChangeWorker!");
167 return;
168 }
169 std::unique_ptr<RegisterDlpSandboxChangeWorker> workPtr { registerSandboxChangeWorker };
170 registerSandboxChangeWorker->env = env_;
171 registerSandboxChangeWorker->ref = ref_;
172 registerSandboxChangeWorker->result = result;
173 DLP_LOG_DEBUG(LABEL, "result appIndex = %{public}d, bundleName = %{public}s", result.appIndex,
174 result.bundleName.c_str());
175 registerSandboxChangeWorker->subscriber = this;
176 work->data = reinterpret_cast<void *>(registerSandboxChangeWorker);
177 NAPI_CALL_RETURN_VOID(env_, uv_queue_work(
178 loop, work, [](uv_work_t *work) {}, UvQueueWorkDlpSandboxChanged));
179 uvWorkPtr.release();
180 workPtr.release();
181 }
182
SetEnv(const napi_env & env)183 void RegisterDlpSandboxChangeScopePtr::SetEnv(const napi_env &env)
184 {
185 env_ = env;
186 }
187
SetCallbackRef(const napi_ref & ref)188 void RegisterDlpSandboxChangeScopePtr::SetCallbackRef(const napi_ref &ref)
189 {
190 ref_ = ref;
191 }
192
SetValid(bool valid)193 void RegisterDlpSandboxChangeScopePtr::SetValid(bool valid)
194 {
195 std::lock_guard<std::mutex> lock(validMutex_);
196 valid_ = valid;
197 }
198
~DlpSandboxChangeContext()199 DlpSandboxChangeContext::~DlpSandboxChangeContext()
200 {
201 if (callbackRef == nullptr) {
202 return;
203 }
204 DeleteNapiRef();
205 }
206
DeleteNapiRef()207 void DlpSandboxChangeContext::DeleteNapiRef()
208 {
209 DLP_LOG_INFO(LABEL, "enter DeleteNapiRef");
210 uv_loop_s *loop = nullptr;
211 NAPI_CALL_RETURN_VOID(env, napi_get_uv_event_loop(env, &loop));
212 if (loop == nullptr) {
213 DLP_LOG_ERROR(LABEL, "loop instance is nullptr");
214 return;
215 }
216 uv_work_t *work = new (std::nothrow) uv_work_t;
217 if (work == nullptr) {
218 DLP_LOG_ERROR(LABEL, "insufficient memory for work!");
219 return;
220 }
221
222 std::unique_ptr<uv_work_t> uvWorkPtr { work };
223 RegisterDlpSandboxChangeWorker *registerSandboxChangeWorker = new (std::nothrow) RegisterDlpSandboxChangeWorker();
224 if (registerSandboxChangeWorker == nullptr) {
225 DLP_LOG_ERROR(LABEL, "insufficient memory for registerSandboxChangeWorker!");
226 return;
227 }
228 std::unique_ptr<RegisterDlpSandboxChangeWorker> workPtr { registerSandboxChangeWorker };
229 registerSandboxChangeWorker->env = env;
230 registerSandboxChangeWorker->ref = callbackRef;
231
232 work->data = reinterpret_cast<void *>(registerSandboxChangeWorker);
233 NAPI_CALL_RETURN_VOID(env, uv_queue_work(
234 loop, work, [](uv_work_t *work) {}, UvQueueWorkDeleteRef));
235 DLP_LOG_DEBUG(LABEL, "DeleteNapiRef");
236 uvWorkPtr.release();
237 workPtr.release();
238 }
239
UvQueueWorkDeleteRef(uv_work_t * work,int32_t status)240 void UvQueueWorkDeleteRef(uv_work_t *work, int32_t status)
241 {
242 DLP_LOG_INFO(LABEL, "enter UvQueueWorkDeleteRef");
243 if (work == nullptr) {
244 DLP_LOG_ERROR(LABEL, "work == nullptr : %{public}d", work == nullptr);
245 return;
246 } else if (work->data == nullptr) {
247 DLP_LOG_ERROR(LABEL, "work->data == nullptr : %{public}d", work->data == nullptr);
248 return;
249 }
250 RegisterDlpSandboxChangeWorker *registerSandboxChangeWorker =
251 reinterpret_cast<RegisterDlpSandboxChangeWorker *>(work->data);
252 if (registerSandboxChangeWorker == nullptr) {
253 delete work;
254 return;
255 }
256 napi_delete_reference(registerSandboxChangeWorker->env, registerSandboxChangeWorker->ref);
257 delete registerSandboxChangeWorker;
258 registerSandboxChangeWorker = nullptr;
259 delete work;
260 DLP_LOG_DEBUG(LABEL, "UvQueueWorkDeleteRef end");
261 }
262
OpenDlpFileSubscriberPtr()263 OpenDlpFileSubscriberPtr::OpenDlpFileSubscriberPtr() {}
264
~OpenDlpFileSubscriberPtr()265 OpenDlpFileSubscriberPtr::~OpenDlpFileSubscriberPtr() {}
266
OnOpenDlpFile(OpenDlpFileCallbackInfo & result)267 void OpenDlpFileSubscriberPtr::OnOpenDlpFile(OpenDlpFileCallbackInfo &result)
268 {
269 DLP_LOG_INFO(LABEL, "enter OnOpenDlpFile");
270 std::lock_guard<std::mutex> lock(validMutex_);
271 if (!valid_) {
272 DLP_LOG_ERROR(LABEL, "object is invalid.");
273 return;
274 }
275 uv_loop_s *loop = nullptr;
276 NAPI_CALL_RETURN_VOID(env_, napi_get_uv_event_loop(env_, &loop));
277 if (loop == nullptr) {
278 DLP_LOG_ERROR(LABEL, "loop instance is nullptr");
279 return;
280 }
281 uv_work_t *work = new (std::nothrow) uv_work_t;
282 if (work == nullptr) {
283 DLP_LOG_ERROR(LABEL, "insufficient memory for work!");
284 return;
285 }
286 std::unique_ptr<uv_work_t> uvWorkPtr { work };
287 OpenDlpFileSubscriberWorker *openDlpFileWorker = new (std::nothrow) OpenDlpFileSubscriberWorker();
288 if (openDlpFileWorker == nullptr) {
289 DLP_LOG_ERROR(LABEL, "insufficient memory for OpenDlpFileSubscriberWorker!");
290 return;
291 }
292 std::unique_ptr<OpenDlpFileSubscriberWorker> workPtr { openDlpFileWorker };
293 openDlpFileWorker->env = env_;
294 openDlpFileWorker->ref = ref_;
295 openDlpFileWorker->result = result;
296 DLP_LOG_DEBUG(LABEL, "result uri = %{public}s, openTime = %{public}" PRIu64, result.uri.c_str(),
297 result.timeStamp);
298 openDlpFileWorker->subscriber = this;
299 work->data = reinterpret_cast<void *>(openDlpFileWorker);
300 NAPI_CALL_RETURN_VOID(env_, uv_queue_work(
301 loop, work, [](uv_work_t *work) {}, UvQueueWorkOpenDlpFile));
302 uvWorkPtr.release();
303 workPtr.release();
304 }
305
SetEnv(const napi_env & env)306 void OpenDlpFileSubscriberPtr::SetEnv(const napi_env &env)
307 {
308 env_ = env;
309 }
310
SetCallbackRef(const napi_ref & ref)311 void OpenDlpFileSubscriberPtr::SetCallbackRef(const napi_ref &ref)
312 {
313 ref_ = ref;
314 }
315
SetValid(bool valid)316 void OpenDlpFileSubscriberPtr::SetValid(bool valid)
317 {
318 std::lock_guard<std::mutex> lock(validMutex_);
319 valid_ = valid;
320 }
321
~OpenDlpFileSubscriberContext()322 OpenDlpFileSubscriberContext::~OpenDlpFileSubscriberContext()
323 {
324 if (callbackRef == nullptr) {
325 return;
326 }
327 DeleteNapiRef();
328 }
329
OpenDlpFileUvQueueWorkDeleteRef(uv_work_t * work,int32_t status)330 void OpenDlpFileUvQueueWorkDeleteRef(uv_work_t *work, int32_t status)
331 {
332 DLP_LOG_INFO(LABEL, "enter OpenDlpFileUvQueueWorkDeleteRef");
333 if (work == nullptr) {
334 DLP_LOG_ERROR(LABEL, "work == nullptr : %{public}d", work == nullptr);
335 return;
336 } else if (work->data == nullptr) {
337 DLP_LOG_ERROR(LABEL, "work->data == nullptr : %{public}d", work->data == nullptr);
338 return;
339 }
340 OpenDlpFileSubscriberWorker *openDlpFileWorker =
341 reinterpret_cast<OpenDlpFileSubscriberWorker *>(work->data);
342 if (openDlpFileWorker == nullptr) {
343 delete work;
344 return;
345 }
346 napi_delete_reference(openDlpFileWorker->env, openDlpFileWorker->ref);
347 delete openDlpFileWorker;
348 openDlpFileWorker = nullptr;
349 delete work;
350 DLP_LOG_INFO(LABEL, "OpenDlpFileUvQueueWorkDeleteRef end");
351 }
352
DeleteNapiRef()353 void OpenDlpFileSubscriberContext::DeleteNapiRef()
354 {
355 DLP_LOG_INFO(LABEL, "enter DeleteNapiRef");
356 uv_loop_s *loop = nullptr;
357 NAPI_CALL_RETURN_VOID(env, napi_get_uv_event_loop(env, &loop));
358 if (loop == nullptr) {
359 DLP_LOG_ERROR(LABEL, "loop instance is nullptr");
360 return;
361 }
362 uv_work_t *work = new (std::nothrow) uv_work_t;
363 if (work == nullptr) {
364 DLP_LOG_ERROR(LABEL, "insufficient memory for work!");
365 return;
366 }
367
368 std::unique_ptr<uv_work_t> uvWorkPtr { work };
369 OpenDlpFileSubscriberWorker *openDlpFileWorker = new (std::nothrow) OpenDlpFileSubscriberWorker();
370 if (openDlpFileWorker == nullptr) {
371 DLP_LOG_ERROR(LABEL, "insufficient memory for openDlpFileWorker!");
372 return;
373 }
374 std::unique_ptr<OpenDlpFileSubscriberWorker> workPtr { openDlpFileWorker };
375 openDlpFileWorker->env = env;
376 openDlpFileWorker->ref = callbackRef;
377
378 work->data = reinterpret_cast<void *>(openDlpFileWorker);
379 NAPI_CALL_RETURN_VOID(env, uv_queue_work(
380 loop, work, [](uv_work_t *work) {}, OpenDlpFileUvQueueWorkDeleteRef));
381 DLP_LOG_DEBUG(LABEL, "DeleteNapiRef");
382 uvWorkPtr.release();
383 workPtr.release();
384 }
385
GenerateBusinessError(napi_env env,int32_t jsErrCode,const std::string & jsErrMsg)386 napi_value GenerateBusinessError(napi_env env, int32_t jsErrCode, const std::string &jsErrMsg)
387 {
388 napi_value errCodeJs = nullptr;
389 NAPI_CALL(env, napi_create_uint32(env, jsErrCode, &errCodeJs));
390
391 napi_value errMsgJs = nullptr;
392 NAPI_CALL(env, napi_create_string_utf8(env, jsErrMsg.c_str(), NAPI_AUTO_LENGTH, &errMsgJs));
393
394 napi_value errJs = nullptr;
395 NAPI_CALL(env, napi_create_error(env, nullptr, errMsgJs, &errJs));
396 NAPI_CALL(env, napi_set_named_property(env, errJs, "code", errCodeJs));
397 NAPI_CALL(env, napi_set_named_property(env, errJs, "message", errMsgJs));
398 return errJs;
399 }
400
DlpNapiThrow(napi_env env,int32_t nativeErrCode)401 void DlpNapiThrow(napi_env env, int32_t nativeErrCode)
402 {
403 int32_t jsErrCode = NativeCodeToJsCode(nativeErrCode);
404 NAPI_CALL_RETURN_VOID(env, napi_throw(env, GenerateBusinessError(env, jsErrCode, GetJsErrMsg(jsErrCode))));
405 }
406
DlpNapiThrow(napi_env env,int32_t jsErrCode,const std::string & jsErrMsg)407 void DlpNapiThrow(napi_env env, int32_t jsErrCode, const std::string &jsErrMsg)
408 {
409 NAPI_CALL_RETURN_VOID(env, napi_throw(env, GenerateBusinessError(env, jsErrCode, jsErrMsg)));
410 }
411
ThrowParamError(const napi_env env,const std::string & param,const std::string & type)412 void ThrowParamError(const napi_env env, const std::string& param, const std::string& type)
413 {
414 std::string msg = "Parameter Error. The type of \"" + param + "\" must be " + type + ".";
415 DlpNapiThrow(env, ERR_JS_PARAMETER_ERROR, msg);
416 }
417
CommonAsyncContext(napi_env napiEnv)418 CommonAsyncContext::CommonAsyncContext(napi_env napiEnv)
419 {
420 env = napiEnv;
421 }
422
~CommonAsyncContext()423 CommonAsyncContext::~CommonAsyncContext()
424 {
425 if (callbackRef) {
426 DLP_LOG_DEBUG(LABEL, "~CommonAsyncContext delete callbackRef");
427 napi_delete_reference(env, callbackRef);
428 callbackRef = nullptr;
429 }
430 if (work) {
431 DLP_LOG_DEBUG(LABEL, "~CommonAsyncContext delete work");
432 napi_delete_async_work(env, work);
433 work = nullptr;
434 }
435 }
436
CreateEnumDLPFileAccess(napi_env env)437 napi_value CreateEnumDLPFileAccess(napi_env env)
438 {
439 napi_value authPerm = nullptr;
440 NAPI_CALL(env, napi_create_object(env, &authPerm));
441
442 napi_value prop = nullptr;
443 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(NO_PERMISSION), &prop));
444 NAPI_CALL(env, napi_set_named_property(env, authPerm, "NO_PERMISSION", prop));
445
446 prop = nullptr;
447 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(READ_ONLY), &prop));
448 NAPI_CALL(env, napi_set_named_property(env, authPerm, "READ_ONLY", prop));
449
450 prop = nullptr;
451 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(CONTENT_EDIT), &prop));
452 NAPI_CALL(env, napi_set_named_property(env, authPerm, "CONTENT_EDIT", prop));
453
454 prop = nullptr;
455 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(FULL_CONTROL), &prop));
456 NAPI_CALL(env, napi_set_named_property(env, authPerm, "FULL_CONTROL", prop));
457
458 return authPerm;
459 }
460
CreateEnumAccountType(napi_env env)461 napi_value CreateEnumAccountType(napi_env env)
462 {
463 napi_value accountType = nullptr;
464 NAPI_CALL(env, napi_create_object(env, &accountType));
465
466 napi_value prop = nullptr;
467 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(CLOUD_ACCOUNT), &prop));
468 NAPI_CALL(env, napi_set_named_property(env, accountType, "CLOUD_ACCOUNT", prop));
469
470 prop = nullptr;
471 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(DOMAIN_ACCOUNT), &prop));
472 NAPI_CALL(env, napi_set_named_property(env, accountType, "DOMAIN_ACCOUNT", prop));
473
474 prop = nullptr;
475 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(APPLICATION_ACCOUNT), &prop));
476 NAPI_CALL(env, napi_set_named_property(env, accountType, "APPLICATION_ACCOUNT", prop));
477
478 return accountType;
479 }
480
CreateEnumActionFlags(napi_env env)481 napi_value CreateEnumActionFlags(napi_env env)
482 {
483 napi_value actionFlags = nullptr;
484 NAPI_CALL(env, napi_create_object(env, &actionFlags));
485
486 napi_value prop = nullptr;
487 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_INVALID), &prop));
488 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_INVALID", prop));
489
490 prop = nullptr;
491 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_VIEW), &prop));
492 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_VIEW", prop));
493
494 prop = nullptr;
495 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_SAVE), &prop));
496 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_SAVE", prop));
497
498 prop = nullptr;
499 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_SAVE_AS), &prop));
500 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_SAVE_AS", prop));
501
502 prop = nullptr;
503 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_EDIT), &prop));
504 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_EDIT", prop));
505
506 prop = nullptr;
507 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_SCREEN_CAPTURE), &prop));
508 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_SCREEN_CAPTURE", prop));
509
510 prop = nullptr;
511 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_SCREEN_SHARE), &prop));
512 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_SCREEN_SHARE", prop));
513
514 prop = nullptr;
515 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_SCREEN_RECORD), &prop));
516 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_SCREEN_RECORD", prop));
517
518 prop = nullptr;
519 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_COPY), &prop));
520 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_COPY", prop));
521
522 prop = nullptr;
523 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_PRINT), &prop));
524 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_PRINT", prop));
525
526 prop = nullptr;
527 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_EXPORT), &prop));
528 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_EXPORT", prop));
529
530 prop = nullptr;
531 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(ACTION_PERMISSION_CHANGE), &prop));
532 NAPI_CALL(env, napi_set_named_property(env, actionFlags, "ACTION_PERMISSION_CHANGE", prop));
533 return actionFlags;
534 }
535
CreateEnumGatheringPolicy(napi_env env)536 napi_value CreateEnumGatheringPolicy(napi_env env)
537 {
538 napi_value gatheringPolicy = nullptr;
539 NAPI_CALL(env, napi_create_object(env, &gatheringPolicy));
540
541 napi_value prop = nullptr;
542 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(GATHERING), &prop));
543 NAPI_CALL(env, napi_set_named_property(env, gatheringPolicy, "GATHERING", prop));
544
545 prop = nullptr;
546 NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(NON_GATHERING), &prop));
547 NAPI_CALL(env, napi_set_named_property(env, gatheringPolicy, "NON_GATHERING", prop));
548
549 return gatheringPolicy;
550 }
551
ProcessCallbackOrPromise(napi_env env,const CommonAsyncContext * asyncContext,napi_value data)552 void ProcessCallbackOrPromise(napi_env env, const CommonAsyncContext* asyncContext, napi_value data)
553 {
554 size_t argc = PARAM_SIZE_TWO;
555 napi_value args[PARAM_SIZE_TWO] = {nullptr};
556
557 if (asyncContext->errCode == DLP_OK) {
558 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &args[PARAM0]));
559 args[PARAM1] = data;
560 } else {
561 int32_t jsErrCode = NativeCodeToJsCode(asyncContext->errCode);
562 napi_value errObj = GenerateBusinessError(env, jsErrCode, GetJsErrMsg(jsErrCode));
563 if (data != nullptr && (asyncContext->errCode == DLP_CREDENTIAL_ERROR_NO_PERMISSION_ERROR ||
564 asyncContext->errCode == DLP_CREDENTIAL_ERROR_TIME_EXPIRED)) {
565 std::string errContacter;
566 if (!GetStringValue(env, data, errContacter)) {
567 DLP_LOG_ERROR(LABEL, "js get contacter data fail");
568 ThrowParamError(env, "contacter data", "string");
569 return ;
570 }
571 std::string errMessage = GetJsErrMsg(jsErrCode) + ", contact:" + errContacter;
572 napi_value jsMessageStr;
573 napi_value jsErrMessage;
574 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, "message", NAPI_AUTO_LENGTH, &jsMessageStr));
575 NAPI_CALL_RETURN_VOID(env,
576 napi_create_string_utf8(env, errMessage.c_str(), NAPI_AUTO_LENGTH, &jsErrMessage));
577 NAPI_CALL_RETURN_VOID(env, napi_delete_property(env, errObj, jsMessageStr, nullptr));
578 NAPI_CALL_RETURN_VOID(env, napi_set_property(env, errObj, jsMessageStr, jsErrMessage));
579 }
580 args[PARAM0] = errObj;
581 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &args[PARAM1]));
582 }
583
584 if (asyncContext->deferred) {
585 DLP_LOG_DEBUG(LABEL, "Promise");
586 if (asyncContext->errCode == DLP_OK) {
587 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, asyncContext->deferred, args[PARAM1]));
588 } else {
589 DLP_LOG_ERROR(LABEL, "Promise reject, errCode=%{public}d", asyncContext->errCode);
590 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncContext->deferred, args[PARAM0]));
591 }
592 } else {
593 DLP_LOG_DEBUG(LABEL, "Callback");
594 napi_value callback = nullptr;
595 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncContext->callbackRef, &callback));
596 napi_value returnVal = nullptr;
597 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback, argc, &args[PARAM0], &returnVal));
598 }
599 }
600
NapiCheckArgc(const napi_env env,int32_t argc,int32_t reqSize)601 bool NapiCheckArgc(const napi_env env, int32_t argc, int32_t reqSize)
602 {
603 if (argc < (reqSize - 1)) {
604 DLP_LOG_ERROR(LABEL, "params number mismatch");
605 std::string errMsg = "Parameter Error. Params number mismatch, need at least " + std::to_string(reqSize - 1) +
606 ", given " + std::to_string(argc);
607 DlpNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg);
608 return false;
609 }
610 return true;
611 }
612
GetGenerateDlpFileParams(const napi_env env,const napi_callback_info info,GenerateDlpFileAsyncContext & asyncContext)613 bool GetGenerateDlpFileParams(
614 const napi_env env, const napi_callback_info info, GenerateDlpFileAsyncContext& asyncContext)
615 {
616 size_t argc = PARAM_SIZE_FOUR;
617 napi_value argv[PARAM_SIZE_FOUR] = {nullptr};
618 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
619
620 if (!NapiCheckArgc(env, argc, PARAM_SIZE_FOUR)) {
621 return false;
622 }
623
624 if (!GetInt64Value(env, argv[PARAM0], asyncContext.plaintextFd)) {
625 DLP_LOG_ERROR(LABEL, "js get plain fd fail");
626 ThrowParamError(env, "plaintextFd", "number");
627 return false;
628 }
629 if (!GetInt64Value(env, argv[PARAM1], asyncContext.ciphertextFd)) {
630 DLP_LOG_ERROR(LABEL, "js get cipher fd fail");
631 ThrowParamError(env, "ciphertextFd", "number");
632 return false;
633 }
634
635 if (!GetDlpProperty(env, argv[PARAM2], asyncContext.property)) {
636 DLP_LOG_ERROR(LABEL, "js get property fail");
637 ThrowParamError(env, "property", "DlpProperty");
638 return false;
639 }
640
641 if (argc == PARAM_SIZE_FOUR) {
642 if (!ParseCallback(env, argv[PARAM3], asyncContext.callbackRef)) {
643 ThrowParamError(env, "callback", "function");
644 return false;
645 }
646 }
647
648 DLP_LOG_DEBUG(LABEL,
649 "Fd: %{private}" PRId64 ",ownerAccount:%{private}s,ownerAccountId: %{private}s, ownerAccountType: %{private}d,"
650 "contactAccount: %{private}s, size: %{private}zu, expireTime: %{public}" PRId64,
651 asyncContext.plaintextFd, asyncContext.property.ownerAccount.c_str(),
652 asyncContext.property.ownerAccountId.c_str(), asyncContext.property.ownerAccountType,
653 asyncContext.property.contactAccount.c_str(), asyncContext.property.authUsers.size(),
654 asyncContext.property.expireTime);
655 return true;
656 }
657
GetOpenDlpFileParams(const napi_env env,const napi_callback_info info,DlpFileAsyncContext & asyncContext)658 bool GetOpenDlpFileParams(const napi_env env, const napi_callback_info info, DlpFileAsyncContext& asyncContext)
659 {
660 size_t argc = PARAM_SIZE_THREE;
661 napi_value argv[PARAM_SIZE_THREE] = {nullptr};
662 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
663
664 if (!NapiCheckArgc(env, argc, PARAM_SIZE_THREE)) {
665 return false;
666 }
667
668 if (!GetInt64Value(env, argv[PARAM0], asyncContext.ciphertextFd)) {
669 DLP_LOG_ERROR(LABEL, "js get cipher fd fail");
670 ThrowParamError(env, "ciphertextFd", "number");
671 return false;
672 }
673
674 if (!GetStringValue(env, argv[PARAM1], asyncContext.appId)) {
675 DLP_LOG_ERROR(LABEL, "js get appId fail");
676 ThrowParamError(env, "appId", "string");
677 return false;
678 }
679
680 if (argc == PARAM_SIZE_THREE) {
681 if (!ParseCallback(env, argv[PARAM2], asyncContext.callbackRef)) {
682 ThrowParamError(env, "callback", "function");
683 return false;
684 }
685 }
686
687 DLP_LOG_DEBUG(LABEL, "Fd: %{private}" PRId64, asyncContext.ciphertextFd);
688 return true;
689 }
690
GetIsDlpFileParams(const napi_env env,const napi_callback_info info,DlpFileAsyncContext & asyncContext)691 bool GetIsDlpFileParams(const napi_env env, const napi_callback_info info, DlpFileAsyncContext& asyncContext)
692 {
693 size_t argc = PARAM_SIZE_TWO;
694 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
695 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
696
697 if (!NapiCheckArgc(env, argc, PARAM_SIZE_TWO)) {
698 return false;
699 }
700
701 if (!GetInt64Value(env, argv[PARAM0], asyncContext.ciphertextFd)) {
702 DLP_LOG_ERROR(LABEL, "js get cipher fd fail");
703 ThrowParamError(env, "fd", "number");
704 return false;
705 }
706
707 if (asyncContext.ciphertextFd < 0) {
708 DlpNapiThrow(env, ERR_JS_INVALID_PARAMETER, GetJsErrMsg(ERR_JS_INVALID_PARAMETER));
709 return false;
710 }
711
712 if (argc == PARAM_SIZE_TWO) {
713 if (!ParseCallback(env, argv[PARAM1], asyncContext.callbackRef)) {
714 ThrowParamError(env, "callback", "function");
715 return false;
716 }
717 }
718
719 DLP_LOG_DEBUG(LABEL, "Fd: %{private}" PRId64, asyncContext.ciphertextFd);
720 return true;
721 }
722
GetDlpLinkFileParams(const napi_env env,const napi_callback_info info,DlpLinkFileAsyncContext & asyncContext)723 bool GetDlpLinkFileParams(const napi_env env, const napi_callback_info info, DlpLinkFileAsyncContext& asyncContext)
724 {
725 napi_value thisVar = nullptr;
726 size_t argc = PARAM_SIZE_TWO;
727 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
728 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr), false);
729 if (thisVar == nullptr) {
730 DLP_LOG_ERROR(LABEL, "This var is null");
731 return false;
732 }
733
734 if (!NapiCheckArgc(env, argc, PARAM_SIZE_TWO)) {
735 return false;
736 }
737
738 NAPI_CALL_BASE(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&asyncContext.dlpFileNative)), false);
739 if (asyncContext.dlpFileNative == nullptr) {
740 DLP_LOG_ERROR(LABEL, "cannot get native object");
741 return false;
742 }
743
744 if (!GetStringValue(env, argv[PARAM0], asyncContext.linkFileName)) {
745 DLP_LOG_ERROR(LABEL, "linkFileName is invalid");
746 ThrowParamError(env, "linkFileName", "string");
747 return false;
748 }
749
750 if (argc == PARAM_SIZE_TWO) {
751 if (!ParseCallback(env, argv[PARAM1], asyncContext.callbackRef)) {
752 ThrowParamError(env, "callback", "function");
753 return false;
754 }
755 }
756
757 DLP_LOG_DEBUG(LABEL, "linkFileName: %{private}s", asyncContext.linkFileName.c_str());
758 return true;
759 }
760
GetLinkFileStatusParams(const napi_env env,const napi_callback_info info,DlpLinkFileAsyncContext & asyncContext)761 bool GetLinkFileStatusParams(const napi_env env, const napi_callback_info info, DlpLinkFileAsyncContext& asyncContext)
762 {
763 napi_value thisVar = nullptr;
764 size_t argc = PARAM_SIZE_ONE;
765 napi_value argv[PARAM_SIZE_ONE] = {nullptr};
766 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr), false);
767 if (thisVar == nullptr) {
768 DLP_LOG_ERROR(LABEL, "This var is null");
769 return false;
770 }
771
772 if (!NapiCheckArgc(env, argc, PARAM_SIZE_ONE)) {
773 return false;
774 }
775
776 NAPI_CALL_BASE(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&asyncContext.dlpFileNative)), false);
777 if (asyncContext.dlpFileNative == nullptr) {
778 DLP_LOG_ERROR(LABEL, "cannot get native object");
779 return false;
780 }
781
782 if (argc == PARAM_SIZE_ONE) {
783 if (!ParseCallback(env, argv[PARAM0], asyncContext.callbackRef)) {
784 ThrowParamError(env, "callback", "function");
785 return false;
786 }
787 }
788
789 return true;
790 }
791
GetRecoverDlpFileParams(const napi_env env,const napi_callback_info info,RecoverDlpFileAsyncContext & asyncContext)792 bool GetRecoverDlpFileParams(
793 const napi_env env, const napi_callback_info info, RecoverDlpFileAsyncContext& asyncContext)
794 {
795 napi_value thisVar = nullptr;
796 size_t argc = PARAM_SIZE_TWO;
797 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
798 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr), false);
799 if (thisVar == nullptr) {
800 DLP_LOG_ERROR(LABEL, "This var is null");
801 return false;
802 }
803
804 if (!NapiCheckArgc(env, argc, PARAM_SIZE_TWO)) {
805 return false;
806 }
807
808 NAPI_CALL_BASE(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&asyncContext.dlpFileNative)), false);
809 if (asyncContext.dlpFileNative == nullptr) {
810 DLP_LOG_ERROR(LABEL, "cannot get native object");
811 return false;
812 }
813
814 if (!GetInt64Value(env, argv[PARAM0], asyncContext.plaintextFd)) {
815 DLP_LOG_ERROR(LABEL, "js get cipher fd fail");
816 ThrowParamError(env, "plaintextFd", "number");
817 return false;
818 }
819
820 if (argc == PARAM_SIZE_TWO) {
821 if (!ParseCallback(env, argv[PARAM1], asyncContext.callbackRef)) {
822 ThrowParamError(env, "callback", "function");
823 return false;
824 }
825 }
826
827 DLP_LOG_DEBUG(LABEL, "plaintextFd: %{private}" PRId64, asyncContext.plaintextFd);
828 return true;
829 }
830
GetCloseDlpFileParams(const napi_env env,const napi_callback_info info,CloseDlpFileAsyncContext & asyncContext)831 bool GetCloseDlpFileParams(const napi_env env, const napi_callback_info info, CloseDlpFileAsyncContext& asyncContext)
832 {
833 napi_value thisVar = nullptr;
834 size_t argc = PARAM_SIZE_ONE;
835 napi_value argv[PARAM_SIZE_ONE] = {nullptr};
836 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr), false);
837 if (thisVar == nullptr) {
838 DLP_LOG_ERROR(LABEL, "This var is null");
839 return false;
840 }
841
842 NAPI_CALL_BASE(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&asyncContext.dlpFileNative)), false);
843 if (asyncContext.dlpFileNative == nullptr) {
844 DLP_LOG_ERROR(LABEL, "cannot get native object");
845 return false;
846 }
847
848 if (argc == PARAM_SIZE_ONE) {
849 if (!ParseCallback(env, argv[PARAM0], asyncContext.callbackRef)) {
850 ThrowParamError(env, "callback", "function");
851 return false;
852 }
853 }
854
855 return true;
856 }
857
GetInstallDlpSandboxParams(const napi_env env,const napi_callback_info info,DlpSandboxAsyncContext & asyncContext)858 bool GetInstallDlpSandboxParams(const napi_env env, const napi_callback_info info, DlpSandboxAsyncContext& asyncContext)
859 {
860 size_t argc = PARAM_SIZE_FIVE;
861 napi_value argv[PARAM_SIZE_FIVE] = {nullptr};
862 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
863
864 if (!NapiCheckArgc(env, argc, PARAM_SIZE_FIVE)) {
865 return false;
866 }
867
868 if (!GetStringValue(env, argv[PARAM0], asyncContext.bundleName)) {
869 DLP_LOG_ERROR(LABEL, "js get bundle name fail");
870 ThrowParamError(env, "bundleName", "string");
871 return false;
872 }
873 int64_t res;
874 if (!GetInt64Value(env, argv[PARAM1], res)) {
875 DLP_LOG_ERROR(LABEL, "js get perm fail");
876 ThrowParamError(env, "access", "number");
877 return false;
878 }
879 asyncContext.dlpFileAccess = static_cast<DLPFileAccess>(res);
880 if (!GetInt64Value(env, argv[PARAM2], res)) {
881 DLP_LOG_ERROR(LABEL, "js get user id fail");
882 ThrowParamError(env, "userId", "number");
883 return false;
884 }
885 asyncContext.userId = static_cast<int32_t>(res);
886 if (!GetStringValue(env, argv[PARAM3], asyncContext.uri)) {
887 DLP_LOG_ERROR(LABEL, "js get uri fail");
888 ThrowParamError(env, "uri", "string");
889 return false;
890 }
891
892 if (argc == PARAM_SIZE_FIVE) {
893 if (!ParseCallback(env, argv[PARAM4], asyncContext.callbackRef)) {
894 ThrowParamError(env, "callback", "function");
895 return false;
896 }
897 }
898
899 DLP_LOG_DEBUG(LABEL, "bundleName: %{private}s, dlpFileAccess: %{private}d, userId: %{private}d,uri: %{private}s",
900 asyncContext.bundleName.c_str(), asyncContext.dlpFileAccess, asyncContext.userId, asyncContext.uri.c_str());
901 return true;
902 }
903
GetUninstallDlpSandboxParams(const napi_env env,const napi_callback_info info,DlpSandboxAsyncContext & asyncContext)904 bool GetUninstallDlpSandboxParams(
905 const napi_env env, const napi_callback_info info, DlpSandboxAsyncContext& asyncContext)
906 {
907 size_t argc = PARAM_SIZE_FOUR;
908 napi_value argv[PARAM_SIZE_FOUR] = {nullptr};
909 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
910
911 if (!NapiCheckArgc(env, argc, PARAM_SIZE_FOUR)) {
912 return false;
913 }
914
915 if (!GetStringValue(env, argv[PARAM0], asyncContext.bundleName)) {
916 DLP_LOG_ERROR(LABEL, "js get bundle name fail");
917 ThrowParamError(env, "bundleName", "string");
918 return false;
919 }
920
921 int64_t res;
922 if (!GetInt64Value(env, argv[PARAM1], res)) {
923 DLP_LOG_ERROR(LABEL, "js get user id fail");
924 ThrowParamError(env, "userId", "number");
925 return false;
926 }
927 asyncContext.userId = static_cast<int32_t>(res);
928
929 if (!GetInt64Value(env, argv[PARAM2], res)) {
930 DLP_LOG_ERROR(LABEL, "js get app index fail");
931 ThrowParamError(env, "appIndex", "number");
932 return false;
933 }
934 asyncContext.sandboxInfo.appIndex = static_cast<int32_t>(res);
935
936 if (argc == PARAM_SIZE_FOUR) {
937 if (!ParseCallback(env, argv[PARAM3], asyncContext.callbackRef)) {
938 ThrowParamError(env, "callback", "function");
939 return false;
940 }
941 }
942
943 DLP_LOG_DEBUG(LABEL, "bundleName: %{private}s, userId: %{private}d, appIndex: %{private}d",
944 asyncContext.bundleName.c_str(), asyncContext.userId, asyncContext.sandboxInfo.appIndex);
945 return true;
946 }
947
ParseInputToRegister(const napi_env env,const napi_callback_info cbInfo,RegisterDlpSandboxChangeInfo & registerSandboxChangeInfo)948 bool ParseInputToRegister(const napi_env env, const napi_callback_info cbInfo,
949 RegisterDlpSandboxChangeInfo ®isterSandboxChangeInfo)
950 {
951 size_t argc = PARAM_SIZE_TWO;
952 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
953 napi_value thisVar = nullptr;
954 NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, &thisVar, nullptr), false);
955 if (argc < PARAM_SIZE_TWO) {
956 ThrowParamError(env, "params", " missing.");
957 return false;
958 }
959 if (thisVar == nullptr) {
960 DLP_LOG_ERROR(LABEL, "thisVar is nullptr");
961 return false;
962 }
963 napi_valuetype valueTypeOfThis = napi_undefined;
964 NAPI_CALL_BASE(env, napi_typeof(env, thisVar, &valueTypeOfThis), false);
965 if (valueTypeOfThis == napi_undefined) {
966 DLP_LOG_ERROR(LABEL, "thisVar is undefined");
967 return false;
968 }
969 // 0: the first parameter of argv
970 std::string type;
971 if (!GetStringValue(env, argv[0], type)) {
972 ThrowParamError(env, "type", "string");
973 return false;
974 }
975
976 if (type.compare(ON_OFF_SANDBOX) != 0) {
977 ThrowParamError(env, "type", "uninstallsandbox");
978 return false;
979 }
980
981 if (!FillDlpSandboxChangeInfo(env, argv, type, thisVar, registerSandboxChangeInfo)) {
982 return false;
983 }
984
985 return true;
986 }
987
FillDlpSandboxChangeInfo(const napi_env env,const napi_value * argv,const std::string & type,const napi_value thisVar,RegisterDlpSandboxChangeInfo & registerSandboxChangeInfo)988 bool FillDlpSandboxChangeInfo(const napi_env env, const napi_value *argv, const std::string &type,
989 const napi_value thisVar, RegisterDlpSandboxChangeInfo ®isterSandboxChangeInfo)
990 {
991 std::string errMsg;
992 napi_ref callback = nullptr;
993
994 // 1: the second parameter of argv
995 if (!ParseCallback(env, argv[1], callback)) {
996 napi_throw(env, GenerateBusinessError(env, ERR_JS_PARAMETER_ERROR, "callback is wrong"));
997 return false;
998 }
999
1000 registerSandboxChangeInfo.env = env;
1001 registerSandboxChangeInfo.callbackRef = callback;
1002 registerSandboxChangeInfo.changeType = type;
1003 registerSandboxChangeInfo.subscriber = std::make_shared<RegisterDlpSandboxChangeScopePtr>();
1004 registerSandboxChangeInfo.subscriber->SetEnv(env);
1005 registerSandboxChangeInfo.subscriber->SetCallbackRef(callback);
1006 std::shared_ptr<RegisterDlpSandboxChangeScopePtr> *subscriber =
1007 new (std::nothrow) std::shared_ptr<RegisterDlpSandboxChangeScopePtr>(registerSandboxChangeInfo.subscriber);
1008 if (subscriber == nullptr) {
1009 DLP_LOG_ERROR(LABEL, "failed to create subscriber");
1010 return false;
1011 }
1012 napi_wrap(
1013 env, thisVar, reinterpret_cast<void *>(subscriber),
1014 [](napi_env nev, void *data, void *hint) {
1015 DLP_LOG_DEBUG(LABEL, "RegisterDlpSandboxChangeScopePtr delete");
1016 std::shared_ptr<RegisterDlpSandboxChangeScopePtr> *subscriber =
1017 static_cast<std::shared_ptr<RegisterDlpSandboxChangeScopePtr> *>(data);
1018 if (subscriber != nullptr && *subscriber != nullptr) {
1019 (*subscriber)->SetValid(false);
1020 delete subscriber;
1021 }
1022 },
1023 nullptr, nullptr);
1024 return true;
1025 }
1026
GetUnregisterSandboxParams(const napi_env env,const napi_callback_info info,UnregisterSandboxChangeCallbackAsyncContext & asyncContext)1027 bool GetUnregisterSandboxParams(const napi_env env, const napi_callback_info info,
1028 UnregisterSandboxChangeCallbackAsyncContext &asyncContext)
1029 {
1030 DLP_LOG_INFO(LABEL, "enter GetUnregisterSandboxParams");
1031 size_t argc = PARAM_SIZE_TWO;
1032 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
1033 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
1034
1035 if (!NapiCheckArgc(env, argc, PARAM_SIZE_TWO)) {
1036 return false;
1037 }
1038
1039 if (!GetStringValue(env, argv[PARAM0], asyncContext.changeType)) {
1040 DLP_LOG_ERROR(LABEL, "js get changeType fail");
1041 ThrowParamError(env, "changeType", "string");
1042 return false;
1043 }
1044
1045 if (asyncContext.changeType.compare(ON_OFF_SANDBOX) != 0) {
1046 ThrowParamError(env, "type", "uninstallsandbox");
1047 return false;
1048 }
1049
1050 DLP_LOG_DEBUG(LABEL, "changeType: %{private}s", asyncContext.changeType.c_str());
1051 return true;
1052 }
1053
GetRetentionStateParams(const napi_env env,const napi_callback_info info,RetentionStateAsyncContext & asyncContext)1054 bool GetRetentionStateParams(const napi_env env, const napi_callback_info info,
1055 RetentionStateAsyncContext& asyncContext)
1056 {
1057 size_t argc = PARAM_SIZE_TWO;
1058 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
1059 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
1060
1061 if (!NapiCheckArgc(env, argc, PARAM_SIZE_TWO)) {
1062 return false;
1063 }
1064
1065 if (!GetVectorDocUriByKey(env, argv[PARAM0], "docUris", asyncContext.docUris)) {
1066 DLP_LOG_ERROR(LABEL, "js get auth users fail");
1067 return false;
1068 }
1069
1070 if (argc == PARAM_SIZE_TWO) {
1071 if (!ParseCallback(env, argv[PARAM1], asyncContext.callbackRef)) {
1072 ThrowParamError(env, "callback", "function");
1073 return false;
1074 }
1075 }
1076
1077 DLP_LOG_DEBUG(LABEL, "docUriVec size: %{private}zu", asyncContext.docUris.size());
1078 return true;
1079 }
1080
GetRetentionSandboxListParams(const napi_env env,const napi_callback_info info,GetRetentionSandboxListAsyncContext & asyncContext)1081 bool GetRetentionSandboxListParams(const napi_env env, const napi_callback_info info,
1082 GetRetentionSandboxListAsyncContext& asyncContext)
1083 {
1084 size_t argc = PARAM_SIZE_TWO;
1085 napi_value argv[PARAM_SIZE_TWO] = {nullptr};
1086 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
1087 if (argc == PARAM_SIZE_TWO) {
1088 if (!ParseCallback(env, argv[PARAM1], asyncContext.callbackRef)) {
1089 ThrowParamError(env, "callback", "function");
1090 return false;
1091 }
1092 if (!GetStringValue(env, argv[PARAM0], asyncContext.bundleName)) {
1093 DLP_LOG_ERROR(LABEL, "js get bundle name fail");
1094 ThrowParamError(env, "bundleName", "string");
1095 return false;
1096 }
1097 }
1098 if (argc == PARAM_SIZE_ONE) {
1099 if (!GetStringValue(env, argv[PARAM0], asyncContext.bundleName) &&
1100 !ParseCallback(env, argv[PARAM0], asyncContext.callbackRef)) {
1101 DLP_LOG_ERROR(LABEL, "js get bundle name or callback fail");
1102 ThrowParamError(env, "bundleName or callback", "string or function");
1103 return false;
1104 }
1105 }
1106 return true;
1107 }
1108
GetOriginalFilenameParams(const napi_env env,const napi_callback_info info,GetOriginalFileAsyncContext & asyncContext)1109 bool GetOriginalFilenameParams(const napi_env env, const napi_callback_info info,
1110 GetOriginalFileAsyncContext& asyncContext)
1111 {
1112 size_t argc = PARAM_SIZE_ONE;
1113 napi_value argv[PARAM_SIZE_ONE] = {nullptr};
1114 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
1115
1116 if (argc == PARAM_SIZE_ONE) {
1117 if (!GetStringValue(env, argv[PARAM0], asyncContext.dlpFilename)) {
1118 ThrowParamError(env, "fileName", "string");
1119 return false;
1120 }
1121 }
1122
1123 std::string filename = asyncContext.dlpFilename;
1124 size_t size = filename.size();
1125 if ((size <= DLP_FILE_SUFFIX.size()) || (size > MAX_FILE_NAME_LEN)) {
1126 DlpNapiThrow(env, ERR_JS_INVALID_PARAMETER, GetJsErrMsg(ERR_JS_INVALID_PARAMETER));
1127 return false;
1128 }
1129
1130 if (filename.substr(filename.size() - DLP_FILE_SUFFIX.size()) != DLP_FILE_SUFFIX) {
1131 DlpNapiThrow(env, ERR_JS_INVALID_PARAMETER, GetJsErrMsg(ERR_JS_INVALID_PARAMETER));
1132 return false;
1133 }
1134 return true;
1135 }
1136
GetSandboxAppConfigParams(const napi_env env,const napi_callback_info info,SandboxAppConfigAsyncContext * asyncContext)1137 bool GetSandboxAppConfigParams(const napi_env env, const napi_callback_info info,
1138 SandboxAppConfigAsyncContext* asyncContext)
1139 {
1140 size_t argc = PARAM_SIZE_ONE;
1141 napi_value argv[PARAM_SIZE_ONE] = {nullptr};
1142 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
1143 if (!NapiCheckArgc(env, argc, PARAM_SIZE_ONE)) {
1144 return false;
1145 }
1146 if (!GetStringValue(env, argv[PARAM0], asyncContext->configInfo)) {
1147 ThrowParamError(env, "config", "string");
1148 return false;
1149 }
1150 if (asyncContext->configInfo.empty()) {
1151 DlpNapiThrow(env, ERR_JS_INVALID_PARAMETER, GetJsErrMsg(ERR_JS_INVALID_PARAMETER));
1152 return false;
1153 }
1154
1155 return true;
1156 }
1157
GetThirdInterfaceParams(const napi_env env,const napi_callback_info info,CommonAsyncContext & asyncContext)1158 bool GetThirdInterfaceParams(
1159 const napi_env env, const napi_callback_info info, CommonAsyncContext& asyncContext)
1160 {
1161 size_t argc = PARAM_SIZE_ONE;
1162 napi_value argv[PARAM_SIZE_ONE] = {nullptr};
1163 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), false);
1164
1165 if (argc == PARAM_SIZE_ONE) {
1166 if (!ParseCallback(env, argv[PARAM0], asyncContext.callbackRef)) {
1167 ThrowParamError(env, "callback", "function");
1168 return false;
1169 }
1170 }
1171 return true;
1172 }
1173
GetDlpPropertyExpireTime(napi_env env,napi_value jsObject,DlpProperty & property)1174 void GetDlpPropertyExpireTime(napi_env env, napi_value jsObject, DlpProperty& property)
1175 {
1176 int64_t jsExpireTime = 0;
1177 if (!GetInt64ValueByKey(env, jsObject, "expireTime", jsExpireTime)) {
1178 DLP_LOG_INFO(LABEL, "js get expity time fail, set zero");
1179 }
1180 property.expireTime = static_cast<uint64_t>(jsExpireTime);
1181 }
1182
GetDlpProperty(napi_env env,napi_value jsObject,DlpProperty & property)1183 bool GetDlpProperty(napi_env env, napi_value jsObject, DlpProperty& property)
1184 {
1185 if (!GetStringValueByKey(env, jsObject, "ownerAccount", property.ownerAccount)) {
1186 DLP_LOG_ERROR(LABEL, "js get owner account fail");
1187 return false;
1188 }
1189 if (!GetStringValueByKey(env, jsObject, "ownerAccountID", property.ownerAccountId)) {
1190 DLP_LOG_ERROR(LABEL, "js get owner accountId fail");
1191 return false;
1192 }
1193 int64_t type;
1194 if (!GetInt64ValueByKey(env, jsObject, "ownerAccountType", type)) {
1195 DLP_LOG_ERROR(LABEL, "js get owner account type fail");
1196 return false;
1197 }
1198 property.ownerAccountType = static_cast<DlpAccountType>(type);
1199 napi_value authUserListObj = GetNapiValue(env, jsObject, "authUserList");
1200 if (authUserListObj != nullptr) {
1201 if (!GetVectorAuthUser(env, authUserListObj, property.authUsers)) {
1202 DLP_LOG_ERROR(LABEL, "js get auth users fail");
1203 return false;
1204 }
1205 }
1206 if (!GetStringValueByKey(env, jsObject, "contactAccount", property.contactAccount)) {
1207 DLP_LOG_ERROR(LABEL, "js get contact account fail");
1208 return false;
1209 }
1210 if (!GetBoolValueByKey(env, jsObject, "offlineAccess", property.offlineAccess)) {
1211 DLP_LOG_ERROR(LABEL, "js get offline access flag fail");
1212 return false;
1213 }
1214 GetDlpPropertyExpireTime(env, jsObject, property);
1215
1216 napi_value everyoneAccessListObj = GetNapiValue(env, jsObject, "everyoneAccessList");
1217 if (everyoneAccessListObj != nullptr) {
1218 std::vector<uint32_t> permList = {};
1219 if (!GetVectorUint32(env, everyoneAccessListObj, permList)) {
1220 DLP_LOG_ERROR(LABEL, "js get everyoneAccessList fail");
1221 return false;
1222 }
1223 if (permList.size() > 0) {
1224 uint32_t perm = *(std::max_element(permList.begin(), permList.end()));
1225 property.everyonePerm = static_cast<DLPFileAccess>(perm);
1226 property.supportEveryone = true;
1227 }
1228 }
1229 return true;
1230 }
1231
RetentionSandboxInfoToJs(napi_env env,const std::vector<RetentionSandBoxInfo> & infoVec)1232 napi_value RetentionSandboxInfoToJs(napi_env env, const std::vector<RetentionSandBoxInfo>& infoVec)
1233 {
1234 napi_value vectorJs = nullptr;
1235 uint32_t index = 0;
1236 NAPI_CALL(env, napi_create_array(env, &vectorJs));
1237 for (auto item : infoVec) {
1238 napi_value objInfo = nullptr;
1239 NAPI_CALL(env, napi_create_object(env, &objInfo));
1240
1241 napi_value appIndexJs;
1242 NAPI_CALL(env, napi_create_int32(env, item.appIndex_, &appIndexJs));
1243 NAPI_CALL(env, napi_set_named_property(env, objInfo, "appIndex", appIndexJs));
1244 DLP_LOG_INFO(LABEL, "GetAppIndex %{public}d", item.appIndex_);
1245 napi_value bundleNameJs;
1246 NAPI_CALL(env, napi_create_string_utf8(env, item.bundleName_.c_str(), NAPI_AUTO_LENGTH, &bundleNameJs));
1247 NAPI_CALL(env, napi_set_named_property(env, objInfo, "bundleName", bundleNameJs));
1248
1249 napi_value docUriVecJs = SetStringToJs(env, item.docUriSet_);
1250 NAPI_CALL(env, napi_set_named_property(env, objInfo, "docUris", docUriVecJs));
1251
1252 NAPI_CALL(env, napi_set_element(env, vectorJs, index, objInfo));
1253 index++;
1254 }
1255 return vectorJs;
1256 }
1257
VisitInfoToJs(napi_env env,const std::vector<VisitedDLPFileInfo> & infoVec)1258 napi_value VisitInfoToJs(napi_env env, const std::vector<VisitedDLPFileInfo>& infoVec)
1259 {
1260 napi_value vectorJs = nullptr;
1261 uint32_t index = 0;
1262 NAPI_CALL(env, napi_create_array(env, &vectorJs));
1263 for (auto& item : infoVec) {
1264 napi_value objInfo = nullptr;
1265 NAPI_CALL(env, napi_create_object(env, &objInfo));
1266
1267 napi_value timestampJs;
1268 NAPI_CALL(env, napi_create_int64(env, item.visitTimestamp, ×tampJs));
1269 NAPI_CALL(env, napi_set_named_property(env, objInfo, "lastOpenTime", timestampJs));
1270 DLP_LOG_DEBUG(LABEL, "Get visitTimestamp %{public}" PRId64, item.visitTimestamp);
1271 napi_value uriJs;
1272 NAPI_CALL(env, napi_create_string_utf8(env, item.docUri.c_str(), NAPI_AUTO_LENGTH, &uriJs));
1273 NAPI_CALL(env, napi_set_named_property(env, objInfo, "uri", uriJs));
1274
1275 NAPI_CALL(env, napi_set_element(env, vectorJs, index, objInfo));
1276 index++;
1277 }
1278 return vectorJs;
1279 }
1280
DlpPropertyToJs(napi_env env,const DlpProperty & property)1281 napi_value DlpPropertyToJs(napi_env env, const DlpProperty& property)
1282 {
1283 napi_value dlpPropertyJs = nullptr;
1284 NAPI_CALL(env, napi_create_object(env, &dlpPropertyJs));
1285
1286 napi_value everyoneAccessListJs = nullptr;
1287 if (property.supportEveryone) {
1288 everyoneAccessListJs = VectorUint32ToJs(env, {property.everyonePerm});
1289 } else {
1290 everyoneAccessListJs = VectorUint32ToJs(env, {});
1291 }
1292 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "everyoneAccessList", everyoneAccessListJs));
1293
1294 napi_value offlineAccessJs;
1295 napi_get_boolean(env, property.offlineAccess, &offlineAccessJs);
1296 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "offlineAccess", offlineAccessJs));
1297
1298 napi_value expireTimeJs;
1299 napi_create_int64(env, property.expireTime, &expireTimeJs);
1300 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "expireTime", expireTimeJs));
1301
1302 napi_value ownerAccountJs;
1303 NAPI_CALL(env, napi_create_string_utf8(env, property.ownerAccount.c_str(), NAPI_AUTO_LENGTH, &ownerAccountJs));
1304 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "ownerAccount", ownerAccountJs));
1305
1306 napi_value ownerAccountIdJs;
1307 NAPI_CALL(env, napi_create_string_utf8(env, property.ownerAccountId.c_str(), NAPI_AUTO_LENGTH, &ownerAccountIdJs));
1308 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "ownerAccountID", ownerAccountIdJs));
1309
1310 napi_value vectorAuthUserJs = VectorAuthUserToJs(env, property.authUsers);
1311 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "authUserList", vectorAuthUserJs));
1312
1313 napi_value contractAccountJs;
1314 NAPI_CALL(
1315 env, napi_create_string_utf8(env, property.contactAccount.c_str(), NAPI_AUTO_LENGTH, &contractAccountJs));
1316 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "contactAccount", contractAccountJs));
1317
1318 napi_value ownerAccountTypeJs;
1319 NAPI_CALL(env, napi_create_int64(env, property.ownerAccountType, &ownerAccountTypeJs));
1320 NAPI_CALL(env, napi_set_named_property(env, dlpPropertyJs, "ownerAccountType", ownerAccountTypeJs));
1321
1322 return dlpPropertyJs;
1323 }
1324
DlpPermissionInfoToJs(napi_env env,const DLPPermissionInfo & permInfo)1325 napi_value DlpPermissionInfoToJs(napi_env env, const DLPPermissionInfo& permInfo)
1326 {
1327 napi_value dlpPermInfoJs = nullptr;
1328 NAPI_CALL(env, napi_create_object(env, &dlpPermInfoJs));
1329
1330 napi_value accessJs;
1331 NAPI_CALL(env, napi_create_uint32(env, permInfo.dlpFileAccess, &accessJs));
1332 NAPI_CALL(env, napi_set_named_property(env, dlpPermInfoJs, "dlpFileAccess", accessJs));
1333
1334 napi_value flagsJs;
1335 NAPI_CALL(env, napi_create_uint32(env, permInfo.flags, &flagsJs));
1336 NAPI_CALL(env, napi_set_named_property(env, dlpPermInfoJs, "flags", flagsJs));
1337
1338 return dlpPermInfoJs;
1339 }
1340
SandboxInfoToJs(napi_env env,const SandboxInfo & sandboxInfo)1341 napi_value SandboxInfoToJs(napi_env env, const SandboxInfo& sandboxInfo)
1342 {
1343 napi_value sandboxInfoJs = nullptr;
1344 NAPI_CALL(env, napi_create_object(env, &sandboxInfoJs));
1345
1346 napi_value appIndexJs;
1347 NAPI_CALL(env, napi_create_int64(env, sandboxInfo.appIndex, &appIndexJs));
1348 NAPI_CALL(env, napi_set_named_property(env, sandboxInfoJs, "appIndex", appIndexJs));
1349
1350 napi_value tokenIdJs;
1351 NAPI_CALL(env, napi_create_int64(env, sandboxInfo.tokenId, &tokenIdJs));
1352 NAPI_CALL(env, napi_set_named_property(env, sandboxInfoJs, "tokenID", tokenIdJs));
1353
1354 return sandboxInfoJs;
1355 }
1356
VectorAuthUserToJs(napi_env env,const std::vector<AuthUserInfo> & users)1357 napi_value VectorAuthUserToJs(napi_env env, const std::vector<AuthUserInfo>& users)
1358 {
1359 napi_value vectorAuthUserJs = nullptr;
1360 uint32_t index = 0;
1361 NAPI_CALL(env, napi_create_array(env, &vectorAuthUserJs));
1362 for (auto item : users) {
1363 napi_value objAuthUserInfo = nullptr;
1364 NAPI_CALL(env, napi_create_object(env, &objAuthUserInfo));
1365
1366 napi_value authAccountJs;
1367 NAPI_CALL(env, napi_create_string_utf8(env, item.authAccount.c_str(), NAPI_AUTO_LENGTH, &authAccountJs));
1368 NAPI_CALL(env, napi_set_named_property(env, objAuthUserInfo, "authAccount", authAccountJs));
1369
1370 napi_value authPermJs;
1371 NAPI_CALL(env, napi_create_int64(env, item.authPerm, &authPermJs));
1372 NAPI_CALL(env, napi_set_named_property(env, objAuthUserInfo, "dlpFileAccess", authPermJs));
1373
1374 napi_value permExpiryTimeJs;
1375 NAPI_CALL(env, napi_create_int64(env, item.permExpiryTime, &permExpiryTimeJs));
1376 NAPI_CALL(env, napi_set_named_property(env, objAuthUserInfo, "permExpiryTime", permExpiryTimeJs));
1377
1378 napi_value authAccountTypeJs;
1379 NAPI_CALL(env, napi_create_int64(env, item.authAccountType, &authAccountTypeJs));
1380 NAPI_CALL(env, napi_set_named_property(env, objAuthUserInfo, "authAccountType", authAccountTypeJs));
1381
1382 NAPI_CALL(env, napi_set_element(env, vectorAuthUserJs, index, objAuthUserInfo));
1383 index++;
1384 }
1385 return vectorAuthUserJs;
1386 }
1387
VectorStringToJs(napi_env env,const std::vector<std::string> & value)1388 napi_value VectorStringToJs(napi_env env, const std::vector<std::string>& value)
1389 {
1390 napi_value jsArray = nullptr;
1391 uint32_t index = 0;
1392 NAPI_CALL(env, napi_create_array(env, &jsArray));
1393 for (const auto& iter : value) {
1394 napi_value jsValue = nullptr;
1395 if (napi_create_string_utf8(env, iter.c_str(), NAPI_AUTO_LENGTH, &jsValue) == napi_ok) {
1396 if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) {
1397 index++;
1398 }
1399 }
1400 }
1401 return jsArray;
1402 }
1403
VectorUint32ToJs(napi_env env,const std::vector<uint32_t> & value)1404 napi_value VectorUint32ToJs(napi_env env, const std::vector<uint32_t>& value)
1405 {
1406 napi_value jsArray = nullptr;
1407 uint32_t index = 0;
1408 NAPI_CALL(env, napi_create_array(env, &jsArray));
1409 for (const auto& iter : value) {
1410 napi_value jsValue = nullptr;
1411 if (napi_create_int64(env, iter, &jsValue) == napi_ok) {
1412 if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) {
1413 index++;
1414 }
1415 }
1416 }
1417 return jsArray;
1418 }
1419
SetStringToJs(napi_env env,const std::set<std::string> & value)1420 napi_value SetStringToJs(napi_env env, const std::set<std::string>& value)
1421 {
1422 napi_value jsArray = nullptr;
1423 uint32_t index = 0;
1424 NAPI_CALL(env, napi_create_array(env, &jsArray));
1425 for (const auto& iter : value) {
1426 napi_value jsValue = nullptr;
1427 if (napi_create_string_utf8(env, iter.c_str(), NAPI_AUTO_LENGTH, &jsValue) == napi_ok) {
1428 if (napi_set_element(env, jsArray, index, jsValue) == napi_ok) {
1429 index++;
1430 } else {
1431 DLP_LOG_ERROR(LABEL, "napi_set_element error index:%{public}d,value:%{private}s", index, iter.c_str());
1432 }
1433 } else {
1434 DLP_LOG_ERROR(LABEL, "napi_create_string_utf8 error index:%{public}d,value:%{private}s", index,
1435 iter.c_str());
1436 }
1437 }
1438 return jsArray;
1439 }
1440
ParseCallback(const napi_env & env,const napi_value & value,napi_ref & callbackRef)1441 bool ParseCallback(const napi_env& env, const napi_value& value, napi_ref& callbackRef)
1442 {
1443 napi_valuetype valuetype = napi_undefined;
1444 NAPI_CALL_BASE(env, napi_typeof(env, value, &valuetype), false);
1445
1446 if (valuetype == napi_function) {
1447 NAPI_CALL_BASE(env, napi_create_reference(env, value, 1, &callbackRef), false);
1448 return true;
1449 }
1450 if (valuetype == napi_null || valuetype == napi_undefined) {
1451 return true;
1452 }
1453 return false;
1454 }
1455
GetNapiValue(napi_env env,napi_value jsObject,const std::string & key)1456 napi_value GetNapiValue(napi_env env, napi_value jsObject, const std::string& key)
1457 {
1458 if (jsObject == nullptr) {
1459 DLP_LOG_ERROR(LABEL, "Js object is nullptr");
1460 return nullptr;
1461 }
1462 napi_value keyValue;
1463 NAPI_CALL(env, napi_create_string_utf8(env, key.c_str(), NAPI_AUTO_LENGTH, &keyValue));
1464 bool result = false;
1465 NAPI_CALL(env, napi_has_property(env, jsObject, keyValue, &result));
1466 if (result) {
1467 napi_value value = nullptr;
1468 NAPI_CALL(env, napi_get_property(env, jsObject, keyValue, &value));
1469 return value;
1470 }
1471 DLP_LOG_ERROR(LABEL, "get napi value fail");
1472 return nullptr;
1473 }
1474
GetStringValue(napi_env env,napi_value jsObject,std::string & result)1475 bool GetStringValue(napi_env env, napi_value jsObject, std::string& result)
1476 {
1477 napi_valuetype valueType = napi_undefined;
1478 if (napi_typeof(env, jsObject, &valueType) != napi_ok) {
1479 DLP_LOG_ERROR(LABEL, "Can not get napi type");
1480 return false;
1481 }
1482 if (valueType != napi_string) {
1483 DLP_LOG_ERROR(LABEL, "object is no a string");
1484 return false;
1485 }
1486
1487 size_t size = 0;
1488 if (napi_get_value_string_utf8(env, jsObject, nullptr, 0, &size) != napi_ok) {
1489 DLP_LOG_ERROR(LABEL, "Can not get string size");
1490 return false;
1491 }
1492 result.reserve(size + 1);
1493 result.resize(size);
1494 if (napi_get_value_string_utf8(env, jsObject, result.data(), (size + 1), &size) != napi_ok) {
1495 DLP_LOG_ERROR(LABEL, "Can not get string value");
1496 return false;
1497 }
1498 return true;
1499 }
1500
GetStringValueByKey(napi_env env,napi_value jsObject,const std::string & key,std::string & result)1501 bool GetStringValueByKey(napi_env env, napi_value jsObject, const std::string& key, std::string& result)
1502 {
1503 napi_value value = GetNapiValue(env, jsObject, key);
1504 return GetStringValue(env, value, result);
1505 }
1506
GetBoolValue(napi_env env,napi_value jsObject,bool & result)1507 bool GetBoolValue(napi_env env, napi_value jsObject, bool& result)
1508 {
1509 napi_valuetype valuetype;
1510 if (napi_typeof(env, jsObject, &valuetype) != napi_ok) {
1511 DLP_LOG_ERROR(LABEL, "Can not get napi type");
1512 return false;
1513 }
1514
1515 if (valuetype != napi_boolean) {
1516 DLP_LOG_ERROR(LABEL, "Wrong argument type. Boolean expected.");
1517 return false;
1518 }
1519
1520 napi_get_value_bool(env, jsObject, &result);
1521 return true;
1522 }
1523
GetBoolValueByKey(napi_env env,napi_value jsObject,const std::string & key,bool & result)1524 bool GetBoolValueByKey(napi_env env, napi_value jsObject, const std::string& key, bool& result)
1525 {
1526 napi_value value = GetNapiValue(env, jsObject, key);
1527 return GetBoolValue(env, value, result);
1528 }
1529
GetInt64Value(napi_env env,napi_value jsObject,int64_t & result)1530 bool GetInt64Value(napi_env env, napi_value jsObject, int64_t& result)
1531 {
1532 napi_valuetype valueType = napi_undefined;
1533 if (napi_typeof(env, jsObject, &valueType) != napi_ok) {
1534 DLP_LOG_ERROR(LABEL, "Can not get napi type");
1535 return false;
1536 }
1537 if (valueType != napi_number) {
1538 DLP_LOG_ERROR(LABEL, "object is no a number");
1539 return false;
1540 }
1541 NAPI_CALL_BASE(env, napi_get_value_int64(env, jsObject, &result), false);
1542 return true;
1543 }
1544
GetInt64ValueByKey(napi_env env,napi_value jsObject,const std::string & key,int64_t & result)1545 bool GetInt64ValueByKey(napi_env env, napi_value jsObject, const std::string& key, int64_t& result)
1546 {
1547 napi_value value = GetNapiValue(env, jsObject, key);
1548 return GetInt64Value(env, value, result);
1549 }
1550
GetUint32Value(napi_env env,napi_value jsObject,uint32_t & result)1551 bool GetUint32Value(napi_env env, napi_value jsObject, uint32_t& result)
1552 {
1553 napi_valuetype valueType = napi_undefined;
1554 if (napi_typeof(env, jsObject, &valueType) != napi_ok) {
1555 DLP_LOG_ERROR(LABEL, "Can not get napi type");
1556 return false;
1557 }
1558 if (valueType != napi_number) {
1559 DLP_LOG_ERROR(LABEL, "object is no a number");
1560 return false;
1561 }
1562 NAPI_CALL_BASE(env, napi_get_value_uint32(env, jsObject, &result), false);
1563 return true;
1564 }
1565
GetUint32ValueByKey(napi_env env,napi_value jsObject,const std::string & key,uint32_t & result)1566 bool GetUint32ValueByKey(napi_env env, napi_value jsObject, const std::string& key, uint32_t& result)
1567 {
1568 napi_value value = GetNapiValue(env, jsObject, key);
1569 return GetUint32Value(env, value, result);
1570 }
1571
GetArrayValueByKey(napi_env env,napi_value jsObject,const std::string & key)1572 napi_value GetArrayValueByKey(napi_env env, napi_value jsObject, const std::string& key)
1573 {
1574 napi_value array = GetNapiValue(env, jsObject, key);
1575 bool isArray = false;
1576 NAPI_CALL(env, napi_is_array(env, array, &isArray));
1577 if (!isArray) {
1578 DLP_LOG_ERROR(LABEL, "value is not array");
1579 return nullptr;
1580 }
1581 return array;
1582 }
1583
GetVectorAuthUser(napi_env env,napi_value jsObject,std::vector<AuthUserInfo> & resultVec)1584 bool GetVectorAuthUser(napi_env env, napi_value jsObject, std::vector<AuthUserInfo>& resultVec)
1585 {
1586 uint32_t size = 0;
1587 if (napi_get_array_length(env, jsObject, &size) != napi_ok) {
1588 DLP_LOG_ERROR(LABEL, "js get array size fail");
1589 return false;
1590 }
1591 for (uint32_t i = 0; i < size; i++) {
1592 napi_value obj;
1593 NAPI_CALL_BASE(env, napi_get_element(env, jsObject, i, &obj), false);
1594 AuthUserInfo userInfo;
1595 if (!GetStringValueByKey(env, obj, "authAccount", userInfo.authAccount)) {
1596 DLP_LOG_ERROR(LABEL, "js get auth account fail");
1597 resultVec.clear();
1598 return false;
1599 }
1600 int64_t perm;
1601 if (!GetInt64ValueByKey(env, obj, "dlpFileAccess", perm)) {
1602 DLP_LOG_ERROR(LABEL, "js get auth perm fail");
1603 resultVec.clear();
1604 return false;
1605 }
1606 userInfo.authPerm = static_cast<DLPFileAccess>(perm);
1607 int64_t time;
1608 if (!GetInt64ValueByKey(env, obj, "permExpiryTime", time)) {
1609 DLP_LOG_ERROR(LABEL, "js get time fail");
1610 resultVec.clear();
1611 return false;
1612 }
1613 userInfo.permExpiryTime = static_cast<uint64_t>(time);
1614 int64_t type;
1615 if (!GetInt64ValueByKey(env, obj, "authAccountType", type)) {
1616 DLP_LOG_ERROR(LABEL, "js get type fail");
1617 resultVec.clear();
1618 return false;
1619 }
1620 userInfo.authAccountType = static_cast<DlpAccountType>(type);
1621 resultVec.push_back(userInfo);
1622 }
1623 return true;
1624 }
1625
GetVectorAuthUserByKey(napi_env env,napi_value jsObject,const std::string & key,std::vector<AuthUserInfo> & resultVec)1626 bool GetVectorAuthUserByKey(
1627 napi_env env, napi_value jsObject, const std::string& key, std::vector<AuthUserInfo>& resultVec)
1628 {
1629 napi_value userArray = GetArrayValueByKey(env, jsObject, key);
1630 if (userArray == nullptr) {
1631 DLP_LOG_ERROR(LABEL, "User array is null");
1632 return false;
1633 }
1634 return GetVectorAuthUser(env, userArray, resultVec);
1635 }
1636
GetVectorDocUriByKey(napi_env env,napi_value jsObject,const std::string & key,std::vector<std::string> & docUriVec)1637 bool GetVectorDocUriByKey(napi_env env, napi_value jsObject, const std::string& key,
1638 std::vector<std::string>& docUriVec)
1639 {
1640 bool isArray = false;
1641 NAPI_CALL_BASE(env, napi_is_array(env, jsObject, &isArray), false);
1642 if (!isArray) {
1643 DLP_LOG_ERROR(LABEL, "value is not array");
1644 return false;
1645 }
1646 uint32_t size = 0;
1647 if (napi_get_array_length(env, jsObject, &size) != napi_ok) {
1648 DLP_LOG_ERROR(LABEL, "js get array size fail");
1649 return false;
1650 }
1651 for (uint32_t i = 0; i < size; i++) {
1652 napi_value obj;
1653 NAPI_CALL_BASE(env, napi_get_element(env, jsObject, i, &obj), false);
1654 std::string docUri;
1655 if (!GetStringValue(env, obj, docUri)) {
1656 DLP_LOG_ERROR(LABEL, "js get docUri fail");
1657 ThrowParamError(env, "docUri", "string");
1658 return false;
1659 }
1660 docUriVec.push_back(docUri);
1661 }
1662 return true;
1663 }
1664
GetVectorUint32(napi_env env,napi_value jsObject,std::vector<uint32_t> & resultVec)1665 bool GetVectorUint32(napi_env env, napi_value jsObject, std::vector<uint32_t>& resultVec)
1666 {
1667 bool isArray = false;
1668 NAPI_CALL_BASE(env, napi_is_array(env, jsObject, &isArray), false);
1669 if (!isArray) {
1670 DLP_LOG_ERROR(LABEL, "value is not array");
1671 return false;
1672 }
1673 uint32_t size = 0;
1674 if (napi_get_array_length(env, jsObject, &size) != napi_ok) {
1675 DLP_LOG_ERROR(LABEL, "js get array size fail");
1676 return false;
1677 }
1678 for (uint32_t i = 0; i < size; i++) {
1679 napi_value obj;
1680 NAPI_CALL_BASE(env, napi_get_element(env, jsObject, i, &obj), false);
1681 uint32_t num;
1682 if (!GetUint32Value(env, obj, num)) {
1683 DLP_LOG_ERROR(LABEL, "js get num fail");
1684 return false;
1685 }
1686 resultVec.emplace_back(num);
1687 }
1688 return true;
1689 }
1690
ParseUIAbilityContextReq(napi_env env,const napi_value & obj,std::shared_ptr<OHOS::AbilityRuntime::AbilityContext> & abilityContext)1691 bool ParseUIAbilityContextReq(
1692 napi_env env, const napi_value& obj, std::shared_ptr<OHOS::AbilityRuntime::AbilityContext>& abilityContext)
1693 {
1694 bool stageMode = false;
1695 napi_status status = OHOS::AbilityRuntime::IsStageContext(env, obj, stageMode);
1696 if (status != napi_ok || !stageMode) {
1697 DLP_LOG_ERROR(LABEL, "not stage mode");
1698 return false;
1699 }
1700
1701 auto context = OHOS::AbilityRuntime::GetStageModeContext(env, obj);
1702 if (context == nullptr) {
1703 DLP_LOG_ERROR(LABEL, "get context failed");
1704 return false;
1705 }
1706
1707 abilityContext = OHOS::AbilityRuntime::Context::ConvertTo<OHOS::AbilityRuntime::AbilityContext>(context);
1708 if (abilityContext == nullptr) {
1709 DLP_LOG_ERROR(LABEL, "get abilityContext failed");
1710 return false;
1711 }
1712 DLP_LOG_DEBUG(LABEL, "end ParseUIAbilityContextReq");
1713 return true;
1714 }
1715
ParseWantReq(napi_env env,const napi_value & obj,OHOS::AAFwk::Want & requestWant)1716 bool ParseWantReq(napi_env env, const napi_value& obj, OHOS::AAFwk::Want& requestWant)
1717 {
1718 requestWant.SetElementName(DLP_MANAGER_BUNDLENAME, DLP_MANAGER_ABILITYNAME);
1719 std::string uri;
1720 bool ret = GetStringValueByKey(env, obj, "uri", uri);
1721 if (!ret || uri.empty()) {
1722 DLP_LOG_ERROR(LABEL, "get uri failed");
1723 DlpNapiThrow(env, ERR_JS_URI_NOT_EXIST, "uri not exist in want");
1724 return false;
1725 }
1726 requestWant.SetUri(uri);
1727
1728 napi_value wantParameters = GetNapiValue(env, obj, "parameters");
1729 if (wantParameters == nullptr) {
1730 DLP_LOG_ERROR(LABEL, "get wantParameters failed");
1731 DlpNapiThrow(env, ERR_JS_PARAM_DISPLAY_NAME_NOT_EXIST, "parameters not exist in want");
1732 return false;
1733 }
1734 std::string displayName;
1735 ret = GetStringValueByKey(env, wantParameters, "displayName", displayName);
1736 if (!ret || displayName.empty()) {
1737 DLP_LOG_ERROR(LABEL, "get displayName failed");
1738 DlpNapiThrow(env, ERR_JS_PARAM_DISPLAY_NAME_NOT_EXIST, "displayName not exist in want parameters");
1739 return false;
1740 }
1741 AAFwk::WantParams requestWantParam;
1742 requestWantParam.SetParam("displayName", AAFwk::String::Box(displayName));
1743 AAFwk::WantParams fileNameObj;
1744 fileNameObj.SetParam("name", AAFwk::String::Box(displayName));
1745 requestWantParam.SetParam("fileName", AAFwk::WantParamWrapper::Box(fileNameObj));
1746
1747 napi_status result = napi_has_named_property(env, wantParameters, "linkFileName", &ret);
1748 if (result == napi_ok && ret) {
1749 napi_value linkFileName = GetNapiValue(env, wantParameters, "linkFileName");
1750 std::string linkFileNameStr;
1751 ret = GetStringValueByKey(env, linkFileName, "name", linkFileNameStr);
1752 if (ret && !linkFileNameStr.empty()) {
1753 AAFwk::WantParams linkFileNameObj;
1754 linkFileNameObj.SetParam("name", AAFwk::String::Box(linkFileNameStr));
1755 requestWantParam.SetParam("linkFileName", AAFwk::WantParamWrapper::Box(linkFileNameObj));
1756 DLP_LOG_DEBUG(LABEL, "set linkFileName");
1757 }
1758 }
1759
1760 requestWant.SetParams(requestWantParam);
1761 requestWant.SetParam(PARAM_UI_EXTENSION_TYPE, SYS_COMMON_UI);
1762 DLP_LOG_DEBUG(LABEL, "end ParseWantReq");
1763 return true;
1764 }
1765
StartUIExtensionAbility(std::shared_ptr<UIExtensionRequestContext> asyncContext)1766 void StartUIExtensionAbility(std::shared_ptr<UIExtensionRequestContext> asyncContext)
1767 {
1768 DLP_LOG_DEBUG(LABEL, "begin StartUIExtensionAbility");
1769 if (asyncContext == nullptr) {
1770 DLP_LOG_ERROR(LABEL, "asyncContext is null");
1771 return;
1772 }
1773 auto abilityContext = asyncContext->context;
1774 if (abilityContext == nullptr) {
1775 DLP_LOG_ERROR(LABEL, "abilityContext is null");
1776 DlpNapiThrow(asyncContext->env, ERR_JS_INVALID_PARAMETER, "abilityContext is null");
1777 return;
1778 }
1779 auto uiContent = abilityContext->GetUIContent();
1780 if (uiContent == nullptr) {
1781 DLP_LOG_ERROR(LABEL, "uiContent is null");
1782 DlpNapiThrow(asyncContext->env, ERR_JS_INVALID_PARAMETER, "uiContent is null");
1783 return;
1784 }
1785
1786 auto uiExtCallback = std::make_shared<UIExtensionCallback>(asyncContext);
1787 OHOS::Ace::ModalUIExtensionCallbacks extensionCallbacks = {
1788 [uiExtCallback](int32_t releaseCode) { uiExtCallback->OnRelease(releaseCode); },
1789 [uiExtCallback](int32_t resultCode, const OHOS::AAFwk::Want& result) {
1790 uiExtCallback->OnResult(resultCode, result); },
1791 [uiExtCallback](const OHOS::AAFwk::WantParams& request) { uiExtCallback->OnReceive(request); },
1792 [uiExtCallback](int32_t errorCode, const std::string& name, const std::string& message) {
1793 uiExtCallback->OnError(errorCode, name, message); },
1794 [uiExtCallback](const std::shared_ptr<OHOS::Ace::ModalUIExtensionProxy>& uiProxy) {
1795 uiExtCallback->OnRemoteReady(uiProxy); },
1796 [uiExtCallback]() { uiExtCallback->OnDestroy(); }
1797 };
1798
1799 OHOS::Ace::ModalUIExtensionConfig uiExtConfig;
1800 uiExtConfig.isProhibitBack = false;
1801 int32_t sessionId = uiContent->CreateModalUIExtension(asyncContext->requestWant, extensionCallbacks, uiExtConfig);
1802 DLP_LOG_INFO(LABEL, "end CreateModalUIExtension sessionId = %{public}d", sessionId);
1803 if (sessionId == 0) {
1804 DLP_LOG_ERROR(LABEL, "CreateModalUIExtension failed, sessionId is %{public}d", sessionId);
1805 }
1806 uiExtCallback->SetSessionId(sessionId);
1807 return;
1808 }
1809
UIExtensionCallback(std::shared_ptr<UIExtensionRequestContext> & reqContext)1810 UIExtensionCallback::UIExtensionCallback(std::shared_ptr<UIExtensionRequestContext>& reqContext)
1811 {
1812 this->reqContext_ = reqContext;
1813 }
1814
SetSessionId(int32_t sessionId)1815 void UIExtensionCallback::SetSessionId(int32_t sessionId)
1816 {
1817 this->sessionId_ = sessionId;
1818 }
1819
SetErrorCode(int32_t code)1820 bool UIExtensionCallback::SetErrorCode(int32_t code)
1821 {
1822 if (this->reqContext_ == nullptr) {
1823 DLP_LOG_ERROR(LABEL, "OnError reqContext is nullptr");
1824 return false;
1825 }
1826 if (this->alreadyCallback_) {
1827 DLP_LOG_DEBUG(LABEL, "alreadyCallback");
1828 return false;
1829 }
1830 this->alreadyCallback_ = true;
1831 this->reqContext_->errCode = code;
1832 return true;
1833 }
1834
OnRelease(int32_t releaseCode)1835 void UIExtensionCallback::OnRelease(int32_t releaseCode)
1836 {
1837 DLP_LOG_DEBUG(LABEL, "UIExtensionComponent OnRelease(), releaseCode = %{public}d", releaseCode);
1838 if (SetErrorCode(releaseCode)) {
1839 SendMessageBack();
1840 }
1841 }
1842
OnResult(int32_t resultCode,const OHOS::AAFwk::Want & result)1843 void UIExtensionCallback::OnResult(int32_t resultCode, const OHOS::AAFwk::Want& result)
1844 {
1845 DLP_LOG_DEBUG(LABEL, "UIExtensionComponent OnResult(), resultCode = %{public}d", resultCode);
1846 this->resultCode_ = resultCode;
1847 this->resultWant_ = result;
1848 if (SetErrorCode(0)) {
1849 SendMessageBack();
1850 }
1851 }
1852
OnReceive(const OHOS::AAFwk::WantParams & request)1853 void UIExtensionCallback::OnReceive(const OHOS::AAFwk::WantParams& request)
1854 {
1855 DLP_LOG_DEBUG(LABEL, "UIExtensionComponent OnReceive()");
1856 }
1857
OnError(int32_t errorCode,const std::string & name,const std::string & message)1858 void UIExtensionCallback::OnError(int32_t errorCode, const std::string& name, const std::string& message)
1859 {
1860 DLP_LOG_ERROR(LABEL,
1861 "UIExtensionComponent OnError(), errorCode = %{public}d, name = %{public}s, message = %{public}s",
1862 errorCode, name.c_str(), message.c_str());
1863 if (SetErrorCode(errorCode)) {
1864 SendMessageBack();
1865 }
1866 }
1867
OnRemoteReady(const std::shared_ptr<OHOS::Ace::ModalUIExtensionProxy> & uiProxy)1868 void UIExtensionCallback::OnRemoteReady(const std::shared_ptr<OHOS::Ace::ModalUIExtensionProxy>& uiProxy)
1869 {
1870 DLP_LOG_DEBUG(LABEL, "UIExtensionComponent OnRemoteReady()");
1871 }
1872
OnDestroy()1873 void UIExtensionCallback::OnDestroy()
1874 {
1875 DLP_LOG_DEBUG(LABEL, "UIExtensionComponent OnDestroy()");
1876 if (SetErrorCode(0)) {
1877 SendMessageBack();
1878 }
1879 }
1880
SendMessageBack()1881 void UIExtensionCallback::SendMessageBack()
1882 {
1883 DLP_LOG_INFO(LABEL, "start SendMessageBack");
1884 if (this->reqContext_ == nullptr) {
1885 DLP_LOG_ERROR(LABEL, "reqContext is nullptr");
1886 return;
1887 }
1888
1889 auto abilityContext = this->reqContext_->context;
1890 if (abilityContext != nullptr) {
1891 auto uiContent = abilityContext->GetUIContent();
1892 if (uiContent != nullptr) {
1893 DLP_LOG_DEBUG(LABEL, "CloseModalUIExtension");
1894 uiContent->CloseModalUIExtension(this->sessionId_);
1895 }
1896 }
1897
1898 napi_value nativeObjJs = nullptr;
1899 NAPI_CALL_RETURN_VOID(this->reqContext_->env, napi_create_object(this->reqContext_->env, &nativeObjJs));
1900 napi_value resultCode = nullptr;
1901 NAPI_CALL_RETURN_VOID(this->reqContext_->env,
1902 napi_create_int32(this->reqContext_->env, this->resultCode_, &resultCode));
1903 NAPI_CALL_RETURN_VOID(this->reqContext_->env,
1904 napi_set_named_property(this->reqContext_->env, nativeObjJs, "resultCode", resultCode));
1905 napi_value resultWant = nullptr;
1906 resultWant = OHOS::AppExecFwk::WrapWant(this->reqContext_->env, this->resultWant_);
1907 NAPI_CALL_RETURN_VOID(this->reqContext_->env,
1908 napi_set_named_property(this->reqContext_->env, nativeObjJs, "want", resultWant));
1909
1910 DLP_LOG_DEBUG(LABEL, "ProcessCallbackOrPromise");
1911 ProcessCallbackOrPromise(this->reqContext_->env, this->reqContext_.get(), nativeObjJs);
1912 }
1913 } // namespace DlpPermission
1914 } // namespace Security
1915 } // namespace OHOS
1916