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