• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-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 "restrictions_addon.h"
17 
18 #include <algorithm>
19 #include <vector>
20 
21 #include "edm_constants.h"
22 #include "edm_ipc_interface_code.h"
23 #include "edm_log.h"
24 
25 using namespace OHOS::EDM;
26 
27 std::unordered_map<std::string, uint32_t> RestrictionsAddon::labelCodeMap = {
28     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_BLUETOOTH, EdmInterfaceCode::DISABLE_BLUETOOTH},
29     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MODIFY_DATETIME, EdmInterfaceCode::DISALLOW_MODIFY_DATETIME},
30     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_PRINTER, EdmInterfaceCode::DISABLED_PRINTER},
31     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_HDC, EdmInterfaceCode::DISABLED_HDC},
32     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MIC, EdmInterfaceCode::DISABLE_MICROPHONE},
33     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_FINGER_PRINT, EdmInterfaceCode::FINGERPRINT_AUTH},
34     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_USB, EdmInterfaceCode::DISABLE_USB},
35     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_WIFI, EdmInterfaceCode::DISABLE_WIFI},
36     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MTP_CLIENT, EdmInterfaceCode::DISABLE_MTP_CLIENT},
37     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MTP_SERVER, EdmInterfaceCode::DISABLE_MTP_SERVER},
38     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SAMBA_CLIENT, EdmInterfaceCode::DISABLE_SAMBA_CLIENT},
39     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SAMBA_SERVER, EdmInterfaceCode::DISABLE_SAMBA_SERVER},
40     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MAINTENANCE_MODE, EdmInterfaceCode::DISABLE_MAINTENANCE_MODE},
41     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_REMOTE_DESK, EdmInterfaceCode::POLICY_CODE_END + 25},
42     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_REMOTE_DIAGNOSIS, EdmInterfaceCode::POLICY_CODE_END + 26},
43     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SCREENSHOT, EdmInterfaceCode::POLICY_CODE_END + 11},
44     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SCREEN_RECORD, EdmInterfaceCode::POLICY_CODE_END + 12},
45     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_DISK_RECOVERY_KEY, EdmInterfaceCode::POLICY_CODE_END + 17},
46     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_NEAR_LINK, EdmInterfaceCode::POLICY_CODE_END + 18},
47     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_TETHERING, EdmInterfaceCode::DISALLOWED_TETHERING},
48     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_INACTIVE_USER_FREEZE, EdmInterfaceCode::INACTIVE_USER_FREEZE},
49     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_CAMERA, EdmInterfaceCode::DISABLE_CAMERA},
50     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_DEVELOPER_MODE, POLICY_CODE_END + 20},
51     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_RESET_FACTORY, POLICY_CODE_END + 21},
52     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_NFC, POLICY_CODE_END + 24},
53     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SMS, EdmInterfaceCode::DISALLOWED_SMS},
54     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MMS, EdmInterfaceCode::DISALLOWED_MMS},
55     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_BACKUP_AND_RESTORE,
56         EdmInterfaceCode::DISABLE_BACKUP_AND_RESTORE},
57     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MOBILE_DATA, EdmInterfaceCode::DISALLOWED_MOBILE_DATA},
58     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_AIRPLANE_MODE, EdmInterfaceCode::DISALLOWED_AIRPLANE_MODE},
59     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_NOTIFICATION, EdmInterfaceCode::DISALLOWED_NOTIFICATION},
60     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_TELEPHONY_CALL, EdmInterfaceCode::DISALLOWED_TELEPHONY_CALL},
61     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_VPN, EdmInterfaceCode::DISALLOW_VPN},
62     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_OTA, POLICY_CODE_END + EdmConstants::PolicyCode::DISABLE_OTA},
63     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_PRIVATE_SPACE, EdmInterfaceCode::DISABLE_PRIVATE_SPACE},
64 };
65 
66 std::unordered_map<std::string, uint32_t> RestrictionsAddon::itemCodeMap = {
67     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_APN, EdmInterfaceCode::DISALLOW_MODIFY_APN},
68     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_POWER_LONG_PRESS,
69         EdmInterfaceCode::DISALLOW_POWER_LONG_PRESS},
70     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SET_BIOMETRICS_AND_SCREENLOCK,
71         EdmInterfaceCode::DISABLE_SET_BIOMETRICS_AND_SCREENLOCK},
72     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SET_DEVICE_NAME,
73         EdmInterfaceCode::DISABLE_SET_DEVICE_NAME},
74     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_ETHERNET_IP, EdmInterfaceCode::DISALLOW_MODIFY_ETHERNET_IP},
75 };
76 
77 std::unordered_map<std::string, uint32_t> RestrictionsAddon::itemQueryCodeMap = {
78     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SET_BIOMETRICS_AND_SCREENLOCK,
79         EdmInterfaceCode::DISABLE_SET_BIOMETRICS_AND_SCREENLOCK},
80     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SET_DEVICE_NAME,
81         EdmInterfaceCode::DISABLE_SET_DEVICE_NAME},
82     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_ETHERNET_IP, EdmInterfaceCode::DISALLOW_MODIFY_ETHERNET_IP},
83 };
84 
85 std::vector<uint32_t> RestrictionsAddon::multiPermCodes = {
86     EdmInterfaceCode::DISABLE_BLUETOOTH,
87     EdmInterfaceCode::DISALLOW_MODIFY_DATETIME,
88     EdmInterfaceCode::DISABLED_PRINTER,
89     EdmInterfaceCode::DISABLED_HDC,
90     EdmInterfaceCode::DISABLE_USB,
91     EdmInterfaceCode::DISABLE_WIFI,
92 };
93 
94 std::unordered_map<std::string, uint32_t> RestrictionsAddon::labelCodeMapForAccount = {
95     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_FINGER_PRINT, EdmInterfaceCode::FINGERPRINT_AUTH},
96     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_MTP_CLIENT, EdmInterfaceCode::DISABLE_USER_MTP_CLIENT},
97     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_SUDO, EdmInterfaceCode::DISALLOWED_SUDO},
98     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_DISTRIBUTED_TRANSMISSION,
99         EdmInterfaceCode::DISALLOWED_DISTRIBUTED_TRANSMISSION},
100     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_EXPORT_RECOVERY_KEY,
101         EdmInterfaceCode::DISALLOWED_EXPORT_RECOVERY_KEY},
102     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_USB_STORAGE_DEVICE_WRITE,
103         EdmInterfaceCode::DISALLOWED_USB_STORAGE_DEVICE_WRITE},
104     {EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_PRINT, EdmInterfaceCode::DISABLED_PRINT},
105 };
106 
Init(napi_env env,napi_value exports)107 napi_value RestrictionsAddon::Init(napi_env env, napi_value exports)
108 {
109     napi_property_descriptor property[] = {
110         DECLARE_NAPI_FUNCTION("setPrinterDisabled", SetPrinterDisabled),
111         DECLARE_NAPI_FUNCTION("isPrinterDisabled", IsPrinterDisabled),
112         DECLARE_NAPI_FUNCTION("setHdcDisabled", SetHdcDisabled),
113         DECLARE_NAPI_FUNCTION("isHdcDisabled", IsHdcDisabled),
114         DECLARE_NAPI_FUNCTION("disableMicrophone", DisableMicrophone),
115         DECLARE_NAPI_FUNCTION("isMicrophoneDisabled", IsMicrophoneDisabled),
116         DECLARE_NAPI_FUNCTION("setFingerprintAuthDisabled", SetFingerprintAuthDisabled),
117         DECLARE_NAPI_FUNCTION("isFingerprintAuthDisabled", IsFingerprintAuthDisabled),
118         DECLARE_NAPI_FUNCTION("setDisallowedPolicy", SetDisallowedPolicy),
119         DECLARE_NAPI_FUNCTION("getDisallowedPolicy", GetDisallowedPolicy),
120         DECLARE_NAPI_FUNCTION("setDisallowedPolicyForAccount", SetDisallowedPolicyForAccount),
121         DECLARE_NAPI_FUNCTION("getDisallowedPolicyForAccount", GetDisallowedPolicyForAccount),
122         DECLARE_NAPI_FUNCTION("addDisallowedListForAccount", AddDisallowedListForAccount),
123         DECLARE_NAPI_FUNCTION("removeDisallowedListForAccount", RemoveDisallowedListForAccount),
124         DECLARE_NAPI_FUNCTION("getDisallowedListForAccount", GetDisallowedListForAccount),
125         DECLARE_NAPI_FUNCTION("setUserRestriction", SetUserRestriction),
126         DECLARE_NAPI_FUNCTION("getUserRestricted", GetUserRestricted),
127     };
128     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property));
129     return exports;
130 }
131 
SetPrinterDisabled(napi_env env,napi_callback_info info)132 napi_value RestrictionsAddon::SetPrinterDisabled(napi_env env, napi_callback_info info)
133 {
134     return SetPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_PRINTER);
135 }
136 
SetHdcDisabled(napi_env env,napi_callback_info info)137 napi_value RestrictionsAddon::SetHdcDisabled(napi_env env, napi_callback_info info)
138 {
139     return SetPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_HDC);
140 }
141 
SetPolicyDisabledCommon(AddonMethodSign & addonMethodSign,int policyCode)142 void RestrictionsAddon::SetPolicyDisabledCommon(AddonMethodSign &addonMethodSign, int policyCode)
143 {
144     addonMethodSign.name = "SetPolicyDisabled";
145     addonMethodSign.argsType = {EdmAddonCommonType::ELEMENT, EdmAddonCommonType::BOOLEAN};
146     addonMethodSign.methodAttribute = MethodAttribute::HANDLE;
147     addonMethodSign.policyCode = policyCode;
148     std::string permissionTag = (std::find(multiPermCodes.begin(), multiPermCodes.end(),
149         policyCode) == multiPermCodes.end()) ? WITHOUT_PERMISSION_TAG : EdmConstants::PERMISSION_TAG_VERSION_11;
150     addonMethodSign.apiVersionTag = permissionTag;
151 }
152 
SetPolicyDisabled(napi_env env,napi_callback_info info,int policyCode)153 napi_value RestrictionsAddon::SetPolicyDisabled(napi_env env, napi_callback_info info, int policyCode)
154 {
155     EDMLOGI("NAPI_SetPolicyDisabled called");
156     AddonMethodSign addonMethodSign;
157     SetPolicyDisabledCommon(addonMethodSign, policyCode);
158     return AddonMethodAdapter(env, info, addonMethodSign, NativeSetPolicyDisabled, NativeVoidCallbackComplete);
159 }
160 
NativeSetPolicyDisabled(napi_env env,void * data)161 void RestrictionsAddon::NativeSetPolicyDisabled(napi_env env, void *data)
162 {
163     EDMLOGI("NativeSetPolicyDisabled called");
164     if (data == nullptr) {
165         EDMLOGE("data is nullptr");
166         return;
167     }
168     AdapterAddonData *asyncCallbackInfo = static_cast<AdapterAddonData *>(data);
169     asyncCallbackInfo->ret = RestrictionsProxy::GetRestrictionsProxy()->SetDisallowedPolicy(
170         asyncCallbackInfo->data, asyncCallbackInfo->policyCode);
171 }
172 
IsPrinterDisabled(napi_env env,napi_callback_info info)173 napi_value RestrictionsAddon::IsPrinterDisabled(napi_env env, napi_callback_info info)
174 {
175     return IsPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_PRINTER);
176 }
177 
IsHdcDisabled(napi_env env,napi_callback_info info)178 napi_value RestrictionsAddon::IsHdcDisabled(napi_env env, napi_callback_info info)
179 {
180     return IsPolicyDisabled(env, info, EdmInterfaceCode::DISABLED_HDC);
181 }
182 
IsPolicyDisabled(napi_env env,napi_callback_info info,int policyCode)183 napi_value RestrictionsAddon::IsPolicyDisabled(napi_env env, napi_callback_info info, int policyCode)
184 {
185     EDMLOGI("NAPI_IsPolicyDisabled called");
186     size_t argc = ARGS_SIZE_TWO;
187     napi_value argv[ARGS_SIZE_TWO] = {nullptr};
188     napi_value thisArg = nullptr;
189     void *data = nullptr;
190     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
191     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
192     auto asyncCallbackInfo = new (std::nothrow) AsyncRestrictionsCallbackInfo();
193     if (asyncCallbackInfo == nullptr) {
194         return nullptr;
195     }
196     std::unique_ptr<AsyncRestrictionsCallbackInfo> callbackPtr{asyncCallbackInfo};
197     bool matchFlag = false;
198     if (MatchValueType(env, argv[ARR_INDEX_ZERO], napi_null)) {
199         asyncCallbackInfo->hasAdmin = false;
200         matchFlag = true;
201     } else if (MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object)) {
202         matchFlag = true;
203         asyncCallbackInfo->hasAdmin = true;
204         bool ret = ParseElementName(env, asyncCallbackInfo->elementName, argv[ARR_INDEX_ZERO]);
205         ASSERT_AND_THROW_PARAM_ERROR(env, ret, "element name param error");
206         EDMLOGD(
207             "IsPolicyDisabled: asyncCallbackInfo->elementName.bundlename %{public}s, "
208             "asyncCallbackInfo->abilityname:%{public}s",
209             asyncCallbackInfo->elementName.GetBundleName().c_str(),
210             asyncCallbackInfo->elementName.GetAbilityName().c_str());
211     }
212     if (argc > ARGS_SIZE_ONE) {
213         matchFlag = matchFlag && MatchValueType(env, argv[ARR_INDEX_ONE], napi_function);
214     }
215     ASSERT_AND_THROW_PARAM_ERROR(env, matchFlag, "parameter type error");
216     if (argc > ARGS_SIZE_ONE) {
217         EDMLOGD("NAPI_IsPolicyDisabled argc == ARGS_SIZE_TWO");
218         NAPI_CALL(env, napi_create_reference(env, argv[ARR_INDEX_ONE], NAPI_RETURN_ONE, &asyncCallbackInfo->callback));
219     }
220     asyncCallbackInfo->policyCode = policyCode;
221     napi_value asyncWorkReturn =
222         HandleAsyncWork(env, asyncCallbackInfo, "IsPolicyDisabled", NativeIsPolicyDisabled, NativeBoolCallbackComplete);
223     callbackPtr.release();
224     return asyncWorkReturn;
225 }
226 
NativeIsPolicyDisabled(napi_env env,void * data)227 void RestrictionsAddon::NativeIsPolicyDisabled(napi_env env, void *data)
228 {
229     EDMLOGI("NativeIsPolicyDisabled called");
230     if (data == nullptr) {
231         EDMLOGE("data is nullptr");
232         return;
233     }
234     AsyncRestrictionsCallbackInfo *asyncCallbackInfo = static_cast<AsyncRestrictionsCallbackInfo *>(data);
235     std::string permissionTag = (std::find(multiPermCodes.begin(), multiPermCodes.end(),
236         asyncCallbackInfo->policyCode) == multiPermCodes.end()) ? WITHOUT_PERMISSION_TAG :
237         EdmConstants::PERMISSION_TAG_VERSION_11;
238     if (asyncCallbackInfo->hasAdmin) {
239         asyncCallbackInfo->ret = RestrictionsProxy::GetRestrictionsProxy()->GetDisallowedPolicy(
240             &(asyncCallbackInfo->elementName), asyncCallbackInfo->policyCode, asyncCallbackInfo->boolRet,
241             permissionTag);
242     } else {
243         asyncCallbackInfo->ret = RestrictionsProxy::GetRestrictionsProxy()->GetDisallowedPolicy(
244             nullptr, asyncCallbackInfo->policyCode, asyncCallbackInfo->boolRet, permissionTag);
245     }
246 }
247 
DisableMicrophone(napi_env env,napi_callback_info info)248 napi_value RestrictionsAddon::DisableMicrophone(napi_env env, napi_callback_info info)
249 {
250     return SetPolicyDisabledSync(env, info, EdmInterfaceCode::DISABLE_MICROPHONE);
251 }
252 
IsMicrophoneDisabled(napi_env env,napi_callback_info info)253 napi_value RestrictionsAddon::IsMicrophoneDisabled(napi_env env, napi_callback_info info)
254 {
255     return IsPolicyDisabledSync(env, info, EdmInterfaceCode::DISABLE_MICROPHONE);
256 }
257 
SetFingerprintAuthDisabled(napi_env env,napi_callback_info info)258 napi_value RestrictionsAddon::SetFingerprintAuthDisabled(napi_env env, napi_callback_info info)
259 {
260     EDMLOGI("SetFingerprintAuthDisabled called");
261     size_t argc = ARGS_SIZE_TWO;
262     napi_value argv[ARGS_SIZE_TWO] = {nullptr};
263     napi_value thisArg = nullptr;
264     void *data = nullptr;
265     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
266     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
267     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
268     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_boolean),
269         "parameter disallow error");
270     OHOS::AppExecFwk::ElementName elementName;
271     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
272         "element name param error");
273     EDMLOGD("SetFingerprintAuthDisabled: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
274         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
275     bool disallow = false;
276     ASSERT_AND_THROW_PARAM_ERROR(env, ParseBool(env, disallow, argv[ARR_INDEX_ONE]), "parameter disallow parse error");
277 
278     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
279     if (proxy == nullptr) {
280         EDMLOGE("can not get RestrictionsProxy");
281         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
282         return nullptr;
283     }
284     ErrCode ret = proxy->SetFingerprintAuthDisabled(elementName, disallow);
285     if (FAILED(ret)) {
286         napi_throw(env, CreateError(env, ret));
287     }
288     return nullptr;
289 }
290 
IsFingerprintAuthDisabled(napi_env env,napi_callback_info info)291 napi_value RestrictionsAddon::IsFingerprintAuthDisabled(napi_env env, napi_callback_info info)
292 {
293     EDMLOGI("NAPI_IsFingerprintAuthDisabled called");
294     size_t argc = ARGS_SIZE_ONE;
295     napi_value argv[ARGS_SIZE_ONE] = {nullptr};
296     napi_value thisArg = nullptr;
297     void *data = nullptr;
298     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
299     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
300     bool hasAdmin = false;
301     OHOS::AppExecFwk::ElementName elementName;
302     ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
303         "param admin need be null or want");
304     EDMLOGD("IsFingerprintAuthDisabled: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
305         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
306 
307     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
308     if (proxy == nullptr) {
309         EDMLOGE("can not get RestrictionsProxy");
310         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
311         return nullptr;
312     }
313     bool disallow = false;
314     ErrCode ret;
315     if (hasAdmin) {
316         ret = proxy->IsFingerprintAuthDisabled(&elementName, disallow);
317     } else {
318         ret = proxy->IsFingerprintAuthDisabled(nullptr, disallow);
319     }
320     if (FAILED(ret)) {
321         napi_throw(env, CreateError(env, ret));
322         return nullptr;
323     }
324     napi_value result = nullptr;
325     NAPI_CALL(env, napi_get_boolean(env, disallow, &result));
326     return result;
327 }
328 
SetPolicyDisabledSync(napi_env env,napi_callback_info info,int policyCode)329 napi_value RestrictionsAddon::SetPolicyDisabledSync(napi_env env, napi_callback_info info, int policyCode)
330 {
331     EDMLOGI("NAPI_SetPolicyDisabledSync called");
332     AddonMethodSign addonMethodSign;
333     SetPolicyDisabledCommon(addonMethodSign, policyCode);
334 
335     AdapterAddonData adapterAddonData{};
336     if (JsObjectToData(env, info, addonMethodSign, &adapterAddonData) == nullptr) {
337         return nullptr;
338     }
339     ErrCode ret = RestrictionsProxy::GetRestrictionsProxy()->SetDisallowedPolicy(adapterAddonData.data, policyCode);
340     if (FAILED(ret)) {
341         napi_throw(env, CreateError(env, ret));
342     }
343     return nullptr;
344 }
345 
IsPolicyDisabledSync(napi_env env,napi_callback_info info,int policyCode)346 napi_value RestrictionsAddon::IsPolicyDisabledSync(napi_env env, napi_callback_info info, int policyCode)
347 {
348     EDMLOGI("NAPI_IsPolicyDisabled called");
349     size_t argc = ARGS_SIZE_ONE;
350     napi_value argv[ARGS_SIZE_ONE] = {nullptr};
351     napi_value thisArg = nullptr;
352     void *data = nullptr;
353     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
354     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_ONE, "parameter count error");
355     bool hasAdmin = false;
356     OHOS::AppExecFwk::ElementName elementName;
357     ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
358         "param admin need be null or want");
359     ErrCode ret = ERR_OK;
360     bool boolRet = false;
361     std::string permissionTag = (std::find(multiPermCodes.begin(), multiPermCodes.end(),
362         policyCode) == multiPermCodes.end()) ? WITHOUT_PERMISSION_TAG : EdmConstants::PERMISSION_TAG_VERSION_11;
363     if (hasAdmin) {
364         ret = RestrictionsProxy::GetRestrictionsProxy()->GetDisallowedPolicy(&elementName, policyCode, boolRet,
365             permissionTag);
366     } else {
367         ret = RestrictionsProxy::GetRestrictionsProxy()->GetDisallowedPolicy(nullptr, policyCode, boolRet,
368             permissionTag);
369     }
370     if (FAILED(ret)) {
371         napi_throw(env, CreateError(env, ret));
372         EDMLOGE("SetPolicyDisabledSync failed!");
373         return nullptr;
374     }
375     napi_value result = nullptr;
376     NAPI_CALL(env, napi_get_boolean(env, boolRet, &result));
377     return result;
378 }
379 
SetDisallowedPolicy(napi_env env,napi_callback_info info)380 napi_value RestrictionsAddon::SetDisallowedPolicy(napi_env env, napi_callback_info info)
381 {
382     EDMLOGI("NAPI_SetDisallowedPolicy called");
383     size_t argc = ARGS_SIZE_THREE;
384     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
385     napi_value thisArg = nullptr;
386     void *data = nullptr;
387     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
388     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "parameter count error");
389     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
390     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter feature error");
391     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_boolean),
392         "parameter disallow error");
393     OHOS::AppExecFwk::ElementName elementName;
394     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
395         "element name param error");
396     EDMLOGD("SetDisallowedPolicy: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
397         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
398     std::string feature;
399     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, feature, argv[ARR_INDEX_ONE]), "parameter feature parse error");
400     bool disallow = false;
401     ASSERT_AND_THROW_PARAM_ERROR(env, ParseBool(env, disallow, argv[ARR_INDEX_TWO]), "parameter disallow parse error");
402 
403     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
404     if (proxy == nullptr) {
405         EDMLOGE("can not get RestrictionsProxy");
406         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
407         return nullptr;
408     }
409     ErrCode ret = ERR_OK;
410     if (feature == EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_FINGER_PRINT) {
411         ret = proxy->SetFingerprintAuthDisabled(elementName, disallow);
412     } else {
413         auto labelCode = labelCodeMap.find(feature);
414         if (labelCode == labelCodeMap.end()) {
415             napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
416             return nullptr;
417         }
418         std::uint32_t ipcCode = labelCode->second;
419         std::string permissionTag = (std::find(multiPermCodes.begin(), multiPermCodes.end(),
420             ipcCode) == multiPermCodes.end()) ? WITHOUT_PERMISSION_TAG : EdmConstants::PERMISSION_TAG_VERSION_12;
421         ret = proxy->SetDisallowedPolicy(elementName, disallow, ipcCode, permissionTag);
422     }
423     if (FAILED(ret)) {
424         napi_throw(env, CreateError(env, ret));
425     }
426     return nullptr;
427 }
428 
GetDisallowedPolicy(napi_env env,napi_callback_info info)429 napi_value RestrictionsAddon::GetDisallowedPolicy(napi_env env, napi_callback_info info)
430 {
431     size_t argc = ARGS_SIZE_TWO;
432     napi_value argv[ARGS_SIZE_TWO] = {nullptr};
433     napi_value thisArg = nullptr;
434     void *data = nullptr;
435     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
436     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
437     bool hasAdmin = false;
438     OHOS::AppExecFwk::ElementName elementName;
439     ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
440         "param admin need be null or want");
441     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter feature error");
442     std::string feature;
443     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, feature, argv[ARR_INDEX_ONE]), "parameter feature parse error");
444     if (hasAdmin) {
445         EDMLOGD("GetDisallowedPolicy: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
446             elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
447     } else {
448         EDMLOGD("GetDisallowedPolicy: elementName is null");
449     }
450 
451     bool disallow = false;
452     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
453     if (proxy == nullptr) {
454         EDMLOGE("can not get RestrictionsProxy");
455         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
456         return nullptr;
457     }
458     ErrCode ret = ERR_OK;
459     if (feature == EdmConstants::Restrictions::LABEL_DISALLOWED_POLICY_FINGER_PRINT) {
460         ret = proxy->IsFingerprintAuthDisabled(hasAdmin ? &elementName : nullptr, disallow);
461     } else {
462         auto labelCode = labelCodeMap.find(feature);
463         if (labelCode == labelCodeMap.end()) {
464             napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
465             return nullptr;
466         }
467         std::uint32_t ipcCode = labelCode->second;
468         std::string permissionTag = (std::find(multiPermCodes.begin(), multiPermCodes.end(),
469             ipcCode) == multiPermCodes.end()) ? WITHOUT_PERMISSION_TAG : EdmConstants::PERMISSION_TAG_VERSION_12;
470         ret = proxy->GetDisallowedPolicy(hasAdmin ? &elementName : nullptr, ipcCode, disallow, permissionTag);
471     }
472 
473     if (FAILED(ret)) {
474         napi_throw(env, CreateError(env, ret));
475         return nullptr;
476     }
477     napi_value result = nullptr;
478     NAPI_CALL(env, napi_get_boolean(env, disallow, &result));
479     return result;
480 }
481 
SetDisallowedPolicyForAccount(napi_env env,napi_callback_info info)482 napi_value RestrictionsAddon::SetDisallowedPolicyForAccount(napi_env env, napi_callback_info info)
483 {
484     EDMLOGI("NAPI_SetDisallowedPolicyForAccount called");
485     size_t argc = ARGS_SIZE_FOUR;
486     napi_value argv[ARGS_SIZE_FOUR] = {nullptr};
487     napi_value thisArg = nullptr;
488     void *data = nullptr;
489     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
490     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_FOUR, "parameter count error");
491     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
492     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter feature error");
493     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_boolean),
494         "parameter disallow error");
495     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_THREE], napi_number),
496         "parameter accountId error");
497     OHOS::AppExecFwk::ElementName elementName;
498     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
499         "element name param error");
500     EDMLOGD("SetDisallowedPolicy: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
501         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
502     std::string feature;
503     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, feature, argv[ARR_INDEX_ONE]), "parameter feature parse error");
504     bool disallow = false;
505     ASSERT_AND_THROW_PARAM_ERROR(env, ParseBool(env, disallow, argv[ARR_INDEX_TWO]), "parameter disallow parse error");
506     int32_t accountId = -1;
507     ASSERT_AND_THROW_PARAM_ERROR(env, ParseInt(env, accountId, argv[ARR_INDEX_THREE]),
508         "parameter accountId parse error");
509 
510     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
511     if (proxy == nullptr) {
512         EDMLOGE("can not get RestrictionsProxy");
513         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
514         return nullptr;
515     }
516     auto labelCode = labelCodeMapForAccount.find(feature);
517     if (labelCode == labelCodeMapForAccount.end()) {
518         napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
519         return nullptr;
520     }
521     std::uint32_t ipcCode = labelCode->second;
522     std::string permissionTag = WITHOUT_PERMISSION_TAG;
523     ErrCode ret;
524     if (ipcCode == EdmInterfaceCode::FINGERPRINT_AUTH) {
525         ret = proxy->SetFingerprintAuthDisallowedPolicyForAccount(elementName, disallow,
526             ipcCode, permissionTag, accountId);
527     } else {
528         ret = proxy->SetDisallowedPolicyForAccount(elementName, disallow, ipcCode, permissionTag, accountId);
529     }
530     if (FAILED(ret)) {
531         napi_throw(env, CreateError(env, ret));
532     }
533     return nullptr;
534 }
535 
GetDisallowedPolicyForAccount(napi_env env,napi_callback_info info)536 napi_value RestrictionsAddon::GetDisallowedPolicyForAccount(napi_env env, napi_callback_info info)
537 {
538     EDMLOGI("NAPI_GetDisallowedPolicyForAccount called");
539     size_t argc = ARGS_SIZE_THREE;
540     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
541     napi_value thisArg = nullptr;
542     void *data = nullptr;
543     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
544     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "parameter count error");
545     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string), "parameter feature error");
546     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_number),
547         "parameter accountId error");
548     bool hasAdmin = false;
549     OHOS::AppExecFwk::ElementName elementName;
550     ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
551         "param admin need be null or want");
552     EDMLOGD("SetDisallowedPolicy: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
553         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
554     std::string feature;
555     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, feature, argv[ARR_INDEX_ONE]), "parameter feature parse error");
556     int32_t accountId = -1;
557     ASSERT_AND_THROW_PARAM_ERROR(env, ParseInt(env, accountId, argv[ARR_INDEX_TWO]), "parameter accountId parse error");
558 
559     auto labelCode = labelCodeMapForAccount.find(feature);
560     if (labelCode == labelCodeMapForAccount.end()) {
561         napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
562         return nullptr;
563     }
564     std::uint32_t ipcCode = labelCode->second;
565     bool disallow = false;
566     ErrCode ret = NativeGetDisallowedPolicyForAccount(hasAdmin, elementName, ipcCode, accountId, disallow);
567     if (FAILED(ret)) {
568         napi_throw(env, CreateError(env, ret));
569         return nullptr;
570     }
571     napi_value result = nullptr;
572     NAPI_CALL(env, napi_get_boolean(env, disallow, &result));
573     return result;
574 }
575 
NativeGetDisallowedPolicyForAccount(bool hasAdmin,AppExecFwk::ElementName & elementName,std::uint32_t ipcCode,int32_t accountId,bool & disallow)576 OHOS::ErrCode RestrictionsAddon::NativeGetDisallowedPolicyForAccount(bool hasAdmin,
577     AppExecFwk::ElementName &elementName, std::uint32_t ipcCode, int32_t accountId, bool &disallow)
578 {
579     std::string permissionTag = WITHOUT_PERMISSION_TAG;
580     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
581     if (proxy == nullptr) {
582         EDMLOGE("can not get RestrictionsProxy");
583         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
584     }
585     if (ipcCode == EdmInterfaceCode::FINGERPRINT_AUTH) {
586         if (hasAdmin) {
587             return proxy->GetFingerprintAuthDisallowedPolicyForAccount(&elementName, ipcCode,
588                 disallow, permissionTag, accountId);
589         } else {
590             return proxy->GetFingerprintAuthDisallowedPolicyForAccount(nullptr, ipcCode,
591                 disallow, permissionTag, accountId);
592         }
593     } else {
594         if (!hasAdmin) {
595             return EdmReturnErrCode::PARAM_ERROR;
596         }
597         return proxy->GetDisallowedPolicyForAccount(elementName, ipcCode, disallow, permissionTag, accountId);
598     }
599 }
600 
AddDisallowedListForAccount(napi_env env,napi_callback_info info)601 napi_value RestrictionsAddon::AddDisallowedListForAccount(napi_env env, napi_callback_info info)
602 {
603     return AddOrRemoveDisallowedListForAccount(env, info, true);
604 }
605 
RemoveDisallowedListForAccount(napi_env env,napi_callback_info info)606 napi_value RestrictionsAddon::RemoveDisallowedListForAccount(napi_env env, napi_callback_info info)
607 {
608     return AddOrRemoveDisallowedListForAccount(env, info, false);
609 }
610 
GetDisallowedListForAccount(napi_env env,napi_callback_info info)611 napi_value RestrictionsAddon::GetDisallowedListForAccount(napi_env env, napi_callback_info info)
612 {
613     EDMLOGI("NAPI_GetDisallowedListForAccount called");
614     size_t argc = ARGS_SIZE_THREE;
615     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
616     napi_value thisArg = nullptr;
617     void *data = nullptr;
618     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
619     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "parameter count error");
620     OHOS::AppExecFwk::ElementName elementName;
621     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
622         "param admin need be want");
623     std::string feature;
624     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, feature, argv[ARR_INDEX_ONE]), "parameter feature parse error");
625 
626     int32_t accountId = -1;
627     ASSERT_AND_THROW_PARAM_ERROR(env, ParseInt(env, accountId, argv[ARR_INDEX_TWO]), "parameter accountId parse error");
628 
629     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
630     if (proxy == nullptr) {
631         EDMLOGE("can not get RestrictionsProxy");
632         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
633         return nullptr;
634     }
635     std::vector<std::string> resultArray;
636     ErrCode ret = proxy->GetDisallowedListForAccount(elementName, feature, accountId, resultArray);
637     if (FAILED(ret)) {
638         napi_throw(env, CreateError(env, ret));
639         return nullptr;
640     }
641     napi_value result = nullptr;
642     NAPI_CALL(env, napi_create_array(env, &result));
643     ConvertStringVectorToJS(env, resultArray, result);
644     return result;
645 }
646 
AddOrRemoveDisallowedListForAccount(napi_env env,napi_callback_info info,bool isAdd)647 napi_value RestrictionsAddon::AddOrRemoveDisallowedListForAccount(napi_env env, napi_callback_info info,
648     bool isAdd)
649 {
650     EDMLOGI("NAPI_AddOrRemoveDisallowedListForAccount called");
651     size_t argc = ARGS_SIZE_FOUR;
652     napi_value argv[ARGS_SIZE_FOUR] = {nullptr};
653     napi_value thisArg = nullptr;
654     void *data = nullptr;
655     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
656     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_FOUR, "parameter count error");
657     OHOS::AppExecFwk::ElementName elementName;
658     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
659         "element name param error");
660     EDMLOGD("SetDisallowedPolicy: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
661         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
662     std::string feature;
663     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, feature, argv[ARR_INDEX_ONE]), "parameter feature parse error");
664     std::vector<std::string> bundleNameArray;
665     ASSERT_AND_THROW_PARAM_ERROR(env, ParseStringArray(env, bundleNameArray, argv[ARR_INDEX_TWO]),
666         "parameter bundle name error");
667     int32_t accountId = 0;
668     ASSERT_AND_THROW_PARAM_ERROR(env, ParseInt(env, accountId, argv[ARR_INDEX_THREE]),
669         "parameter accountId parse error");
670 
671     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
672     if (proxy == nullptr) {
673         EDMLOGE("can not get RestrictionsProxy");
674         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
675         return nullptr;
676     }
677     ErrCode ret = proxy->AddOrRemoveDisallowedListForAccount(elementName, feature, bundleNameArray, accountId, isAdd);
678     if (FAILED(ret)) {
679         napi_throw(env, CreateError(env, ret));
680     }
681     return nullptr;
682 }
683 
SetUserRestriction(napi_env env,napi_callback_info info)684 napi_value RestrictionsAddon::SetUserRestriction(napi_env env, napi_callback_info info)
685 {
686     EDMLOGI("NAPI_SetUserRestriction called");
687     size_t argc = ARGS_SIZE_THREE;
688     napi_value argv[ARGS_SIZE_THREE] = {nullptr};
689     napi_value thisArg = nullptr;
690     void *data = nullptr;
691     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
692     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_THREE, "parameter count error");
693     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object), "parameter admin error");
694     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string),
695         "parameter settingsItem error");
696     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_TWO], napi_boolean),
697         "parameter disallow error");
698     OHOS::AppExecFwk::ElementName elementName;
699     ASSERT_AND_THROW_PARAM_ERROR(env, ParseElementName(env, elementName, argv[ARR_INDEX_ZERO]),
700         "element name param error");
701     EDMLOGD("SetUserRestriction: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
702         elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
703     std::string settingsItem;
704     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, settingsItem, argv[ARR_INDEX_ONE]),
705         "parameter settingsItem parse error");
706     bool disallow = false;
707     ASSERT_AND_THROW_PARAM_ERROR(env, ParseBool(env, disallow, argv[ARR_INDEX_TWO]), "parameter disallow parse error");
708 
709     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
710     if (proxy == nullptr) {
711         EDMLOGE("can not get RestrictionsProxy");
712         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
713         return nullptr;
714     }
715     ErrCode ret = ERR_OK;
716     auto itemCode = itemCodeMap.find(settingsItem);
717     if (itemCode == itemCodeMap.end()) {
718         napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
719         return nullptr;
720     }
721     std::uint32_t ipcCode = itemCode->second;
722     ret = proxy->SetUserRestriction(elementName, disallow, ipcCode);
723     if (FAILED(ret)) {
724         napi_throw(env, CreateError(env, ret));
725     }
726     return nullptr;
727 }
728 
GetUserRestricted(napi_env env,napi_callback_info info)729 napi_value RestrictionsAddon::GetUserRestricted(napi_env env, napi_callback_info info)
730 {
731     EDMLOGI("NAPI_GetUserRestricted called");
732     size_t argc = ARGS_SIZE_TWO;
733     napi_value argv[ARGS_SIZE_TWO] = {nullptr};
734     napi_value thisArg = nullptr;
735     void *data = nullptr;
736     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisArg, &data));
737     ASSERT_AND_THROW_PARAM_ERROR(env, argc >= ARGS_SIZE_TWO, "parameter count error");
738     bool hasAdmin = false;
739     OHOS::AppExecFwk::ElementName elementName;
740     ASSERT_AND_THROW_PARAM_ERROR(env, CheckGetPolicyAdminParam(env, argv[ARR_INDEX_ZERO], hasAdmin, elementName),
741         "param admin need be null or want");
742     ASSERT_AND_THROW_PARAM_ERROR(env, MatchValueType(env, argv[ARR_INDEX_ONE], napi_string),
743         "parameter settingsItem error");
744     std::string settingsItem;
745     ASSERT_AND_THROW_PARAM_ERROR(env, ParseString(env, settingsItem, argv[ARR_INDEX_ONE]),
746         "parameter settingsItem parse error");
747     if (hasAdmin) {
748         EDMLOGD("GetUserRestricted: elementName.bundleName %{public}s, elementName.abilityName:%{public}s",
749             elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
750     } else {
751         EDMLOGD("GetUserRestricted: elementName is null");
752     }
753 
754     auto proxy = RestrictionsProxy::GetRestrictionsProxy();
755     if (proxy == nullptr) {
756         EDMLOGE("can not get RestrictionsProxy");
757         napi_throw(env, CreateError(env, EdmReturnErrCode::SYSTEM_ABNORMALLY));
758         return nullptr;
759     }
760 
761     auto itemCode = itemQueryCodeMap.find(settingsItem);
762     if (itemCode == itemQueryCodeMap.end()) {
763         napi_throw(env, CreateError(env, EdmReturnErrCode::INTERFACE_UNSUPPORTED));
764         return nullptr;
765     }
766     std::uint32_t ipcCode = itemCode->second;
767 
768     bool restricted = false;
769     ErrCode ret = proxy->GetUserRestricted(hasAdmin ? &elementName : nullptr, ipcCode, restricted);
770     if (FAILED(ret)) {
771         napi_throw(env, CreateError(env, ret));
772         return nullptr;
773     }
774     napi_value result = nullptr;
775     NAPI_CALL(env, napi_get_boolean(env, restricted, &result));
776     return result;
777 }
778 
779 static napi_module g_restrictionsModule = {
780     .nm_version = 1,
781     .nm_flags = 0,
782     .nm_filename = nullptr,
783     .nm_register_func = RestrictionsAddon::Init,
784     .nm_modname = "enterprise.restrictions",
785     .nm_priv = ((void *)0),
786     .reserved = {0},
787 };
788 
RestrictionsRegister()789 extern "C" __attribute__((constructor)) void RestrictionsRegister()
790 {
791     napi_module_register(&g_restrictionsModule);
792 }
793