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