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