• 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 "restrictions_addon.h"
17 
18 #include "edm_ipc_interface_code.h"
19 #include "edm_log.h"
20 
21 using namespace OHOS::EDM;
22 
23 std::map<int, RestrictionsAddon::RestrictionsProxySetFunc> RestrictionsAddon::memberSetFuncMap_ = {
24     {EdmInterfaceCode::DISABLED_PRINTER, &RestrictionsProxy::SetPrinterDisabled},
25     {EdmInterfaceCode::DISABLED_HDC, &RestrictionsProxy::SetHdcDisabled},
26     {EdmInterfaceCode::DISABLE_MICROPHONE, &RestrictionsProxy::DisableMicrophone},
27     {EdmInterfaceCode::FINGERPRINT_AUTH, &RestrictionsProxy::SetFingerprintAuthDisabled},
28 };
29 
30 std::map<int, RestrictionsAddon::RestrictionsProxyIsFunc> RestrictionsAddon::memberIsFuncMap_ = {
31     {EdmInterfaceCode::DISABLED_PRINTER, &RestrictionsProxy::IsPrinterDisabled},
32     {EdmInterfaceCode::DISABLED_HDC, &RestrictionsProxy::IsHdcDisabled},
33     {EdmInterfaceCode::DISABLE_MICROPHONE, &RestrictionsProxy::IsMicrophoneDisabled},
34     {EdmInterfaceCode::FINGERPRINT_AUTH, &RestrictionsProxy::IsFingerprintAuthDisabled},
35 };
36 
Init(napi_env env,napi_value exports)37 napi_value RestrictionsAddon::Init(napi_env env, napi_value exports)
38 {
39     napi_property_descriptor property[] = {
40         DECLARE_NAPI_FUNCTION("setPrinterDisabled", SetPrinterDisabled),
41         DECLARE_NAPI_FUNCTION("isPrinterDisabled", IsPrinterDisabled),
42         DECLARE_NAPI_FUNCTION("setHdcDisabled", SetHdcDisabled),
43         DECLARE_NAPI_FUNCTION("isHdcDisabled", IsHdcDisabled),
44         DECLARE_NAPI_FUNCTION("disableMicrophone", DisableMicrophone),
45         DECLARE_NAPI_FUNCTION("isMicrophoneDisabled", IsMicrophoneDisabled),
46         DECLARE_NAPI_FUNCTION("setFingerprintAuthDisabled", SetFingerprintAuthDisabled),
47         DECLARE_NAPI_FUNCTION("isFingerprintAuthDisabled", IsFingerprintAuthDisabled),
48     };
49     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
50     return exports;
51 }
52 
SetPrinterDisabled(napi_env env,napi_callback_info info)53 napi_value RestrictionsAddon::SetPrinterDisabled(napi_env env, napi_callback_info info)
54 {
55     return SetPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_PRINTER);
56 }
57 
SetHdcDisabled(napi_env env,napi_callback_info info)58 napi_value RestrictionsAddon::SetHdcDisabled(napi_env env, napi_callback_info info)
59 {
60     return SetPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_HDC);
61 }
62 
SetPolicyDisabled(napi_env env,napi_callback_info info,int policyCode)63 napi_value RestrictionsAddon::SetPolicyDisabled(napi_env env, napi_callback_info info, int policyCode)
64 {
65     EDMLOGI("NAPI_SetPolicyDisabled called");
66     size_t argc = ARGS_SIZE_THREE;
67     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
68     napi_value thisArg = nullptr;
69     void *data = nullptr;
70     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
71     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
72     bool hasAdmin = MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object);
73     ASSERT_AND_THROW_PARAM_ERROR(env, hasAdmin, "The first parameter must be want.");
74     bool hasPolicy = MatchValueType(env, argv[ARR_INDEX_ONE], napi_boolean);
75     ASSERT_AND_THROW_PARAM_ERROR(env, hasPolicy, "The second parameter must be bool.");
76     if (argc > ARGS_SIZE_TWO) {
77         bool hasCallback = MatchValueType(env, argv[ARR_INDEX_TWO], napi_function);
78         ASSERT_AND_THROW_PARAM_ERROR(env, hasCallback, "The third parameter must be function");
79     }
80     auto asyncCallbackInfo = new (std::nothrow) AsyncRestrictionsCallbackInfo();
81     if (asyncCallbackInfo == nullptr) {
82         return nullptr;
83     }
84     std::unique_ptr<AsyncRestrictionsCallbackInfo> callbackPtr{asyncCallbackInfo};
85     bool ret = ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]);
86     ASSERT_AND_THROW_PARAM_ERROR(env, ret, "element name param error");
87     EDMLOGD(
88         "SetPolicyDisabled: asyncCallbackInfo->elementName.bundlename %{public}s, "
89         "asyncCallbackInfo->abilityname:%{public}s",
90         asyncCallbackInfo->elementName.GetBundleName().c_str(),
91         asyncCallbackInfo->elementName.GetAbilityName().c_str());
92     ret = ParseBool(env, asyncCallbackInfo->isDisabled, argv[ARR_INDEX_ONE]);
93     ASSERT_AND_THROW_PARAM_ERROR(env, ret, "isDisabled param error");
94     if (argc > ARGS_SIZE_TWO) {
95         EDMLOGD("NAPI_SetPolicyDisabled argc == ARGS_SIZE_THREE");
96         napi_create_reference(env, argv[ARR_INDEX_TWO], NAPI_RETURN_ONE, &asyncCallbackInfo->callback);
97     }
98     asyncCallbackInfo->policyCode = policyCode;
99     napi_value asyncWorkReturn = HandleAsyncWork(env, asyncCallbackInfo, "SetPolicyDisabled", NativeSetPolicyDisabled,
100         NativeVoidCallbackComplete);
101     callbackPtr.release();
102     return asyncWorkReturn;
103 }
104 
NativeSetPolicyDisabled(napi_env env,void * data)105 void RestrictionsAddon::NativeSetPolicyDisabled(napi_env env, void *data)
106 {
107     EDMLOGI("NativeSetPolicyDisabled called");
108     if (data == nullptr) {
109         EDMLOGE("data is nullptr");
110         return;
111     }
112     AsyncRestrictionsCallbackInfo *asyncCallbackInfo = static_cast<AsyncRestrictionsCallbackInfo *>(data);
113     auto func = memberSetFuncMap_.find(asyncCallbackInfo->policyCode);
114     if (func != memberSetFuncMap_.end()) {
115         auto memberFunc = func->second;
116         auto proxy = RestrictionsProxy::GetRestrictionsProxy();
117         asyncCallbackInfo->ret =
118             (proxy.get()->*memberFunc)(asyncCallbackInfo->elementName, asyncCallbackInfo->isDisabled);
119     } else {
120         EDMLOGE("NativeSetPolicyDisabled failed");
121         asyncCallbackInfo->ret = EdmReturnErrCode::INTERFACE_UNSUPPORTED;
122     }
123 }
124 
IsPrinterDisabled(napi_env env,napi_callback_info info)125 napi_value RestrictionsAddon::IsPrinterDisabled(napi_env env, napi_callback_info info)
126 {
127     return IsPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_PRINTER);
128 }
129 
IsHdcDisabled(napi_env env,napi_callback_info info)130 napi_value RestrictionsAddon::IsHdcDisabled(napi_env env, napi_callback_info info)
131 {
132     return IsPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_HDC);
133 }
134 
IsPolicyDisabled(napi_env env,napi_callback_info info,int policyCode)135 napi_value RestrictionsAddon::IsPolicyDisabled(napi_env env, napi_callback_info info, int policyCode)
136 {
137     EDMLOGI("NAPI_IsPolicyDisabled called");
138     size_t argc = ARGS_SIZE_TWO;
139     napi_value argv[ARGS_SIZE_TWO] = {nullptr};
140     napi_value thisArg = nullptr;
141     void *data = nullptr;
142     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
143     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
144     auto asyncCallbackInfo = new (std::nothrow) AsyncRestrictionsCallbackInfo();
145     if (asyncCallbackInfo == nullptr) {
146         return nullptr;
147     }
148     std::unique_ptr<AsyncRestrictionsCallbackInfo> callbackPtr{asyncCallbackInfo};
149     bool matchFlag = false;
150     if (MatchValueType(env, argv[ARR_INDEX_ZERO], napi_null)) {
151         asyncCallbackInfo->hasAdmin = false;
152         matchFlag = true;
153     } else if (MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object)) {
154         matchFlag = true;
155         asyncCallbackInfo->hasAdmin = true;
156         bool ret = ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]);
157         ASSERT_AND_THROW_PARAM_ERROR(env, ret, "element name param error");
158         EDMLOGD(
159             "IsPolicyDisabled: asyncCallbackInfo->elementName.bundlename %{public}s, "
160             "asyncCallbackInfo->abilityname:%{public}s",
161             asyncCallbackInfo->elementName.GetBundleName().c_str(),
162             asyncCallbackInfo->elementName.GetAbilityName().c_str());
163     }
164     if (argc > ARGS_SIZE_ONE) {
165         matchFlag = matchFlag && MatchValueType(env, argv[ARR_INDEX_ONE], napi_function);
166     }
167     ASSERT_AND_THROW_PARAM_ERROR(env, matchFlag, "parameter type error");
168     if (argc > ARGS_SIZE_ONE) {
169         EDMLOGD("NAPI_IsPolicyDisabled argc == ARGS_SIZE_TWO");
170         napi_create_reference(env, argv[ARR_INDEX_ONE], NAPI_RETURN_ONE, &asyncCallbackInfo->callback);
171     }
172     asyncCallbackInfo->policyCode = policyCode;
173     napi_value asyncWorkReturn =
174         HandleAsyncWork(env, asyncCallbackInfo, "IsPolicyDisabled", NativeIsPolicyDisabled, NativeBoolCallbackComplete);
175     callbackPtr.release();
176     return asyncWorkReturn;
177 }
178 
NativeIsPolicyDisabled(napi_env env,void * data)179 void RestrictionsAddon::NativeIsPolicyDisabled(napi_env env, void *data)
180 {
181     EDMLOGI("NativeIsPolicyDisabled called");
182     if (data == nullptr) {
183         EDMLOGE("data is nullptr");
184         return;
185     }
186     AsyncRestrictionsCallbackInfo *asyncCallbackInfo = static_cast<AsyncRestrictionsCallbackInfo *>(data);
187     auto func = memberIsFuncMap_.find(asyncCallbackInfo->policyCode);
188     if (func != memberIsFuncMap_.end()) {
189         auto memberFunc = func->second;
190         auto proxy = RestrictionsProxy::GetRestrictionsProxy();
191         if (asyncCallbackInfo->hasAdmin) {
192             asyncCallbackInfo->ret =
193                 (proxy.get()->*memberFunc)(&(asyncCallbackInfo->elementName), asyncCallbackInfo->boolRet);
194         } else {
195             asyncCallbackInfo->ret = (proxy.get()->*memberFunc)(nullptr, asyncCallbackInfo->boolRet);
196         }
197     } else {
198         EDMLOGE("NativeIsPolicyDisabled error");
199         asyncCallbackInfo->ret = EdmReturnErrCode::INTERFACE_UNSUPPORTED;
200     }
201 }
202 
DisableMicrophone(napi_env env,napi_callback_info info)203 napi_value RestrictionsAddon::DisableMicrophone(napi_env env, napi_callback_info info)
204 {
205     return SetPolicyDisabledSync(env, info, EdmInterfaceCode::DISABLE_MICROPHONE);
206 }
207 
IsMicrophoneDisabled(napi_env env,napi_callback_info info)208 napi_value RestrictionsAddon::IsMicrophoneDisabled(napi_env env, napi_callback_info info)
209 {
210     return IsPolicyDisabledSync(env, info, EdmInterfaceCode::DISABLE_MICROPHONE);
211 }
212 
SetFingerprintAuthDisabled(napi_env env,napi_callback_info info)213 napi_value RestrictionsAddon::SetFingerprintAuthDisabled(napi_env env, napi_callback_info info)
214 {
215     return SetPolicyDisabledSync(env, info, EdmInterfaceCode::FINGERPRINT_AUTH);
216 }
217 
IsFingerprintAuthDisabled(napi_env env,napi_callback_info info)218 napi_value RestrictionsAddon::IsFingerprintAuthDisabled(napi_env env, napi_callback_info info)
219 {
220     return IsPolicyDisabledSync(env, info, EdmInterfaceCode::FINGERPRINT_AUTH);
221 }
222 
SetPolicyDisabledSync(napi_env env,napi_callback_info info,int policyCode)223 napi_value RestrictionsAddon::SetPolicyDisabledSync(napi_env env, napi_callback_info info, int policyCode)
224 {
225     EDMLOGI("NAPI_SetPolicyDisabledSync called");
226     size_t argc = ARGS_SIZE_TWO;
227     napi_value argv[ARGS_SIZE_TWO] = {nullptr};
228     napi_value thisArg = nullptr;
229     void *data = nullptr;
230     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
231     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
232     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
233     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_boolean), "parameter bool error");
234 
235     OHOS::AppExecFwk::ElementName elementName;
236     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
237         "element name param error");
238     bool isDisallow = false;
239     ASSERT_AND_THROW_PARAM_ERROR(env, ParseBool(env, isDisallow, argv[ARR_INDEX_ONE]), "bool name param error");
240     auto func = memberSetFuncMap_.find(policyCode);
241     if (func != memberSetFuncMap_.end()) {
242         auto memberFunc = func->second;
243         auto proxy = RestrictionsProxy::GetRestrictionsProxy();
244         ErrCode ret = (proxy.get()->*memberFunc)(elementName, isDisallow);
245         if (FAILED(ret)) {
246             napi_throw(env, CreateError(env, ret));
247             EDMLOGE("SetPolicyDisabledSync failed!");
248             return nullptr;
249         }
250     } else {
251         napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
252     }
253     return nullptr;
254 }
255 
IsPolicyDisabledSync(napi_env env,napi_callback_info info,int policyCode)256 napi_value RestrictionsAddon::IsPolicyDisabledSync(napi_env env, napi_callback_info info, int policyCode)
257 {
258     EDMLOGI("NAPI_IsPolicyDisabled called");
259     size_t argc = ARGS_SIZE_ONE;
260     napi_value argv[ARGS_SIZE_ONE] = {nullptr};
261     napi_value thisArg = nullptr;
262     void *data = nullptr;
263     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
264     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
265     bool hasAdmin = false;
266     OHOS::AppExecFwk::ElementName elementName;
267     ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
268         "param admin need be null or want");
269     ErrCode ret = ERR_OK;
270     bool boolRet = false;
271     auto func = memberIsFuncMap_.find(policyCode);
272     if (func != memberIsFuncMap_.end()) {
273         auto memberFunc = func->second;
274         auto proxy = RestrictionsProxy::GetRestrictionsProxy();
275         if (hasAdmin) {
276             ret = (proxy.get()->*memberFunc)(&(elementName), boolRet);
277         } else {
278             ret = (proxy.get()->*memberFunc)(nullptr, boolRet);
279         }
280     } else {
281         EDMLOGE("IsPolicyDisabledSync error");
282         napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
283         return nullptr;
284     }
285     if (FAILED(ret)) {
286         napi_throw(env, CreateError(env, ret));
287         EDMLOGE("SetPolicyDisabledSync failed!");
288         return nullptr;
289     }
290     napi_value result = nullptr;
291     napi_get_boolean(env, boolRet, &result);
292     return result;
293 }
294 
295 static napi_module g_restrictionsModule = {
296     .nm_version = 1,
297     .nm_flags = 0,
298     .nm_filename = nullptr,
299     .nm_register_func = RestrictionsAddon::Init,
300     .nm_modname = "enterprise.restrictions",
301     .nm_priv = ((void *)0),
302     .reserved = {0},
303 };
304 
RestrictionsRegister()305 extern "C" __attribute__((constructor)) void RestrictionsRegister()
306 {
307     napi_module_register(&g_restrictionsModule);
308 }
309