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> ¤tData,
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> ¤tData,
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