• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &currentData, 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 &currentJsonData,
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> &currentData, 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