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