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 &registerSandboxChangeInfo)
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 &registerSandboxChangeInfo)
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, &timestampJs));
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