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 ®isterSandboxChangeInfo)
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 ®isterSandboxChangeInfo)
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, ×tampJs));
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