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