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 "manage_auto_start_apps_plugin.h"
17
18 #include <algorithm>
19
20 #include "app_control/app_control_proxy.h"
21 #include <bundle_info.h>
22 #include <bundle_mgr_interface.h>
23 #include <system_ability_definition.h>
24
25 #include "ability_auto_startup_client.h"
26 #include "manage_auto_start_apps_serializer.h"
27 #include "edm_constants.h"
28 #include "edm_ipc_interface_code.h"
29 #include "edm_sys_manager.h"
30 #include "element_name.h"
31 #include "iplugin_manager.h"
32 #include "ipolicy_manager.h"
33 #include "func_code_utils.h"
34
35 namespace OHOS {
36 namespace EDM {
37 const bool REGISTER_RESULT = IPluginManager::GetInstance()->AddPlugin(std::make_shared<ManageAutoStartAppsPlugin>());
38 const std::string SEPARATOR = "/";
39
ManageAutoStartAppsPlugin()40 ManageAutoStartAppsPlugin::ManageAutoStartAppsPlugin()
41 {
42 policyCode_ = EdmInterfaceCode::MANAGE_AUTO_START_APPS;
43 policyName_ = PolicyName::POLICY_MANAGE_AUTO_START_APPS;
44 permissionConfig_.typePermissions.emplace(IPlugin::PermissionType::SUPER_DEVICE_ADMIN,
45 EdmPermission::PERMISSION_ENTERPRISE_MANAGE_APPLICATION);
46 permissionConfig_.apiType = IPlugin::ApiType::PUBLIC;
47 needSave_ = true;
48 maxListSize_ = EdmConstants::AUTO_START_APPS_MAX_SIZE;
49 }
50
OnHandlePolicy(std::uint32_t funcCode,MessageParcel & data,MessageParcel & reply,HandlePolicyData & policyData,int32_t userId)51 ErrCode ManageAutoStartAppsPlugin::OnHandlePolicy(std::uint32_t funcCode, MessageParcel &data, MessageParcel &reply,
52 HandlePolicyData &policyData, int32_t userId)
53 {
54 EDMLOGI("ManageAutoStartAppsPlugin OnHandlePolicy.");
55 uint32_t typeCode = FUNC_TO_OPERATE(funcCode);
56 FuncOperateType type = FuncCodeUtils::ConvertOperateType(typeCode);
57 std::vector<std::string> autoStartApps;
58 data.ReadStringVector(&autoStartApps);
59 bool disallowModify = false;
60 data.ReadBool(disallowModify);
61 std::vector<ManageAutoStartAppInfo> currentData;
62 bool isDeserializeOk = false;
63 isDeserializeOk = ManageAutoStartAppsSerializer::GetInstance()->Deserialize(policyData.policyData, currentData);
64 std::vector<ManageAutoStartAppInfo> mergeData;
65 isDeserializeOk = isDeserializeOk &&
66 ManageAutoStartAppsSerializer::GetInstance()->Deserialize(policyData.mergePolicyData, mergeData);
67 std::string mergePolicyStr;
68 IPolicyManager::GetInstance()->GetPolicy("", GetPolicyName(), mergePolicyStr, userId);
69 std::vector<ManageAutoStartAppInfo> totalMergePolicyData;
70 isDeserializeOk = isDeserializeOk &&
71 ManageAutoStartAppsSerializer::GetInstance()->Deserialize(mergePolicyStr, totalMergePolicyData);
72 if (!isDeserializeOk) {
73 EDMLOGE("ManageAutoStartAppsPlugin OnHandlePolicy Deserialize failed.");
74 }
75 ManageAutoStartAppsSerializer::GetInstance()->UpdateByMergePolicy(currentData,
76 totalMergePolicyData);
77 ErrCode res = EdmReturnErrCode::PARAM_ERROR;
78 if (type == FuncOperateType::SET) {
79 res = OnSetPolicy(autoStartApps, disallowModify, currentData, mergeData, userId);
80 } else if (type == FuncOperateType::REMOVE) {
81 res = OnRemovePolicy(autoStartApps, currentData, mergeData, userId);
82 }
83 if (res != ERR_OK) {
84 reply.WriteInt32(res);
85 return res;
86 }
87 reply.WriteInt32(ERR_OK);
88 std::string afterHandle;
89 std::string afterMerge;
90 bool isSerializeOk = ManageAutoStartAppsSerializer::GetInstance()->Serialize(currentData, afterHandle);
91 isSerializeOk = isSerializeOk && ManageAutoStartAppsSerializer::GetInstance()->Serialize(mergeData, afterMerge);
92 if (!isSerializeOk) {
93 EDMLOGE("ManageAutoStartAppsPlugin OnHandlePolicy Serialize failed.");
94 }
95 policyData.isChanged = (policyData.policyData != afterHandle || mergePolicyStr != afterMerge);
96 policyData.policyData = afterHandle;
97 policyData.mergePolicyData = afterMerge;
98 return ERR_OK;
99 }
100
OnRemovePolicy(std::vector<std::string> & data,std::vector<ManageAutoStartAppInfo> & currentData,std::vector<ManageAutoStartAppInfo> & mergeData,int32_t userId)101 ErrCode ManageAutoStartAppsPlugin::OnRemovePolicy(std::vector<std::string> &data,
102 std::vector<ManageAutoStartAppInfo> ¤tData, std::vector<ManageAutoStartAppInfo> &mergeData, int32_t userId)
103 {
104 if (data.empty()) {
105 EDMLOGW("BasicArrayStringPlugin OnRemovePolicy data is empty.");
106 return ERR_OK;
107 }
108 if (data.size() > maxListSize_) {
109 EDMLOGE("BasicArrayStringPlugin OnRemovePolicy input data is too large.");
110 return EdmReturnErrCode::PARAM_ERROR;
111 }
112 std::vector<ManageAutoStartAppInfo> needRemovePolicy =
113 ManageAutoStartAppsSerializer::GetInstance()->SetIntersectionPolicyData(data, currentData);
114 std::vector<ManageAutoStartAppInfo> needRemoveMergePolicy =
115 ManageAutoStartAppsSerializer::GetInstance()->SetNeedRemoveMergePolicyData(mergeData, needRemovePolicy);
116
117 std::vector<ManageAutoStartAppInfo> failedData;
118 if (!needRemoveMergePolicy.empty()) {
119 ErrCode ret = SetOrRemoveOtherModulePolicy(needRemoveMergePolicy, false, failedData, userId);
120 if (FAILED(ret)) {
121 return ret;
122 }
123 }
124 if (failedData.empty()) {
125 currentData = ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(needRemovePolicy,
126 currentData);
127 } else {
128 auto removeData = ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(failedData,
129 needRemovePolicy);
130 currentData = ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(removeData,
131 currentData);
132 }
133 mergeData = ManageAutoStartAppsSerializer::GetInstance()->SetUnionPolicyData(currentData, mergeData);
134 return ERR_OK;
135 }
136
OnGetPolicy(std::string & policyData,MessageParcel & data,MessageParcel & reply,int32_t userId)137 ErrCode ManageAutoStartAppsPlugin::OnGetPolicy(std::string &policyData, MessageParcel &data, MessageParcel &reply,
138 int32_t userId)
139 {
140 EDMLOGI("ManageAutoStartAppsPlugin OnGetPolicy.");
141 std::string type = data.ReadString();
142 if (type == EdmConstants::AutoStart::GET_MANAGE_AUTO_START_APPS_BUNDLE_INFO) {
143 std::vector<ManageAutoStartAppInfo> appInfos;
144 ManageAutoStartAppsSerializer::GetInstance()->Deserialize(policyData, appInfos);
145 std::vector<std::string> policies;
146 for (const ManageAutoStartAppInfo &item : appInfos) {
147 policies.push_back(item.GetUniqueKey());
148 }
149 reply.WriteInt32(ERR_OK);
150 reply.WriteStringVector(policies);
151 } else if (type == EdmConstants::AutoStart::GET_MANAGE_AUTO_START_APP_DISALLOW_MODIFY) {
152 std::string uniqueKey = data.ReadString();
153 std::string mergePolicyStr;
154 IPolicyManager::GetInstance()->GetPolicy("", GetPolicyName(), mergePolicyStr, userId);
155 std::vector<ManageAutoStartAppInfo> mergePolicyData;
156 ManageAutoStartAppsSerializer::GetInstance()->Deserialize(mergePolicyStr, mergePolicyData);
157 bool hasSetAutoStart = false;
158 for (const ManageAutoStartAppInfo &item : mergePolicyData) {
159 if (item.GetUniqueKey() == uniqueKey) {
160 reply.WriteInt32(ERR_OK);
161 reply.WriteBool(item.GetDisallowModify());
162 hasSetAutoStart = true;
163 break;
164 }
165 }
166 if (!hasSetAutoStart) {
167 reply.WriteInt32(ERR_OK);
168 reply.WriteBool(true);
169 }
170 } else {
171 EDMLOGE("ManageAutoStartAppsPlugin::OnGetPolicy type error");
172 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
173 }
174 return ERR_OK;
175 }
176
OnAdminRemove(const std::string & adminName,const std::string & currentJsonData,const std::string & mergeJsonData,int32_t userId)177 ErrCode ManageAutoStartAppsPlugin::OnAdminRemove(const std::string &adminName, const std::string ¤tJsonData,
178 const std::string &mergeJsonData, int32_t userId)
179 {
180 EDMLOGI("ManageAutoStartAppsPlugin OnAdminRemoveDone");
181
182 std::vector<ManageAutoStartAppInfo> currentData;
183 ManageAutoStartAppsSerializer::GetInstance()->Deserialize(currentJsonData, currentData);
184 std::vector<ManageAutoStartAppInfo> mergeData;
185 ManageAutoStartAppsSerializer::GetInstance()->Deserialize(mergeJsonData, mergeData);
186 std::vector<ManageAutoStartAppInfo> needRemoveMergePolicy =
187 ManageAutoStartAppsSerializer::GetInstance()->SetNeedRemoveMergePolicyData(mergeData, currentData);
188 std::vector<ManageAutoStartAppInfo> failedData;
189 return SetOrRemoveOtherModulePolicy(needRemoveMergePolicy, false, failedData, userId);
190 }
191
GetOthersMergePolicyData(const std::string & adminName,int32_t userId,std::string & othersMergePolicyData)192 ErrCode ManageAutoStartAppsPlugin::GetOthersMergePolicyData(const std::string &adminName, int32_t userId,
193 std::string &othersMergePolicyData)
194 {
195 std::unordered_map<std::string, std::string> adminValues;
196 IPolicyManager::GetInstance()->GetAdminByPolicyName(GetPolicyName(), adminValues, userId);
197 EDMLOGI("ManageAutoStartAppsPlugin::GetOthersMergePolicyData %{public}s value size %{public}d.",
198 GetPolicyName().c_str(), (uint32_t)adminValues.size());
199 if (adminValues.empty()) {
200 return ERR_OK;
201 }
202 auto entry = adminValues.find(adminName);
203 if (entry != adminValues.end()) {
204 adminValues.erase(entry);
205 }
206 if (adminValues.empty()) {
207 return ERR_OK;
208 }
209 auto serializer = ManageAutoStartAppsSerializer::GetInstance();
210 std::vector<std::vector<ManageAutoStartAppInfo>> data;
211 for (const auto &item : adminValues) {
212 std::vector<ManageAutoStartAppInfo> dataItem;
213 if (!item.second.empty()) {
214 if (!serializer->Deserialize(item.second, dataItem)) {
215 return ERR_EDM_OPERATE_JSON;
216 }
217 data.push_back(dataItem);
218 }
219 }
220 std::vector<ManageAutoStartAppInfo> result;
221 if (!serializer->MergePolicy(data, result)) {
222 return ERR_EDM_OPERATE_JSON;
223 }
224
225 std::string mergePolicyStr;
226 IPolicyManager::GetInstance()->GetPolicy("", GetPolicyName(), mergePolicyStr, userId);
227 std::vector<ManageAutoStartAppInfo> mergePolicyData;
228 if (!serializer->Deserialize(mergePolicyStr, mergePolicyData)) {
229 return ERR_EDM_OPERATE_JSON;
230 }
231
232 if (!serializer->UpdateByMergePolicy(result, mergePolicyData)) {
233 return ERR_EDM_OPERATE_JSON;
234 }
235
236 if (!serializer->Serialize(result, othersMergePolicyData)) {
237 return ERR_EDM_OPERATE_JSON;
238 }
239
240 return ERR_OK;
241 }
242
OnSetPolicy(std::vector<std::string> & data,bool disallowModify,std::vector<ManageAutoStartAppInfo> & currentData,std::vector<ManageAutoStartAppInfo> & mergeData,int32_t userId)243 ErrCode ManageAutoStartAppsPlugin::OnSetPolicy(std::vector<std::string> &data, bool disallowModify,
244 std::vector<ManageAutoStartAppInfo> ¤tData, std::vector<ManageAutoStartAppInfo> &mergeData, int32_t userId)
245 {
246 if (data.empty()) {
247 EDMLOGW("ManageAutoStartAppsPlugin OnSetPolicy data is empty.");
248 return ERR_OK;
249 }
250 if (data.size() > maxListSize_) {
251 EDMLOGE("ManageAutoStartAppsPlugin OnSetPolicy input data is too large.");
252 return EdmReturnErrCode::PARAM_ERROR;
253 }
254 std::vector<ManageAutoStartAppInfo> tmpData;
255 for (const auto &item : data) {
256 ManageAutoStartAppInfo appInfo;
257 appInfo.SetUniqueKey(item);
258 appInfo.SetDisallowModify(disallowModify);
259 tmpData.push_back(appInfo);
260 }
261 std::vector<ManageAutoStartAppInfo> addData =
262 ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(currentData, tmpData);
263 std::vector<ManageAutoStartAppInfo> needAddMergeData =
264 ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(mergeData, addData);
265 std::vector<ManageAutoStartAppInfo> afterHandle =
266 ManageAutoStartAppsSerializer::GetInstance()->SetUnionPolicyData(currentData, addData);
267 std::vector<ManageAutoStartAppInfo> afterMerge =
268 ManageAutoStartAppsSerializer::GetInstance()->SetUnionPolicyData(mergeData, afterHandle);
269 if (afterMerge.size() > maxListSize_) {
270 EDMLOGE("ManageAutoStartAppsPlugin OnSetPolicy merge data is too large.");
271 return EdmReturnErrCode::PARAM_ERROR;
272 }
273
274 std::vector<ManageAutoStartAppInfo> failedData;
275 if (!needAddMergeData.empty()) {
276 ErrCode ret = SetOrRemoveOtherModulePolicy(needAddMergeData, true, failedData, userId);
277 if (FAILED(ret)) {
278 return ret;
279 }
280 }
281 if (failedData.empty()) {
282 currentData = afterHandle;
283 mergeData = afterMerge;
284 } else {
285 currentData = ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(failedData, afterHandle);
286 mergeData = ManageAutoStartAppsSerializer::GetInstance()->SetDifferencePolicyData(failedData, afterMerge);
287 }
288 return ERR_OK;
289 }
290
SetOrRemoveOtherModulePolicy(const std::vector<ManageAutoStartAppInfo> & data,bool isSet,std::vector<ManageAutoStartAppInfo> & failedData,int32_t userId)291 ErrCode ManageAutoStartAppsPlugin::SetOrRemoveOtherModulePolicy(const std::vector<ManageAutoStartAppInfo> &data,
292 bool isSet, std::vector<ManageAutoStartAppInfo> &failedData, int32_t userId)
293 {
294 EDMLOGI("ManageAutoStartAppsPlugin SetOrRemoveOtherModulePolicy: %{public}d.", isSet);
295 auto autoStartupClient = AAFwk::AbilityAutoStartupClient::GetInstance();
296 if (!autoStartupClient) {
297 EDMLOGE("ManageAutoStartAppsPlugin SetOrRemoveOtherModulePolicy GetAppControlProxy failed.");
298 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
299 }
300 bool flag = false;
301 for (const ManageAutoStartAppInfo &item : data) {
302 OHOS::AbilityRuntime::AutoStartupInfo autoStartupInfo;
303 autoStartupInfo.bundleName = item.GetBundleName();
304 autoStartupInfo.abilityName = item.GetAbilityName();
305 autoStartupInfo.userId = userId;
306 if (!CheckBundleAndAbilityExited(autoStartupInfo.bundleName, autoStartupInfo.abilityName)) {
307 EDMLOGW("CheckBundleAndAbilityExited failed bundleName: %{public}s, abilityName: %{public}s",
308 autoStartupInfo.bundleName.c_str(), autoStartupInfo.abilityName.c_str());
309 if (!isSet) {
310 flag = true;
311 }
312 failedData.push_back(item);
313 continue;
314 }
315 ErrCode res;
316 if (isSet) {
317 res = autoStartupClient->SetApplicationAutoStartupByEDM(autoStartupInfo, item.GetDisallowModify());
318 } else {
319 res = autoStartupClient->CancelApplicationAutoStartupByEDM(autoStartupInfo, item.GetDisallowModify());
320 }
321 if (res != ERR_OK) {
322 EDMLOGW("OnRemovePolicy SetOrCancelApplicationAutoStartupByEDM err res: %{public}d bundleName: %{public}s "
323 "abilityName:%{public}s", res, autoStartupInfo.bundleName.c_str(), autoStartupInfo.abilityName.c_str());
324 failedData.push_back(item);
325 continue;
326 }
327 flag = true;
328 }
329 return flag ? ERR_OK : EdmReturnErrCode::PARAM_ERROR;
330 }
331
CheckBundleAndAbilityExited(const std::string & bundleName,const std::string & abilityName)332 bool ManageAutoStartAppsPlugin::CheckBundleAndAbilityExited(const std::string &bundleName,
333 const std::string &abilityName)
334 {
335 auto remoteObject = EdmSysManager::GetRemoteObjectOfSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
336 sptr<AppExecFwk::IBundleMgr> proxy = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
337 if (!proxy) {
338 EDMLOGE("EnterpriseDeviceMgrAbility::GetAllPermissionsByAdmin GetBundleMgr failed.");
339 return false;
340 }
341
342 std::vector<AppExecFwk::AbilityInfo> abilityInfos;
343 AppExecFwk::ElementName element;
344 element.SetBundleName(bundleName);
345 element.SetAbilityName(abilityName);
346 OHOS::AppExecFwk::IBundleMgr::Want want;
347 want.SetElement(element);
348 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionAbilityInfo;
349 return proxy->QueryAbilityInfos(want, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT,
350 DEFAULT_USER_ID, abilityInfos) ||
351 proxy->QueryExtensionAbilityInfos(want, AppExecFwk::ExtensionAbilityType::SERVICE,
352 AppExecFwk::ExtensionAbilityInfoFlag::GET_EXTENSION_INFO_DEFAULT, DEFAULT_USER_ID,
353 extensionAbilityInfo);
354 }
355 } // namespace EDM
356 } // namespace OHOS
357