• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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 }