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 "disallow_mobile_data_plugin.h"
17
18 #include "cellular_data_client.h"
19 #include "edm_constants.h"
20 #include "edm_ipc_interface_code.h"
21 #include "func_code_utils.h"
22 #include "iplugin_manager.h"
23 #include "parameters.h"
24 #include "telephony_errors.h"
25
26 namespace OHOS {
27 namespace EDM {
28 const bool REGISTER_RESULT = IPluginManager::GetInstance()->AddPlugin(std::make_shared<DisallowMobileDataPlugin>());
29 constexpr const char *PARAM_MOBILE_DATA_POLICY = "persist.edm.mobile_data_policy";
30 constexpr const char *MOBILE_DATA_NONE = "none";
31 constexpr const char *MOBILE_DATA_DISALLOW = "disallow";
32 constexpr const char *MOBILE_DATA_FORCE_OPEN = "force_open";
33
DisallowMobileDataPlugin()34 DisallowMobileDataPlugin::DisallowMobileDataPlugin()
35 {
36 policyCode_ = EdmInterfaceCode::DISALLOWED_MOBILE_DATA;
37 policyName_ = PolicyName::POLICY_DISALLOW_MOBILE_DATA;
38 permissionConfig_.typePermissions.emplace(IPlugin::PermissionType::SUPER_DEVICE_ADMIN,
39 EdmPermission::PERMISSION_ENTERPRISE_MANAGE_NETWORK);
40 permissionConfig_.apiType = IPlugin::ApiType::PUBLIC;
41 needSave_ = true;
42 }
43
OnHandlePolicy(std::uint32_t funcCode,MessageParcel & data,MessageParcel & reply,HandlePolicyData & policyData,int32_t userId)44 ErrCode DisallowMobileDataPlugin::OnHandlePolicy(std::uint32_t funcCode, MessageParcel &data, MessageParcel &reply,
45 HandlePolicyData &policyData, int32_t userId)
46 {
47 EDMLOGI("DisallowMobileDataPlugin::OnHandlePolicy start");
48 uint32_t typeCode = FUNC_TO_OPERATE(funcCode);
49 FuncOperateType type = FuncCodeUtils::ConvertOperateType(typeCode);
50 if (type != FuncOperateType::SET) {
51 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
52 }
53 const std::string flag = data.ReadString();
54 if (flag.empty() || flag == EdmConstants::MobileData::DISALLOW_FLAG) {
55 const bool isDisallow = data.ReadBool();
56 EDMLOGI("DisallowMobileDataPlugin:ReadBool isDisallow:%{public}d", isDisallow);
57 if (isDisallow) {
58 if (!system::SetParameter(PARAM_MOBILE_DATA_POLICY, MOBILE_DATA_DISALLOW)) {
59 EDMLOGE("DisallowMobileDataPlugin:OnSetPolicy SetParameter fail");
60 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
61 }
62 int32_t ret = Telephony::CellularDataClient::GetInstance().EnableCellularData(false);
63 EDMLOGI("DisallowMobileDataPlugin:OnSetPolicy send request result:%{public}d", ret);
64 if (ret != Telephony::TELEPHONY_ERR_SUCCESS) {
65 EDMLOGE("DisallowMobileDataPlugin:OnSetPolicy send request fail. %{public}d", ret);
66 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
67 }
68 policyData.isChanged = true;
69 policyData.mergePolicyData = "true";
70 policyData.policyData = "true";
71 return ERR_OK;
72 }
73 if (!system::SetParameter(PARAM_MOBILE_DATA_POLICY, MOBILE_DATA_NONE)) {
74 EDMLOGE("DisallowMobileDataPlugin:OnSetPolicy SetParameter fail");
75 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
76 }
77 policyData.isChanged = true;
78 policyData.mergePolicyData = "false";
79 policyData.policyData = "false";
80 return ERR_OK;
81 }
82 if (flag == EdmConstants::MobileData::FORCE_FLAG) {
83 return OnHandleForceOpen(data);
84 }
85 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
86 }
87
OnHandleForceOpen(MessageParcel & data)88 ErrCode DisallowMobileDataPlugin::OnHandleForceOpen(MessageParcel &data)
89 {
90 const int32_t foceOpen = data.ReadInt32();
91 EDMLOGI("DisallowMobileDataPlugin:ReadInt32 foceOpen:%{public}d", foceOpen);
92 if (foceOpen != EdmConstants::MobileData::FORCE_OPEN) {
93 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
94 }
95 std::string dataPolicy = system::GetParameter(PARAM_MOBILE_DATA_POLICY, "");
96 if (dataPolicy == MOBILE_DATA_DISALLOW) {
97 EDMLOGE("DisallowMobileDataPlugin::OnSetPolicy failed, because mobile data disallow");
98 return EdmReturnErrCode::ENTERPRISE_POLICES_DENIED;
99 }
100 if (!system::SetParameter(PARAM_MOBILE_DATA_POLICY, MOBILE_DATA_FORCE_OPEN)) {
101 EDMLOGE("DisallowMobileDataPlugin:OnSetPolicy SetParameter fail");
102 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
103 }
104 int32_t ret = Telephony::CellularDataClient::GetInstance().EnableCellularData(true);
105 EDMLOGI("DisallowMobileDataPlugin:OnSetPolicy send request result:%{public}d", ret);
106 if (ret != Telephony::TELEPHONY_ERR_SUCCESS) {
107 EDMLOGE("DisallowMobileDataPlugin:OnSetPolicy send request fail. %{public}d", ret);
108 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
109 }
110 return ERR_OK;
111 }
112
OnAdminRemove(const std::string & adminName,const std::string & policyData,const std::string & mergeData,int32_t userId)113 ErrCode DisallowMobileDataPlugin::OnAdminRemove(const std::string &adminName, const std::string &policyData,
114 const std::string &mergeData, int32_t userId)
115 {
116 EDMLOGI("TurnOnOffMobileDataPlugin OnAdminRemove adminName : %{public}s, policyData : %{public}s",
117 adminName.c_str(), policyData.c_str());
118 if (!system::SetParameter(PARAM_MOBILE_DATA_POLICY, MOBILE_DATA_NONE)) {
119 EDMLOGE("DisallowMobileDataPlugin:OnSetPolicy SetParameter fail");
120 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
121 }
122 return ERR_OK;
123 }
124 } // namespace EDM
125 } // namespace OHOS
126