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 "browser_addon.h"
17
18 #include "browser_proxy.h"
19 #include "cJSON.h"
20 #include "edm_constants.h"
21 #include "edm_log.h"
22 #include "enterprise_device_mgr_proxy.h"
23 #include "securec.h"
24
25 using namespace OHOS::EDM;
26
27 static const std::u16string DESCRIPTOR = u"ohos.edm.IEnterpriseDeviceMgr";
Init(napi_env env,napi_value exports)28 napi_value BrowserAddon::Init(napi_env env, napi_value exports)
29 {
30 napi_property_descriptor property[] = {
31 DECLARE_NAPI_FUNCTION("setPolicies", SetPolicies),
32 DECLARE_NAPI_FUNCTION("getPolicies", GetPolicies),
33 DECLARE_NAPI_FUNCTION("setPolicySync", SetPolicy),
34 DECLARE_NAPI_FUNCTION("getPoliciesSync", GetPoliciesSync),
35 DECLARE_NAPI_FUNCTION("setManagedBrowserPolicy", SetManagedBrowserPolicy),
36 DECLARE_NAPI_FUNCTION("getManagedBrowserPolicy", GetManagedBrowserPolicy),
37 DECLARE_NAPI_FUNCTION("getSelfManagedBrowserPolicyVersion", GetSelfManagedBrowserPolicyVersion),
38 DECLARE_NAPI_FUNCTION("getSelfManagedBrowserPolicy", GetSelfManagedBrowserPolicy),
39 };
40 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
41 return exports;
42 }
43
SetPolicies(napi_env env,napi_callback_info info)44 napi_value BrowserAddon::SetPolicies(napi_env env, napi_callback_info info)
45 {
46 EDMLOGI("NAPI_SetPolicies called");
47 auto asyncCallbackInfo = new (std::nothrow) AsyncBrowserCallbackInfo();
48 if (asyncCallbackInfo == nullptr) {
49 return nullptr;
50 }
51 std::unique_ptr<AsyncBrowserCallbackInfo> callbackPtr{asyncCallbackInfo};
52 napi_value ret = SetPolicyCommon(env, info, asyncCallbackInfo);
53 int32_t errCode = -1;
54 napi_get_value_int32(env, ret, &errCode);
55 if (ret == nullptr || errCode != ERR_OK) {
56 return nullptr;
57 }
58 if (asyncCallbackInfo->value != nullptr) {
59 ASSERT_AND_THROW_PARAM_ERROR(env,
60 MatchValueType(env, asyncCallbackInfo->value, napi_function), "Parameter callback error");
61 napi_create_reference(env, asyncCallbackInfo->value, NAPI_RETURN_ONE, &asyncCallbackInfo->callback);
62 }
63 napi_value asyncWorkReturn =
64 HandleAsyncWork(env, asyncCallbackInfo, "setPolicies", NativeSetPolicies, NativeVoidCallbackComplete);
65 callbackPtr.release();
66 return asyncWorkReturn;
67 }
68
NativeSetPolicies(napi_env env,void * data)69 void BrowserAddon::NativeSetPolicies(napi_env env, void *data)
70 {
71 EDMLOGI("NAPI_NativeSetPolicies called");
72 if (data == nullptr) {
73 EDMLOGE("data is nullptr");
74 return;
75 }
76 AsyncBrowserCallbackInfo *asyncCallbackInfo = static_cast<AsyncBrowserCallbackInfo *>(data);
77 asyncCallbackInfo->ret = BrowserProxy::GetBrowserProxy()->SetPolicies(asyncCallbackInfo->elementName,
78 asyncCallbackInfo->appId, asyncCallbackInfo->policies);
79 }
80
GetPolicies(napi_env env,napi_callback_info info)81 napi_value BrowserAddon::GetPolicies(napi_env env, napi_callback_info info)
82 {
83 EDMLOGI("NAPI_GetPolicies called");
84 auto asyncCallbackInfo = new (std::nothrow) AsyncBrowserCallbackInfo();
85 if (asyncCallbackInfo == nullptr) {
86 return nullptr;
87 }
88 std::unique_ptr<AsyncBrowserCallbackInfo> callbackPtr{asyncCallbackInfo};
89 napi_value ret = GetPoliciesCommon(env, info, asyncCallbackInfo);
90 int32_t errCode = -1;
91 napi_get_value_int32(env, ret, &errCode);
92 if (ret == nullptr || errCode != ERR_OK) {
93 return nullptr;
94 }
95 if (asyncCallbackInfo->value != nullptr) {
96 ASSERT_AND_THROW_PARAM_ERROR(env,
97 MatchValueType(env, asyncCallbackInfo->value, napi_function), "Parameter callback error");
98 napi_create_reference(env, asyncCallbackInfo->value, NAPI_RETURN_ONE, &asyncCallbackInfo->callback);
99 }
100 napi_value asyncWorkReturn =
101 HandleAsyncWork(env, asyncCallbackInfo, "getPolicies", NativeGetPolicies, NativeStringCallbackComplete);
102 callbackPtr.release();
103 return asyncWorkReturn;
104 }
105
NativeGetPolicies(napi_env env,void * data)106 void BrowserAddon::NativeGetPolicies(napi_env env, void *data)
107 {
108 EDMLOGI("NativeGetPolicies called");
109 if (data == nullptr) {
110 EDMLOGE("data is nullptr");
111 return;
112 }
113 AsyncBrowserCallbackInfo *asyncCallbackInfo = static_cast<AsyncBrowserCallbackInfo *>(data);
114 asyncCallbackInfo->ret = BrowserProxy::GetBrowserProxy()->GetPolicies(asyncCallbackInfo->elementName,
115 asyncCallbackInfo->appId, asyncCallbackInfo->stringRet);
116 }
117
SetPolicy(napi_env env,napi_callback_info info)118 napi_value BrowserAddon::SetPolicy(napi_env env, napi_callback_info info)
119 {
120 EDMLOGI("NAPI_SetPolicy called");
121 std::string policyValue;
122 auto asyncCallbackInfo = new (std::nothrow) AsyncBrowserCallbackInfo();
123 if (asyncCallbackInfo == nullptr) {
124 return nullptr;
125 }
126 std::unique_ptr<AsyncBrowserCallbackInfo> callbackPtr{asyncCallbackInfo};
127 napi_value ret = SetPolicyCommon(env, info, asyncCallbackInfo);
128 int32_t errCode = -1;
129 napi_get_value_int32(env, ret, &errCode);
130 if (ret == nullptr || errCode != ERR_OK) {
131 return nullptr;
132 }
133 ASSERT_AND_THROW_PARAM_ERROR(env,
134 ParseString(env, policyValue, asyncCallbackInfo->value), "Parameter policyValue error");
135
136 int32_t retCode = BrowserProxy::GetBrowserProxy()->SetPolicy(asyncCallbackInfo->elementName,
137 asyncCallbackInfo->appId, asyncCallbackInfo->policies, policyValue);
138 if (FAILED(retCode)) {
139 napi_throw(env, CreateError(env, retCode));
140 }
141 return nullptr;
142 }
143
GetPoliciesSync(napi_env env,napi_callback_info info)144 napi_value BrowserAddon::GetPoliciesSync(napi_env env, napi_callback_info info)
145 {
146 EDMLOGI("NAPI_GetPoliciesSync called");
147 auto asyncCallbackInfo = new (std::nothrow) AsyncBrowserCallbackInfo();
148 if (asyncCallbackInfo == nullptr) {
149 return nullptr;
150 }
151 std::unique_ptr<AsyncBrowserCallbackInfo> callbackPtr{asyncCallbackInfo};
152 napi_value ret = GetPoliciesCommon(env, info, asyncCallbackInfo);
153 int32_t errCode = -1;
154 napi_get_value_int32(env, ret, &errCode);
155 if (ret == nullptr || errCode != ERR_OK) {
156 return nullptr;
157 }
158 std::string policies;
159 int32_t retCode = BrowserProxy::GetBrowserProxy()->GetPolicies(asyncCallbackInfo->elementName,
160 asyncCallbackInfo->appId, policies);
161 if (FAILED(retCode)) {
162 napi_throw(env, CreateError(env, retCode));
163 }
164 napi_value res;
165 napi_create_string_utf8(env, policies.c_str(), NAPI_AUTO_LENGTH, &res);
166 return res;
167 }
168
SetManagedBrowserPolicy(napi_env env,napi_callback_info info)169 napi_value BrowserAddon::SetManagedBrowserPolicy(napi_env env, napi_callback_info info)
170 {
171 EDMLOGI("BrowserAddon::SetManagedBrowserPolicy start");
172 size_t argc = ARGS_SIZE_FOUR;
173 napi_value argv[ARGS_SIZE_FOUR] = { nullptr };
174 napi_value thisArg = nullptr;
175 void* data = nullptr;
176 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
177 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_FOUR, "parameter count error");
178 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "admin type error");
179 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string),
180 "bundleName type error");
181 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_string),
182 "policyName type error");
183 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_THREE], napi_string),
184 "policyValue type error");
185 OHOS::AppExecFwk::ElementName elementName;
186 std::string bundleName;
187 std::string policyName;
188 std::string policyValue;
189
190 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
191 "Parameter admin error");
192 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, bundleName, argv[ARR_INDEX_ONE]),
193 "Parameter bundleName error");
194 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, policyName, argv[ARR_INDEX_TWO]),
195 "Parameter policyName error");
196 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, policyValue, argv[ARR_INDEX_THREE]),
197 "Parameter policyValue error");
198
199 if (!policyValue.empty()) {
200 cJSON* root = cJSON_Parse(policyValue.c_str());
201 ASSERT_AND_THROW_PARAM_ERROR(env, root != nullptr, "policyValue is not a json value");
202 cJSON_Delete(root);
203 }
204
205 MessageParcel parcelData;
206 parcelData.WriteInterfaceToken(DESCRIPTOR);
207 parcelData.WriteInt32(WITHOUT_USERID);
208 parcelData.WriteParcelable(&elementName);
209 parcelData.WriteString(WITHOUT_PERMISSION_TAG);
210 parcelData.WriteString(bundleName);
211 parcelData.WriteString(policyName);
212 parcelData.WriteString(policyValue);
213 int32_t ret = BrowserProxy::GetBrowserProxy()->SetManagedBrowserPolicy(parcelData);
214 if (FAILED(ret)) {
215 napi_throw(env, CreateError(env, ret));
216 }
217 return nullptr;
218 }
219
GetManagedBrowserPolicy(napi_env env,napi_callback_info info)220 napi_value BrowserAddon::GetManagedBrowserPolicy(napi_env env, napi_callback_info info)
221 {
222 EDMLOGI("BrowserAddon::GetManagedBrowserPolicy start");
223 size_t argc = ARGS_SIZE_TWO;
224 napi_value argv[ARGS_SIZE_TWO] = { nullptr };
225 napi_value thisArg = nullptr;
226 void* data = nullptr;
227 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
228 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
229 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "admin type error");
230 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string),
231 "bundleName type error");
232 OHOS::AppExecFwk::ElementName elementName;
233 std::string bundleName;
234
235 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
236 "Parameter admin error");
237 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, bundleName, argv[ARR_INDEX_ONE]),
238 "Parameter bundleName error");
239
240 MessageParcel parcelData;
241 parcelData.WriteInterfaceToken(DESCRIPTOR);
242 parcelData.WriteInt32(WITHOUT_USERID);
243 parcelData.WriteString(WITHOUT_PERMISSION_TAG);
244 parcelData.WriteInt32(HAS_ADMIN);
245 parcelData.WriteParcelable(&elementName);
246 parcelData.WriteString(EdmConstants::Browser::GET_MANAGED_BROWSER_FILE_DATA);
247 parcelData.WriteString(bundleName);
248
249 int32_t size = -1;
250 void* retData = nullptr;
251 int32_t ret = BrowserProxy::GetBrowserProxy()->GetManagedBrowserPolicy(parcelData, &retData, size);
252 if (FAILED(ret)) {
253 napi_throw(env, CreateError(env, ret));
254 return nullptr;
255 }
256 return CreateArrayBuffer(env, retData, size);
257 }
258
GetSelfManagedBrowserPolicyVersion(napi_env env,napi_callback_info info)259 napi_value BrowserAddon::GetSelfManagedBrowserPolicyVersion(napi_env env, napi_callback_info info)
260 {
261 EDMLOGI("BrowserAddon::GetManagedBrowserPolicy start");
262 int32_t version = -1;
263 int32_t ret = BrowserProxy::GetBrowserProxy()->GetSelfManagedBrowserPolicyVersion(version);
264 if (FAILED(ret)) {
265 napi_throw(env, CreateError(env, ret));
266 return nullptr;
267 }
268 if (version == -1) {
269 napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
270 return nullptr;
271 }
272 napi_value versionRet = nullptr;
273 NAPI_CALL(env, napi_create_string_utf8(env, std::to_string(version).c_str(), NAPI_AUTO_LENGTH, &versionRet));
274 return versionRet;
275 }
276
GetSelfManagedBrowserPolicy(napi_env env,napi_callback_info info)277 napi_value BrowserAddon::GetSelfManagedBrowserPolicy(napi_env env, napi_callback_info info)
278 {
279 EDMLOGI("BrowserAddon::GetSelfManagedBrowserPolicy start");
280 int32_t size = -1;
281 void* data = nullptr;
282 int32_t ret = BrowserProxy::GetBrowserProxy()->GetSelfManagedBrowserPolicy(&data, size);
283 if (FAILED(ret)) {
284 napi_throw(env, CreateError(env, ret));
285 return nullptr;
286 }
287 return CreateArrayBuffer(env, data, size);
288 }
289
SetPolicyCommon(napi_env env,napi_callback_info info,AsyncBrowserCallbackInfo * callbackInfo)290 napi_value BrowserAddon::SetPolicyCommon(napi_env env, napi_callback_info info, AsyncBrowserCallbackInfo* callbackInfo)
291 {
292 size_t argc = ARGS_SIZE_FOUR;
293 napi_value argv[ARGS_SIZE_FOUR] = {nullptr};
294 napi_value thisArg = nullptr;
295 void *data = nullptr;
296 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
297 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "Parameter count error");
298 bool matchFlag = MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object) &&
299 MatchValueType(env, argv[ARR_INDEX_ONE], napi_string) && MatchValueType(env, argv[ARR_INDEX_TWO], napi_string);
300
301 ASSERT_AND_THROW_PARAM_ERROR(env, matchFlag, "parameter type error");
302 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, callbackInfo->elementName, argv[ARR_INDEX_ZERO]),
303 "element name param error");
304 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, callbackInfo->appId, argv[ARR_INDEX_ONE]),
305 "Parameter appId error");
306 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, callbackInfo->policies, argv[ARR_INDEX_TWO]),
307 "Parameter policyName error");
308
309 EDMLOGD(
310 "setBrowserPolicy: elementName.bundlename %{public}s, "
311 "elementName.abilityname:%{public}s",
312 callbackInfo->elementName.GetBundleName().c_str(),
313 callbackInfo->elementName.GetAbilityName().c_str());
314
315 if (argc > ARGS_SIZE_THREE) {
316 callbackInfo->value = argv[ARR_INDEX_THREE];
317 }
318
319 napi_value ret;
320 napi_create_int32(env, ERR_OK, &ret);
321 return ret;
322 }
323
GetPoliciesCommon(napi_env env,napi_callback_info info,AsyncBrowserCallbackInfo * asyncCallbackInfo)324 napi_value BrowserAddon::GetPoliciesCommon(napi_env env, napi_callback_info info,
325 AsyncBrowserCallbackInfo* asyncCallbackInfo)
326 {
327 size_t argc = ARGS_SIZE_THREE;
328 napi_value argv[ARGS_SIZE_THREE] = {nullptr};
329 napi_value thisArg = nullptr;
330 void *data = nullptr;
331 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
332 ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "Parameter count error");
333 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "admin type error");
334 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "appId type error");
335
336 ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]),
337 "Parameter want error");
338 ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, asyncCallbackInfo->appId, argv[ARR_INDEX_ONE]),
339 "Parameter appId error");
340 EDMLOGD(
341 "GetPolicies::asyncCallbackInfo->elementName.bundlename %{public}s, "
342 "asyncCallbackInfo->abilityname:%{public}s",
343 asyncCallbackInfo->elementName.GetBundleName().c_str(),
344 asyncCallbackInfo->elementName.GetAbilityName().c_str());
345
346 if (argc > ARGS_SIZE_TWO) {
347 ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_function),
348 "callback type error");
349 asyncCallbackInfo->value = argv[ARR_INDEX_TWO];
350 }
351 napi_value ret;
352 napi_create_int32(env, ERR_OK, &ret);
353 return ret;
354 }
355
CreateArrayBuffer(napi_env env,void * data,int32_t size)356 napi_value BrowserAddon::CreateArrayBuffer(napi_env env, void* data, int32_t size)
357 {
358 if (data == nullptr) {
359 EDMLOGE("BrowserAddon::CreateArrayBuffer data null");
360 napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
361 return nullptr;
362 }
363 if (size < 0) {
364 EDMLOGE("BrowserAddon::CreateArrayBuffer size error.size:%{public}d", size);
365 napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
366 return nullptr;
367 }
368 napi_value result = nullptr;
369 void* arrayBufferData = nullptr;
370 NAPI_CALL(env, napi_create_arraybuffer(env, size, &arrayBufferData, &result));
371 if (arrayBufferData == nullptr) {
372 EDMLOGE("BrowserAddon::CreateArrayBuffer arrayBufferData null");
373 napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
374 free(data);
375 data = nullptr;
376 return nullptr;
377 }
378 errno_t cpRet = memcpy_s(arrayBufferData, size, data, size);
379 if (cpRet != EOK) {
380 EDMLOGE("BrowserAddon::CreateArrayBuffer memcpy_s fail.errcode:%{public}d, size:%{public}d", cpRet, size);
381 napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
382 free(data);
383 data = nullptr;
384 return nullptr;
385 }
386 free(data);
387 data = nullptr;
388 return result;
389 }
390
391 static napi_module g_browserModule = {
392 .nm_version = 1,
393 .nm_flags = 0,
394 .nm_filename = nullptr,
395 .nm_register_func = BrowserAddon::Init,
396 .nm_modname = "enterprise.browser",
397 .nm_priv = ((void *)0),
398 .reserved = {0},
399 };
400
BrowserRegister()401 extern "C" __attribute__((constructor)) void BrowserRegister()
402 {
403 napi_module_register(&g_browserModule);
404 }