1 /*
2  * Copyright (C) 2024 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 <string>
17 #include <cstdbool>
18 #include <cstdint>
19 
20 #include "DataProtectionKit/dlp_permission_api.h"
21 #include "hilog/log.h"
22 #include "napi/native_api.h"
23 #include "native_common.h"
24 
OsGetDlpPermissionInfoA(napi_env env, napi_callback_info info)25 static napi_value OsGetDlpPermissionInfoA(napi_env env, napi_callback_info info)
26 {
27     DLP_FileAccess dlpFileAccess = NO_PERMISSION; //表示DLP文件授权类型
28     uint32_t flags = 0; //表示DLP文件的详细操作权限
29     DLP_ErrCode ret = OH_DLP_GetDlpPermissionInfo(&dlpFileAccess, &flags);
30     if (ret == DLP_ErrCode::ERR_OH_SUCCESS) {
31         napi_value result[2] = {nullptr};
32         napi_create_int32(env, dlpFileAccess, &result[0]);
33         napi_create_int32(env, flags, &result[1]);
34         return result[1];
35     }
36     napi_value result = nullptr;
37     napi_create_int32(env, ret, &result);
38     return result;
39 }
40 
OsGetOriginalFileNameA(napi_env env, napi_callback_info info)41 static napi_value OsGetOriginalFileNameA(napi_env env, napi_callback_info info)
42 {
43     const char *fileName = "test.txt.dlp"; //表示dlp文件名,用以获取原始文件名
44     char *originalFileName = NULL; //表示原始文件名
45     DLP_ErrCode ret = OH_DLP_GetOriginalFileName(fileName, &originalFileName);
46     if (ret == DLP_ErrCode::ERR_OH_SUCCESS) {
47         napi_value result = nullptr;
48         napi_create_string_utf8(env, originalFileName, NAPI_AUTO_LENGTH, &result);
49         return result;
50     }
51     napi_value result = nullptr;
52     napi_create_int32(env, ret, &result);
53     free(originalFileName); //处理完后手动释放originalFileName
54     return result;
55 }
56 
OsIsInSandboxA(napi_env env, napi_callback_info info)57 static napi_value OsIsInSandboxA(napi_env env, napi_callback_info info)
58 {
59     bool isInSandbox = false; //true 表示当前应用在沙箱中,false 表示应用不在沙箱
60     DLP_ErrCode ret = OH_DLP_IsInSandbox(&isInSandbox);
61     if (ret == DLP_ErrCode::ERR_OH_SUCCESS) {
62         napi_value result = nullptr;
63         napi_get_boolean(env, isInSandbox, &result);
64         return result;
65     }
66     napi_value result = nullptr;
67     napi_create_int32(env, ret, &result);
68     return result;
69 }
70 
OsSetSandboxAppConfigA(napi_env env, napi_callback_info info)71 static napi_value OsSetSandboxAppConfigA(napi_env env, napi_callback_info info)
72 {
73     const char *configInfo = "configInfo"; //沙箱应用配置信息,用户可将配置信息json化后传入
74     DLP_ErrCode ret = OH_DLP_SetSandboxAppConfig(configInfo);
75 
76     napi_value result = nullptr;
77     napi_create_int32(env, ret, &result);
78     return result;
79 }
80 
OsGetSandboxAppConfigA(napi_env env, napi_callback_info info)81 static napi_value OsGetSandboxAppConfigA(napi_env env, napi_callback_info info)
82 {
83     char *configInfo = NULL; //输出json化后的沙箱应用配置信息
84     DLP_ErrCode ret = OH_DLP_GetSandboxAppConfig(&configInfo);
85     if (ret == DLP_ErrCode::ERR_OH_SUCCESS) {
86         napi_value result = nullptr;
87         napi_create_string_utf8(env, configInfo, NAPI_AUTO_LENGTH, &result);
88         return result;
89     }
90     napi_value result = nullptr;
91     napi_create_int32(env, ret, &result);
92     free(configInfo); //处理完后手动释放configInfo
93     return result;
94 }
95 
OsCleanSandboxAppConfigA(napi_env env, napi_callback_info info)96 static napi_value OsCleanSandboxAppConfigA(napi_env env, napi_callback_info info)
97 {
98     DLP_ErrCode ret = OH_DLP_CleanSandboxAppConfig();
99 
100     napi_value result = nullptr;
101     napi_create_int32(env, ret, &result);
102     return result;
103 }
104 
105 EXTERN_C_START
Init(napi_env env, napi_value exports)106 static napi_value Init(napi_env env, napi_value exports)
107 {
108     napi_property_descriptor desc[] = {
109         {"osGetDlpPermissionInfoA", nullptr, OsGetDlpPermissionInfoA, nullptr,
110          nullptr, nullptr, napi_default, nullptr},
111         {"osGetOriginalFileNameA", nullptr, OsGetOriginalFileNameA, nullptr,
112          nullptr, nullptr, napi_default, nullptr},
113         {"osIsInSandboxA", nullptr, OsIsInSandboxA, nullptr,
114          nullptr, nullptr, napi_default, nullptr},
115         {"osSetSandboxAppConfigA", nullptr, OsSetSandboxAppConfigA, nullptr,
116          nullptr, nullptr, napi_default, nullptr},
117         {"osGetSandboxAppConfigA", nullptr, OsGetSandboxAppConfigA, nullptr,
118          nullptr, nullptr, napi_default, nullptr},
119         {"osCleanSandboxAppConfigA", nullptr, OsCleanSandboxAppConfigA, nullptr,
120          nullptr, nullptr, napi_default, nullptr}
121     };
122 
123     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
124     return exports;
125 }
126 EXTERN_C_END
127 
128 static napi_module demoModule = {
129     .nm_version = 1,
130     .nm_flags = 0,
131     .nm_filename = nullptr,
132     // 模块对外接口注册函数
133     .nm_register_func = Init,
134     // 自定义模块
135     .nm_modname = "entry",
136     .nm_priv = ((void*)0),
137     .reserved = {0},
138 };
139 
RegisterEntryModule(void)140 extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
141 {
142     napi_module_register(&demoModule);
143 }
144