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