1 /*
2 * Copyright (c) 2022 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 "enterprise_device_mgr_stub.h"
17 #include "admin.h"
18 #include "ent_info.h"
19 #include "string_ex.h"
20
21 using namespace OHOS::HiviewDFX;
22
23 namespace OHOS {
24 namespace EDM {
EnterpriseDeviceMgrStub()25 EnterpriseDeviceMgrStub::EnterpriseDeviceMgrStub()
26 {
27 AddCallFuncMap();
28 EDMLOGI("EnterpriseDeviceMgrStub()");
29 }
30
~EnterpriseDeviceMgrStub()31 EnterpriseDeviceMgrStub::~EnterpriseDeviceMgrStub()
32 {
33 EDMLOGI("~EnterpriseDeviceMgrStub()");
34 }
35
AddCallFuncMap()36 void EnterpriseDeviceMgrStub::AddCallFuncMap()
37 {
38 memberFuncMap_[ADD_DEVICE_ADMIN] = &EnterpriseDeviceMgrStub::EnableAdminInner;
39 memberFuncMap_[REMOVE_DEVICE_ADMIN] = &EnterpriseDeviceMgrStub::DisableAdminInner;
40 memberFuncMap_[REMOVE_SUPER_ADMIN] = &EnterpriseDeviceMgrStub::DisableSuperAdminInner;
41 memberFuncMap_[GET_ENABLED_ADMIN] = &EnterpriseDeviceMgrStub::GetEnabledAdminInner;
42 memberFuncMap_[GET_ENT_INFO] = &EnterpriseDeviceMgrStub::GetEnterpriseInfoInner;
43 memberFuncMap_[SET_ENT_INFO] = &EnterpriseDeviceMgrStub::SetEnterpriseInfoInner;
44 memberFuncMap_[IS_SUPER_ADMIN] = &EnterpriseDeviceMgrStub::IsSuperAdminInner;
45 memberFuncMap_[IS_ADMIN_ENABLED] = &EnterpriseDeviceMgrStub::IsAdminEnabledInner;
46 memberFuncMap_[SUBSCRIBE_MANAGED_EVENT] = &EnterpriseDeviceMgrStub::SubscribeManagedEventInner;
47 memberFuncMap_[UNSUBSCRIBE_MANAGED_EVENT] = &EnterpriseDeviceMgrStub::UnsubscribeManagedEventInner;
48 }
49
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)50 int32_t EnterpriseDeviceMgrStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
51 MessageOption &option)
52 {
53 std::u16string descriptor = GetDescriptor();
54 std::u16string remoteDescriptor = data.ReadInterfaceToken();
55 EDMLOGI("EnterpriseDeviceMgrStub code %{public}u", code);
56 if (descriptor != remoteDescriptor) {
57 EDMLOGE("EnterpriseDeviceMgrStub code %{public}d client and service descriptors are inconsistent", code);
58 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
59 return EdmReturnErrCode::PARAM_ERROR;
60 }
61 if (SERVICE_FLAG(code)) {
62 auto func = memberFuncMap_.find(code);
63 if (func != memberFuncMap_.end()) {
64 auto memberFunc = func->second;
65 if (memberFunc != nullptr) {
66 return (this->*memberFunc)(data, reply);
67 }
68 }
69 }
70 if (POLICY_FLAG(code)) {
71 EDMLOGD("POLICY_FLAG(code:%{public}x)\n", code);
72 if (FUNC_TO_OPERATE(code) == static_cast<int>(FuncOperateType::GET)) {
73 EDMLOGD("GetDevicePolicyInner");
74 return GetDevicePolicyInner(code, data, reply);
75 } else {
76 EDMLOGD("HandleDevicePolicyInner");
77 return HandleDevicePolicyInner(code, data, reply);
78 }
79 } else {
80 EDMLOGE("!POLICY_FLAG(code)");
81 }
82
83 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
84 }
85
EnableAdminInner(MessageParcel & data,MessageParcel & reply)86 ErrCode EnterpriseDeviceMgrStub::EnableAdminInner(MessageParcel &data, MessageParcel &reply)
87 {
88 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
89 if (!admin) {
90 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
91 return EdmReturnErrCode::PARAM_ERROR;
92 }
93 EDMLOGD("EnableAdminInner bundleName:: %{public}s : abilityName : %{public}s ", admin->GetBundleName().c_str(),
94 admin->GetAbilityName().c_str());
95 std::unique_ptr<EntInfo> entInfo(data.ReadParcelable<EntInfo>());
96 uint32_t type = data.ReadUint32();
97 int32_t userId = data.ReadInt32();
98 ErrCode retCode = EnableAdmin(*admin, *entInfo, AdminType(type), userId);
99 reply.WriteInt32(retCode);
100 return ERR_OK;
101 }
102
DisableAdminInner(MessageParcel & data,MessageParcel & reply)103 ErrCode EnterpriseDeviceMgrStub::DisableAdminInner(MessageParcel &data, MessageParcel &reply)
104 {
105 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
106 if (!admin) {
107 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
108 return EdmReturnErrCode::PARAM_ERROR;
109 }
110 int32_t userId = data.ReadInt32();
111 ErrCode retCode = DisableAdmin(*admin, userId);
112 reply.WriteInt32(retCode);
113 return ERR_OK;
114 }
115
DisableSuperAdminInner(MessageParcel & data,MessageParcel & reply)116 ErrCode EnterpriseDeviceMgrStub::DisableSuperAdminInner(MessageParcel &data, MessageParcel &reply)
117 {
118 std::string bundleName = data.ReadString();
119 EDMLOGD("DisableSuperAdminInner bundleName:: %{public}s :", bundleName.c_str());
120 ErrCode retCode = DisableSuperAdmin(bundleName);
121 reply.WriteInt32(retCode);
122 return retCode;
123 }
124
HandleDevicePolicyInner(uint32_t code,MessageParcel & data,MessageParcel & reply)125 ErrCode EnterpriseDeviceMgrStub::HandleDevicePolicyInner(uint32_t code, MessageParcel &data, MessageParcel &reply)
126 {
127 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
128 if (!admin) {
129 EDMLOGW("HandleDevicePolicyInner: ReadParcelable failed");
130 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
131 return ERR_EDM_PARAM_ERROR;
132 }
133 ErrCode errCode = HandleDevicePolicy(code, *admin, data);
134 reply.WriteInt32(errCode);
135 return errCode;
136 }
137
GetDevicePolicyInner(uint32_t code,MessageParcel & data,MessageParcel & reply)138 ErrCode EnterpriseDeviceMgrStub::GetDevicePolicyInner(uint32_t code, MessageParcel &data, MessageParcel &reply)
139 {
140 AppExecFwk::ElementName *admin = nullptr;
141 if (data.ReadInt32() != ERR_OK) {
142 admin = AppExecFwk::ElementName::Unmarshalling(data);
143 } else {
144 admin = nullptr;
145 }
146 if (admin != nullptr) {
147 EDMLOGD("GetDevicePolicyInner bundleName:: %{public}s : abilityName : %{public}s code : %{public}x",
148 admin->GetBundleName().c_str(), admin->GetAbilityName().c_str(), code);
149 }
150 ErrCode retCode = GetDevicePolicy(code, admin, reply);
151 delete admin;
152 return retCode;
153 }
154
GetEnabledAdminInner(MessageParcel & data,MessageParcel & reply)155 ErrCode EnterpriseDeviceMgrStub::GetEnabledAdminInner(MessageParcel &data, MessageParcel &reply)
156 {
157 EDMLOGD("EnterpriseDeviceMgrStub:GetEnabledAdmin");
158 uint32_t type = AdminType::UNKNOWN;
159 if (!data.ReadUint32(type)) {
160 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
161 EDMLOGE("EnterpriseDeviceMgrStub:GetEnabledAdminInner read type fail %{public}u", type);
162 return EdmReturnErrCode::PARAM_ERROR;
163 }
164 std::vector<std::string> enabledAdminList;
165 ErrCode res = GetEnabledAdmin((AdminType)type, enabledAdminList);
166 if (FAILED(res)) {
167 EDMLOGE("EnterpriseDeviceMgrStub:GetEnabledAdmin failed:%{public}d", res);
168 reply.WriteInt32(res);
169 return res;
170 }
171 reply.WriteInt32(ERR_OK);
172 std::vector<std::u16string> writeArray;
173 ArrayPolicyUtils::StringToU16String(enabledAdminList, writeArray);
174 reply.WriteString16Vector(writeArray);
175 return ERR_OK;
176 }
177
GetEnterpriseInfoInner(MessageParcel & data,MessageParcel & reply)178 ErrCode EnterpriseDeviceMgrStub::GetEnterpriseInfoInner(MessageParcel &data, MessageParcel &reply)
179 {
180 EDMLOGD("EnterpriseDeviceMgrStub:GetEnterpriseInfoInner");
181 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
182 if (!admin) {
183 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
184 return EdmReturnErrCode::PARAM_ERROR;
185 }
186 EDMLOGD("GetEnterpriseInfoInner bundleName:: %{public}s : abilityName : %{public}s ",
187 admin->GetBundleName().c_str(), admin->GetAbilityName().c_str());
188
189 return GetEnterpriseInfo(*admin, reply);
190 }
191
IsSuperAdminInner(MessageParcel & data,MessageParcel & reply)192 ErrCode EnterpriseDeviceMgrStub::IsSuperAdminInner(MessageParcel &data, MessageParcel &reply)
193 {
194 EDMLOGD("EnterpriseDeviceMgrStub:IsSuperAdminInner");
195 std::string bundleName = data.ReadString();
196 EDMLOGD("IsSuperAdminInner bundleName:: %{public}s :", bundleName.c_str());
197 bool ret = IsSuperAdmin(bundleName);
198 reply.WriteInt32(ret);
199 return ERR_OK;
200 }
201
IsAdminEnabledInner(MessageParcel & data,MessageParcel & reply)202 ErrCode EnterpriseDeviceMgrStub::IsAdminEnabledInner(MessageParcel &data, MessageParcel &reply)
203 {
204 EDMLOGD("EnterpriseDeviceMgrStub:IsAdminEnabled");
205 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
206 if (!admin) {
207 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
208 return EdmReturnErrCode::PARAM_ERROR;
209 }
210 int32_t userId = data.ReadInt32();
211 bool ret = IsAdminEnabled(*admin, userId);
212 reply.WriteInt32(ret);
213 return ERR_OK;
214 }
215
SetEnterpriseInfoInner(MessageParcel & data,MessageParcel & reply)216 ErrCode EnterpriseDeviceMgrStub::SetEnterpriseInfoInner(MessageParcel &data, MessageParcel &reply)
217 {
218 EDMLOGD("EnterpriseDeviceMgrStub:SetEnterpriseInfoInner");
219 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
220 if (!admin) {
221 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
222 return EdmReturnErrCode::PARAM_ERROR;
223 }
224 std::unique_ptr<EntInfo> entInfo(data.ReadParcelable<EntInfo>());
225 ErrCode ret = SetEnterpriseInfo(*admin, *entInfo);
226 reply.WriteInt32(ret);
227 return ERR_OK;
228 }
229
SubscribeManagedEventInner(MessageParcel & data,MessageParcel & reply)230 ErrCode EnterpriseDeviceMgrStub::SubscribeManagedEventInner(MessageParcel &data, MessageParcel &reply)
231 {
232 EDMLOGD("EnterpriseDeviceMgrStub:SubscribeManagedEventInner");
233 return SubscribeManagedEventInner(data, reply, true);
234 }
235
UnsubscribeManagedEventInner(MessageParcel & data,MessageParcel & reply)236 ErrCode EnterpriseDeviceMgrStub::UnsubscribeManagedEventInner(MessageParcel &data, MessageParcel &reply)
237 {
238 EDMLOGD("EnterpriseDeviceMgrStub:UnsubscribeManagedEventInner");
239 return SubscribeManagedEventInner(data, reply, false);
240 }
241
SubscribeManagedEventInner(MessageParcel & data,MessageParcel & reply,bool subscribe)242 ErrCode EnterpriseDeviceMgrStub::SubscribeManagedEventInner(MessageParcel &data, MessageParcel &reply, bool subscribe)
243 {
244 std::unique_ptr<AppExecFwk::ElementName> admin(data.ReadParcelable<AppExecFwk::ElementName>());
245 if (!admin) {
246 reply.WriteInt32(EdmReturnErrCode::PARAM_ERROR);
247 return EdmReturnErrCode::PARAM_ERROR;
248 }
249 std::vector<uint32_t> events;
250 data.ReadUInt32Vector(&events);
251 ErrCode code;
252 if (subscribe) {
253 code = SubscribeManagedEvent(*admin, events);
254 } else {
255 code = UnsubscribeManagedEvent(*admin, events);
256 }
257 reply.WriteInt32(code);
258 return code;
259 }
260 } // namespace EDM
261 } // namespace OHOS