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