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 <bundle_info.h>
19 #include <bundle_mgr_interface.h>
20 #include <system_ability_definition.h>
21 
22 #include "ability_auto_startup_client.h"
23 #include "array_string_serializer.h"
24 #include "edm_constants.h"
25 #include "edm_ipc_interface_code.h"
26 #include "edm_sys_manager.h"
27 #include "element_name.h"
28 #include "plugin_manager.h"
29 
30 namespace OHOS {
31 namespace EDM {
32 const bool REGISTER_RESULT = PluginManager::GetInstance()->AddPlugin(ManageAutoStartAppsPlugin::GetPlugin());
33 const std::string SPERATOR = "/";
34 
InitPlugin(std::shared_ptr<IPluginTemplate<ManageAutoStartAppsPlugin,std::vector<std::string>>> ptr)35 void ManageAutoStartAppsPlugin::InitPlugin(
36     std::shared_ptr<IPluginTemplate<ManageAutoStartAppsPlugin, std::vector<std::string>>> ptr)
37 {
38     EDMLOGI("ManageAutoStartAppsPlugin InitPlugin...");
39     ptr->InitAttribute(EdmInterfaceCode::MANAGE_AUTO_START_APPS, "manage_auto_start_apps",
40         "ohos.permission.ENTERPRISE_MANAGE_APPLICATION", IPlugin::PermissionType::SUPER_DEVICE_ADMIN, true);
41     ptr->SetSerializer(ArrayStringSerializer::GetInstance());
42     ptr->SetOnHandlePolicyListener(&ManageAutoStartAppsPlugin::OnSetPolicy, FuncOperateType::SET);
43     ptr->SetOnHandlePolicyListener(&ManageAutoStartAppsPlugin::OnRemovePolicy, FuncOperateType::REMOVE);
44     ptr->SetOnAdminRemoveDoneListener(&ManageAutoStartAppsPlugin::OnAdminRemoveDone);
45 }
46 
OnSetPolicy(std::vector<std::string> & data,std::vector<std::string> & currentData,int32_t userId)47 ErrCode ManageAutoStartAppsPlugin::OnSetPolicy(std::vector<std::string> &data, std::vector<std::string> &currentData,
48     int32_t userId)
49 {
50     EDMLOGI("ManageAutoStartAppsPlugin OnSetPolicy userId : %{public}d", userId);
51     if (data.empty()) {
52         EDMLOGW("ManageAutoStartAppsPlugin OnSetPolicy data is empty.");
53         return ERR_OK;
54     }
55 
56     if (data.size() > EdmConstants::AUTO_START_APPS_MAX_SIZE) {
57         EDMLOGE("ManageAutoStartAppsPlugin OnSetPolicy data is too large.");
58         return EdmReturnErrCode::PARAM_ERROR;
59     }
60 
61     std::vector<std::string> allData =
62         ArrayStringSerializer::GetInstance()->SetUnionPolicyData(data, currentData);
63     if (allData.size() > EdmConstants::AUTO_START_APPS_MAX_SIZE) {
64         EDMLOGE("ManageAutoStartAppsPlugin OnSetPolicy data is too large.");
65         return EdmReturnErrCode::PARAM_ERROR;
66     }
67 
68     auto autoStartUpclient = AAFwk::AbilityAutoStartupClient::GetInstance();
69     if (!autoStartUpclient) {
70         EDMLOGE("ManageAutoStartAppsPlugin OnSetPolicy GetAppControlProxy failed.");
71         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
72     }
73     bool flag = false;
74     std::vector<std::string> mergeData;
75     for (const auto &str : data) {
76         std::string bundleName;
77         std::string abilityName;
78         if (!ParseAutoStartAppWant(str, bundleName, abilityName)) {
79             continue;
80         }
81         if (!CheckBundleAndAbilityExited(bundleName, abilityName)) {
82             EDMLOGW("CheckBundleAndAbilityExited failed bundleName: %{public}s, abilityName: %{public}s",
83                 bundleName.c_str(), abilityName.c_str());
84             continue;
85         }
86         OHOS::AbilityRuntime::AutoStartupInfo autoStartupInfo;
87         autoStartupInfo.bundleName = bundleName;
88         autoStartupInfo.abilityName = abilityName;
89         ErrCode res = autoStartUpclient->SetApplicationAutoStartupByEDM(autoStartupInfo, true);
90         if (res != ERR_OK) {
91             EDMLOGW("OnSetPolicy SetApplicationAutoStartupByEDM err res: %{public}d bundleName: %{public}s "
92                 "abilityName: %{public}s", res, bundleName.c_str(), abilityName.c_str());
93             break;
94         }
95         flag = true;
96         mergeData.push_back(str);
97     }
98     currentData = ArrayStringSerializer::GetInstance()->SetUnionPolicyData(mergeData, currentData);
99     return flag ? ERR_OK : EdmReturnErrCode::PARAM_ERROR;
100 }
101 
OnGetPolicy(std::string & policyData,MessageParcel & data,MessageParcel & reply,int32_t userId)102 ErrCode ManageAutoStartAppsPlugin::OnGetPolicy(std::string &policyData, MessageParcel &data, MessageParcel &reply,
103     int32_t userId)
104 {
105     EDMLOGI("ManageAutoStartAppsPlugin OnGetPolicy policyData : %{public}s, userId : %{public}d", policyData.c_str(),
106         userId);
107     auto autoStartUpclient = AAFwk::AbilityAutoStartupClient::GetInstance();
108     if (!autoStartUpclient) {
109         EDMLOGE("ManageAutoStartAppsPlugin OnGetPolicy GetAppControlProxy failed.");
110         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
111     }
112     std::vector<OHOS::AbilityRuntime::AutoStartupInfo> infoList;
113     ErrCode res = autoStartUpclient->QueryAllAutoStartupApplications(infoList);
114     if (res != ERR_OK) {
115         EDMLOGE("ManageAutoStartAppsPlugin OnGetPolicy Faild %{public}d:", res);
116         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
117     }
118 
119     std::vector<std::string> autoStartAppsInfo;
120     std::for_each(infoList.begin(), infoList.end(), [&](const OHOS::AbilityRuntime::AutoStartupInfo &Info) {
121         std::string appInfo = Info.bundleName + SPERATOR + Info.abilityName;
122         autoStartAppsInfo.push_back(appInfo);
123     });
124     reply.WriteInt32(ERR_OK);
125     reply.WriteStringVector(autoStartAppsInfo);
126     return ERR_OK;
127 }
128 
OnRemovePolicy(std::vector<std::string> & data,std::vector<std::string> & currentData,int32_t userId)129 ErrCode ManageAutoStartAppsPlugin::OnRemovePolicy(std::vector<std::string> &data, std::vector<std::string> &currentData,
130     int32_t userId)
131 {
132     EDMLOGI("ManageAutoStartAppsPlugin OnRemovePolicy userId : %{public}d.", userId);
133     if (data.empty()) {
134         EDMLOGW("ManageAutoStartAppsPlugin OnRemovePolicy data is empty.");
135         return ERR_OK;
136     }
137 
138     if (data.size() > EdmConstants::AUTO_START_APPS_MAX_SIZE) {
139         EDMLOGE("ManageAutoStartAppsPlugin OnRemovePolicy data is too large.");
140         return EdmReturnErrCode::PARAM_ERROR;
141     }
142 
143     auto autoStartUpclient = AAFwk::AbilityAutoStartupClient::GetInstance();
144     if (!autoStartUpclient) {
145         EDMLOGE("ManageAutoStartAppsPlugin OnRemovePolicy GetAppControlProxy failed.");
146         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
147     }
148     bool flag = false;
149     std::vector<std::string> mergeData;
150     for (const auto &str : data) {
151         std::string bundleName;
152         std::string abilityName;
153         if (!ParseAutoStartAppWant(str, bundleName, abilityName)) {
154             continue;
155         }
156         if (!CheckBundleAndAbilityExited(bundleName, abilityName)) {
157             if (std::find(currentData.begin(), currentData.end(), str) != currentData.end()) {
158                 flag = true;
159                 mergeData.push_back(str);
160             }
161             EDMLOGW("CheckBundleAndAbilityExited failed bundleName: %{public}s, abilityName: %{public}s",
162                 bundleName.c_str(), abilityName.c_str());
163             continue;
164         }
165         OHOS::AbilityRuntime::AutoStartupInfo autoStartupInfo;
166         autoStartupInfo.bundleName = bundleName;
167         autoStartupInfo.abilityName = abilityName;
168 
169         ErrCode res = autoStartUpclient->CancelApplicationAutoStartupByEDM(autoStartupInfo, true);
170         if (res != ERR_OK) {
171             EDMLOGW("OnRemovePolicy CancelApplicationAutoStartupByEDM err res: %{public}d bundleName: %{public}s "
172                 "abilityName: %{public}s", res, bundleName.c_str(), abilityName.c_str());
173             break;
174         }
175         mergeData.push_back(str);
176         flag = true;
177     };
178     currentData = ArrayStringSerializer::GetInstance()->SetDifferencePolicyData(mergeData, currentData);
179     return flag ? ERR_OK : EdmReturnErrCode::PARAM_ERROR;
180 }
181 
OnAdminRemoveDone(const std::string & adminName,std::vector<std::string> & data,int32_t userId)182 void ManageAutoStartAppsPlugin::OnAdminRemoveDone(const std::string &adminName, std::vector<std::string> &data,
183     int32_t userId)
184 {
185     EDMLOGI("ManageAutoStartAppsPlugin OnAdminRemoveDone adminName : %{public}s userId : %{public}d", adminName.c_str(),
186         userId);
187 
188     auto autoStartUpclient = AAFwk::AbilityAutoStartupClient::GetInstance();
189     if (!autoStartUpclient) {
190         EDMLOGE("ManageAutoStartAppsPlugin OnSetPolicy GetAppControlProxy failed.");
191         return;
192     }
193 
194     std::for_each(data.begin(), data.end(), [&](const std::string &str) {
195         OHOS::AbilityRuntime::AutoStartupInfo autoStartupInfo;
196         std::string bundleName;
197         std::string abilityName;
198         if (!ParseAutoStartAppWant(str, bundleName, abilityName)) {
199             return;
200         }
201         autoStartupInfo.bundleName = bundleName;
202         autoStartupInfo.abilityName = abilityName;
203         ErrCode res = autoStartUpclient->CancelApplicationAutoStartupByEDM(autoStartupInfo, true);
204         EDMLOGI("ManageAutoStartAppsPlugin OnAdminRemoveDone result %{public}d:", res);
205     });
206 }
207 
ParseAutoStartAppWant(std::string appWant,std::string & bundleName,std::string & abilityName)208 bool ManageAutoStartAppsPlugin::ParseAutoStartAppWant(std::string appWant, std::string &bundleName,
209     std::string &abilityName)
210 {
211     size_t index = appWant.find(SPERATOR);
212     if (index != appWant.npos) {
213         bundleName = appWant.substr(0, index);
214         abilityName = appWant.substr(index + 1);
215     } else {
216         EDMLOGE("ManageAutoStartAppsPlugin ParseAutoStartAppWant parse auto start app want failed");
217         return false;
218     }
219     return true;
220 }
221 
CheckBundleAndAbilityExited(const std::string & bundleName,const std::string & abilityName)222 bool ManageAutoStartAppsPlugin::CheckBundleAndAbilityExited(const std::string &bundleName,
223     const std::string &abilityName)
224 {
225     auto remoteObject = EdmSysManager::GetRemoteObjectOfSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
226     sptr<AppExecFwk::IBundleMgr> proxy = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
227     if (!proxy) {
228         EDMLOGE("EnterpriseDeviceMgrAbility::GetAllPermissionsByAdmin GetBundleMgr failed.");
229         return false;
230     }
231 
232     std::vector<AppExecFwk::AbilityInfo> abilityInfos;
233     AppExecFwk::ElementName element;
234     element.SetBundleName(bundleName);
235     element.SetAbilityName(abilityName);
236     OHOS::AppExecFwk::IBundleMgr::Want want;
237     want.SetElement(element);
238     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionAbilityInfo;
239     return proxy->QueryAbilityInfos(want, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT,
240         DEFAULT_USER_ID, abilityInfos) ||
241         proxy->QueryExtensionAbilityInfos(want, AppExecFwk::ExtensionAbilityType::SERVICE,
242             AppExecFwk::ExtensionAbilityInfoFlag::GET_EXTENSION_INFO_DEFAULT, DEFAULT_USER_ID,
243             extensionAbilityInfo);
244 }
245 } // namespace EDM
246 } // namespace OHOS
247