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