1 /*
2 * Copyright (c) 2023-2025 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 "ability_auto_startup_service.h"
17
18 #include "ability_auto_startup_data_manager.h"
19 #include "ability_manager_service.h"
20 #include "auto_startup_callback_proxy.h"
21 #include "auto_startup_interface.h"
22 #include "global_constant.h"
23 #include "hilog_tag_wrapper.h"
24 #include "in_process_call_wrapper.h"
25 #include "permission_constants.h"
26
27 namespace OHOS {
28 namespace AbilityRuntime {
29 using namespace OHOS::AAFwk;
30 namespace {
31 constexpr char PRODUCT_APPBOOT_SETTING_ENABLED[] = "const.product.appboot.setting.enabled";
32 } // namespace
33
AbilityAutoStartupService()34 AbilityAutoStartupService::AbilityAutoStartupService() {}
35
~AbilityAutoStartupService()36 AbilityAutoStartupService::~AbilityAutoStartupService() {}
37
RegisterAutoStartupSystemCallback(const sptr<IRemoteObject> & callback)38 int32_t AbilityAutoStartupService::RegisterAutoStartupSystemCallback(const sptr<IRemoteObject> &callback)
39 {
40 int32_t code = CheckPermissionForSystem();
41 if (code != ERR_OK) {
42 return code;
43 }
44
45 {
46 std::lock_guard<std::mutex> lock(autoStartUpMutex_);
47 bool isFound = false;
48 auto item = callbackVector_.begin();
49 while (item != callbackVector_.end()) {
50 if (*item == callback) {
51 isFound = true;
52 break;
53 }
54 item++;
55 }
56 if (!isFound) {
57 callbackVector_.emplace_back(callback);
58 SetDeathRecipient(
59 callback, new (std::nothrow) AbilityAutoStartupService::ClientDeathRecipient(weak_from_this()));
60 } else {
61 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Callback already exist");
62 }
63 }
64 return ERR_OK;
65 }
66
UnregisterAutoStartupSystemCallback(const sptr<IRemoteObject> & callback)67 int32_t AbilityAutoStartupService::UnregisterAutoStartupSystemCallback(const sptr<IRemoteObject> &callback)
68 {
69 int32_t code = CheckPermissionForSystem();
70 if (code != ERR_OK) {
71 return code;
72 }
73
74 {
75 std::lock_guard<std::mutex> lock(autoStartUpMutex_);
76 bool isFound = false;
77 auto item = callbackVector_.begin();
78 while (item != callbackVector_.end()) {
79 if (*item == callback) {
80 item = callbackVector_.erase(item);
81 isFound = true;
82 } else {
83 item++;
84 }
85 }
86 if (!isFound) {
87 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Callback not exist");
88 }
89 }
90 return ERR_OK;
91 }
92
SetApplicationAutoStartup(const AutoStartupInfo & info)93 int32_t AbilityAutoStartupService::SetApplicationAutoStartup(const AutoStartupInfo &info)
94 {
95 TAG_LOGD(AAFwkTag::AUTO_STARTUP,
96 "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s,"
97 " accessTokenId: %{public}s, setterUserId: %{public}d",
98 info.bundleName.c_str(), info.moduleName.c_str(),
99 info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId);
100 int32_t code = CheckPermissionForSystem();
101 if (code != ERR_OK) {
102 return code;
103 }
104
105 AutoStartupAbilityData abilityData;
106 code = GetAbilityInfo(info, abilityData);
107 if (code != ERR_OK) {
108 return code;
109 }
110
111 AutoStartupInfo fullInfo(info);
112 fullInfo.abilityTypeName = abilityData.abilityTypeName;
113 fullInfo.setterUserId = abilityData.setterUserId;
114 fullInfo.accessTokenId = abilityData.accessTokenId;
115 fullInfo.userId = abilityData.userId;
116 fullInfo.canUserModify = true;
117 fullInfo.setterType = AutoStartupSetterType::USER;
118
119 return InnerSetApplicationAutoStartup(fullInfo);
120 }
121
InnerSetApplicationAutoStartup(const AutoStartupInfo & info)122 int32_t AbilityAutoStartupService::InnerSetApplicationAutoStartup(const AutoStartupInfo &info)
123 {
124 AutoStartupStatus status =
125 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->QueryAutoStartupData(info);
126 if (status.code != ERR_OK && status.code != ERR_NAME_NOT_FOUND) {
127 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "QueryAutoStartupData fail");
128 return status.code;
129 }
130
131 int32_t result;
132 if (status.code == ERR_NAME_NOT_FOUND) {
133 TAG_LOGI(AAFwkTag::AUTO_STARTUP, "Not found");
134 result =
135 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->InsertAutoStartupData(info, true, false);
136 if (result == ERR_OK) {
137 ExecuteCallbacks(true, info);
138 }
139 return result;
140 }
141 if (status.isEdmForce) {
142 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Edm abnormal");
143 return ERR_EDM_APP_CONTROLLED;
144 }
145 if (!status.isAutoStartup) {
146 result =
147 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->UpdateAutoStartupData(info, true, false);
148 if (result == ERR_OK) {
149 ExecuteCallbacks(true, info);
150 }
151 return result;
152 }
153 return ERR_OK;
154 }
155
CancelApplicationAutoStartup(const AutoStartupInfo & info)156 int32_t AbilityAutoStartupService::CancelApplicationAutoStartup(const AutoStartupInfo &info)
157 {
158 TAG_LOGD(AAFwkTag::AUTO_STARTUP,
159 "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s,"
160 " accessTokenId: %{public}s, setterUserId: %{public}d",
161 info.bundleName.c_str(), info.moduleName.c_str(),
162 info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId);
163 int32_t code = CheckPermissionForSystem();
164 if (code != ERR_OK) {
165 return code;
166 }
167
168 AutoStartupAbilityData abilityData;
169 code = GetAbilityInfo(info, abilityData);
170 if (code != ERR_OK) {
171 return code;
172 }
173
174 AutoStartupInfo fullInfo(info);
175 fullInfo.abilityTypeName = abilityData.abilityTypeName;
176 fullInfo.accessTokenId = abilityData.accessTokenId;
177 fullInfo.setterUserId = abilityData.setterUserId;
178 fullInfo.userId = abilityData.userId;
179 fullInfo.canUserModify = true;
180 fullInfo.setterType = AutoStartupSetterType::USER;
181
182 return InnerCancelApplicationAutoStartup(fullInfo);
183 }
184
InnerCancelApplicationAutoStartup(const AutoStartupInfo & info)185 int32_t AbilityAutoStartupService::InnerCancelApplicationAutoStartup(const AutoStartupInfo &info)
186 {
187 AutoStartupStatus status =
188 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->QueryAutoStartupData(info);
189 if (status.code != ERR_OK) {
190 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "QueryAutoStartupData fail");
191 return status.code;
192 }
193
194 if (status.isEdmForce) {
195 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Edm abnormal");
196 return ERR_EDM_APP_CONTROLLED;
197 }
198
199 if (status.isAutoStartup) {
200 if (status.setterUserId != -1 &&
201 status.setterUserId != info.setterUserId &&
202 status.setterType == AutoStartupSetterType::USER) {
203 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "setter id is different, cannot cancel");
204 return ERR_INVALID_OPERATION;
205 }
206 int32_t result = DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->DeleteAutoStartupData(info);
207 if (result == ERR_OK) {
208 ExecuteCallbacks(false, info);
209 }
210 return result;
211 }
212 return ERR_OK;
213 }
214
QueryAllAutoStartupApplications(std::vector<AutoStartupInfo> & infoList,int32_t userId)215 int32_t AbilityAutoStartupService::QueryAllAutoStartupApplications(std::vector<AutoStartupInfo> &infoList,
216 int32_t userId)
217 {
218 int32_t code = CheckPermissionForEDM();
219 bool isCalledByEDM = (code == ERR_OK);
220 if (!isCalledByEDM) {
221 code = CheckPermissionForSystem();
222 }
223 if (code != ERR_OK) {
224 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "permission verification fail");
225 return code;
226 }
227
228 return DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->QueryAllAutoStartupApplications(infoList,
229 userId, isCalledByEDM);
230 }
231
QueryAllAutoStartupApplicationsWithoutPermission(std::vector<AutoStartupInfo> & infoList,int32_t userId)232 int32_t AbilityAutoStartupService::QueryAllAutoStartupApplicationsWithoutPermission(
233 std::vector<AutoStartupInfo> &infoList, int32_t userId)
234 {
235 if (!system::GetBoolParameter(PRODUCT_APPBOOT_SETTING_ENABLED, false)) {
236 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Disabled config");
237 return ERR_NOT_SUPPORTED_PRODUCT_TYPE;
238 }
239
240 return DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->QueryAllAutoStartupApplications(infoList,
241 userId, false);
242 }
243
DeleteAutoStartupData(const std::string & bundleName,const int32_t accessTokenId)244 int32_t AbilityAutoStartupService::DeleteAutoStartupData(const std::string &bundleName, const int32_t accessTokenId)
245 {
246 return DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->DeleteAutoStartupData(
247 bundleName, accessTokenId);
248 }
249
CheckAutoStartupData(const std::string & bundleName,int32_t uid)250 int32_t AbilityAutoStartupService::CheckAutoStartupData(const std::string &bundleName, int32_t uid)
251 {
252 int32_t appIndex = 0;
253 AppExecFwk::BundleInfo bundleInfo;
254 int32_t userId = uid / AppExecFwk::Constants::BASE_USER_RANGE;
255 int32_t validUserId = GetValidUserId(userId);
256 if (!GetBundleInfo(bundleName, validUserId, appIndex, bundleInfo)) {
257 return INNER_ERR;
258 }
259 auto tokenId = bundleInfo.applicationInfo.accessTokenId;
260 std::string accessTokenIdStr = std::to_string(tokenId);
261 std::vector<AutoStartupInfo> infoList;
262 int32_t result = DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->GetCurrentAppAutoStartupData(
263 bundleName, infoList, accessTokenIdStr);
264 if (result != ERR_OK) {
265 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "get auto startup data fail");
266 return result;
267 }
268 if (infoList.size() == 0) {
269 return ERR_OK;
270 }
271
272 bool isFound = false;
273 for (auto info : infoList) {
274 for (auto abilityInfo : bundleInfo.abilityInfos) {
275 if (IsTargetAbility(info, abilityInfo)) {
276 isFound = true;
277 break;
278 }
279 }
280 }
281
282 if (!isFound) {
283 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Current bundleName not found");
284 return DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->DeleteAutoStartupData(bundleName,
285 tokenId);
286 }
287 return ERR_OK;
288 }
289
GetCallbackVector(std::vector<sptr<IRemoteObject>> & callbackVector)290 void AbilityAutoStartupService::GetCallbackVector(std::vector<sptr<IRemoteObject>>& callbackVector)
291 {
292 std::lock_guard<std::mutex> lock(autoStartUpMutex_);
293 callbackVector = callbackVector_;
294 }
295
ExecuteCallbacks(bool isCallOn,const AutoStartupInfo & info)296 void AbilityAutoStartupService::ExecuteCallbacks(bool isCallOn, const AutoStartupInfo &info)
297 {
298 TAG_LOGD(AAFwkTag::AUTO_STARTUP,
299 "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s,"
300 " accessTokenId: %{public}s, setterUserId: %{public}d, userId: %{public}d",
301 info.bundleName.c_str(), info.moduleName.c_str(),
302 info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId, info.userId);
303 int32_t currentUserId = DelayedSingleton<AbilityManagerService>::GetInstance()->GetUserId();
304 bool isUserIdMatch = (info.userId == currentUserId);
305 bool isUserIdU0OrU1 = (U0_USER_ID == info.userId) || (U1_USER_ID == info.userId);
306 if (!isUserIdMatch && !isUserIdU0OrU1) {
307 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Condition not satisfied");
308 return;
309 }
310 std::vector<sptr<IRemoteObject>> callbackVector;
311 GetCallbackVector(callbackVector);
312 for (auto& item : callbackVector) {
313 auto remoteSystemCallback = iface_cast<IAutoStartupCallBack>(item);
314 if (remoteSystemCallback != nullptr) {
315 if (isCallOn) {
316 remoteSystemCallback->OnAutoStartupOn(info);
317 } else {
318 remoteSystemCallback->OnAutoStartupOff(info);
319 }
320 }
321 }
322 }
323
SetDeathRecipient(const sptr<IRemoteObject> & callback,const sptr<IRemoteObject::DeathRecipient> & deathRecipient)324 void AbilityAutoStartupService::SetDeathRecipient(
325 const sptr<IRemoteObject> &callback, const sptr<IRemoteObject::DeathRecipient> &deathRecipient)
326 {
327 if (callback == nullptr || deathRecipient == nullptr) {
328 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "callerToken or deathRecipient empty");
329 return;
330 }
331 std::lock_guard<std::mutex> lock(deathRecipientsMutex_);
332 auto iter = deathRecipients_.find(callback);
333 if (iter == deathRecipients_.end()) {
334 deathRecipients_.emplace(callback, deathRecipient);
335 callback->AddDeathRecipient(deathRecipient);
336 return;
337 }
338 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "DeathRecipient added");
339 }
340
CleanResource(const wptr<IRemoteObject> & remote)341 void AbilityAutoStartupService::CleanResource(const wptr<IRemoteObject> &remote)
342 {
343 auto object = remote.promote();
344 if (object == nullptr) {
345 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null remote obj");
346 return;
347 }
348
349 // Clean the callbackVector_.
350 {
351 std::lock_guard<std::mutex> lock(autoStartUpMutex_);
352 for (auto item = callbackVector_.begin(); item != callbackVector_.end();) {
353 if (*item == object) {
354 item = callbackVector_.erase(item);
355 } else {
356 item++;
357 }
358 }
359 }
360 {
361 std::lock_guard<std::mutex> deathLock(deathRecipientsMutex_);
362 auto iter = deathRecipients_.find(object);
363 if (iter != deathRecipients_.end()) {
364 auto deathRecipient = iter->second;
365 deathRecipients_.erase(iter);
366 object->RemoveDeathRecipient(deathRecipient);
367 }
368 }
369 }
370
ClientDeathRecipient(const std::weak_ptr<AbilityAutoStartupService> & weakPtr)371 AbilityAutoStartupService::ClientDeathRecipient::ClientDeathRecipient(
372 const std::weak_ptr<AbilityAutoStartupService> &weakPtr)
373 {
374 weakPtr_ = weakPtr;
375 }
376
OnRemoteDied(const wptr<IRemoteObject> & remote)377 void AbilityAutoStartupService::ClientDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
378 {
379 auto abilityAutoStartupService = weakPtr_.lock();
380 if (abilityAutoStartupService == nullptr) {
381 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null abilityAutoStartupService");
382 return;
383 }
384 abilityAutoStartupService->CleanResource(remote);
385 }
386
GetSelfApplicationBundleName()387 std::string AbilityAutoStartupService::GetSelfApplicationBundleName()
388 {
389 auto bundleMgrClient = GetBundleMgrClient();
390 if (bundleMgrClient == nullptr) {
391 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null bundleMgrClient");
392 return "";
393 }
394
395 std::string bundleName;
396 int32_t callerUid = IPCSkeleton::GetCallingUid();
397 if (IN_PROCESS_CALL(bundleMgrClient->GetNameForUid(callerUid, bundleName)) != ERR_OK) {
398 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "get bundleName fail");
399 return "";
400 }
401 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Get bundle name: %{public}s", bundleName.c_str());
402 return bundleName;
403 }
404
CheckSelfApplication(const std::string & bundleName)405 bool AbilityAutoStartupService::CheckSelfApplication(const std::string &bundleName)
406 {
407 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Called, bundleName: %{public}s", bundleName.c_str());
408 return GetSelfApplicationBundleName() == bundleName ? true : false;
409 }
410
GetValidUserId(int32_t userId)411 int32_t AbilityAutoStartupService::GetValidUserId(int32_t userId)
412 {
413 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "userId = %{public}d.", userId);
414 int32_t validUserId = userId;
415
416 if (userId == -1) {
417 validUserId = IPCSkeleton::GetCallingUid() / AppExecFwk::Constants::BASE_USER_RANGE;
418 }
419 if (validUserId == U0_USER_ID || validUserId == U1_USER_ID) {
420 validUserId = DelayedSingleton<AbilityManagerService>::GetInstance()->GetUserId();
421 }
422 return validUserId;
423 }
424
GetBundleInfo(const std::string & bundleName,int32_t userId,int32_t appIndex,AppExecFwk::BundleInfo & bundleInfo)425 bool AbilityAutoStartupService::GetBundleInfo(const std::string &bundleName, int32_t userId, int32_t appIndex,
426 AppExecFwk::BundleInfo &bundleInfo)
427 {
428 TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, userId: %{public}d, appIndex: %{public}d",
429 bundleName.c_str(), userId, appIndex);
430 auto bundleMgrHelper = DelayedSingleton<AppExecFwk::BundleMgrHelper>::GetInstance();
431 if (bundleMgrHelper == nullptr) {
432 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null bundleMgrHelper");
433 return false;
434 }
435 if (appIndex == 0) {
436 auto flags =
437 AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES | AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
438 if (!IN_PROCESS_CALL(bundleMgrHelper->GetBundleInfo(
439 bundleName, static_cast<AppExecFwk::BundleFlag>(flags), bundleInfo, userId))) {
440 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "get bundleInfo fail");
441 return false;
442 }
443 } else if (appIndex <= GlobalConstant::MAX_APP_CLONE_INDEX) {
444 auto bundleFlag = static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION) +
445 static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) +
446 static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY) +
447 static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE);
448 auto bundleMgrResult = IN_PROCESS_CALL(
449 bundleMgrHelper->GetCloneBundleInfo(bundleName, bundleFlag, appIndex, bundleInfo, userId));
450 if (bundleMgrResult != ERR_OK) {
451 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "error bundleMgrResult");
452 return false;
453 }
454 } else {
455 if (!IN_PROCESS_CALL(bundleMgrHelper->GetSandboxBundleInfo(bundleName, appIndex, userId, bundleInfo))) {
456 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetSandboxBundleInfo fail");
457 return false;
458 }
459 }
460 return true;
461 }
462
GetAbilityData(const AutoStartupInfo & info,AutoStartupAbilityData & abilityData)463 bool AbilityAutoStartupService::GetAbilityData(const AutoStartupInfo &info, AutoStartupAbilityData &abilityData)
464 {
465 TAG_LOGD(AAFwkTag::AUTO_STARTUP,
466 "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s,"
467 " accessTokenId: %{public}s, setterUserId: %{public}d",
468 info.bundleName.c_str(), info.moduleName.c_str(),
469 info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId);
470 AppExecFwk::BundleInfo bundleInfo;
471 int32_t validUserId = GetValidUserId(info.userId);
472 if (!GetBundleInfo(info.bundleName, validUserId, info.appCloneIndex, bundleInfo)) {
473 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetBundleInfo fail");
474 return false;
475 }
476 auto accessTokenIdStr = bundleInfo.applicationInfo.accessTokenId;
477 abilityData.accessTokenId = std::to_string(accessTokenIdStr);
478 abilityData.setterUserId = IPCSkeleton::GetCallingUid() / AppExecFwk::Constants::BASE_USER_RANGE;
479 abilityData.userId = bundleInfo.applicationInfo.uid / AppExecFwk::Constants::BASE_USER_RANGE;
480 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
481 for (const auto& abilityInfo : hapModuleInfo.abilityInfos) {
482 if (IsTargetAbility(info, abilityInfo)) {
483 abilityData.isVisible = abilityInfo.visible;
484 abilityData.abilityTypeName = GetAbilityTypeName(abilityInfo);
485 return true;
486 }
487 }
488 }
489
490 for (const auto& extensionInfo : bundleInfo.extensionInfos) {
491 if (IsTargetExtension(info, extensionInfo)) {
492 abilityData.isVisible = extensionInfo.visible;
493 abilityData.abilityTypeName = GetExtensionTypeName(extensionInfo);
494 return true;
495 }
496 }
497 return false;
498 }
499
IsTargetAbility(const AutoStartupInfo & info,const AppExecFwk::AbilityInfo & abilityInfo)500 bool AbilityAutoStartupService::IsTargetAbility(const AutoStartupInfo &info,
501 const AppExecFwk::AbilityInfo &abilityInfo)
502 {
503 return ((abilityInfo.bundleName == info.bundleName) &&
504 (abilityInfo.name == info.abilityName) &&
505 (info.moduleName.empty() || abilityInfo.moduleName == info.moduleName));
506 }
507
IsTargetExtension(const AutoStartupInfo & info,const AppExecFwk::ExtensionAbilityInfo & extensionInfo)508 bool AbilityAutoStartupService::IsTargetExtension(const AutoStartupInfo &info,
509 const AppExecFwk::ExtensionAbilityInfo &extensionInfo)
510 {
511 return ((extensionInfo.bundleName == info.bundleName) &&
512 (extensionInfo.name == info.abilityName) &&
513 (info.moduleName.empty() || extensionInfo.moduleName == info.moduleName));
514 }
515
GetAbilityTypeName(const AppExecFwk::AbilityInfo & abilityInfo)516 std::string AbilityAutoStartupService::GetAbilityTypeName(const AppExecFwk::AbilityInfo &abilityInfo)
517 {
518 if (abilityInfo.type == AppExecFwk::AbilityType::PAGE) {
519 return "UIAbility";
520 }
521 return "";
522 }
523
GetExtensionTypeName(const AppExecFwk::ExtensionAbilityInfo & extensionInfo)524 std::string AbilityAutoStartupService::GetExtensionTypeName(
525 const AppExecFwk::ExtensionAbilityInfo &extensionInfo)
526 {
527 switch (extensionInfo.type) {
528 case AppExecFwk::ExtensionAbilityType::APP_SERVICE:
529 return EXTENSION_TYPE_APP_SERVICE;
530 case AppExecFwk::ExtensionAbilityType::SERVICE:
531 return "ServiceExtension";
532 default:
533 return "";
534 }
535 }
536
GetBundleMgrClient()537 std::shared_ptr<AppExecFwk::BundleMgrClient> AbilityAutoStartupService::GetBundleMgrClient()
538 {
539 if (bundleMgrClient_ == nullptr) {
540 bundleMgrClient_ = DelayedSingleton<AppExecFwk::BundleMgrClient>::GetInstance();
541 }
542 return bundleMgrClient_;
543 }
544
CheckPermissionForSystem()545 int32_t AbilityAutoStartupService::CheckPermissionForSystem()
546 {
547 if (!system::GetBoolParameter(PRODUCT_APPBOOT_SETTING_ENABLED, false)) {
548 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Disabled config");
549 return ERR_NOT_SUPPORTED_PRODUCT_TYPE;
550 }
551
552 if (!PermissionVerification::GetInstance()->JudgeCallerIsAllowedToUseSystemAPI()) {
553 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "not use system-api");
554 return ERR_NOT_SYSTEM_APP;
555 }
556
557 if (!PermissionVerification::GetInstance()->VerifyCallingPermission(
558 PermissionConstants::PERMISSION_MANAGE_APP_BOOT)) {
559 TAG_LOGE(AAFwkTag::AUTO_STARTUP, " verify PERMISSION_MANAGE_APP_BOOT fail");
560 return CHECK_PERMISSION_FAILED;
561 }
562
563 return ERR_OK;
564 }
565
CheckPermissionForSelf(const std::string & bundleName)566 int32_t AbilityAutoStartupService::CheckPermissionForSelf(const std::string &bundleName)
567 {
568 if (!system::GetBoolParameter(PRODUCT_APPBOOT_SETTING_ENABLED, false)) {
569 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Disabled config");
570 return ERR_NOT_SUPPORTED_PRODUCT_TYPE;
571 }
572
573 if (!CheckSelfApplication(bundleName)) {
574 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Not self application");
575 return ERR_NOT_SELF_APPLICATION;
576 }
577 return ERR_OK;
578 }
579
GetAbilityInfo(const AutoStartupInfo & info,AutoStartupAbilityData & abilityData)580 int32_t AbilityAutoStartupService::GetAbilityInfo(
581 const AutoStartupInfo &info, AutoStartupAbilityData &abilityData)
582 {
583 if (!GetAbilityData(info, abilityData)) {
584 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetAbilityData fail");
585 return INNER_ERR;
586 }
587
588 if (!abilityData.isVisible) {
589 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "not visible");
590 return ABILITY_VISIBLE_FALSE_DENY_REQUEST;
591 }
592
593 if ((abilityData.abilityTypeName == EXTENSION_TYPE_APP_SERVICE) &&
594 (abilityData.userId != U1_USER_ID)) {
595 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "AppServiceExtension does not belong to U1");
596 return INNER_ERR;
597 }
598
599 return ERR_OK;
600 }
601
SetApplicationAutoStartupByEDM(const AutoStartupInfo & info,bool flag)602 int32_t AbilityAutoStartupService::SetApplicationAutoStartupByEDM(const AutoStartupInfo &info, bool flag)
603 {
604 int32_t errorCode = CheckPermissionForEDM();
605 if (errorCode != ERR_OK) {
606 return errorCode;
607 }
608 AutoStartupAbilityData abilityData;
609 errorCode = GetAbilityInfo(info, abilityData);
610 if (errorCode != ERR_OK) {
611 return errorCode;
612 }
613 AutoStartupInfo fullInfo(info);
614 fullInfo.abilityTypeName = abilityData.abilityTypeName;
615 fullInfo.accessTokenId = abilityData.accessTokenId;
616 fullInfo.setterUserId = abilityData.setterUserId;
617 fullInfo.userId = abilityData.userId;
618 fullInfo.canUserModify = !flag;
619 fullInfo.setterType = AutoStartupSetterType::SYSTEM;
620 return InnerApplicationAutoStartupByEDM(fullInfo, true, flag);
621 }
622
CancelApplicationAutoStartupByEDM(const AutoStartupInfo & info,bool flag)623 int32_t AbilityAutoStartupService::CancelApplicationAutoStartupByEDM(const AutoStartupInfo &info, bool flag)
624 {
625 int32_t errorCode = CheckPermissionForEDM();
626 if (errorCode != ERR_OK) {
627 return errorCode;
628 }
629 AutoStartupAbilityData abilityData;
630 errorCode = GetAbilityInfo(info, abilityData);
631 if (errorCode != ERR_OK) {
632 return errorCode;
633 }
634 AutoStartupInfo fullInfo(info);
635 fullInfo.abilityTypeName = abilityData.abilityTypeName;
636 fullInfo.accessTokenId = abilityData.accessTokenId;
637 fullInfo.setterUserId = abilityData.setterUserId;
638 fullInfo.userId = abilityData.userId;
639 fullInfo.canUserModify = !flag;
640 fullInfo.setterType = AutoStartupSetterType::SYSTEM;
641 return InnerApplicationAutoStartupByEDM(fullInfo, false, flag);
642 }
643
InnerApplicationAutoStartupByEDM(const AutoStartupInfo & info,bool isSet,bool flag)644 int32_t AbilityAutoStartupService::InnerApplicationAutoStartupByEDM(const AutoStartupInfo &info, bool isSet, bool flag)
645 {
646 TAG_LOGD(AAFwkTag::AUTO_STARTUP,
647 "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s, accessTokenId: %{public}s,"
648 " setterUserId: %{public}d, isSet: %{public}d, flag: %{public}d",
649 info.bundleName.c_str(), info.moduleName.c_str(), info.abilityName.c_str(),
650 info.accessTokenId.c_str(), info.setterUserId, isSet, flag);
651 AutoStartupStatus status =
652 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->QueryAutoStartupData(info);
653 if (status.code != ERR_OK && status.code != ERR_NAME_NOT_FOUND) {
654 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "QueryAutoStartupData fail");
655 return status.code;
656 }
657
658 int32_t result = ERR_OK;
659 if (status.code == ERR_NAME_NOT_FOUND) {
660 result = DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->InsertAutoStartupData(
661 info, isSet, flag);
662 if (result == ERR_OK && isSet) {
663 ExecuteCallbacks(isSet, info);
664 }
665 return result;
666 }
667
668 bool isFlag = isSet ? !status.isAutoStartup : status.isAutoStartup;
669 if (isFlag) {
670 result =
671 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->UpdateAutoStartupData(info, isSet, flag);
672 if (result == ERR_OK) {
673 ExecuteCallbacks(isSet, info);
674 }
675 return result;
676 }
677 if (status.isEdmForce != flag) {
678 result =
679 DelayedSingleton<AbilityAutoStartupDataManager>::GetInstance()->UpdateAutoStartupData(info, isSet, flag);
680 if (result == ERR_OK) {
681 ExecuteCallbacks(isSet, info);
682 }
683 return result;
684 }
685
686 return result;
687 }
688
CheckPermissionForEDM()689 int32_t AbilityAutoStartupService::CheckPermissionForEDM()
690 {
691 if (!PermissionVerification::GetInstance()->VerifyCallingPermission(
692 PermissionConstants::PERMISSION_MANAGE_APP_BOOT_INTERNAL)) {
693 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "verify PERMISSION_MANAGE_APP_BOOT_INTERNAL fail");
694 return CHECK_PERMISSION_FAILED;
695 }
696 return ERR_OK;
697 }
698 } // namespace AbilityRuntime
699 } // namespace OHOS
700