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