• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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_manager_service.h"
17 #include "accesstoken_kit.h"
18 
19 #include <chrono>
20 #include <fstream>
21 #include <functional>
22 #include <getopt.h>
23 #include <memory>
24 #include <nlohmann/json.hpp>
25 #include <string>
26 #include <thread>
27 #include <unistd.h>
28 #include <unordered_set>
29 #include <csignal>
30 #include <cstdlib>
31 
32 #include "ability_info.h"
33 #include "ability_interceptor.h"
34 #include "ability_manager_errors.h"
35 #include "ability_util.h"
36 #include "application_util.h"
37 #include "hitrace_meter.h"
38 #include "bundle_mgr_client.h"
39 #include "distributed_client.h"
40 #include "dlp_utils.h"
41 #include "hilog_wrapper.h"
42 #include "if_system_ability_manager.h"
43 #include "in_process_call_wrapper.h"
44 #include "ipc_skeleton.h"
45 #include "iservice_registry.h"
46 #include "itest_observer.h"
47 #include "mission_info_mgr.h"
48 #include "sa_mgr_client.h"
49 #include "system_ability_token_callback.h"
50 #include "softbus_bus_center.h"
51 #include "string_ex.h"
52 #include "system_ability_definition.h"
53 #include "os_account_manager_wrapper.h"
54 #include "permission_constants.h"
55 #include "uri_permission_manager_client.h"
56 #include "xcollie/watchdog.h"
57 #include "hisysevent.h"
58 #include "connection_state_manager.h"
59 
60 #ifdef SUPPORT_GRAPHICS
61 #include "display_manager.h"
62 #include "input_manager.h"
63 #include "png.h"
64 #include "ui_service_mgr_client.h"
65 #endif
66 
67 #ifdef EFFICIENCY_MANAGER_ENABLE
68 #include "suspend_manager_client.h"
69 #endif // EFFICIENCY_MANAGER_ENABLE
70 
71 #ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
72 #include "res_sched_client.h"
73 #include "res_type.h"
74 #endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
75 #include "container_manager_client.h"
76 
77 #include "ability_bundle_event_callback.h"
78 
79 using OHOS::AppExecFwk::ElementName;
80 using OHOS::Security::AccessToken::AccessTokenKit;
81 
82 namespace OHOS {
83 namespace AAFwk {
84 namespace {
85 const std::string ARGS_USER_ID = "-u";
86 const std::string ARGS_CLIENT = "-c";
87 const std::string ILLEGAL_INFOMATION = "The arguments are illegal and you can enter '-h' for help.";
88 
89 constexpr int32_t NEW_RULE_VALUE_SIZE = 6;
90 constexpr int32_t KILL_APP_TIME = 3000;
91 constexpr int64_t APP_ALIVE_TIME_MS = 1000;  // Allow background startup within 1 second after application startup
92 const std::string IS_DELEGATOR_CALL = "isDelegatorCall";
93 // Startup rule switch
94 const std::string COMPONENT_STARTUP_NEW_RULES = "component.startup.newRules";
95 const std::string NEW_RULES_EXCEPT_LAUNCHER_SYSTEMUI = "component.startup.newRules.except.LauncherSystemUI";
96 const std::string BACKGROUND_JUDGE_FLAG = "component.startup.backgroundJudge.flag";
97 const std::string WHITE_LIST_ASS_WAKEUP_FLAG = "component.startup.whitelist.associatedWakeUp";
98 // White list app
99 const std::string BUNDLE_NAME_LAUNCHER = "com.ohos.launcher";
100 const std::string BUNDLE_NAME_SYSTEMUI = "com.ohos.systemui";
101 const std::string BUNDLE_NAME_SETTINGSDATA = "com.ohos.settingsdata";
102 
103 const std::unordered_set<std::string> WHITE_LIST_ASS_WAKEUP_SET = { BUNDLE_NAME_SETTINGSDATA };
104 } // namespace
105 
106 using namespace std::chrono;
107 using namespace std::chrono_literals;
108 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
109 using namespace BackgroundTaskMgr;
110 #endif
111 const bool CONCURRENCY_MODE_FALSE = false;
112 const int32_t MAIN_USER_ID = 100;
113 const int32_t U0_USER_ID = 0;
114 constexpr int32_t INVALID_USER_ID = -1;
115 constexpr auto DATA_ABILITY_START_TIMEOUT = 5s;
116 constexpr int32_t NON_ANONYMIZE_LENGTH = 6;
117 constexpr uint32_t SCENE_FLAG_NORMAL = 0;
118 const int32_t MAX_NUMBER_OF_DISTRIBUTED_MISSIONS = 20;
119 const int32_t SWITCH_ACCOUNT_TRY = 3;
120 #ifdef ABILITY_COMMAND_FOR_TEST
121 const int32_t BLOCK_AMS_SERVICE_TIME = 65;
122 #endif
123 const std::string EMPTY_DEVICE_ID = "";
124 const int32_t APP_MEMORY_SIZE = 512;
125 const int32_t GET_PARAMETER_INCORRECT = -9;
126 const int32_t GET_PARAMETER_OTHER = -1;
127 const int32_t SIZE_10 = 10;
128 const int32_t ACCOUNT_MGR_SERVICE_UID = 3058;
129 const int32_t DMS_UID = 5522;
130 const std::string BUNDLE_NAME_KEY = "bundleName";
131 const std::string DM_PKG_NAME = "ohos.distributedhardware.devicemanager";
132 const std::string ACTION_CHOOSE = "ohos.want.action.select";
133 const std::string HIGHEST_PRIORITY_ABILITY_ENTITY = "flag.home.intent.from.system";
134 const std::string DMS_API_VERSION = "dmsApiVersion";
135 const std::string DMS_IS_CALLER_BACKGROUND = "dmsIsCallerBackGround";
136 const std::string DMS_PROCESS_NAME = "distributedsched";
137 const std::string DMS_MISSION_ID = "dmsMissionId";
138 const std::string DLP_INDEX = "ohos.dlp.params.index";
139 const std::string BOOTEVENT_APPFWK_READY = "bootevent.appfwk.ready";
140 const std::string BOOTEVENT_BOOT_COMPLETED = "bootevent.boot.completed";
141 const std::string BOOTEVENT_BOOT_ANIMATION_STARTED = "bootevent.bootanimation.started";
142 const std::string NEED_STARTINGWINDOW = "ohos.ability.NeedStartingWindow";
143 const int DEFAULT_DMS_MISSION_ID = -1;
144 const std::map<std::string, AbilityManagerService::DumpKey> AbilityManagerService::dumpMap = {
145     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--all", KEY_DUMP_ALL),
146     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-a", KEY_DUMP_ALL),
147     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--stack-list", KEY_DUMP_STACK_LIST),
148     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-l", KEY_DUMP_STACK_LIST),
149     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--stack", KEY_DUMP_STACK),
150     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-s", KEY_DUMP_STACK),
151     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission", KEY_DUMP_MISSION),
152     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-m", KEY_DUMP_MISSION),
153     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--top", KEY_DUMP_TOP_ABILITY),
154     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-t", KEY_DUMP_TOP_ABILITY),
155     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--waiting-queue", KEY_DUMP_WAIT_QUEUE),
156     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-w", KEY_DUMP_WAIT_QUEUE),
157     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--serv", KEY_DUMP_SERVICE),
158     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-e", KEY_DUMP_SERVICE),
159     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--data", KEY_DUMP_DATA),
160     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-d", KEY_DUMP_DATA),
161     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-focus", KEY_DUMP_FOCUS_ABILITY),
162     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-f", KEY_DUMP_FOCUS_ABILITY),
163     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--win-mode", KEY_DUMP_WINDOW_MODE),
164     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-z", KEY_DUMP_WINDOW_MODE),
165     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission-list", KEY_DUMP_MISSION_LIST),
166     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-L", KEY_DUMP_MISSION_LIST),
167     std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission-infos", KEY_DUMP_MISSION_INFOS),
168     std::map<std::string, AbilityManagerService::DumpKey>::value_type("-S", KEY_DUMP_MISSION_INFOS),
169 };
170 
171 const std::map<std::string, AbilityManagerService::DumpsysKey> AbilityManagerService::dumpsysMap = {
172     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--all", KEY_DUMPSYS_ALL),
173     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-a", KEY_DUMPSYS_ALL),
174     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--mission-list", KEY_DUMPSYS_MISSION_LIST),
175     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-l", KEY_DUMPSYS_MISSION_LIST),
176     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--ability", KEY_DUMPSYS_ABILITY),
177     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-i", KEY_DUMPSYS_ABILITY),
178     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--extension", KEY_DUMPSYS_SERVICE),
179     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-e", KEY_DUMPSYS_SERVICE),
180     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--pending", KEY_DUMPSYS_PENDING),
181     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-p", KEY_DUMPSYS_PENDING),
182     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--process", KEY_DUMPSYS_PROCESS),
183     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-r", KEY_DUMPSYS_PROCESS),
184     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--data", KEY_DUMPSYS_DATA),
185     std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-d", KEY_DUMPSYS_DATA),
186 };
187 
188 const std::map<int32_t, AppExecFwk::SupportWindowMode> AbilityManagerService::windowModeMap = {
189     std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_FULLSCREEN,
190         AppExecFwk::SupportWindowMode::FULLSCREEN),
191     std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_PRIMARY,
192         AppExecFwk::SupportWindowMode::SPLIT),
193     std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_SECONDARY,
194         AppExecFwk::SupportWindowMode::SPLIT),
195     std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_FLOATING,
196         AppExecFwk::SupportWindowMode::FLOATING),
197 };
198 
199 const bool REGISTER_RESULT =
200     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<AbilityManagerService>::GetInstance().get());
201 sptr<AbilityManagerService> AbilityManagerService::instance_;
202 
AbilityManagerService()203 AbilityManagerService::AbilityManagerService()
204     : SystemAbility(ABILITY_MGR_SERVICE_ID, true),
205       eventLoop_(nullptr),
206       handler_(nullptr),
207       state_(ServiceRunningState::STATE_NOT_START),
208       iBundleManager_(nullptr)
209 {
210     DumpFuncInit();
211     DumpSysFuncInit();
212 }
213 
~AbilityManagerService()214 AbilityManagerService::~AbilityManagerService()
215 {}
216 
OnStart()217 void AbilityManagerService::OnStart()
218 {
219     if (state_ == ServiceRunningState::STATE_RUNNING) {
220         HILOG_INFO("AMS has already started.");
221         return;
222     }
223     HILOG_INFO("AMS starting.");
224     if (!Init()) {
225         HILOG_ERROR("Failed to init AMS.");
226         return;
227     }
228     state_ = ServiceRunningState::STATE_RUNNING;
229     eventLoop_->Run();
230     /* Publish service maybe failed, so we need call this function at the last,
231      * so it can't affect the TDD test program */
232     instance_ = DelayedSingleton<AbilityManagerService>::GetInstance().get();
233     if (instance_ == nullptr) {
234         HILOG_ERROR("AMS enter OnStart, but instance_ is nullptr!");
235         return;
236     }
237     bool ret = Publish(instance_);
238     if (!ret) {
239         HILOG_ERROR("Publish AMS failed!");
240         return;
241     }
242 
243     SetParameter(BOOTEVENT_APPFWK_READY.c_str(), "true");
244     WatchParameter(BOOTEVENT_BOOT_COMPLETED.c_str(), AAFwk::ApplicationUtil::AppFwkBootEventCallback, nullptr);
245     AddSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID);
246     HILOG_INFO("AMS start success.");
247 }
248 
Init()249 bool AbilityManagerService::Init()
250 {
251     eventLoop_ = AppExecFwk::EventRunner::Create(AbilityConfig::NAME_ABILITY_MGR_SERVICE);
252     CHECK_POINTER_RETURN_BOOL(eventLoop_);
253 
254     handler_ = std::make_shared<AbilityEventHandler>(eventLoop_, weak_from_this());
255     CHECK_POINTER_RETURN_BOOL(handler_);
256 
257     freeInstallManager_ = std::make_shared<FreeInstallManager>(weak_from_this());
258     CHECK_POINTER_RETURN_BOOL(freeInstallManager_);
259 
260     // init user controller.
261     userController_ = std::make_shared<UserController>();
262     userController_->Init();
263 
264     InitConnectManager(MAIN_USER_ID, true);
265     InitDataAbilityManager(MAIN_USER_ID, true);
266     InitPendWantManager(MAIN_USER_ID, true);
267     systemDataAbilityManager_ = std::make_shared<DataAbilityManager>();
268 
269     amsConfigResolver_ = std::make_shared<AmsConfigurationParameter>();
270     amsConfigResolver_->Parse();
271     HILOG_INFO("ams config parse");
272     InitMissionListManager(MAIN_USER_ID, true);
273     SwitchManagers(U0_USER_ID, false);
274     int amsTimeOut = amsConfigResolver_->GetAMSTimeOutTime();
275     HILOG_INFO("amsTimeOut is %{public}d", amsTimeOut);
276     std::string threadName = std::string(AbilityConfig::NAME_ABILITY_MGR_SERVICE) + "(" +
277         std::to_string(eventLoop_->GetThreadId()) + ")";
278 #ifdef SUPPORT_ASAN
279     constexpr int32_t timeout = 5 * 60 * 1000; // 5 min
280     if (HiviewDFX::Watchdog::GetInstance().AddThread(threadName, handler_, timeout) != 0) {
281         HILOG_ERROR("HiviewDFX::Watchdog::GetInstance AddThread Fail");
282     }
283 #else
284     if (HiviewDFX::Watchdog::GetInstance().AddThread(threadName, handler_) != 0) {
285         HILOG_ERROR("HiviewDFX::Watchdog::GetInstance AddThread Fail");
286     }
287 #endif
288 #ifdef SUPPORT_GRAPHICS
289     anrListener_ = std::make_shared<ApplicationAnrListener>();
290     MMI::InputManager::GetInstance()->SetAnrObserver(anrListener_);
291     DelayedSingleton<SystemDialogScheduler>::GetInstance()->SetDeviceType(amsConfigResolver_->GetDeviceType());
292     implicitStartProcessor_ = std::make_shared<ImplicitStartProcessor>();
293 #endif
294 
295     interceptorExecuter_ = std::make_shared<AbilityInterceptorExecuter>();
296     interceptorExecuter_->AddInterceptor(std::make_shared<CrowdTestInterceptor>());
297     interceptorExecuter_->AddInterceptor(std::make_shared<ControlInterceptor>());
298 
299     auto startResidentAppsTask = [aams = shared_from_this()]() { aams->StartResidentApps(); };
300     handler_->PostTask(startResidentAppsTask, "StartResidentApps");
301 
302     DelayedSingleton<ConnectionStateManager>::GetInstance()->Init();
303     auto initStartupFlagTask = [aams = shared_from_this()]() { aams->InitStartupFlag(); };
304     handler_->PostTask(initStartupFlagTask, "InitStartupFlag");
305 
306     // Register abilityBundleEventCallback to receive hap updates
307     HILOG_INFO("Register abilityBundleEventCallback to receive hap updates.");
308     sptr<AbilityBundleEventCallback> abilityBundleEventCallback_ =
309         new (std::nothrow) AbilityBundleEventCallback(handler_);
310     auto bms = GetBundleManager();
311     if (bms && abilityBundleEventCallback_) {
312         bool re = bms->RegisterBundleEventCallback(abilityBundleEventCallback_);
313         if (!re) {
314             HILOG_ERROR("RegisterBundleEventCallback failed!");
315         }
316     } else {
317         HILOG_ERROR("Get BundleManager or abilieyBundleEventCallback failed!");
318     }
319 
320     HILOG_INFO("Init success.");
321     return true;
322 }
323 
InitStartupFlag()324 void AbilityManagerService::InitStartupFlag()
325 {
326     startUpNewRule_ = CheckNewRuleSwitchState(COMPONENT_STARTUP_NEW_RULES);
327     newRuleExceptLauncherSystemUI_ = CheckNewRuleSwitchState(NEW_RULES_EXCEPT_LAUNCHER_SYSTEMUI);
328     backgroundJudgeFlag_ = CheckNewRuleSwitchState(BACKGROUND_JUDGE_FLAG);
329     whiteListassociatedWakeUpFlag_ = CheckNewRuleSwitchState(WHITE_LIST_ASS_WAKEUP_FLAG);
330 }
331 
OnStop()332 void AbilityManagerService::OnStop()
333 {
334     HILOG_INFO("Stop AMS.");
335 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
336     std::unique_lock<std::shared_mutex> lock(bgtaskObserverMutex_);
337     if (bgtaskObserver_) {
338         int ret = BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*bgtaskObserver_);
339         if (ret != ERR_OK) {
340             HILOG_ERROR("unsubscribe bgtask failed, err:%{public}d.", ret);
341         }
342     }
343     bgtaskObserver_.reset();
344 #endif
345     eventLoop_.reset();
346     handler_.reset();
347     state_ = ServiceRunningState::STATE_NOT_START;
348 }
349 
QueryServiceState() const350 ServiceRunningState AbilityManagerService::QueryServiceState() const
351 {
352     return state_;
353 }
354 
StartAbility(const Want & want,int32_t userId,int requestCode)355 int AbilityManagerService::StartAbility(const Want &want, int32_t userId, int requestCode)
356 {
357     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
358     HILOG_INFO("%{public}s coldStart:%{public}d", __func__, want.GetBoolParam("coldStart", false));
359     EventInfo eventInfo = BuildEventInfo(want, userId);
360     EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
361     int32_t ret = StartAbilityInner(want, nullptr, requestCode, -1, userId);
362     if (ret != ERR_OK) {
363         eventInfo.errCode = ret;
364         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
365     }
366     return ret;
367 }
368 
StartAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)369 int AbilityManagerService::StartAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
370     int32_t userId, int requestCode)
371 {
372     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
373     auto flags = want.GetFlags();
374     EventInfo eventInfo = BuildEventInfo(want, userId);
375     EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
376     if ((flags & Want::FLAG_ABILITY_CONTINUATION) == Want::FLAG_ABILITY_CONTINUATION) {
377         HILOG_ERROR("StartAbility with continuation flags is not allowed!");
378         eventInfo.errCode = ERR_INVALID_VALUE;
379         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
380         return ERR_INVALID_CONTINUATION_FLAG;
381     }
382 
383     HILOG_INFO("Start ability come, ability is %{public}s, userId is %{public}d",
384         want.GetElement().GetAbilityName().c_str(), userId);
385 
386     int32_t ret = StartAbilityInner(want, callerToken, requestCode, -1, userId);
387     if (ret != ERR_OK) {
388         eventInfo.errCode = ret;
389         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
390     }
391     return ret;
392 }
393 
StartAbilityInner(const Want & want,const sptr<IRemoteObject> & callerToken,int requestCode,int callerUid,int32_t userId)394 int AbilityManagerService::StartAbilityInner(const Want &want, const sptr<IRemoteObject> &callerToken,
395     int requestCode, int callerUid, int32_t userId)
396 {
397     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
398     {
399         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "CHECK_DLP");
400         if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
401             VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
402             !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
403             HILOG_ERROR("%{public}s: Permission verification failed.", __func__);
404             return CHECK_PERMISSION_FAILED;
405         }
406 
407         if (AbilityUtil::HandleDlpApp(const_cast<Want &>(want))) {
408             return StartExtensionAbility(want, callerToken, userId, AppExecFwk::ExtensionAbilityType::SERVICE);
409         }
410     }
411 
412     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
413         auto isSpecificSA = AAFwk::PermissionVerification::GetInstance()->
414             CheckSpecificSystemAbilityAccessPermission();
415         if (!isSpecificSA) {
416             HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
417             return ERR_INVALID_CALLER;
418         }
419         HILOG_INFO("%{public}s: Caller is specific system ability.", __func__);
420     }
421 
422     auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
423         interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
424     if (result != ERR_OK) {
425         HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
426         return result;
427     }
428 
429     int32_t oriValidUserId = GetValidUserId(userId);
430     int32_t validUserId = oriValidUserId;
431 
432     if (callerToken != nullptr && CheckIfOperateRemote(want)) {
433         HILOG_INFO("%{public}s: try to StartRemoteAbility", __func__);
434         return StartRemoteAbility(want, requestCode, validUserId, callerToken);
435     }
436     if (AbilityUtil::IsStartFreeInstall(want)) {
437         if (freeInstallManager_ == nullptr) {
438             return ERR_INVALID_VALUE;
439         }
440         Want localWant = want;
441         if (!localWant.GetDeviceId().empty()) {
442             localWant.SetDeviceId("");
443         }
444         int32_t ret = freeInstallManager_->StartFreeInstall(localWant, validUserId, requestCode, callerToken);
445         if (ret != ERR_OK) {
446             HILOG_DEBUG("StartFreeInstall ret : %{public}d", ret);
447             return ret;
448         }
449     }
450 
451     if (!JudgeMultiUserConcurrency(validUserId)) {
452         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
453         return ERR_CROSS_USER;
454     }
455 
456     AbilityRequest abilityRequest;
457 #ifdef SUPPORT_GRAPHICS
458     if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
459         ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
460         if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
461             return componentRequest.requestResult;
462         }
463         abilityRequest.Voluation(want, requestCode, callerToken);
464         CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
465         return implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
466     }
467 #endif
468     result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
469     ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
470     if (CheckProxyComponent(want, result) && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
471         return componentRequest.requestResult;
472     }
473 
474     if (result != ERR_OK) {
475         HILOG_ERROR("Generate ability request local error.");
476         return result;
477     }
478 
479     auto abilityInfo = abilityRequest.abilityInfo;
480     validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
481     HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
482         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
483 
484     result = CheckStaticCfgPermission(abilityInfo);
485     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
486         HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
487         return ERR_STATIC_CFG_PERMISSION;
488     }
489 
490     auto type = abilityInfo.type;
491     if (type == AppExecFwk::AbilityType::DATA) {
492         HILOG_ERROR("Cannot start data ability, use 'AcquireDataAbility()' instead.");
493         return ERR_WRONG_INTERFACE_CALL;
494     } else if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
495         HILOG_DEBUG("Check call service or extension permission, name is %{public}s.", abilityInfo.name.c_str());
496         result = CheckCallServicePermission(abilityRequest);
497         if (result != ERR_OK) {
498             HILOG_ERROR("Check permission failed");
499             return result;
500         }
501     } else {
502         HILOG_DEBUG("Check call ability permission, name is %{public}s.", abilityInfo.name.c_str());
503         result = CheckCallAbilityPermission(abilityRequest);
504         if (result != ERR_OK) {
505             HILOG_ERROR("Check permission failed");
506             return result;
507         }
508     }
509 
510     if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
511         HILOG_DEBUG("PreLoadAppDataAbilities:%{public}s.", abilityInfo.bundleName.c_str());
512         result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
513         if (result != ERR_OK) {
514             HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d.",
515                 abilityInfo.bundleName.c_str(), result);
516             return result;
517         }
518     }
519 
520     UpdateCallerInfo(abilityRequest.want);
521     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
522         auto connectManager = GetConnectManagerByUserId(validUserId);
523         if (!connectManager) {
524             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
525             return ERR_INVALID_VALUE;
526         }
527         HILOG_DEBUG("Start service or extension, name is %{public}s.", abilityInfo.name.c_str());
528         ReportEventToSuspendManager(abilityInfo);
529         return connectManager->StartAbility(abilityRequest);
530     }
531 
532     if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
533         return componentRequest.requestResult;
534     }
535     if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
536         HILOG_ERROR("IsAbilityControllerStart failed: %{public}s.", abilityInfo.bundleName.c_str());
537         return ERR_WOULD_BLOCK;
538     }
539     auto missionListManager = GetListManagerByUserId(oriValidUserId);
540     if (missionListManager == nullptr) {
541         HILOG_ERROR("missionListManager is nullptr. userId=%{public}d", validUserId);
542         return ERR_INVALID_VALUE;
543     }
544     ReportAbilitStartInfoToRSS(abilityInfo);
545     ReportEventToSuspendManager(abilityInfo);
546     HILOG_DEBUG("Start ability, name is %{public}s.", abilityInfo.name.c_str());
547     return missionListManager->StartAbility(abilityRequest);
548 }
549 
StartAbility(const Want & want,const AbilityStartSetting & abilityStartSetting,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)550 int AbilityManagerService::StartAbility(const Want &want, const AbilityStartSetting &abilityStartSetting,
551     const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
552 {
553     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
554     HILOG_DEBUG("Start ability setting.");
555     EventInfo eventInfo = BuildEventInfo(want, userId);
556     EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
557 
558     if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
559         VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
560         !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
561         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
562         eventInfo.errCode = CHECK_PERMISSION_FAILED;
563         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
564         return CHECK_PERMISSION_FAILED;
565     }
566 
567     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
568         eventInfo.errCode = ERR_INVALID_VALUE;
569         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
570         return ERR_INVALID_CALLER;
571     }
572 
573     auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
574         interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
575     if (result != ERR_OK) {
576         HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
577         return result;
578     }
579 
580     int32_t oriValidUserId = GetValidUserId(userId);
581     int32_t validUserId = oriValidUserId;
582 
583     if (AbilityUtil::IsStartFreeInstall(want)) {
584         if (CheckIfOperateRemote(want) || freeInstallManager_ == nullptr) {
585             HILOG_ERROR("can not start remote free install");
586             return ERR_INVALID_VALUE;
587         }
588         int32_t ret = freeInstallManager_->StartFreeInstall(want, validUserId, requestCode, callerToken);
589         if (ret != ERR_OK) {
590             HILOG_DEBUG("StartFreeInstall ret : %{public}d", ret);
591             return ret;
592         }
593     }
594 
595     if (!JudgeMultiUserConcurrency(validUserId)) {
596         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
597         eventInfo.errCode = ERR_INVALID_VALUE;
598         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
599         return ERR_CROSS_USER;
600     }
601 
602     AbilityRequest abilityRequest;
603 #ifdef SUPPORT_GRAPHICS
604     if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
605         ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode);
606         if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
607             return componentRequest.requestResult;
608         }
609         abilityRequest.Voluation(
610             want, requestCode, callerToken, std::make_shared<AbilityStartSetting>(abilityStartSetting));
611         abilityRequest.callType = AbilityCallType::START_SETTINGS_TYPE;
612         CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
613         result = implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
614         if (result != ERR_OK) {
615             HILOG_ERROR("implicit start ability error.");
616             eventInfo.errCode = result;
617             EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
618         }
619         return result;
620     }
621 #endif
622     result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
623     ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
624     if (result != ERR_OK && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
625         return componentRequest.requestResult;
626     }
627     if (result != ERR_OK) {
628         HILOG_ERROR("Generate ability request local error.");
629         eventInfo.errCode = result;
630         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
631         return result;
632     }
633     auto abilityInfo = abilityRequest.abilityInfo;
634     validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
635     HILOG_DEBUG("userId : %{public}d, singleton is : %{public}d",
636         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
637 
638     result = CheckStaticCfgPermission(abilityInfo);
639     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
640         HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
641         eventInfo.errCode = result;
642         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
643         return ERR_STATIC_CFG_PERMISSION;
644     }
645     result = CheckCallAbilityPermission(abilityRequest);
646     if (result != ERR_OK) {
647         HILOG_ERROR("%{public}s CheckCallAbilityPermission error.", __func__);
648         eventInfo.errCode = result;
649         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
650         return result;
651     }
652 
653     abilityRequest.startSetting = std::make_shared<AbilityStartSetting>(abilityStartSetting);
654 
655     if (abilityInfo.type == AppExecFwk::AbilityType::DATA) {
656         HILOG_ERROR("Cannot start data ability, use 'AcquireDataAbility()' instead.");
657         eventInfo.errCode = ERR_INVALID_VALUE;
658         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
659         return ERR_WRONG_INTERFACE_CALL;
660     }
661 
662     if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
663         result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
664         if (result != ERR_OK) {
665             HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
666                 abilityInfo.bundleName.c_str(),
667                 result);
668             eventInfo.errCode = result;
669             EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
670             return result;
671         }
672     }
673 #ifdef SUPPORT_GRAPHICS
674     if (abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
675         HILOG_ERROR("Only support for page type ability.");
676         eventInfo.errCode = ERR_INVALID_VALUE;
677         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
678         return ERR_WRONG_INTERFACE_CALL;
679     }
680 #endif
681     if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
682         return componentRequest.requestResult;
683     }
684     if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
685         eventInfo.errCode = ERR_WOULD_BLOCK;
686         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
687         return ERR_WOULD_BLOCK;
688     }
689     auto missionListManager = GetListManagerByUserId(oriValidUserId);
690     if (missionListManager == nullptr) {
691         HILOG_ERROR("missionListManager is Null. userId=%{public}d", validUserId);
692         eventInfo.errCode = ERR_INVALID_VALUE;
693         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
694         return ERR_INVALID_VALUE;
695     }
696     UpdateCallerInfo(abilityRequest.want);
697     auto ret = missionListManager->StartAbility(abilityRequest);
698     if (ret != ERR_OK) {
699         eventInfo.errCode = ret;
700         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
701     }
702     return ret;
703 }
704 
StartAbility(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)705 int AbilityManagerService::StartAbility(const Want &want, const StartOptions &startOptions,
706     const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
707 {
708     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
709     HILOG_DEBUG("Start ability options.");
710     EventInfo eventInfo = BuildEventInfo(want, userId);
711     EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
712 
713     if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
714         VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
715         !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
716         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
717         eventInfo.errCode = CHECK_PERMISSION_FAILED;
718         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
719         return CHECK_PERMISSION_FAILED;
720     }
721 
722     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
723         eventInfo.errCode = ERR_INVALID_VALUE;
724         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
725         return ERR_INVALID_CALLER;
726     }
727 
728     auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
729         interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
730     if (result != ERR_OK) {
731         HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
732         return result;
733     }
734 
735     int32_t oriValidUserId = GetValidUserId(userId);
736     int32_t validUserId = oriValidUserId;
737 
738     if (AbilityUtil::IsStartFreeInstall(want)) {
739         if (CheckIfOperateRemote(want) || freeInstallManager_ == nullptr) {
740             HILOG_ERROR("can not start remote free install");
741             return ERR_INVALID_VALUE;
742         }
743         int32_t ret = freeInstallManager_->StartFreeInstall(want, validUserId, requestCode, callerToken);
744         if (ret != ERR_OK) {
745             HILOG_DEBUG("StartFreeInstall ret : %{public}d", ret);
746             return ret;
747         }
748     }
749     if (!JudgeMultiUserConcurrency(validUserId)) {
750         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
751         eventInfo.errCode = ERR_INVALID_VALUE;
752         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
753         return ERR_CROSS_USER;
754     }
755 
756     AbilityRequest abilityRequest;
757 #ifdef SUPPORT_GRAPHICS
758     if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
759         ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode);
760         if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
761             return componentRequest.requestResult;
762         }
763         abilityRequest.Voluation(want, requestCode, callerToken);
764         abilityRequest.want.SetParam(Want::PARAM_RESV_DISPLAY_ID, startOptions.GetDisplayID());
765         abilityRequest.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions.GetWindowMode());
766         abilityRequest.callType = AbilityCallType::START_OPTIONS_TYPE;
767         CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
768         result = implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
769         if (result != ERR_OK) {
770             HILOG_ERROR("implicit start ability error.");
771             eventInfo.errCode = result;
772             EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
773         }
774         return result;
775     }
776 #endif
777     result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
778     ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
779     if (result != ERR_OK && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
780         return componentRequest.requestResult;
781     }
782     if (result != ERR_OK) {
783         HILOG_ERROR("Generate ability request local error.");
784         eventInfo.errCode = result;
785         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
786         return result;
787     }
788 
789     auto abilityInfo = abilityRequest.abilityInfo;
790     validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
791     HILOG_DEBUG("userId : %{public}d, singleton is : %{public}d",
792         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
793 
794     result = CheckStaticCfgPermission(abilityInfo);
795     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
796         HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
797         eventInfo.errCode = result;
798         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
799         return ERR_STATIC_CFG_PERMISSION;
800     }
801     result = CheckCallAbilityPermission(abilityRequest);
802     if (result != ERR_OK) {
803         HILOG_ERROR("%{public}s CheckCallAbilityPermission error.", __func__);
804         eventInfo.errCode = result;
805         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
806         return result;
807     }
808 
809     if (abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
810         HILOG_ERROR("Only support for page type ability.");
811         eventInfo.errCode = ERR_INVALID_VALUE;
812         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
813         return ERR_INVALID_VALUE;
814     }
815 
816     if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
817         result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
818         if (result != ERR_OK) {
819             HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
820                 abilityInfo.bundleName.c_str(),
821                 result);
822             eventInfo.errCode = result;
823             EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
824             return result;
825         }
826     }
827 
828     if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
829         return componentRequest.requestResult;
830     }
831     if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
832         eventInfo.errCode = ERR_WOULD_BLOCK;
833         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
834         return ERR_WOULD_BLOCK;
835     }
836     abilityRequest.want.SetParam(Want::PARAM_RESV_DISPLAY_ID, startOptions.GetDisplayID());
837     abilityRequest.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions.GetWindowMode());
838     auto missionListManager = GetListManagerByUserId(oriValidUserId);
839     if (missionListManager == nullptr) {
840         HILOG_ERROR("missionListManager is Null. userId=%{public}d", oriValidUserId);
841         eventInfo.errCode = ERR_INVALID_VALUE;
842         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
843         return ERR_INVALID_VALUE;
844     }
845 
846 #ifdef SUPPORT_GRAPHICS
847     if (abilityInfo.isStageBasedModel && !CheckWindowMode(startOptions.GetWindowMode(), abilityInfo.windowModes)) {
848         return ERR_AAFWK_INVALID_WINDOW_MODE;
849     }
850 #endif
851     UpdateCallerInfo(abilityRequest.want);
852     auto ret = missionListManager->StartAbility(abilityRequest);
853     if (ret != ERR_OK) {
854         eventInfo.errCode = ret;
855         EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
856     }
857     return ret;
858 }
859 
IsBackgroundTaskUid(const int uid)860 bool AbilityManagerService::IsBackgroundTaskUid(const int uid)
861 {
862 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
863     std::shared_lock<std::shared_mutex> lock(bgtaskObserverMutex_);
864     if (bgtaskObserver_) {
865         return bgtaskObserver_->IsBackgroundTaskUid(uid);
866     }
867     return false;
868 #else
869     return false;
870 #endif
871 }
872 
CheckOptExtensionAbility(const Want & want,AbilityRequest & abilityRequest,int32_t validUserId,AppExecFwk::ExtensionAbilityType extensionType)873 int AbilityManagerService::CheckOptExtensionAbility(const Want &want, AbilityRequest &abilityRequest,
874     int32_t validUserId, AppExecFwk::ExtensionAbilityType extensionType)
875 {
876     auto abilityInfo = abilityRequest.abilityInfo;
877     auto type = abilityInfo.type;
878     if (type != AppExecFwk::AbilityType::EXTENSION) {
879         HILOG_ERROR("Not extension ability, not allowed.");
880         return ERR_WRONG_INTERFACE_CALL;
881     }
882     if (extensionType != AppExecFwk::ExtensionAbilityType::UNSPECIFIED &&
883         extensionType != abilityInfo.extensionAbilityType) {
884         HILOG_ERROR("Extension ability type not match, set type: %{public}d, real type: %{public}d",
885             static_cast<int32_t>(extensionType), static_cast<int32_t>(abilityInfo.extensionAbilityType));
886         return ERR_WRONG_INTERFACE_CALL;
887     }
888 
889     auto result = CheckStaticCfgPermission(abilityInfo);
890     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
891         HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
892         return ERR_STATIC_CFG_PERMISSION;
893     }
894 
895     if (extensionType == AppExecFwk::ExtensionAbilityType::DATASHARE ||
896         extensionType == AppExecFwk::ExtensionAbilityType::SERVICE) {
897         result = CheckCallServiceExtensionPermission(abilityRequest);
898         if (result != ERR_OK) {
899             return result;
900         }
901     } else {
902         result = CheckCallOtherExtensionPermission(abilityRequest);
903         if (result != ERR_OK) {
904             return result;
905         }
906     }
907 
908     UpdateCallerInfo(abilityRequest.want);
909     return ERR_OK;
910 }
911 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)912 void AbilityManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
913 {
914     HILOG_INFO("systemAbilityId: %{public}d add", systemAbilityId);
915     switch (systemAbilityId) {
916         case BACKGROUND_TASK_MANAGER_SERVICE_ID:
917             SubscribeBackgroundTask();
918             break;
919         default:
920             break;
921     }
922 }
923 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)924 void AbilityManagerService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
925 {
926     HILOG_INFO("systemAbilityId: %{public}d remove", systemAbilityId);
927     switch (systemAbilityId) {
928         case BACKGROUND_TASK_MANAGER_SERVICE_ID:
929             UnSubscribeBackgroundTask();
930             break;
931         default:
932             break;
933     }
934 }
935 
SubscribeBackgroundTask()936 void AbilityManagerService::SubscribeBackgroundTask()
937 {
938 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
939     std::unique_lock<std::shared_mutex> lock(bgtaskObserverMutex_);
940     if (bgtaskObserver_) {
941         return;
942     }
943     bgtaskObserver_ = std::make_shared<BackgroundTaskObserver>();
944     int ret = BackgroundTaskMgrHelper::SubscribeBackgroundTask(*bgtaskObserver_);
945     if (ret != ERR_OK) {
946         bgtaskObserver_ = nullptr;
947         HILOG_ERROR("%{public}s failed, err:%{public}d.", __func__, ret);
948         return;
949     }
950     bgtaskObserver_->GetContinuousTaskApps();
951     HILOG_INFO("%{public}s success.", __func__);
952 #endif
953 }
954 
UnSubscribeBackgroundTask()955 void AbilityManagerService::UnSubscribeBackgroundTask()
956 {
957 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
958     std::unique_lock<std::shared_mutex> lock(bgtaskObserverMutex_);
959     if (!bgtaskObserver_) {
960         return;
961     }
962     bgtaskObserver_ = nullptr;
963     HILOG_INFO("%{public}s success.", __func__);
964 #endif
965 }
966 
ReportAbilitStartInfoToRSS(const AppExecFwk::AbilityInfo & abilityInfo)967 void AbilityManagerService::ReportAbilitStartInfoToRSS(const AppExecFwk::AbilityInfo &abilityInfo)
968 {
969 #ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
970     if (abilityInfo.type == AppExecFwk::AbilityType::PAGE &&
971         abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
972         std::vector<AppExecFwk::RunningProcessInfo> runningProcessInfos;
973         if (IN_PROCESS_CALL(GetProcessRunningInfos(runningProcessInfos)) != ERR_OK) {
974             return;
975         }
976         bool isColdStart = true;
977         int32_t pid = 0;
978         for (auto const &info : runningProcessInfos) {
979             if (info.uid_ == abilityInfo.applicationInfo.uid) {
980                 isColdStart = false;
981                 pid = info.pid_;
982                 break;
983             }
984         }
985         std::unordered_map<std::string, std::string> eventParams {
986             { "name", "ability_start" },
987             { "uid", std::to_string(abilityInfo.applicationInfo.uid) },
988             { "bundleName", abilityInfo.applicationInfo.bundleName },
989             { "abilityName", abilityInfo.name },
990             { "pid", std::to_string(pid) }
991         };
992         ResourceSchedule::ResSchedClient::GetInstance().ReportData(
993             ResourceSchedule::ResType::RES_TYPE_APP_ABILITY_START, isColdStart ? 1 : 0, eventParams);
994     }
995 #endif
996 }
997 
ReportEventToSuspendManager(const AppExecFwk::AbilityInfo & abilityInfo)998 void AbilityManagerService::ReportEventToSuspendManager(const AppExecFwk::AbilityInfo &abilityInfo)
999 {
1000 #ifdef EFFICIENCY_MANAGER_ENABLE
1001     std::string reason = (abilityInfo.type == AppExecFwk::AbilityType::PAGE) ?
1002         "THAW_BY_START_PAGE_ABILITY" : "THAW_BY_START_NOT_PAGE_ABILITY";
1003     SuspendManager::SuspendManagerClient::GetInstance().ThawOneApplication(
1004         abilityInfo.applicationInfo.uid,
1005         abilityInfo.applicationInfo.bundleName, reason);
1006 #endif // EFFICIENCY_MANAGER_ENABLE
1007 }
1008 
StartExtensionAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,AppExecFwk::ExtensionAbilityType extensionType)1009 int AbilityManagerService::StartExtensionAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
1010     int32_t userId, AppExecFwk::ExtensionAbilityType extensionType)
1011 {
1012     HILOG_INFO("Start extension ability come, bundlename: %{public}s, ability is %{public}s, userId is %{public}d",
1013         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
1014     EventInfo eventInfo = BuildEventInfo(want, userId);
1015     eventInfo.extensionType = (int32_t)(extensionType);
1016     EventReport::SendExtensionEvent(EventName::START_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
1017     if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
1018         VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
1019         !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
1020         HILOG_ERROR("%{public}s: Permission verification failed.", __func__);
1021         eventInfo.errCode = CHECK_PERMISSION_FAILED;
1022         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1023         return CHECK_PERMISSION_FAILED;
1024     }
1025 
1026     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
1027         HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
1028         eventInfo.errCode = ERR_INVALID_VALUE;
1029         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1030         return ERR_INVALID_CALLER;
1031     }
1032 
1033     auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1034         interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
1035     if (result != ERR_OK) {
1036         HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1037         return result;
1038     }
1039 
1040     int32_t validUserId = GetValidUserId(userId);
1041     if (!JudgeMultiUserConcurrency(validUserId)) {
1042         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1043         eventInfo.errCode = ERR_INVALID_VALUE;
1044         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1045         return ERR_CROSS_USER;
1046     }
1047 
1048     AbilityRequest abilityRequest;
1049 #ifdef SUPPORT_GRAPHICS
1050     if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
1051         abilityRequest.Voluation(want, DEFAULT_INVAL_VALUE, callerToken);
1052         abilityRequest.callType = AbilityCallType::START_EXTENSION_TYPE;
1053         abilityRequest.extensionType = extensionType;
1054         CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
1055         result = implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
1056         if (result != ERR_OK) {
1057             HILOG_ERROR("implicit start ability error.");
1058             eventInfo.errCode = result;
1059             EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1060         }
1061         return result;
1062     }
1063 #endif
1064     result = GenerateExtensionAbilityRequest(want, abilityRequest, callerToken, validUserId);
1065     if (result != ERR_OK) {
1066         HILOG_ERROR("Generate ability request local error.");
1067         eventInfo.errCode = result;
1068         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1069         return result;
1070     }
1071 
1072     auto abilityInfo = abilityRequest.abilityInfo;
1073     validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
1074     HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
1075         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
1076 
1077     result = CheckOptExtensionAbility(want, abilityRequest, validUserId, extensionType);
1078     if (result != ERR_OK) {
1079         HILOG_ERROR("CheckOptExtensionAbility error.");
1080         eventInfo.errCode = result;
1081         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1082         return result;
1083     }
1084 
1085     auto connectManager = GetConnectManagerByUserId(validUserId);
1086     if (!connectManager) {
1087         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
1088         eventInfo.errCode = ERR_INVALID_VALUE;
1089         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1090         return ERR_INVALID_VALUE;
1091     }
1092     HILOG_INFO("Start extension begin, name is %{public}s.", abilityInfo.name.c_str());
1093     eventInfo.errCode = connectManager->StartAbility(abilityRequest);
1094     if (eventInfo.errCode != ERR_OK) {
1095         EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1096     }
1097     return eventInfo.errCode;
1098 }
1099 
StopExtensionAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,AppExecFwk::ExtensionAbilityType extensionType)1100 int AbilityManagerService::StopExtensionAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
1101     int32_t userId, AppExecFwk::ExtensionAbilityType extensionType)
1102 {
1103     HILOG_INFO("Stop extension ability come, bundlename: %{public}s, ability is %{public}s, userId is %{public}d",
1104         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
1105     EventInfo eventInfo = BuildEventInfo(want, userId);
1106     eventInfo.extensionType = (int32_t)(extensionType);
1107     EventReport::SendExtensionEvent(EventName::STOP_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
1108     if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
1109         VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
1110         !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
1111         HILOG_ERROR("%{public}s: Permission verification failed.", __func__);
1112         eventInfo.errCode = CHECK_PERMISSION_FAILED;
1113         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1114         return CHECK_PERMISSION_FAILED;
1115     }
1116 
1117     if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
1118         HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
1119         eventInfo.errCode = ERR_INVALID_VALUE;
1120         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1121         return ERR_INVALID_CALLER;
1122     }
1123     int32_t validUserId = GetValidUserId(userId);
1124     if (!JudgeMultiUserConcurrency(validUserId)) {
1125         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1126         eventInfo.errCode = ERR_INVALID_VALUE;
1127         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1128         return ERR_CROSS_USER;
1129     }
1130 
1131     AbilityRequest abilityRequest;
1132     auto result = GenerateExtensionAbilityRequest(want, abilityRequest, callerToken, validUserId);
1133     if (result != ERR_OK) {
1134         HILOG_ERROR("Generate ability request local error.");
1135         eventInfo.errCode = result;
1136         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1137         return result;
1138     }
1139 
1140     auto abilityInfo = abilityRequest.abilityInfo;
1141     validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
1142     HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
1143         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
1144 
1145     result = CheckOptExtensionAbility(want, abilityRequest, validUserId, extensionType);
1146     if (result != ERR_OK) {
1147         HILOG_ERROR("CheckOptExtensionAbility error.");
1148         eventInfo.errCode = result;
1149         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1150         return result;
1151     }
1152 
1153     auto connectManager = GetConnectManagerByUserId(validUserId);
1154     if (!connectManager) {
1155         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
1156         eventInfo.errCode = ERR_INVALID_VALUE;
1157         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1158         return ERR_INVALID_VALUE;
1159     }
1160     HILOG_INFO("Stop extension begin, name is %{public}s.", abilityInfo.name.c_str());
1161     eventInfo.errCode = connectManager->StopServiceAbility(abilityRequest);
1162     if (eventInfo.errCode != ERR_OK) {
1163         EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1164     }
1165     return eventInfo.errCode;
1166 }
1167 
TerminateAbility(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant)1168 int AbilityManagerService::TerminateAbility(const sptr<IRemoteObject> &token, int resultCode, const Want *resultWant)
1169 {
1170     auto abilityRecord = Token::GetAbilityRecordByToken(token);
1171     if (!abilityRecord) {
1172         HILOG_ERROR("abilityRecord is Null.");
1173         return ERR_INVALID_VALUE;
1174     }
1175     return TerminateAbilityWithFlag(token, resultCode, resultWant, true);
1176 }
1177 
CloseAbility(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant)1178 int AbilityManagerService::CloseAbility(const sptr<IRemoteObject> &token, int resultCode, const Want *resultWant)
1179 {
1180     EventInfo eventInfo;
1181     EventReport::SendAbilityEvent(EventName::CLOSE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
1182     return TerminateAbilityWithFlag(token, resultCode, resultWant, false);
1183 }
1184 
TerminateAbilityWithFlag(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant,bool flag)1185 int AbilityManagerService::TerminateAbilityWithFlag(const sptr<IRemoteObject> &token, int resultCode,
1186     const Want *resultWant, bool flag)
1187 {
1188     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1189     HILOG_DEBUG("Terminate ability begin, flag:%{public}d.", flag);
1190     if (!VerificationAllToken(token)) {
1191         HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
1192         return ERR_INVALID_VALUE;
1193     }
1194 
1195     auto abilityRecord = Token::GetAbilityRecordByToken(token);
1196     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1197     if (!JudgeSelfCalled(abilityRecord)) {
1198         return CHECK_PERMISSION_FAILED;
1199     }
1200 
1201     int result = JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
1202     if (result != ERR_OK) {
1203         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1204         return result;
1205     }
1206 
1207     if (IsSystemUiApp(abilityRecord->GetAbilityInfo())) {
1208         HILOG_ERROR("System ui not allow terminate.");
1209         return ERR_INVALID_VALUE;
1210     }
1211 
1212     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
1213     auto type = abilityRecord->GetAbilityInfo().type;
1214     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
1215         auto connectManager = GetConnectManagerByUserId(userId);
1216         if (!connectManager) {
1217             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
1218             return ERR_INVALID_VALUE;
1219         }
1220         return connectManager->TerminateAbility(token);
1221     }
1222 
1223     if (type == AppExecFwk::AbilityType::DATA) {
1224         HILOG_ERROR("Cannot terminate data ability, use 'ReleaseDataAbility()' instead.");
1225         return ERR_WRONG_INTERFACE_CALL;
1226     }
1227 
1228     if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
1229         return ERR_WOULD_BLOCK;
1230     }
1231 
1232     auto ownerUserId = abilityRecord->GetOwnerMissionUserId();
1233     auto missionListManager = GetListManagerByUserId(ownerUserId);
1234     if (missionListManager == nullptr) {
1235         HILOG_ERROR("missionListManager is Null. ownerUserId=%{public}d", ownerUserId);
1236         return ERR_INVALID_VALUE;
1237     }
1238     NotifyHandleAbilityStateChange(token, TERMINATE_ABILITY_CODE);
1239     return missionListManager->TerminateAbility(abilityRecord, resultCode, resultWant, flag);
1240 }
1241 
SendResultToAbility(int32_t requestCode,int32_t resultCode,Want & resultWant)1242 int AbilityManagerService::SendResultToAbility(int32_t requestCode, int32_t resultCode, Want &resultWant)
1243 {
1244     HILOG_INFO("%{public}s", __func__);
1245     Security::AccessToken::NativeTokenInfo nativeTokenInfo;
1246     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1247     auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(accessToken);
1248     int32_t result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(accessToken, nativeTokenInfo);
1249     if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE ||
1250         result != ERR_OK || nativeTokenInfo.processName != DMS_PROCESS_NAME) {
1251         HILOG_ERROR("Check processName failed");
1252         return ERR_INVALID_VALUE;
1253     }
1254     int missionId = resultWant.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID);
1255     resultWant.RemoveParam(DMS_MISSION_ID);
1256     if (missionId == DEFAULT_DMS_MISSION_ID) {
1257         HILOG_ERROR("MissionId is empty");
1258         return ERR_INVALID_VALUE;
1259     }
1260     sptr<IRemoteObject> abilityToken = GetAbilityTokenByMissionId(missionId);
1261     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1262 
1263     auto abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
1264     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1265 
1266     abilityRecord->SetResult(std::make_shared<AbilityResult>(requestCode, resultCode, resultWant));
1267     abilityRecord->SendResult();
1268     return ERR_OK;
1269 }
1270 
StartRemoteAbility(const Want & want,int requestCode,int32_t validUserId,const sptr<IRemoteObject> & callerToken)1271 int AbilityManagerService::StartRemoteAbility(const Want &want, int requestCode, int32_t validUserId,
1272     const sptr<IRemoteObject> &callerToken)
1273 {
1274     HILOG_INFO("%{public}s", __func__);
1275     Want remoteWant = want;
1276     if (AddStartControlParam(remoteWant, callerToken) != ERR_OK) {
1277         HILOG_ERROR("%{public}s AddStartControlParam failed.", __func__);
1278         return ERR_INVALID_VALUE;
1279     }
1280     if (AbilityUtil::IsStartFreeInstall(remoteWant)) {
1281         return freeInstallManager_ == nullptr ? ERR_INVALID_VALUE :
1282             freeInstallManager_->StartRemoteFreeInstall(remoteWant, requestCode, validUserId, callerToken);
1283     }
1284     if (remoteWant.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) {
1285         HILOG_INFO("%{public}s: try to StartAbilityForResult", __func__);
1286         int32_t missionId = GetMissionIdByAbilityToken(callerToken);
1287         if (missionId < 0) {
1288             return ERR_INVALID_VALUE;
1289         }
1290         remoteWant.SetParam(DMS_MISSION_ID, missionId);
1291     }
1292 
1293     int32_t callerUid = IPCSkeleton::GetCallingUid();
1294     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1295     DistributedClient dmsClient;
1296     HILOG_DEBUG("get callerUid = %d, AccessTokenID = %u", callerUid, accessToken);
1297     int result = dmsClient.StartRemoteAbility(remoteWant, callerUid, requestCode, accessToken);
1298     if (result != ERR_NONE) {
1299         HILOG_ERROR("AbilityManagerService::StartRemoteAbility failed, result = %{public}d", result);
1300     }
1301     return result;
1302 }
1303 
CheckIsRemote(const std::string & deviceId)1304 bool AbilityManagerService::CheckIsRemote(const std::string& deviceId)
1305 {
1306     if (deviceId.empty()) {
1307         HILOG_INFO("CheckIsRemote: deviceId is empty.");
1308         return false;
1309     }
1310     std::string localDeviceId;
1311     if (!GetLocalDeviceId(localDeviceId)) {
1312         HILOG_ERROR("CheckIsRemote: get local deviceId failed");
1313         return false;
1314     }
1315     if (localDeviceId == deviceId) {
1316         HILOG_INFO("CheckIsRemote: deviceId is local.");
1317         return false;
1318     }
1319     HILOG_DEBUG("CheckIsRemote, deviceId = %{public}s", AnonymizeDeviceId(deviceId).c_str());
1320     return true;
1321 }
1322 
CheckIfOperateRemote(const Want & want)1323 bool AbilityManagerService::CheckIfOperateRemote(const Want &want)
1324 {
1325     std::string deviceId = want.GetElement().GetDeviceID();
1326     if (deviceId.empty() || want.GetElement().GetBundleName().empty() ||
1327         want.GetElement().GetAbilityName().empty()) {
1328         HILOG_DEBUG("CheckIfOperateRemote: DeviceId or BundleName or GetAbilityName empty");
1329         return false;
1330     }
1331     return CheckIsRemote(deviceId);
1332 }
1333 
GetLocalDeviceId(std::string & localDeviceId)1334 bool AbilityManagerService::GetLocalDeviceId(std::string& localDeviceId)
1335 {
1336     auto localNode = std::make_unique<NodeBasicInfo>();
1337     int32_t errCode = GetLocalNodeDeviceInfo(DM_PKG_NAME.c_str(), localNode.get());
1338     if (errCode != ERR_OK) {
1339         HILOG_ERROR("AbilityManagerService::GetLocalNodeDeviceInfo errCode = %{public}d", errCode);
1340         return false;
1341     }
1342     if (localNode != nullptr) {
1343         localDeviceId = localNode->networkId;
1344         HILOG_DEBUG("get local deviceId, deviceId = %{public}s",
1345             AnonymizeDeviceId(localDeviceId).c_str());
1346         return true;
1347     }
1348     HILOG_ERROR("AbilityManagerService::GetLocalDeviceId localDeviceId null");
1349     return false;
1350 }
1351 
AnonymizeDeviceId(const std::string & deviceId)1352 std::string AbilityManagerService::AnonymizeDeviceId(const std::string& deviceId)
1353 {
1354     if (deviceId.length() < NON_ANONYMIZE_LENGTH) {
1355         return EMPTY_DEVICE_ID;
1356     }
1357     std::string anonDeviceId = deviceId.substr(0, NON_ANONYMIZE_LENGTH);
1358     anonDeviceId.append("******");
1359     return anonDeviceId;
1360 }
1361 
TerminateAbilityByCaller(const sptr<IRemoteObject> & callerToken,int requestCode)1362 int AbilityManagerService::TerminateAbilityByCaller(const sptr<IRemoteObject> &callerToken, int requestCode)
1363 {
1364     HILOG_INFO("Terminate ability by caller.");
1365     if (!VerificationAllToken(callerToken)) {
1366         return ERR_INVALID_VALUE;
1367     }
1368 
1369     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1370     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1371     if (!JudgeSelfCalled(abilityRecord)) {
1372         return CHECK_PERMISSION_FAILED;
1373     }
1374 #ifdef SUPPORT_GRAPHICS
1375     if (IsSystemUiApp(abilityRecord->GetAbilityInfo())) {
1376         HILOG_ERROR("System ui not allow terminate.");
1377         return ERR_INVALID_VALUE;
1378     }
1379 #endif
1380 
1381     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
1382     auto type = abilityRecord->GetAbilityInfo().type;
1383     auto missionListManager = GetListManagerByUserId(userId);
1384     auto connectManager = GetConnectManagerByUserId(userId);
1385     switch (type) {
1386         case AppExecFwk::AbilityType::SERVICE:
1387         case AppExecFwk::AbilityType::EXTENSION: {
1388             if (!connectManager) {
1389                 HILOG_ERROR("connectManager is nullptr.");
1390                 return ERR_INVALID_VALUE;
1391             }
1392             auto result = connectManager->TerminateAbility(abilityRecord, requestCode);
1393             if (result == NO_FOUND_ABILITY_BY_CALLER) {
1394                 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
1395                     return ERR_WOULD_BLOCK;
1396                 }
1397 
1398                 if (!missionListManager) {
1399                     HILOG_ERROR("missionListManager is nullptr. userId=%{public}d", userId);
1400                     return ERR_INVALID_VALUE;
1401                 }
1402                 return missionListManager->TerminateAbility(abilityRecord, requestCode);
1403             }
1404             return result;
1405         }
1406 #ifdef SUPPORT_GRAPHICS
1407         case AppExecFwk::AbilityType::PAGE: {
1408             if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
1409                 return ERR_WOULD_BLOCK;
1410             }
1411             if (!missionListManager) {
1412                 HILOG_ERROR("missionListManager is nullptr.");
1413                 return ERR_INVALID_VALUE;
1414             }
1415             auto result = missionListManager->TerminateAbility(abilityRecord, requestCode);
1416             if (result == NO_FOUND_ABILITY_BY_CALLER) {
1417                 if (!connectManager) {
1418                     HILOG_ERROR("connectManager is nullptr.");
1419                     return ERR_INVALID_VALUE;
1420                 }
1421                 return connectManager->TerminateAbility(abilityRecord, requestCode);
1422             }
1423             return result;
1424         }
1425 #endif
1426         default:
1427             return ERR_INVALID_VALUE;
1428     }
1429 }
1430 
MinimizeAbility(const sptr<IRemoteObject> & token,bool fromUser)1431 int AbilityManagerService::MinimizeAbility(const sptr<IRemoteObject> &token, bool fromUser)
1432 {
1433     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1434     HILOG_INFO("Minimize ability, fromUser:%{public}d.", fromUser);
1435     if (!VerificationAllToken(token)) {
1436         return ERR_INVALID_VALUE;
1437     }
1438 
1439     auto abilityRecord = Token::GetAbilityRecordByToken(token);
1440     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1441     if (!JudgeSelfCalled(abilityRecord)) {
1442         return CHECK_PERMISSION_FAILED;
1443     }
1444 
1445     int result = JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
1446     if (result != ERR_OK) {
1447         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1448         return result;
1449     }
1450 
1451     auto type = abilityRecord->GetAbilityInfo().type;
1452     if (type != AppExecFwk::AbilityType::PAGE) {
1453         HILOG_ERROR("Cannot minimize except page ability.");
1454         return ERR_WRONG_INTERFACE_CALL;
1455     }
1456 
1457     if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
1458         return ERR_WOULD_BLOCK;
1459     }
1460 
1461     auto missionListManager = GetListManagerByUserId(abilityRecord->GetOwnerMissionUserId());
1462     if (!missionListManager) {
1463         HILOG_ERROR("missionListManager is Null.");
1464         return ERR_INVALID_VALUE;
1465     }
1466     return missionListManager->MinimizeAbility(token, fromUser);
1467 }
1468 
ConnectAbility(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,int32_t userId)1469 int AbilityManagerService::ConnectAbility(
1470     const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, int32_t userId)
1471 {
1472     return ConnectAbilityCommon(want, connect, callerToken, AppExecFwk::ExtensionAbilityType::SERVICE, userId);
1473 }
1474 
ConnectAbilityCommon(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,AppExecFwk::ExtensionAbilityType extensionType,int32_t userId)1475 int AbilityManagerService::ConnectAbilityCommon(
1476     const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken,
1477     AppExecFwk::ExtensionAbilityType extensionType, int32_t userId)
1478 {
1479     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1480     HILOG_DEBUG("Connect ability called, element uri: %{public}s.", want.GetElement().GetURI().c_str());
1481     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
1482     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
1483     EventInfo eventInfo = BuildEventInfo(want, userId);
1484     EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
1485 
1486     if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
1487         VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
1488         !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
1489         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1490         eventInfo.errCode = CHECK_PERMISSION_FAILED;
1491         EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1492         return CHECK_PERMISSION_FAILED;
1493     }
1494 
1495     auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1496         interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
1497     if (result != ERR_OK) {
1498         HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1499         return result;
1500     }
1501 
1502     int32_t validUserId = GetValidUserId(userId);
1503 
1504     if (AbilityUtil::IsStartFreeInstall(want) && freeInstallManager_ != nullptr) {
1505         std::string localDeviceId;
1506         if (!GetLocalDeviceId(localDeviceId)) {
1507             HILOG_ERROR("%{public}s: Get Local DeviceId failed", __func__);
1508             eventInfo.errCode = ERR_INVALID_VALUE;
1509             EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1510             return ERR_INVALID_VALUE;
1511         }
1512         result = freeInstallManager_->ConnectFreeInstall(want, validUserId, callerToken, localDeviceId);
1513         if (result != ERR_OK) {
1514             eventInfo.errCode = result;
1515             EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1516             return result;
1517         }
1518     }
1519 
1520     Want abilityWant = want;
1521     std::string uri = abilityWant.GetUri().ToString();
1522     if (!uri.empty()) {
1523         // if the want include uri, it may only has uri information. it is probably a datashare extension.
1524         HILOG_INFO("%{public}s called. uri:%{public}s, userId %{public}d", __func__, uri.c_str(), validUserId);
1525         AppExecFwk::ExtensionAbilityInfo extensionInfo;
1526         auto bms = GetBundleManager();
1527         CHECK_POINTER_AND_RETURN(bms, ERR_INVALID_VALUE);
1528 
1529         AbilityRequest abilityRequest;
1530         abilityWant.SetParam("abilityConnectionObj", connect->AsObject());
1531         ComponentRequest componentRequest = initComponentRequest(callerToken);
1532         if (!IsComponentInterceptionStart(abilityWant, componentRequest, abilityRequest)) {
1533             return componentRequest.requestResult;
1534         }
1535         abilityWant.RemoveParam("abilityConnectionObj");
1536 
1537         bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfoByUri(uri, validUserId, extensionInfo));
1538         if (!queryResult || extensionInfo.name.empty() || extensionInfo.bundleName.empty()) {
1539             HILOG_ERROR("Invalid extension ability info.");
1540             eventInfo.errCode = ERR_INVALID_VALUE;
1541             EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1542             return ERR_INVALID_VALUE;
1543         }
1544         abilityWant.SetElementName(extensionInfo.bundleName, extensionInfo.name);
1545     }
1546 
1547     if (CheckIfOperateRemote(abilityWant)) {
1548         HILOG_INFO("AbilityManagerService::ConnectAbility. try to ConnectRemoteAbility");
1549         eventInfo.errCode = ConnectRemoteAbility(abilityWant, callerToken, connect->AsObject());
1550         if (eventInfo.errCode != ERR_OK) {
1551             EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1552         }
1553         return eventInfo.errCode;
1554     }
1555 
1556     if (callerToken != nullptr && callerToken->GetObjectDescriptor() != u"ohos.aafwk.AbilityToken") {
1557         HILOG_INFO("%{public}s invalid Token.", __func__);
1558         eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, nullptr, extensionType);
1559         if (eventInfo.errCode != ERR_OK) {
1560             EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1561         }
1562         return eventInfo.errCode;
1563     }
1564     eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, callerToken, extensionType);
1565     if (eventInfo.errCode != ERR_OK) {
1566         EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1567     }
1568     return eventInfo.errCode;
1569 }
1570 
BuildEventInfo(const Want & want,int32_t userId)1571 EventInfo AbilityManagerService::BuildEventInfo(const Want &want, int32_t userId)
1572 {
1573     EventInfo eventInfo;
1574     eventInfo.userId = userId;
1575     eventInfo.bundleName = want.GetElement().GetBundleName();
1576     eventInfo.moduleName = want.GetElement().GetModuleName();
1577     eventInfo.abilityName = want.GetElement().GetAbilityName();
1578     return eventInfo;
1579 }
1580 
DisconnectAbility(const sptr<IAbilityConnection> & connect)1581 int AbilityManagerService::DisconnectAbility(const sptr<IAbilityConnection> &connect)
1582 {
1583     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1584     HILOG_DEBUG("Disconnect ability begin.");
1585     EventInfo eventInfo;
1586     EventReport::SendExtensionEvent(EventName::DISCONNECT_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
1587     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
1588     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
1589 
1590     if (ERR_OK != DisconnectLocalAbility(connect) &&
1591         ERR_OK != DisconnectRemoteAbility(connect->AsObject())) {
1592         eventInfo.errCode = INNER_ERR;
1593         EventReport::SendExtensionEvent(EventName::DISCONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
1594     }
1595     return ERR_OK;
1596 }
1597 
ConnectLocalAbility(const Want & want,const int32_t userId,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,AppExecFwk::ExtensionAbilityType extensionType)1598 int AbilityManagerService::ConnectLocalAbility(const Want &want, const int32_t userId,
1599     const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken,
1600     AppExecFwk::ExtensionAbilityType extensionType)
1601 {
1602     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1603     HILOG_INFO("Connect local ability begin.");
1604     if (!JudgeMultiUserConcurrency(userId)) {
1605         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1606         return ERR_CROSS_USER;
1607     }
1608 
1609     AbilityRequest abilityRequest;
1610     ErrCode result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, callerToken, userId);
1611 
1612     Want requestWant = want;
1613     requestWant.SetParam("abilityConnectionObj", connect->AsObject());
1614     ComponentRequest componentRequest = initComponentRequest(callerToken);
1615     if (!IsComponentInterceptionStart(requestWant, componentRequest, abilityRequest)) {
1616         return componentRequest.requestResult;
1617     }
1618 
1619     if (result != ERR_OK) {
1620         HILOG_ERROR("Generate ability request error.");
1621         return result;
1622     }
1623 
1624     if (abilityRequest.abilityInfo.isStageBasedModel) {
1625         bool isService = (abilityRequest.abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::SERVICE);
1626         if (isService && extensionType != AppExecFwk::ExtensionAbilityType::SERVICE) {
1627             HILOG_ERROR("Service extension type, please use ConnectAbility.");
1628             return ERR_WRONG_INTERFACE_CALL;
1629         }
1630     }
1631     auto abilityInfo = abilityRequest.abilityInfo;
1632     int32_t validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : userId;
1633     HILOG_DEBUG("validUserId : %{public}d, singleton is : %{public}d",
1634         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
1635 
1636     result = CheckStaticCfgPermission(abilityInfo);
1637     if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
1638         HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
1639         return ERR_STATIC_CFG_PERMISSION;
1640     }
1641 
1642     auto type = abilityInfo.type;
1643     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
1644         HILOG_ERROR("Connect ability failed, target ability is not Service.");
1645         return TARGET_ABILITY_NOT_SERVICE;
1646     }
1647     result = CheckCallServicePermission(abilityRequest);
1648     if (result != ERR_OK) {
1649         HILOG_ERROR("%{public}s CheckCallServicePermission error.", __func__);
1650         return result;
1651     }
1652     result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
1653     if (result != ERR_OK) {
1654         HILOG_ERROR("ConnectAbility: App data ability preloading failed, '%{public}s', %{public}d",
1655             abilityInfo.bundleName.c_str(),
1656             result);
1657         return result;
1658     }
1659 
1660     auto connectManager = GetConnectManagerByUserId(validUserId);
1661     if (connectManager == nullptr) {
1662         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
1663         return ERR_INVALID_VALUE;
1664     }
1665 
1666     ReportEventToSuspendManager(abilityInfo);
1667     return connectManager->ConnectAbilityLocked(abilityRequest, connect, callerToken);
1668 }
1669 
ConnectRemoteAbility(Want & want,const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject> & connect)1670 int AbilityManagerService::ConnectRemoteAbility(Want &want, const sptr<IRemoteObject> &callerToken,
1671     const sptr<IRemoteObject> &connect)
1672 {
1673     HILOG_INFO("%{public}s begin ConnectAbilityRemote", __func__);
1674     if (AddStartControlParam(want, callerToken) != ERR_OK) {
1675         HILOG_ERROR("%{public}s AddStartControlParam failed.", __func__);
1676         return ERR_INVALID_VALUE;
1677     }
1678     DistributedClient dmsClient;
1679     return dmsClient.ConnectRemoteAbility(want, connect);
1680 }
1681 
DisconnectLocalAbility(const sptr<IAbilityConnection> & connect)1682 int AbilityManagerService::DisconnectLocalAbility(const sptr<IAbilityConnection> &connect)
1683 {
1684     HILOG_INFO("Disconnect local ability begin.");
1685     CHECK_POINTER_AND_RETURN(connectManager_, ERR_NO_INIT);
1686     if (connectManager_->DisconnectAbilityLocked(connect) == ERR_OK) {
1687         return ERR_OK;
1688     }
1689     // If current connectManager_ does not exist connect, then try connectManagerU0
1690     auto connectManagerU0 = GetConnectManagerByUserId(U0_USER_ID);
1691     CHECK_POINTER_AND_RETURN(connectManagerU0, ERR_NO_INIT);
1692     return connectManagerU0->DisconnectAbilityLocked(connect);
1693 }
1694 
DisconnectRemoteAbility(const sptr<IRemoteObject> & connect)1695 int AbilityManagerService::DisconnectRemoteAbility(const sptr<IRemoteObject> &connect)
1696 {
1697     HILOG_INFO("%{public}s begin DisconnectAbilityRemote", __func__);
1698     int32_t callerUid = IPCSkeleton::GetCallingUid();
1699     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1700     DistributedClient dmsClient;
1701     return dmsClient.DisconnectRemoteAbility(connect, callerUid, accessToken);
1702 }
1703 
ContinueMission(const std::string & srcDeviceId,const std::string & dstDeviceId,int32_t missionId,const sptr<IRemoteObject> & callBack,AAFwk::WantParams & wantParams)1704 int AbilityManagerService::ContinueMission(const std::string &srcDeviceId, const std::string &dstDeviceId,
1705     int32_t missionId, const sptr<IRemoteObject> &callBack, AAFwk::WantParams &wantParams)
1706 {
1707     HILOG_INFO("ContinueMission missionId: %{public}d", missionId);
1708     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
1709         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1710         return CHECK_PERMISSION_FAILED;
1711     }
1712 
1713     DistributedClient dmsClient;
1714     return dmsClient.ContinueMission(srcDeviceId, dstDeviceId, missionId, callBack, wantParams);
1715 }
1716 
ContinueAbility(const std::string & deviceId,int32_t missionId,uint32_t versionCode)1717 int AbilityManagerService::ContinueAbility(const std::string &deviceId, int32_t missionId, uint32_t versionCode)
1718 {
1719     HILOG_INFO("ContinueAbility missionId = %{public}d, version = %{public}u.", missionId, versionCode);
1720 
1721     sptr<IRemoteObject> abilityToken = GetAbilityTokenByMissionId(missionId);
1722     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1723 
1724     auto abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
1725     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1726 
1727     abilityRecord->ContinueAbility(deviceId, versionCode);
1728     return ERR_OK;
1729 }
1730 
StartContinuation(const Want & want,const sptr<IRemoteObject> & abilityToken,int32_t status)1731 int AbilityManagerService::StartContinuation(const Want &want, const sptr<IRemoteObject> &abilityToken, int32_t status)
1732 {
1733     HILOG_INFO("Start Continuation.");
1734     if (!CheckIfOperateRemote(want)) {
1735         HILOG_ERROR("deviceId or bundle name or abilityName empty");
1736         return ERR_INVALID_VALUE;
1737     }
1738     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1739 
1740     int32_t appUid = IPCSkeleton::GetCallingUid();
1741     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
1742     HILOG_INFO("AbilityManagerService::Try to StartContinuation, AccessTokenID = %{public}u", accessToken);
1743     int32_t missionId = GetMissionIdByAbilityToken(abilityToken);
1744     if (missionId == -1) {
1745         HILOG_ERROR("AbilityManagerService::StartContinuation failed to get missionId.");
1746         return ERR_INVALID_VALUE;
1747     }
1748     DistributedClient dmsClient;
1749     auto result =  dmsClient.StartContinuation(want, missionId, appUid, status, accessToken);
1750     if (result != ERR_OK) {
1751         HILOG_ERROR("StartContinuation failed, result = %{public}d, notify caller", result);
1752         NotifyContinuationResult(missionId, result);
1753     }
1754     return result;
1755 }
1756 
NotifyCompleteContinuation(const std::string & deviceId,int32_t sessionId,bool isSuccess)1757 void AbilityManagerService::NotifyCompleteContinuation(const std::string &deviceId,
1758     int32_t sessionId, bool isSuccess)
1759 {
1760     HILOG_INFO("NotifyCompleteContinuation.");
1761     DistributedClient dmsClient;
1762     dmsClient.NotifyCompleteContinuation(Str8ToStr16(deviceId), sessionId, isSuccess);
1763 }
1764 
NotifyContinuationResult(int32_t missionId,int32_t result)1765 int AbilityManagerService::NotifyContinuationResult(int32_t missionId, int32_t result)
1766 {
1767     HILOG_INFO("Notify Continuation Result : %{public}d.", result);
1768 
1769     auto abilityToken = GetAbilityTokenByMissionId(missionId);
1770     CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
1771 
1772     auto abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
1773     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1774 
1775     abilityRecord->NotifyContinuationResult(result);
1776     return ERR_OK;
1777 }
1778 
StartSyncRemoteMissions(const std::string & devId,bool fixConflict,int64_t tag)1779 int AbilityManagerService::StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag)
1780 {
1781     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
1782         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1783         return CHECK_PERMISSION_FAILED;
1784     }
1785     DistributedClient dmsClient;
1786     return dmsClient.StartSyncRemoteMissions(devId, fixConflict, tag);
1787 }
1788 
StopSyncRemoteMissions(const std::string & devId)1789 int AbilityManagerService::StopSyncRemoteMissions(const std::string& devId)
1790 {
1791     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
1792         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1793         return CHECK_PERMISSION_FAILED;
1794     }
1795     DistributedClient dmsClient;
1796     return dmsClient.StopSyncRemoteMissions(devId);
1797 }
1798 
RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> & observer)1799 int AbilityManagerService::RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer)
1800 {
1801     return DelayedSingleton<ConnectionStateManager>::GetInstance()->RegisterObserver(observer);
1802 }
1803 
UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> & observer)1804 int AbilityManagerService::UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer)
1805 {
1806     return DelayedSingleton<ConnectionStateManager>::GetInstance()->UnregisterObserver(observer);
1807 }
1808 
GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> & infos)1809 int AbilityManagerService::GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> &infos)
1810 {
1811     if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
1812         HILOG_ERROR("can not get dlp connection infos if caller is not sa.");
1813         return CHECK_PERMISSION_FAILED;
1814     }
1815     DelayedSingleton<ConnectionStateManager>::GetInstance()->GetDlpConnectionInfos(infos);
1816 
1817     return ERR_OK;
1818 }
1819 
RegisterMissionListener(const std::string & deviceId,const sptr<IRemoteMissionListener> & listener)1820 int AbilityManagerService::RegisterMissionListener(const std::string &deviceId,
1821     const sptr<IRemoteMissionListener> &listener)
1822 {
1823     std::string localDeviceId;
1824     if (!GetLocalDeviceId(localDeviceId) || localDeviceId == deviceId) {
1825         HILOG_ERROR("RegisterMissionListener: Check DeviceId failed");
1826         return REGISTER_REMOTE_MISSION_LISTENER_FAIL;
1827     }
1828     CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
1829     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
1830         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1831         return CHECK_PERMISSION_FAILED;
1832     }
1833     DistributedClient dmsClient;
1834     return dmsClient.RegisterMissionListener(Str8ToStr16(deviceId), listener->AsObject());
1835 }
1836 
UnRegisterMissionListener(const std::string & deviceId,const sptr<IRemoteMissionListener> & listener)1837 int AbilityManagerService::UnRegisterMissionListener(const std::string &deviceId,
1838     const sptr<IRemoteMissionListener> &listener)
1839 {
1840     std::string localDeviceId;
1841     if (!GetLocalDeviceId(localDeviceId) || localDeviceId == deviceId) {
1842         HILOG_ERROR("RegisterMissionListener: Check DeviceId failed");
1843         return REGISTER_REMOTE_MISSION_LISTENER_FAIL;
1844     }
1845     CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
1846     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
1847         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1848         return CHECK_PERMISSION_FAILED;
1849     }
1850     DistributedClient dmsClient;
1851     return dmsClient.UnRegisterMissionListener(Str8ToStr16(deviceId), listener->AsObject());
1852 }
1853 
GetWantSender(const WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken)1854 sptr<IWantSender> AbilityManagerService::GetWantSender(
1855     const WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken)
1856 {
1857     HILOG_INFO("Get want Sender.");
1858     CHECK_POINTER_AND_RETURN(pendingWantManager_, nullptr);
1859 
1860     auto bms = GetBundleManager();
1861     CHECK_POINTER_AND_RETURN(bms, nullptr);
1862 
1863     int32_t callerUid = IPCSkeleton::GetCallingUid();
1864     int32_t userId = wantSenderInfo.userId;
1865     bool bundleMgrResult = false;
1866     if (userId < 0) {
1867         if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
1868             GetOsAccountLocalIdFromUid(callerUid, userId) != 0) {
1869             HILOG_ERROR("GetOsAccountLocalIdFromUid failed. uid=%{public}d", callerUid);
1870             return nullptr;
1871         }
1872     }
1873 
1874     int32_t appUid = 0;
1875     if (!wantSenderInfo.allWants.empty()) {
1876         AppExecFwk::BundleInfo bundleInfo;
1877         std::string bundleName = wantSenderInfo.allWants.back().want.GetElement().GetBundleName();
1878         bundleMgrResult = IN_PROCESS_CALL(bms->GetBundleInfo(bundleName,
1879             AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
1880         if (bundleMgrResult) {
1881             appUid = bundleInfo.uid;
1882         }
1883         HILOG_INFO("App bundleName: %{public}s, uid: %{public}d", bundleName.c_str(), appUid);
1884     }
1885 
1886     std::string apl;
1887     if (!wantSenderInfo.bundleName.empty()) {
1888         AppExecFwk::BundleInfo bundleInfo;
1889         bundleMgrResult = IN_PROCESS_CALL(bms->GetBundleInfo(wantSenderInfo.bundleName,
1890             AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
1891         if (bundleMgrResult) {
1892             apl = bundleInfo.applicationInfo.appPrivilegeLevel;
1893         }
1894     }
1895 
1896     HILOG_INFO("AbilityManagerService::GetWantSender: bundleName = %{public}s", wantSenderInfo.bundleName.c_str());
1897     return pendingWantManager_->GetWantSender(callerUid, appUid, apl, wantSenderInfo, callerToken);
1898 }
1899 
SendWantSender(const sptr<IWantSender> & target,const SenderInfo & senderInfo)1900 int AbilityManagerService::SendWantSender(const sptr<IWantSender> &target, const SenderInfo &senderInfo)
1901 {
1902     HILOG_INFO("Send want sender.");
1903     CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
1904     CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
1905     return pendingWantManager_->SendWantSender(target, senderInfo);
1906 }
1907 
CancelWantSender(const sptr<IWantSender> & sender)1908 void AbilityManagerService::CancelWantSender(const sptr<IWantSender> &sender)
1909 {
1910     HILOG_INFO("Cancel want sender.");
1911     CHECK_POINTER(pendingWantManager_);
1912     CHECK_POINTER(sender);
1913 
1914     auto bms = GetBundleManager();
1915     CHECK_POINTER(bms);
1916 
1917     int32_t callerUid = IPCSkeleton::GetCallingUid();
1918     sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(sender->AsObject());
1919 
1920     int userId = -1;
1921     if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
1922         GetOsAccountLocalIdFromUid(callerUid, userId) != 0) {
1923         HILOG_ERROR("GetOsAccountLocalIdFromUid failed. uid=%{public}d", callerUid);
1924         return;
1925     }
1926     AppExecFwk::BundleInfo bundleInfo;
1927     bool bundleMgrResult = IN_PROCESS_CALL(
1928         bms->GetBundleInfo(record->GetKey()->GetBundleName(),
1929             AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
1930     if (!bundleMgrResult) {
1931         HILOG_ERROR("GetBundleInfo is fail.");
1932         return;
1933     }
1934 
1935     auto apl = bundleInfo.applicationInfo.appPrivilegeLevel;
1936     pendingWantManager_->CancelWantSender(apl, sender);
1937 }
1938 
GetPendingWantUid(const sptr<IWantSender> & target)1939 int AbilityManagerService::GetPendingWantUid(const sptr<IWantSender> &target)
1940 {
1941     HILOG_INFO("%{public}s:begin.", __func__);
1942 
1943     if (pendingWantManager_ == nullptr) {
1944         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1945         return -1;
1946     }
1947     if (target == nullptr) {
1948         HILOG_ERROR("%s, target is nullptr", __func__);
1949         return -1;
1950     }
1951     return pendingWantManager_->GetPendingWantUid(target);
1952 }
1953 
GetPendingWantUserId(const sptr<IWantSender> & target)1954 int AbilityManagerService::GetPendingWantUserId(const sptr<IWantSender> &target)
1955 {
1956     HILOG_INFO("%{public}s:begin.", __func__);
1957 
1958     if (pendingWantManager_ == nullptr) {
1959         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1960         return -1;
1961     }
1962     if (target == nullptr) {
1963         HILOG_ERROR("%s, target is nullptr", __func__);
1964         return -1;
1965     }
1966     return pendingWantManager_->GetPendingWantUserId(target);
1967 }
1968 
GetPendingWantBundleName(const sptr<IWantSender> & target)1969 std::string AbilityManagerService::GetPendingWantBundleName(const sptr<IWantSender> &target)
1970 {
1971     HILOG_INFO("Get pending want bundle name.");
1972     CHECK_POINTER_AND_RETURN(pendingWantManager_, "");
1973     CHECK_POINTER_AND_RETURN(target, "");
1974     return pendingWantManager_->GetPendingWantBundleName(target);
1975 }
1976 
GetPendingWantCode(const sptr<IWantSender> & target)1977 int AbilityManagerService::GetPendingWantCode(const sptr<IWantSender> &target)
1978 {
1979     HILOG_INFO("%{public}s:begin.", __func__);
1980 
1981     if (pendingWantManager_ == nullptr) {
1982         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1983         return -1;
1984     }
1985     if (target == nullptr) {
1986         HILOG_ERROR("%s, target is nullptr", __func__);
1987         return -1;
1988     }
1989     return pendingWantManager_->GetPendingWantCode(target);
1990 }
1991 
GetPendingWantType(const sptr<IWantSender> & target)1992 int AbilityManagerService::GetPendingWantType(const sptr<IWantSender> &target)
1993 {
1994     HILOG_INFO("%{public}s:begin.", __func__);
1995 
1996     if (pendingWantManager_ == nullptr) {
1997         HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
1998         return -1;
1999     }
2000     if (target == nullptr) {
2001         HILOG_ERROR("%s, target is nullptr", __func__);
2002         return -1;
2003     }
2004     return pendingWantManager_->GetPendingWantType(target);
2005 }
2006 
RegisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & receiver)2007 void AbilityManagerService::RegisterCancelListener(const sptr<IWantSender> &sender,
2008     const sptr<IWantReceiver> &receiver)
2009 {
2010     HILOG_INFO("Register cancel listener.");
2011     CHECK_POINTER(pendingWantManager_);
2012     CHECK_POINTER(sender);
2013     CHECK_POINTER(receiver);
2014     pendingWantManager_->RegisterCancelListener(sender, receiver);
2015 }
2016 
UnregisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & receiver)2017 void AbilityManagerService::UnregisterCancelListener(
2018     const sptr<IWantSender> &sender, const sptr<IWantReceiver> &receiver)
2019 {
2020     HILOG_INFO("Unregister cancel listener.");
2021     CHECK_POINTER(pendingWantManager_);
2022     CHECK_POINTER(sender);
2023     CHECK_POINTER(receiver);
2024     pendingWantManager_->UnregisterCancelListener(sender, receiver);
2025 }
2026 
GetPendingRequestWant(const sptr<IWantSender> & target,std::shared_ptr<Want> & want)2027 int AbilityManagerService::GetPendingRequestWant(const sptr<IWantSender> &target, std::shared_ptr<Want> &want)
2028 {
2029     HILOG_INFO("Get pending request want.");
2030     CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
2031     CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
2032     CHECK_POINTER_AND_RETURN(want, ERR_INVALID_VALUE);
2033     return pendingWantManager_->GetPendingRequestWant(target, want);
2034 }
2035 
LockMissionForCleanup(int32_t missionId)2036 int AbilityManagerService::LockMissionForCleanup(int32_t missionId)
2037 {
2038     HILOG_INFO("request unlock mission for clean up all, id :%{public}d", missionId);
2039     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2040 
2041     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2042         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2043         return CHECK_PERMISSION_FAILED;
2044     }
2045     return currentMissionListManager_->SetMissionLockedState(missionId, true);
2046 }
2047 
UnlockMissionForCleanup(int32_t missionId)2048 int AbilityManagerService::UnlockMissionForCleanup(int32_t missionId)
2049 {
2050     HILOG_INFO("request unlock mission for clean up all, id :%{public}d", missionId);
2051     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2052 
2053     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2054         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2055         return CHECK_PERMISSION_FAILED;
2056     }
2057     return currentMissionListManager_->SetMissionLockedState(missionId, false);
2058 }
2059 
RegisterMissionListener(const sptr<IMissionListener> & listener)2060 int AbilityManagerService::RegisterMissionListener(const sptr<IMissionListener> &listener)
2061 {
2062     HILOG_INFO("request RegisterMissionListener ");
2063     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2064 
2065     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2066         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2067         return CHECK_PERMISSION_FAILED;
2068     }
2069     return currentMissionListManager_->RegisterMissionListener(listener);
2070 }
2071 
UnRegisterMissionListener(const sptr<IMissionListener> & listener)2072 int AbilityManagerService::UnRegisterMissionListener(const sptr<IMissionListener> &listener)
2073 {
2074     HILOG_INFO("request RegisterMissionListener ");
2075     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2076 
2077     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2078         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2079         return CHECK_PERMISSION_FAILED;
2080     }
2081     return currentMissionListManager_->UnRegisterMissionListener(listener);
2082 }
2083 
GetMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)2084 int AbilityManagerService::GetMissionInfos(const std::string& deviceId, int32_t numMax,
2085     std::vector<MissionInfo> &missionInfos)
2086 {
2087     HILOG_INFO("request GetMissionInfos.");
2088     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2089 
2090     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2091         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2092         return CHECK_PERMISSION_FAILED;
2093     }
2094 
2095     if (CheckIsRemote(deviceId)) {
2096         return GetRemoteMissionInfos(deviceId, numMax, missionInfos);
2097     }
2098 
2099     return currentMissionListManager_->GetMissionInfos(numMax, missionInfos);
2100 }
2101 
GetRemoteMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)2102 int AbilityManagerService::GetRemoteMissionInfos(const std::string& deviceId, int32_t numMax,
2103     std::vector<MissionInfo> &missionInfos)
2104 {
2105     HILOG_INFO("GetRemoteMissionInfos begin");
2106     DistributedClient dmsClient;
2107     int result = dmsClient.GetMissionInfos(deviceId, numMax, missionInfos);
2108     if (result != ERR_OK) {
2109         HILOG_ERROR("GetRemoteMissionInfos failed, result = %{public}d", result);
2110         return result;
2111     }
2112     return ERR_OK;
2113 }
2114 
GetMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)2115 int AbilityManagerService::GetMissionInfo(const std::string& deviceId, int32_t missionId,
2116     MissionInfo &missionInfo)
2117 {
2118     HILOG_INFO("request GetMissionInfo, missionId:%{public}d", missionId);
2119     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2120 
2121     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2122         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2123         return CHECK_PERMISSION_FAILED;
2124     }
2125 
2126     if (CheckIsRemote(deviceId)) {
2127         return GetRemoteMissionInfo(deviceId, missionId, missionInfo);
2128     }
2129 
2130     return currentMissionListManager_->GetMissionInfo(missionId, missionInfo);
2131 }
2132 
GetRemoteMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)2133 int AbilityManagerService::GetRemoteMissionInfo(const std::string& deviceId, int32_t missionId,
2134     MissionInfo &missionInfo)
2135 {
2136     HILOG_INFO("GetMissionInfoFromDms begin");
2137     std::vector<MissionInfo> missionVector;
2138     int result = GetRemoteMissionInfos(deviceId, MAX_NUMBER_OF_DISTRIBUTED_MISSIONS, missionVector);
2139     if (result != ERR_OK) {
2140         return result;
2141     }
2142     for (auto iter = missionVector.begin(); iter != missionVector.end(); iter++) {
2143         if (iter->id == missionId) {
2144             missionInfo = *iter;
2145             return ERR_OK;
2146         }
2147     }
2148     HILOG_WARN("missionId not found");
2149     return ERR_INVALID_VALUE;
2150 }
2151 
CleanMission(int32_t missionId)2152 int AbilityManagerService::CleanMission(int32_t missionId)
2153 {
2154     HILOG_INFO("request CleanMission, missionId:%{public}d", missionId);
2155     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2156 
2157     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2158         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2159         return CHECK_PERMISSION_FAILED;
2160     }
2161 
2162     return currentMissionListManager_->ClearMission(missionId);
2163 }
2164 
CleanAllMissions()2165 int AbilityManagerService::CleanAllMissions()
2166 {
2167     HILOG_INFO("request CleanAllMissions ");
2168     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2169 
2170     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2171         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2172         return CHECK_PERMISSION_FAILED;
2173     }
2174 
2175     Want want;
2176     want.SetElementName(AbilityConfig::LAUNCHER_BUNDLE_NAME, AbilityConfig::LAUNCHER_ABILITY_NAME);
2177     if (!IsAbilityControllerStart(want, AbilityConfig::LAUNCHER_BUNDLE_NAME)) {
2178         HILOG_ERROR("IsAbilityControllerStart failed: %{public}s", want.GetBundle().c_str());
2179         return ERR_WOULD_BLOCK;
2180     }
2181 
2182     return currentMissionListManager_->ClearAllMissions();
2183 }
2184 
MoveMissionToFront(int32_t missionId)2185 int AbilityManagerService::MoveMissionToFront(int32_t missionId)
2186 {
2187     HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId);
2188     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2189 
2190     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2191         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2192         return CHECK_PERMISSION_FAILED;
2193     }
2194 
2195     if (!IsAbilityControllerStartById(missionId)) {
2196         HILOG_ERROR("IsAbilityControllerStart false");
2197         return ERR_WOULD_BLOCK;
2198     }
2199 
2200     return currentMissionListManager_->MoveMissionToFront(missionId);
2201 }
2202 
MoveMissionToFront(int32_t missionId,const StartOptions & startOptions)2203 int AbilityManagerService::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions)
2204 {
2205     HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId);
2206     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
2207 
2208     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2209         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2210         return CHECK_PERMISSION_FAILED;
2211     }
2212 
2213     if (!IsAbilityControllerStartById(missionId)) {
2214         HILOG_ERROR("IsAbilityControllerStart false");
2215         return ERR_WOULD_BLOCK;
2216     }
2217 
2218     auto options = std::make_shared<StartOptions>(startOptions);
2219     return currentMissionListManager_->MoveMissionToFront(missionId, options);
2220 }
2221 
GetMissionIdByToken(const sptr<IRemoteObject> & token)2222 int32_t AbilityManagerService::GetMissionIdByToken(const sptr<IRemoteObject> &token)
2223 {
2224     HILOG_INFO("request GetMissionIdByToken.");
2225     if (!token) {
2226         HILOG_ERROR("token is invalid.");
2227         return -1;
2228     }
2229 
2230     return GetMissionIdByAbilityToken(token);
2231 }
2232 
IsAbilityControllerStartById(int32_t missionId)2233 bool AbilityManagerService::IsAbilityControllerStartById(int32_t missionId)
2234 {
2235     InnerMissionInfo innerMissionInfo;
2236     int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
2237         missionId, innerMissionInfo);
2238     if (getMission != ERR_OK) {
2239         HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
2240         return true;
2241     }
2242     if (!IsAbilityControllerStart(innerMissionInfo.missionInfo.want, innerMissionInfo.missionInfo.want.GetBundle())) {
2243         HILOG_ERROR("IsAbilityControllerStart failed: %{public}s",
2244             innerMissionInfo.missionInfo.want.GetBundle().c_str());
2245         return false;
2246     }
2247     return true;
2248 }
2249 
GetServiceRecordByElementName(const std::string & element)2250 std::shared_ptr<AbilityRecord> AbilityManagerService::GetServiceRecordByElementName(const std::string &element)
2251 {
2252     if (!connectManager_) {
2253         HILOG_ERROR("Connect manager is nullptr.");
2254         return nullptr;
2255     }
2256     return connectManager_->GetServiceRecordByElementName(element);
2257 }
2258 
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)2259 std::list<std::shared_ptr<ConnectionRecord>> AbilityManagerService::GetConnectRecordListByCallback(
2260     sptr<IAbilityConnection> callback)
2261 {
2262     if (!connectManager_) {
2263         HILOG_ERROR("Connect manager is nullptr.");
2264         std::list<std::shared_ptr<ConnectionRecord>> connectList;
2265         return connectList;
2266     }
2267     return connectManager_->GetConnectRecordListByCallback(callback);
2268 }
2269 
AcquireDataAbility(const Uri & uri,bool tryBind,const sptr<IRemoteObject> & callerToken)2270 sptr<IAbilityScheduler> AbilityManagerService::AcquireDataAbility(
2271     const Uri &uri, bool tryBind, const sptr<IRemoteObject> &callerToken)
2272 {
2273     auto bms = GetBundleManager();
2274     CHECK_POINTER_AND_RETURN(bms, nullptr);
2275 
2276     auto localUri(uri);
2277     if (localUri.GetScheme() != AbilityConfig::SCHEME_DATA_ABILITY) {
2278         HILOG_ERROR("Acquire data ability with invalid uri scheme.");
2279         return nullptr;
2280     }
2281     std::vector<std::string> pathSegments;
2282     localUri.GetPathSegments(pathSegments);
2283     if (pathSegments.empty()) {
2284         HILOG_ERROR("Acquire data ability with invalid uri path.");
2285         return nullptr;
2286     }
2287 
2288     auto userId = GetValidUserId(INVALID_USER_ID);
2289     AbilityRequest abilityRequest;
2290     std::string dataAbilityUri = localUri.ToString();
2291     HILOG_INFO("%{public}s, called. userId %{public}d", __func__, userId);
2292     bool queryResult = IN_PROCESS_CALL(bms->QueryAbilityInfoByUri(dataAbilityUri, userId, abilityRequest.abilityInfo));
2293     if (!queryResult || abilityRequest.abilityInfo.name.empty() || abilityRequest.abilityInfo.bundleName.empty()) {
2294         HILOG_ERROR("Invalid ability info for data ability acquiring.");
2295         return nullptr;
2296     }
2297 
2298     abilityRequest.callerToken = callerToken;
2299     if (CheckCallDataAbilityPermission(abilityRequest) != ERR_OK) {
2300         HILOG_ERROR("Invalid ability request info for data ability acquiring.");
2301         return nullptr;
2302     }
2303 
2304     HILOG_DEBUG("Query data ability info: %{public}s|%{public}s|%{public}s",
2305         abilityRequest.appInfo.name.c_str(), abilityRequest.appInfo.bundleName.c_str(),
2306         abilityRequest.abilityInfo.name.c_str());
2307 
2308     if (CheckStaticCfgPermission(abilityRequest.abilityInfo) != AppExecFwk::Constants::PERMISSION_GRANTED) {
2309         if (!VerificationAllToken(callerToken)) {
2310             HILOG_INFO("VerificationAllToken fail");
2311             return nullptr;
2312         }
2313     }
2314 
2315     if (abilityRequest.abilityInfo.applicationInfo.singleton) {
2316         userId = U0_USER_ID;
2317     }
2318 
2319     std::shared_ptr<DataAbilityManager> dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2320     CHECK_POINTER_AND_RETURN(dataAbilityManager, nullptr);
2321     ReportEventToSuspendManager(abilityRequest.abilityInfo);
2322     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
2323     auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
2324     bool isNotHap = isSaCall || isShellCall;
2325     return dataAbilityManager->Acquire(abilityRequest, tryBind, callerToken, isNotHap);
2326 }
2327 
ReleaseDataAbility(sptr<IAbilityScheduler> dataAbilityScheduler,const sptr<IRemoteObject> & callerToken)2328 int AbilityManagerService::ReleaseDataAbility(
2329     sptr<IAbilityScheduler> dataAbilityScheduler, const sptr<IRemoteObject> &callerToken)
2330 {
2331     HILOG_INFO("%{public}s, called.", __func__);
2332     if (!dataAbilityScheduler || !callerToken) {
2333         HILOG_ERROR("dataAbilitySchedule or callerToken is nullptr");
2334         return ERR_INVALID_VALUE;
2335     }
2336 
2337     std::shared_ptr<DataAbilityManager> dataAbilityManager = GetDataAbilityManager(dataAbilityScheduler);
2338     if (!dataAbilityManager) {
2339         HILOG_ERROR("dataAbilityScheduler is not exists");
2340         return ERR_INVALID_VALUE;
2341     }
2342 
2343     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
2344     auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
2345     bool isNotHap = isSaCall || isShellCall;
2346     return dataAbilityManager->Release(dataAbilityScheduler, callerToken, isNotHap);
2347 }
2348 
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)2349 int AbilityManagerService::AttachAbilityThread(
2350     const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
2351 {
2352     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2353     HILOG_INFO("Attach ability thread.");
2354     CHECK_POINTER_AND_RETURN(scheduler, ERR_INVALID_VALUE);
2355     if (!VerificationAllToken(token)) {
2356         return ERR_INVALID_VALUE;
2357     }
2358     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2359     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2360     if (!JudgeSelfCalled(abilityRecord)) {
2361         return CHECK_PERMISSION_FAILED;
2362     }
2363 
2364     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2365     auto abilityInfo = abilityRecord->GetAbilityInfo();
2366     auto type = abilityInfo.type;
2367     // force timeout ability for test
2368     if (IsNeedTimeoutForTest(abilityInfo.name, AbilityRecord::ConvertAbilityState(AbilityState::INITIAL))) {
2369         HILOG_WARN("force timeout ability for test, state:INITIAL, ability: %{public}s",
2370             abilityInfo.name.c_str());
2371         return ERR_OK;
2372     }
2373     int returnCode = -1;
2374     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
2375         auto connectManager = GetConnectManagerByUserId(userId);
2376         if (!connectManager) {
2377             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2378             return ERR_INVALID_VALUE;
2379         }
2380         returnCode = connectManager->AttachAbilityThreadLocked(scheduler, token);
2381     } else if (type == AppExecFwk::AbilityType::DATA) {
2382         auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2383         if (!dataAbilityManager) {
2384             HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
2385             return ERR_INVALID_VALUE;
2386         }
2387         returnCode = dataAbilityManager->AttachAbilityThread(scheduler, token);
2388     } else {
2389         int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
2390         auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
2391         if (!missionListManager) {
2392             HILOG_ERROR("missionListManager is Null. userId=%{public}d", ownerMissionUserId);
2393             return ERR_INVALID_VALUE;
2394         }
2395         returnCode = missionListManager->AttachAbilityThread(scheduler, token);
2396     }
2397     return returnCode;
2398 }
2399 
DumpFuncInit()2400 void AbilityManagerService::DumpFuncInit()
2401 {
2402     dumpFuncMap_[KEY_DUMP_ALL] = &AbilityManagerService::DumpInner;
2403     dumpFuncMap_[KEY_DUMP_MISSION] = &AbilityManagerService::DumpMissionInner;
2404     dumpFuncMap_[KEY_DUMP_SERVICE] = &AbilityManagerService::DumpStateInner;
2405     dumpFuncMap_[KEY_DUMP_DATA] = &AbilityManagerService::DataDumpStateInner;
2406     dumpFuncMap_[KEY_DUMP_MISSION_LIST] = &AbilityManagerService::DumpMissionListInner;
2407     dumpFuncMap_[KEY_DUMP_MISSION_INFOS] = &AbilityManagerService::DumpMissionInfosInner;
2408 }
2409 
DumpSysFuncInit()2410 void AbilityManagerService::DumpSysFuncInit()
2411 {
2412     dumpsysFuncMap_[KEY_DUMPSYS_ALL] = &AbilityManagerService::DumpSysInner;
2413     dumpsysFuncMap_[KEY_DUMPSYS_MISSION_LIST] = &AbilityManagerService::DumpSysMissionListInner;
2414     dumpsysFuncMap_[KEY_DUMPSYS_ABILITY] = &AbilityManagerService::DumpSysAbilityInner;
2415     dumpsysFuncMap_[KEY_DUMPSYS_SERVICE] = &AbilityManagerService::DumpSysStateInner;
2416     dumpsysFuncMap_[KEY_DUMPSYS_PENDING] = &AbilityManagerService::DumpSysPendingInner;
2417     dumpsysFuncMap_[KEY_DUMPSYS_PROCESS] = &AbilityManagerService::DumpSysProcess;
2418     dumpsysFuncMap_[KEY_DUMPSYS_DATA] = &AbilityManagerService::DataDumpSysStateInner;
2419 }
2420 
DumpSysInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2421 void AbilityManagerService::DumpSysInner(
2422     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2423 {
2424     std::vector<std::string> argList;
2425     SplitStr(args, " ", argList);
2426     if (argList.empty()) {
2427         return;
2428     }
2429     DumpSysMissionListInner(args, info, isClient, isUserID, userId);
2430     DumpSysStateInner(args, info, isClient, isUserID, userId);
2431     DumpSysPendingInner(args, info, isClient, isUserID, userId);
2432     DumpSysProcess(args, info, isClient, isUserID, userId);
2433 }
2434 
DumpSysMissionListInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2435 void AbilityManagerService::DumpSysMissionListInner(
2436     const std::string &args, std::vector<std::string> &info, bool isClient, bool isUserID, int userId)
2437 {
2438     std::shared_ptr<MissionListManager> targetManager;
2439     if (isUserID) {
2440         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2441         auto it = missionListManagers_.find(userId);
2442         if (it == missionListManagers_.end()) {
2443             info.push_back("error: No user found.");
2444             return;
2445         }
2446         targetManager = it->second;
2447     } else {
2448         targetManager = currentMissionListManager_;
2449     }
2450 
2451     CHECK_POINTER(targetManager);
2452 
2453     std::vector<std::string> argList;
2454     SplitStr(args, " ", argList);
2455     if (argList.empty()) {
2456         return;
2457     }
2458 
2459     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2460         targetManager->DumpMissionList(info, isClient, argList[1]);
2461     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2462         targetManager->DumpMissionList(info, isClient);
2463     } else {
2464         info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
2465     }
2466 }
DumpSysAbilityInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2467 void AbilityManagerService::DumpSysAbilityInner(
2468     const std::string &args, std::vector<std::string> &info, bool isClient, bool isUserID, int userId)
2469 {
2470     std::shared_ptr<MissionListManager> targetManager;
2471     if (isUserID) {
2472         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2473         auto it = missionListManagers_.find(userId);
2474         if (it == missionListManagers_.end()) {
2475             info.push_back("error: No user found.");
2476             return;
2477         }
2478         targetManager = it->second;
2479     } else {
2480         targetManager = currentMissionListManager_;
2481     }
2482 
2483     CHECK_POINTER(targetManager);
2484 
2485     std::vector<std::string> argList;
2486     SplitStr(args, " ", argList);
2487     if (argList.empty()) {
2488         return;
2489     }
2490     if (argList.size() >= MIN_DUMP_ARGUMENT_NUM) {
2491         HILOG_INFO("argList = %{public}s", argList[1].c_str());
2492         std::vector<std::string> params(argList.begin() + MIN_DUMP_ARGUMENT_NUM, argList.end());
2493         try {
2494             auto abilityId = static_cast<int32_t>(std::stoi(argList[1]));
2495             targetManager->DumpMissionListByRecordId(info, isClient, abilityId, params);
2496         } catch (...) {
2497             HILOG_WARN("stoi(%{public}s) failed", argList[1].c_str());
2498             info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
2499         }
2500     } else {
2501         info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
2502     }
2503 }
2504 
DumpSysStateInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2505 void AbilityManagerService::DumpSysStateInner(
2506     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2507 {
2508     HILOG_INFO("DumpSysStateInner begin:%{public}s", args.c_str());
2509     std::shared_ptr<AbilityConnectManager> targetManager;
2510 
2511     if (isUserID) {
2512         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2513         auto it = connectManagers_.find(userId);
2514         if (it == connectManagers_.end()) {
2515             info.push_back("error: No user found.");
2516             return;
2517         }
2518         targetManager = it->second;
2519     } else {
2520         targetManager = connectManager_;
2521     }
2522 
2523     CHECK_POINTER(targetManager);
2524 
2525     std::vector<std::string> argList;
2526     SplitStr(args, " ", argList);
2527     if (argList.empty()) {
2528         return;
2529     }
2530 
2531     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2532         targetManager->DumpState(info, isClient, argList[1]);
2533     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2534         targetManager->DumpState(info, isClient);
2535     } else {
2536         HILOG_INFO("uri = %{public}s", argList[1].c_str());
2537         std::vector<std::string> params(argList.begin() + MIN_DUMP_ARGUMENT_NUM, argList.end());
2538         targetManager->DumpStateByUri(info, isClient, argList[1], params);
2539     }
2540 }
2541 
DumpSysPendingInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2542 void AbilityManagerService::DumpSysPendingInner(
2543     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2544 {
2545     std::shared_ptr<PendingWantManager> targetManager;
2546     if (isUserID) {
2547         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2548         auto it = pendingWantManagers_.find(userId);
2549         if (it == pendingWantManagers_.end()) {
2550             info.push_back("error: No user found.");
2551             return;
2552         }
2553         targetManager = it->second;
2554     } else {
2555         targetManager = pendingWantManager_;
2556     }
2557 
2558     CHECK_POINTER(targetManager);
2559 
2560     std::vector<std::string> argList;
2561     SplitStr(args, " ", argList);
2562     if (argList.empty()) {
2563         return;
2564     }
2565 
2566     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2567         targetManager->DumpByRecordId(info, argList[1]);
2568     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2569         targetManager->Dump(info);
2570     } else {
2571         info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
2572     }
2573 }
2574 
DumpSysProcess(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2575 void AbilityManagerService::DumpSysProcess(
2576     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2577 {
2578     std::vector<std::string> argList;
2579     SplitStr(args, " ", argList);
2580     if (argList.empty()) {
2581         return;
2582     }
2583     std::vector<AppExecFwk::RunningProcessInfo> ProcessInfos;
2584     int ret = 0;
2585     if (isUserID) {
2586         ret = GetProcessRunningInfosByUserId(ProcessInfos, userId);
2587     } else {
2588         ret = GetProcessRunningInfos(ProcessInfos);
2589     }
2590 
2591     if (ret != ERR_OK || ProcessInfos.size() == 0) {
2592         return;
2593     }
2594 
2595     std::string dumpInfo = "  AppRunningRecords:";
2596     info.push_back(dumpInfo);
2597     auto processInfoID = 0;
2598     auto hasProcessName = (argList.size() == MIN_DUMP_ARGUMENT_NUM ? true : false);
2599     for (const auto& ProcessInfo : ProcessInfos) {
2600         if (hasProcessName && argList[1] != ProcessInfo.processName_) {
2601             continue;
2602         }
2603 
2604         dumpInfo = "    AppRunningRecord ID #" + std::to_string(processInfoID);
2605         processInfoID++;
2606         info.push_back(dumpInfo);
2607         dumpInfo = "      process name [" + ProcessInfo.processName_ + "]";
2608         info.push_back(dumpInfo);
2609         dumpInfo = "      pid #" + std::to_string(ProcessInfo.pid_) +
2610             "  uid #" + std::to_string(ProcessInfo.uid_);
2611         info.push_back(dumpInfo);
2612         auto appState = static_cast<AppState>(ProcessInfo.state_);
2613         dumpInfo = "      state #" + DelayedSingleton<AppScheduler>::GetInstance()->ConvertAppState(appState);
2614         info.push_back(dumpInfo);
2615     }
2616 }
2617 
DataDumpSysStateInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2618 void AbilityManagerService::DataDumpSysStateInner(
2619     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2620 {
2621     std::shared_ptr<DataAbilityManager> targetManager;
2622     if (isUserID) {
2623         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2624         auto it = dataAbilityManagers_.find(userId);
2625         if (it == dataAbilityManagers_.end()) {
2626             info.push_back("error: No user found.");
2627             return;
2628         }
2629         targetManager = it->second;
2630     } else {
2631         targetManager = dataAbilityManager_;
2632     }
2633 
2634     CHECK_POINTER(targetManager);
2635 
2636     std::vector<std::string> argList;
2637     SplitStr(args, " ", argList);
2638     if (argList.empty()) {
2639         return;
2640     }
2641     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2642         targetManager->DumpSysState(info, isClient, argList[1]);
2643     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2644         targetManager->DumpSysState(info, isClient);
2645     } else {
2646         info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
2647     }
2648 }
2649 
DumpInner(const std::string & args,std::vector<std::string> & info)2650 void AbilityManagerService::DumpInner(const std::string &args, std::vector<std::string> &info)
2651 {
2652     if (currentMissionListManager_) {
2653         currentMissionListManager_->Dump(info);
2654     }
2655 }
2656 
DumpMissionListInner(const std::string & args,std::vector<std::string> & info)2657 void AbilityManagerService::DumpMissionListInner(const std::string &args, std::vector<std::string> &info)
2658 {
2659     if (currentMissionListManager_) {
2660         currentMissionListManager_->DumpMissionList(info, false, "");
2661     }
2662 }
2663 
DumpMissionInfosInner(const std::string & args,std::vector<std::string> & info)2664 void AbilityManagerService::DumpMissionInfosInner(const std::string &args, std::vector<std::string> &info)
2665 {
2666     if (currentMissionListManager_) {
2667         currentMissionListManager_->DumpMissionInfos(info);
2668     }
2669 }
2670 
DumpMissionInner(const std::string & args,std::vector<std::string> & info)2671 void AbilityManagerService::DumpMissionInner(const std::string &args, std::vector<std::string> &info)
2672 {
2673     CHECK_POINTER_LOG(currentMissionListManager_, "Current mission manager not init.");
2674     std::vector<std::string> argList;
2675     SplitStr(args, " ", argList);
2676     if (argList.empty()) {
2677         return;
2678     }
2679     if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2680         info.push_back("error: invalid argument, please see 'ability dump -h'.");
2681         return;
2682     }
2683     int missionId = DEFAULT_INVAL_VALUE;
2684     (void)StrToInt(argList[1], missionId);
2685     currentMissionListManager_->DumpMission(missionId, info);
2686 }
2687 
DumpStateInner(const std::string & args,std::vector<std::string> & info)2688 void AbilityManagerService::DumpStateInner(const std::string &args, std::vector<std::string> &info)
2689 {
2690     CHECK_POINTER_LOG(connectManager_, "Current mission manager not init.");
2691     std::vector<std::string> argList;
2692     SplitStr(args, " ", argList);
2693     if (argList.empty()) {
2694         return;
2695     }
2696     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2697         connectManager_->DumpState(info, false, argList[1]);
2698     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2699         connectManager_->DumpState(info, false);
2700     } else {
2701         info.emplace_back("error: invalid argument, please see 'ability dump -h'.");
2702     }
2703 }
2704 
DataDumpStateInner(const std::string & args,std::vector<std::string> & info)2705 void AbilityManagerService::DataDumpStateInner(const std::string &args, std::vector<std::string> &info)
2706 {
2707     std::vector<std::string> argList;
2708     SplitStr(args, " ", argList);
2709     if (argList.empty()) {
2710         return;
2711     }
2712     if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
2713         dataAbilityManager_->DumpState(info, argList[1]);
2714     } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
2715         dataAbilityManager_->DumpState(info);
2716     } else {
2717         info.emplace_back("error: invalid argument, please see 'ability dump -h'.");
2718     }
2719 }
2720 
DumpState(const std::string & args,std::vector<std::string> & info)2721 void AbilityManagerService::DumpState(const std::string &args, std::vector<std::string> &info)
2722 {
2723     std::vector<std::string> argList;
2724     SplitStr(args, " ", argList);
2725     if (argList.empty()) {
2726         return;
2727     }
2728     auto it = dumpMap.find(argList[0]);
2729     if (it == dumpMap.end()) {
2730         return;
2731     }
2732     DumpKey key = it->second;
2733     auto itFunc = dumpFuncMap_.find(key);
2734     if (itFunc != dumpFuncMap_.end()) {
2735         auto dumpFunc = itFunc->second;
2736         if (dumpFunc != nullptr) {
2737             (this->*dumpFunc)(args, info);
2738             return;
2739         }
2740     }
2741     info.push_back("error: invalid argument, please see 'ability dump -h'.");
2742 }
2743 
DumpSysState(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)2744 void AbilityManagerService::DumpSysState(
2745     const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
2746 {
2747     HILOG_DEBUG("%{public}s begin", __func__);
2748     std::vector<std::string> argList;
2749     SplitStr(args, " ", argList);
2750     if (argList.empty()) {
2751         return;
2752     }
2753     auto it = dumpsysMap.find(argList[0]);
2754     if (it == dumpsysMap.end()) {
2755         return;
2756     }
2757     DumpsysKey key = it->second;
2758     auto itFunc = dumpsysFuncMap_.find(key);
2759     if (itFunc != dumpsysFuncMap_.end()) {
2760         auto dumpsysFunc = itFunc->second;
2761         if (dumpsysFunc != nullptr) {
2762             (this->*dumpsysFunc)(args, info, isClient, isUserID, userId);
2763             return;
2764         }
2765     }
2766     info.push_back("error: invalid argument, please see 'ability dump -h'.");
2767 }
2768 
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)2769 int AbilityManagerService::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state, const PacMap &saveData)
2770 {
2771     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2772     HILOG_INFO("Ability transition done come, state:%{public}d.", state);
2773     if (!VerificationAllToken(token)) {
2774         return ERR_INVALID_VALUE;
2775     }
2776     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2777     CHECK_POINTER_AND_RETURN_LOG(abilityRecord, ERR_INVALID_VALUE, "Ability record is nullptr.");
2778     if (!JudgeSelfCalled(abilityRecord)) {
2779         return CHECK_PERMISSION_FAILED;
2780     }
2781 
2782     auto abilityInfo = abilityRecord->GetAbilityInfo();
2783     HILOG_DEBUG("Ability transition done come, state:%{public}d, name:%{public}s", state, abilityInfo.name.c_str());
2784     auto type = abilityInfo.type;
2785     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2786     // force timeout ability for test
2787     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
2788     bool isTerminate = abilityRecord->IsAbilityState(AbilityState::TERMINATING) && targetState == AbilityState::INITIAL;
2789     std::string tempState = isTerminate ? AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING) :
2790         AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
2791     if (IsNeedTimeoutForTest(abilityInfo.name, tempState)) {
2792         HILOG_WARN("force timeout ability for test, state:%{public}s, ability: %{public}s",
2793             tempState.c_str(),
2794             abilityInfo.name.c_str());
2795         return ERR_OK;
2796     }
2797     if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
2798         auto connectManager = GetConnectManagerByUserId(userId);
2799         if (!connectManager) {
2800             HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2801             return ERR_INVALID_VALUE;
2802         }
2803         return connectManager->AbilityTransitionDone(token, state);
2804     }
2805     if (type == AppExecFwk::AbilityType::DATA) {
2806         auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2807         if (!dataAbilityManager) {
2808             HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
2809             return ERR_INVALID_VALUE;
2810         }
2811         return dataAbilityManager->AbilityTransitionDone(token, state);
2812     }
2813     int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
2814     auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
2815     if (!missionListManager) {
2816         HILOG_ERROR("missionListManager is Null. userId=%{public}d", ownerMissionUserId);
2817         return ERR_INVALID_VALUE;
2818     }
2819     return missionListManager->AbilityTransactionDone(token, state, saveData);
2820 }
2821 
ScheduleConnectAbilityDone(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)2822 int AbilityManagerService::ScheduleConnectAbilityDone(
2823     const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
2824 {
2825     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2826     HILOG_INFO("Schedule connect ability done.");
2827     if (!VerificationAllToken(token)) {
2828         return ERR_INVALID_VALUE;
2829     }
2830 
2831     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2832     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2833     if (!JudgeSelfCalled(abilityRecord)) {
2834         return CHECK_PERMISSION_FAILED;
2835     }
2836 
2837     auto type = abilityRecord->GetAbilityInfo().type;
2838     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2839         HILOG_ERROR("Connect ability failed, target ability is not service.");
2840         return TARGET_ABILITY_NOT_SERVICE;
2841     }
2842     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2843     auto connectManager = GetConnectManagerByUserId(userId);
2844     if (!connectManager) {
2845         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2846         return ERR_INVALID_VALUE;
2847     }
2848     return connectManager->ScheduleConnectAbilityDoneLocked(token, remoteObject);
2849 }
2850 
ScheduleDisconnectAbilityDone(const sptr<IRemoteObject> & token)2851 int AbilityManagerService::ScheduleDisconnectAbilityDone(const sptr<IRemoteObject> &token)
2852 {
2853     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2854     HILOG_INFO("Schedule disconnect ability done.");
2855     if (!VerificationAllToken(token)) {
2856         return ERR_INVALID_VALUE;
2857     }
2858 
2859     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2860     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2861     if (!JudgeSelfCalled(abilityRecord)) {
2862         return CHECK_PERMISSION_FAILED;
2863     }
2864 
2865     auto type = abilityRecord->GetAbilityInfo().type;
2866     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2867         HILOG_ERROR("Connect ability failed, target ability is not service.");
2868         return TARGET_ABILITY_NOT_SERVICE;
2869     }
2870     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2871     auto connectManager = GetConnectManagerByUserId(userId);
2872     if (!connectManager) {
2873         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2874         return ERR_INVALID_VALUE;
2875     }
2876     return connectManager->ScheduleDisconnectAbilityDoneLocked(token);
2877 }
2878 
ScheduleCommandAbilityDone(const sptr<IRemoteObject> & token)2879 int AbilityManagerService::ScheduleCommandAbilityDone(const sptr<IRemoteObject> &token)
2880 {
2881     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2882     HILOG_INFO("Schedule command ability done.");
2883     if (!VerificationAllToken(token)) {
2884         return ERR_INVALID_VALUE;
2885     }
2886 
2887     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2888     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2889     if (!JudgeSelfCalled(abilityRecord)) {
2890         return CHECK_PERMISSION_FAILED;
2891     }
2892     // force timeout ability for test
2893     if (IsNeedTimeoutForTest(abilityRecord->GetAbilityInfo().name, std::string("COMMAND"))) {
2894         HILOG_WARN("force timeout ability for test, state:COMMAND, ability: %{public}s",
2895             abilityRecord->GetAbilityInfo().name.c_str());
2896         return ERR_OK;
2897     }
2898     auto type = abilityRecord->GetAbilityInfo().type;
2899     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2900         HILOG_ERROR("Connect ability failed, target ability is not service.");
2901         return TARGET_ABILITY_NOT_SERVICE;
2902     }
2903     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2904     auto connectManager = GetConnectManagerByUserId(userId);
2905     if (!connectManager) {
2906         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2907         return ERR_INVALID_VALUE;
2908     }
2909     return connectManager->ScheduleCommandAbilityDoneLocked(token);
2910 }
2911 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const int32_t state)2912 void AbilityManagerService::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
2913 {
2914     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2915     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2916     CHECK_POINTER(abilityRecord);
2917     HILOG_INFO("On ability request done, name is %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
2918     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2919 
2920     auto type = abilityRecord->GetAbilityInfo().type;
2921     switch (type) {
2922         case AppExecFwk::AbilityType::DATA: {
2923             auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
2924             if (!dataAbilityManager) {
2925                 HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
2926                 return;
2927             }
2928             dataAbilityManager->OnAbilityRequestDone(token, state);
2929             break;
2930         }
2931         default: {
2932             int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
2933             auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
2934             if (!missionListManager) {
2935                 HILOG_ERROR("missionListManager is Null. userId=%{public}d", ownerMissionUserId);
2936                 return;
2937             }
2938             missionListManager->OnAbilityRequestDone(token, state);
2939             break;
2940         }
2941     }
2942 }
2943 
OnAppStateChanged(const AppInfo & info)2944 void AbilityManagerService::OnAppStateChanged(const AppInfo &info)
2945 {
2946     HILOG_INFO("On app state changed.");
2947     CHECK_POINTER_LOG(connectManager_, "Connect manager not init.");
2948     CHECK_POINTER_LOG(currentMissionListManager_, "Current mission list manager not init.");
2949     connectManager_->OnAppStateChanged(info);
2950     currentMissionListManager_->OnAppStateChanged(info);
2951     dataAbilityManager_->OnAppStateChanged(info);
2952 }
2953 
GetEventHandler()2954 std::shared_ptr<AbilityEventHandler> AbilityManagerService::GetEventHandler()
2955 {
2956     return handler_;
2957 }
2958 
InitMissionListManager(int userId,bool switchUser)2959 void AbilityManagerService::InitMissionListManager(int userId, bool switchUser)
2960 {
2961     bool find = false;
2962     {
2963         std::shared_lock<std::shared_mutex> lock(managersMutex_);
2964         auto iterator = missionListManagers_.find(userId);
2965         find = (iterator != missionListManagers_.end());
2966         if (find) {
2967             if (switchUser) {
2968                 DelayedSingleton<MissionInfoMgr>::GetInstance()->Init(userId);
2969                 currentMissionListManager_ = iterator->second;
2970             }
2971         }
2972     }
2973     if (!find) {
2974         auto manager = std::make_shared<MissionListManager>(userId);
2975         manager->Init();
2976         std::unique_lock<std::shared_mutex> lock(managersMutex_);
2977         missionListManagers_.emplace(userId, manager);
2978         if (switchUser) {
2979             currentMissionListManager_ = manager;
2980         }
2981     }
2982 }
2983 
2984 // multi user scene
GetUserId()2985 int AbilityManagerService::GetUserId()
2986 {
2987     if (userController_) {
2988         auto userId = userController_->GetCurrentUserId();
2989         HILOG_INFO("%{public}s, userId is %{public}d", __func__, userId);
2990         return userId;
2991     }
2992     return U0_USER_ID;
2993 }
2994 
StartHighestPriorityAbility(int32_t userId,bool isBoot)2995 void AbilityManagerService::StartHighestPriorityAbility(int32_t userId, bool isBoot)
2996 {
2997     HILOG_DEBUG("%{public}s", __func__);
2998     auto bms = GetBundleManager();
2999     CHECK_POINTER(bms);
3000 
3001     auto func = []() {
3002         auto client = ContainerManagerClient::GetInstance();
3003         if (client != nullptr) {
3004             client->NotifyBootComplete(0);
3005             HILOG_INFO("StartSystemApplication NotifyBootComplete");
3006         }
3007     };
3008     std::thread(func).detach();
3009 
3010     /* Query the highest priority ability or extension ability, and start it. usually, it is OOBE or launcher */
3011     Want want;
3012     want.AddEntity(HIGHEST_PRIORITY_ABILITY_ENTITY);
3013     AppExecFwk::AbilityInfo abilityInfo;
3014     AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
3015     int attemptNums = 0;
3016     while (!IN_PROCESS_CALL(bms->ImplicitQueryInfoByPriority(want,
3017         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, userId,
3018         abilityInfo, extensionAbilityInfo))) {
3019         HILOG_INFO("Waiting query highest priority ability info completed.");
3020         ++attemptNums;
3021         if (!isBoot && attemptNums > SWITCH_ACCOUNT_TRY) {
3022             HILOG_ERROR("Query highest priority ability failed.");
3023             return;
3024         }
3025         AbilityRequest abilityRequest;
3026         ComponentRequest componentRequest = initComponentRequest();
3027         if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
3028             return;
3029         }
3030         usleep(REPOLL_TIME_MICRO_SECONDS);
3031     }
3032 
3033     if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
3034         HILOG_ERROR("Query highest priority ability failed");
3035         return;
3036     }
3037 
3038     Want abilityWant; // donot use 'want' here, because the entity of 'want' is not empty
3039     if (!abilityInfo.name.empty()) {
3040         /* highest priority ability */
3041         HILOG_INFO("Start the highest priority ability. bundleName: %{public}s, ability:%{public}s",
3042             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
3043         abilityWant.SetElementName(abilityInfo.bundleName, abilityInfo.name);
3044     } else {
3045         /* highest priority extension ability */
3046         HILOG_INFO("Start the highest priority extension ability. bundleName: %{public}s, ability:%{public}s",
3047             extensionAbilityInfo.bundleName.c_str(), extensionAbilityInfo.name.c_str());
3048         abilityWant.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
3049     }
3050 
3051 #ifdef SUPPORT_GRAPHICS
3052     abilityWant.SetParam(NEED_STARTINGWINDOW, false);
3053     // wait BOOT_ANIMATION_STARTED to start LAUNCHER
3054     WaitParameter(BOOTEVENT_BOOT_ANIMATION_STARTED.c_str(), "true", amsConfigResolver_->GetBootAnimationTimeoutTime());
3055 #endif
3056 
3057     /* note: OOBE APP need disable itself, otherwise, it will be started when restart system everytime */
3058     (void)StartAbility(abilityWant, userId, DEFAULT_INVAL_VALUE);
3059 }
3060 
GenerateAbilityRequest(const Want & want,int requestCode,AbilityRequest & request,const sptr<IRemoteObject> & callerToken,int32_t userId)3061 int AbilityManagerService::GenerateAbilityRequest(
3062     const Want &want, int requestCode, AbilityRequest &request, const sptr<IRemoteObject> &callerToken, int32_t userId)
3063 {
3064     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3065     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
3066     if (abilityRecord && abilityRecord->GetAppIndex() != 0 &&
3067         abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
3068         (const_cast<Want &>(want)).SetParam(DLP_INDEX, abilityRecord->GetAppIndex());
3069     }
3070     request.want = want;
3071     request.requestCode = requestCode;
3072     request.callerToken = callerToken;
3073     request.startSetting = nullptr;
3074 
3075     sptr<IRemoteObject> abilityInfoCallback = want.GetRemoteObject(Want::PARAM_RESV_ABILITY_INFO_CALLBACK);
3076     if (abilityInfoCallback != nullptr) {
3077         auto isPerm = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
3078         if (isPerm) {
3079             request.abilityInfoCallback = abilityInfoCallback;
3080         }
3081     }
3082 
3083     auto bms = GetBundleManager();
3084     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
3085 #ifdef SUPPORT_GRAPHICS
3086     if (want.GetAction().compare(ACTION_CHOOSE) == 0) {
3087         return ShowPickerDialog(want, userId, callerToken);
3088     }
3089 #endif
3090     auto abilityInfoFlag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION |
3091         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION |
3092         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA);
3093     HILOG_DEBUG("QueryAbilityInfo from bms, userId is %{public}d.", userId);
3094     int32_t appIndex = want.GetIntParam(DLP_INDEX, 0);
3095     if (appIndex == 0) {
3096         IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(want, abilityInfoFlag, userId, request.abilityInfo));
3097     } else {
3098         IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxAbilityInfo(want, appIndex,
3099             abilityInfoFlag, userId, request.abilityInfo));
3100     }
3101     if (request.abilityInfo.name.empty() || request.abilityInfo.bundleName.empty()) {
3102         // try to find extension
3103         std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
3104         if (appIndex == 0) {
3105             IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag,
3106                 userId, extensionInfos));
3107         } else {
3108             IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
3109                 abilityInfoFlag, userId, extensionInfos));
3110         }
3111         if (extensionInfos.size() <= 0) {
3112             HILOG_ERROR("GenerateAbilityRequest error. Get extension info failed.");
3113             return RESOLVE_ABILITY_ERR;
3114         }
3115 
3116         AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
3117         if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
3118             HILOG_ERROR("extensionInfo empty.");
3119             return RESOLVE_ABILITY_ERR;
3120         }
3121         HILOG_DEBUG("Extension ability info found, name=%{public}s.",
3122             extensionInfo.name.c_str());
3123         // For compatibility translates to AbilityInfo
3124         InitAbilityInfoFromExtension(extensionInfo, request.abilityInfo);
3125     }
3126     HILOG_DEBUG("QueryAbilityInfo success, ability name: %{public}s, is stage mode: %{public}d.",
3127         request.abilityInfo.name.c_str(), request.abilityInfo.isStageBasedModel);
3128     if (request.abilityInfo.type == AppExecFwk::AbilityType::SERVICE && request.abilityInfo.isStageBasedModel) {
3129         HILOG_INFO("Stage mode, abilityInfo SERVICE type reset EXTENSION.");
3130         request.abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
3131     }
3132 
3133     if (request.abilityInfo.applicationInfo.name.empty() || request.abilityInfo.applicationInfo.bundleName.empty()) {
3134         HILOG_ERROR("Get app info failed.");
3135         return RESOLVE_APP_ERR;
3136     }
3137     request.appInfo = request.abilityInfo.applicationInfo;
3138     request.uid = request.appInfo.uid;
3139     HILOG_DEBUG("GenerateAbilityRequest end, app name: %{public}s, bundle name: %{public}s, uid: %{public}d.",
3140         request.appInfo.name.c_str(), request.appInfo.bundleName.c_str(), request.uid);
3141 
3142     HILOG_INFO("GenerateAbilityRequest, moduleName: %{public}s.", request.abilityInfo.moduleName.c_str());
3143     request.want.SetModuleName(request.abilityInfo.moduleName);
3144 
3145     if (want.GetBoolParam(Want::PARAM_RESV_START_RECENT, false) &&
3146         AAFwk::PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3147         request.startRecent = true;
3148     }
3149 
3150     return ERR_OK;
3151 }
3152 
GenerateExtensionAbilityRequest(const Want & want,AbilityRequest & request,const sptr<IRemoteObject> & callerToken,int32_t userId)3153 int AbilityManagerService::GenerateExtensionAbilityRequest(
3154     const Want &want, AbilityRequest &request, const sptr<IRemoteObject> &callerToken, int32_t userId)
3155 {
3156     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
3157     if (abilityRecord && abilityRecord->GetAppIndex() != 0 &&
3158         abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
3159         (const_cast<Want &>(want)).SetParam(DLP_INDEX, abilityRecord->GetAppIndex());
3160     }
3161     request.want = want;
3162     request.callerToken = callerToken;
3163     request.startSetting = nullptr;
3164 
3165     auto bms = GetBundleManager();
3166     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
3167 
3168     auto abilityInfoFlag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION |
3169         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION |
3170         AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA);
3171     HILOG_DEBUG("QueryExtensionAbilityInfo from bms, userId is %{public}d.", userId);
3172     // try to find extension
3173     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
3174     int32_t appIndex = want.GetIntParam(DLP_INDEX, 0);
3175     if (appIndex == 0) {
3176         IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag, userId, extensionInfos));
3177     } else {
3178         IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
3179             abilityInfoFlag, userId, extensionInfos));
3180     }
3181     if (extensionInfos.size() <= 0) {
3182         HILOG_ERROR("GenerateAbilityRequest error. Get extension info failed.");
3183         return RESOLVE_ABILITY_ERR;
3184     }
3185 
3186     AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
3187     if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
3188         HILOG_ERROR("extensionInfo empty.");
3189         return RESOLVE_ABILITY_ERR;
3190     }
3191     HILOG_DEBUG("Extension ability info found, name=%{public}s.",
3192         extensionInfo.name.c_str());
3193     // For compatibility translates to AbilityInfo
3194     InitAbilityInfoFromExtension(extensionInfo, request.abilityInfo);
3195 
3196     HILOG_DEBUG("QueryAbilityInfo success, ability name: %{public}s, is stage mode: %{public}d.",
3197         request.abilityInfo.name.c_str(), request.abilityInfo.isStageBasedModel);
3198 
3199     if (request.abilityInfo.applicationInfo.name.empty() || request.abilityInfo.applicationInfo.bundleName.empty()) {
3200         HILOG_ERROR("Get app info failed.");
3201         return RESOLVE_APP_ERR;
3202     }
3203     request.appInfo = request.abilityInfo.applicationInfo;
3204     request.uid = request.appInfo.uid;
3205     HILOG_DEBUG("GenerateAbilityRequest end, app name: %{public}s, bundle name: %{public}s, uid: %{public}d.",
3206         request.appInfo.name.c_str(), request.appInfo.bundleName.c_str(), request.uid);
3207 
3208     HILOG_INFO("GenerateExtensionAbilityRequest, moduleName: %{public}s.", request.abilityInfo.moduleName.c_str());
3209     request.want.SetModuleName(request.abilityInfo.moduleName);
3210 
3211     return ERR_OK;
3212 }
3213 
TerminateAbilityResult(const sptr<IRemoteObject> & token,int startId)3214 int AbilityManagerService::TerminateAbilityResult(const sptr<IRemoteObject> &token, int startId)
3215 {
3216     HILOG_INFO("Terminate ability result, startId: %{public}d", startId);
3217     if (!VerificationAllToken(token)) {
3218         return ERR_INVALID_VALUE;
3219     }
3220 
3221     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3222     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
3223     if (!JudgeSelfCalled(abilityRecord)) {
3224         return CHECK_PERMISSION_FAILED;
3225     }
3226     int result = JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
3227     if (result != ERR_OK) {
3228         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
3229         return result;
3230     }
3231 
3232     auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
3233     auto type = abilityRecord->GetAbilityInfo().type;
3234     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
3235         HILOG_ERROR("target ability is not service.");
3236         return TARGET_ABILITY_NOT_SERVICE;
3237     }
3238 
3239     auto connectManager = GetConnectManagerByUserId(userId);
3240     if (!connectManager) {
3241         HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
3242         return ERR_INVALID_VALUE;
3243     }
3244     return connectManager->TerminateAbilityResult(token, startId);
3245 }
3246 
StopServiceAbility(const Want & want,int32_t userId)3247 int AbilityManagerService::StopServiceAbility(const Want &want, int32_t userId)
3248 {
3249     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3250     HILOG_DEBUG("Stop service ability.");
3251     int32_t validUserId = GetValidUserId(userId);
3252     if (!JudgeMultiUserConcurrency(validUserId)) {
3253         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
3254         return ERR_INVALID_VALUE;
3255     }
3256 
3257     AbilityRequest abilityRequest;
3258     auto result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, validUserId);
3259     if (result != ERR_OK) {
3260         HILOG_ERROR("Generate ability request local error.");
3261         return result;
3262     }
3263 
3264     auto abilityInfo = abilityRequest.abilityInfo;
3265     validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
3266     HILOG_DEBUG("validUserId : %{public}d, singleton is : %{public}d",
3267         validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
3268 
3269     auto type = abilityInfo.type;
3270     if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
3271         HILOG_ERROR("Target ability is not service type.");
3272         return TARGET_ABILITY_NOT_SERVICE;
3273     }
3274 
3275     auto connectManager = GetConnectManagerByUserId(validUserId);
3276     if (connectManager == nullptr) {
3277         return ERR_INVALID_VALUE;
3278     }
3279 
3280     return connectManager->StopServiceAbility(abilityRequest);
3281 }
3282 
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)3283 void AbilityManagerService::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
3284 {
3285     CHECK_POINTER(abilityRecord);
3286 
3287     auto manager = GetListManagerByUserId(abilityRecord->GetOwnerMissionUserId());
3288     if (manager && abilityRecord->GetAbilityInfo().type == AbilityType::PAGE) {
3289         manager->OnAbilityDied(abilityRecord, GetUserId());
3290         return;
3291     }
3292 
3293     auto connectManager = GetConnectManagerByToken(abilityRecord->GetToken());
3294     if (connectManager) {
3295         connectManager->OnAbilityDied(abilityRecord, GetUserId());
3296         return;
3297     }
3298 
3299     auto dataAbilityManager = GetDataAbilityManagerByToken(abilityRecord->GetToken());
3300     if (dataAbilityManager) {
3301         dataAbilityManager->OnAbilityDied(abilityRecord);
3302     }
3303 }
3304 
OnCallConnectDied(std::shared_ptr<CallRecord> callRecord)3305 void AbilityManagerService::OnCallConnectDied(std::shared_ptr<CallRecord> callRecord)
3306 {
3307     CHECK_POINTER(callRecord);
3308     if (currentMissionListManager_) {
3309         currentMissionListManager_->OnCallConnectDied(callRecord);
3310     }
3311 }
3312 
GetMaxRestartNum(int & max,bool isRootLauncher)3313 void AbilityManagerService::GetMaxRestartNum(int &max, bool isRootLauncher)
3314 {
3315     if (amsConfigResolver_) {
3316         max = amsConfigResolver_->GetMaxRestartNum(isRootLauncher);
3317     }
3318 }
3319 
GetRestartIntervalTime(int & restartIntervalTime)3320 void AbilityManagerService::GetRestartIntervalTime(int &restartIntervalTime)
3321 {
3322     if (amsConfigResolver_) {
3323         restartIntervalTime = amsConfigResolver_->GetRestartIntervalTime();
3324     }
3325 }
3326 
KillProcess(const std::string & bundleName)3327 int AbilityManagerService::KillProcess(const std::string &bundleName)
3328 {
3329     HILOG_DEBUG("Kill process, bundleName: %{public}s", bundleName.c_str());
3330     auto bms = GetBundleManager();
3331     CHECK_POINTER_AND_RETURN(bms, KILL_PROCESS_FAILED);
3332     int32_t userId = GetUserId();
3333     AppExecFwk::BundleInfo bundleInfo;
3334     if (!IN_PROCESS_CALL(
3335         bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId))) {
3336         HILOG_ERROR("Failed to get bundle info when kill process.");
3337         return GET_BUNDLE_INFO_FAILED;
3338     }
3339 
3340     if (bundleInfo.isKeepAlive) {
3341         HILOG_ERROR("Can not kill keep alive process.");
3342         return KILL_PROCESS_KEEP_ALIVE;
3343     }
3344 
3345     int ret = DelayedSingleton<AppScheduler>::GetInstance()->KillApplication(bundleName);
3346     if (ret != ERR_OK) {
3347         return KILL_PROCESS_FAILED;
3348     }
3349     return ERR_OK;
3350 }
3351 
ClearUpApplicationData(const std::string & bundleName)3352 int AbilityManagerService::ClearUpApplicationData(const std::string &bundleName)
3353 {
3354     HILOG_DEBUG("ClearUpApplicationData, bundleName: %{public}s", bundleName.c_str());
3355     int ret = DelayedSingleton<AppScheduler>::GetInstance()->ClearUpApplicationData(bundleName);
3356     if (ret != ERR_OK) {
3357         return CLEAR_APPLICATION_DATA_FAIL;
3358     }
3359     return ERR_OK;
3360 }
3361 
UninstallApp(const std::string & bundleName,int32_t uid)3362 int AbilityManagerService::UninstallApp(const std::string &bundleName, int32_t uid)
3363 {
3364     HILOG_DEBUG("Uninstall app, bundleName: %{public}s, uid=%{public}d", bundleName.c_str(), uid);
3365     pid_t callingPid = IPCSkeleton::GetCallingPid();
3366     pid_t pid = getpid();
3367     if (callingPid != pid) {
3368         HILOG_ERROR("%{public}s: Not bundleMgr call.", __func__);
3369         return CHECK_PERMISSION_FAILED;
3370     }
3371 
3372     int32_t targetUserId = uid / BASE_USER_RANGE;
3373     if (targetUserId == U0_USER_ID) {
3374         std::shared_lock<std::shared_mutex> lock(managersMutex_);
3375         for (auto item: missionListManagers_) {
3376             if (item.second) {
3377                 item.second->UninstallApp(bundleName, uid);
3378             }
3379         }
3380     } else {
3381         auto listManager = GetListManagerByUserId(targetUserId);
3382         if (listManager) {
3383             listManager->UninstallApp(bundleName, uid);
3384         }
3385     }
3386 
3387     if (pendingWantManager_) {
3388         pendingWantManager_->ClearPendingWantRecord(bundleName, uid);
3389     }
3390     int ret = DelayedSingleton<AppScheduler>::GetInstance()->KillApplicationByUid(bundleName, uid);
3391     if (ret != ERR_OK) {
3392         return UNINSTALL_APP_FAILED;
3393     }
3394     return ERR_OK;
3395 }
3396 
GetBundleManager()3397 sptr<AppExecFwk::IBundleMgr> AbilityManagerService::GetBundleManager()
3398 {
3399     if (iBundleManager_ == nullptr) {
3400         auto bundleObj =
3401             OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
3402         if (bundleObj == nullptr) {
3403             HILOG_ERROR("Failed to get bundle manager service.");
3404             return nullptr;
3405         }
3406         iBundleManager_ = iface_cast<AppExecFwk::IBundleMgr>(bundleObj);
3407     }
3408     return iBundleManager_;
3409 }
3410 
PreLoadAppDataAbilities(const std::string & bundleName,const int32_t userId)3411 int AbilityManagerService::PreLoadAppDataAbilities(const std::string &bundleName, const int32_t userId)
3412 {
3413     if (bundleName.empty()) {
3414         HILOG_ERROR("Invalid bundle name when app data abilities preloading.");
3415         return ERR_INVALID_VALUE;
3416     }
3417 
3418     auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
3419     if (dataAbilityManager == nullptr) {
3420         HILOG_ERROR("Invalid data ability manager when app data abilities preloading.");
3421         return ERR_INVALID_STATE;
3422     }
3423 
3424     auto bms = GetBundleManager();
3425     CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
3426 
3427     AppExecFwk::BundleInfo bundleInfo;
3428     bool ret = IN_PROCESS_CALL(
3429         bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, userId));
3430     if (!ret) {
3431         HILOG_ERROR("Failed to get bundle info when app data abilities preloading, userId is %{public}d", userId);
3432         return RESOLVE_APP_ERR;
3433     }
3434 
3435     HILOG_INFO("App data abilities preloading for bundle '%{public}s'...", bundleName.data());
3436 
3437     auto begin = system_clock::now();
3438     AbilityRequest dataAbilityRequest;
3439     dataAbilityRequest.appInfo = bundleInfo.applicationInfo;
3440     for (auto it = bundleInfo.abilityInfos.begin(); it != bundleInfo.abilityInfos.end(); ++it) {
3441         if (it->type != AppExecFwk::AbilityType::DATA) {
3442             continue;
3443         }
3444         if ((system_clock::now() - begin) >= DATA_ABILITY_START_TIMEOUT) {
3445             HILOG_ERROR("App data ability preloading for '%{public}s' timeout.", bundleName.c_str());
3446             return ERR_TIMED_OUT;
3447         }
3448         dataAbilityRequest.abilityInfo = *it;
3449         dataAbilityRequest.uid = bundleInfo.uid;
3450         HILOG_INFO("App data ability preloading: '%{public}s.%{public}s'...",
3451             it->bundleName.c_str(), it->name.c_str());
3452 
3453         auto dataAbility = dataAbilityManager->Acquire(dataAbilityRequest, false, nullptr, false);
3454         if (dataAbility == nullptr) {
3455             HILOG_ERROR(
3456                 "Failed to preload data ability '%{public}s.%{public}s'.", it->bundleName.c_str(), it->name.c_str());
3457             return ERR_NULL_OBJECT;
3458         }
3459     }
3460 
3461     HILOG_INFO("App data abilities preloading done.");
3462 
3463     return ERR_OK;
3464 }
3465 
IsSystemUiApp(const AppExecFwk::AbilityInfo & info) const3466 bool AbilityManagerService::IsSystemUiApp(const AppExecFwk::AbilityInfo &info) const
3467 {
3468     if (info.bundleName != AbilityConfig::SYSTEM_UI_BUNDLE_NAME) {
3469         return false;
3470     }
3471     return (info.name == AbilityConfig::SYSTEM_UI_NAVIGATION_BAR ||
3472         info.name == AbilityConfig::SYSTEM_UI_STATUS_BAR ||
3473         info.name == AbilityConfig::SYSTEM_UI_ABILITY_NAME);
3474 }
3475 
IsSystemUI(const std::string & bundleName) const3476 bool AbilityManagerService::IsSystemUI(const std::string &bundleName) const
3477 {
3478     return bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME;
3479 }
3480 
HandleLoadTimeOut(int64_t eventId)3481 void AbilityManagerService::HandleLoadTimeOut(int64_t eventId)
3482 {
3483     HILOG_DEBUG("Handle load timeout.");
3484     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3485     for (auto& item : missionListManagers_) {
3486         if (item.second) {
3487             item.second->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId);
3488         }
3489     }
3490 }
3491 
HandleActiveTimeOut(int64_t eventId)3492 void AbilityManagerService::HandleActiveTimeOut(int64_t eventId)
3493 {
3494     HILOG_DEBUG("Handle active timeout.");
3495     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3496     for (auto& item : missionListManagers_) {
3497         if (item.second) {
3498             item.second->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, eventId);
3499         }
3500     }
3501 }
3502 
HandleInactiveTimeOut(int64_t eventId)3503 void AbilityManagerService::HandleInactiveTimeOut(int64_t eventId)
3504 {
3505     HILOG_DEBUG("Handle inactive timeout.");
3506     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3507     for (auto& item : missionListManagers_) {
3508         if (item.second) {
3509             item.second->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, eventId);
3510         }
3511     }
3512 
3513     for (auto& item : connectManagers_) {
3514         if (item.second) {
3515             item.second->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, eventId);
3516         }
3517     }
3518 }
3519 
HandleForegroundTimeOut(int64_t eventId)3520 void AbilityManagerService::HandleForegroundTimeOut(int64_t eventId)
3521 {
3522     HILOG_DEBUG("Handle foreground timeout.");
3523     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3524     for (auto& item : missionListManagers_) {
3525         if (item.second) {
3526             item.second->OnTimeOut(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, eventId);
3527         }
3528     }
3529 }
3530 
HandleBackgroundTimeOut(int64_t eventId)3531 void AbilityManagerService::HandleBackgroundTimeOut(int64_t eventId)
3532 {
3533     HILOG_DEBUG("Handle background timeout.");
3534     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3535     for (auto& item : missionListManagers_) {
3536         if (item.second) {
3537             item.second->OnTimeOut(AbilityManagerService::BACKGROUND_TIMEOUT_MSG, eventId);
3538         }
3539     }
3540 }
3541 
VerificationToken(const sptr<IRemoteObject> & token)3542 bool AbilityManagerService::VerificationToken(const sptr<IRemoteObject> &token)
3543 {
3544     HILOG_INFO("Verification token.");
3545     CHECK_POINTER_RETURN_BOOL(dataAbilityManager_);
3546     CHECK_POINTER_RETURN_BOOL(connectManager_);
3547     CHECK_POINTER_RETURN_BOOL(currentMissionListManager_);
3548 
3549     if (currentMissionListManager_->GetAbilityRecordByToken(token)) {
3550         return true;
3551     }
3552     if (currentMissionListManager_->GetAbilityFromTerminateList(token)) {
3553         return true;
3554     }
3555 
3556     if (dataAbilityManager_->GetAbilityRecordByToken(token)) {
3557         HILOG_INFO("Verification token4.");
3558         return true;
3559     }
3560 
3561     if (connectManager_->GetExtensionByTokenFromSeriveMap(token)) {
3562         HILOG_INFO("Verification token5.");
3563         return true;
3564     }
3565 
3566     if (connectManager_->GetExtensionByTokenFromTerminatingMap(token)) {
3567         HILOG_INFO("Verification token5.");
3568         return true;
3569     }
3570 
3571     HILOG_ERROR("Failed to verify token.");
3572     return false;
3573 }
3574 
VerificationAllToken(const sptr<IRemoteObject> & token)3575 bool AbilityManagerService::VerificationAllToken(const sptr<IRemoteObject> &token)
3576 {
3577     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3578     HILOG_INFO("VerificationAllToken.");
3579     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3580     {
3581         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchMissionListManagers");
3582         for (auto item: missionListManagers_) {
3583             if (item.second && item.second->GetAbilityRecordByToken(token)) {
3584                 return true;
3585             }
3586 
3587             if (item.second && item.second->GetAbilityFromTerminateList(token)) {
3588                 return true;
3589             }
3590         }
3591     }
3592 
3593     {
3594         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchDataAbilityManagers_");
3595         for (auto item: dataAbilityManagers_) {
3596             if (item.second && item.second->GetAbilityRecordByToken(token)) {
3597                 return true;
3598             }
3599         }
3600     }
3601 
3602     {
3603         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchConnectManagers_");
3604         for (auto item: connectManagers_) {
3605             if (item.second && item.second->GetExtensionByTokenFromSeriveMap(token)) {
3606                 return true;
3607             }
3608             if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
3609                 return true;
3610             }
3611         }
3612     }
3613     HILOG_ERROR("Failed to verify all token.");
3614     return false;
3615 }
3616 
GetDataAbilityManager(const sptr<IAbilityScheduler> & scheduler)3617 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManager(
3618     const sptr<IAbilityScheduler> &scheduler)
3619 {
3620     if (scheduler == nullptr) {
3621         HILOG_ERROR("the param ability scheduler is nullptr");
3622         return nullptr;
3623     }
3624 
3625     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3626     for (auto& item: dataAbilityManagers_) {
3627         if (item.second && item.second->ContainsDataAbility(scheduler)) {
3628             return item.second;
3629         }
3630     }
3631 
3632     return nullptr;
3633 }
3634 
GetListManagerByUserId(int32_t userId)3635 std::shared_ptr<MissionListManager> AbilityManagerService::GetListManagerByUserId(int32_t userId)
3636 {
3637     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3638     auto it = missionListManagers_.find(userId);
3639     if (it != missionListManagers_.end()) {
3640         return it->second;
3641     }
3642     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3643     return nullptr;
3644 }
3645 
GetConnectManagerByUserId(int32_t userId)3646 std::shared_ptr<AbilityConnectManager> AbilityManagerService::GetConnectManagerByUserId(int32_t userId)
3647 {
3648     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3649     auto it = connectManagers_.find(userId);
3650     if (it != connectManagers_.end()) {
3651         return it->second;
3652     }
3653     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3654     return nullptr;
3655 }
3656 
GetDataAbilityManagerByUserId(int32_t userId)3657 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManagerByUserId(int32_t userId)
3658 {
3659     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3660     auto it = dataAbilityManagers_.find(userId);
3661     if (it != dataAbilityManagers_.end()) {
3662         return it->second;
3663     }
3664     HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
3665     return nullptr;
3666 }
3667 
GetConnectManagerByToken(const sptr<IRemoteObject> & token)3668 std::shared_ptr<AbilityConnectManager> AbilityManagerService::GetConnectManagerByToken(
3669     const sptr<IRemoteObject> &token)
3670 {
3671     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3672     for (auto item: connectManagers_) {
3673         if (item.second && item.second->GetExtensionByTokenFromSeriveMap(token)) {
3674             return item.second;
3675         }
3676         if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
3677             return item.second;
3678         }
3679     }
3680 
3681     return nullptr;
3682 }
3683 
GetDataAbilityManagerByToken(const sptr<IRemoteObject> & token)3684 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManagerByToken(
3685     const sptr<IRemoteObject> &token)
3686 {
3687     std::shared_lock<std::shared_mutex> lock(managersMutex_);
3688     for (auto item: dataAbilityManagers_) {
3689         if (item.second && item.second->GetAbilityRecordByToken(token)) {
3690             return item.second;
3691         }
3692     }
3693 
3694     return nullptr;
3695 }
3696 
StartResidentApps()3697 void AbilityManagerService::StartResidentApps()
3698 {
3699     HILOG_DEBUG("%{public}s", __func__);
3700     ConnectBmsService();
3701     auto bms = GetBundleManager();
3702     CHECK_POINTER_IS_NULLPTR(bms);
3703     std::vector<AppExecFwk::BundleInfo> bundleInfos;
3704     if (!IN_PROCESS_CALL(
3705         bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, U0_USER_ID))) {
3706         HILOG_ERROR("Get resident bundleinfos failed");
3707         return;
3708     }
3709 
3710     HILOG_INFO("StartResidentApps GetBundleInfos size: %{public}zu", bundleInfos.size());
3711 
3712     DelayedSingleton<ResidentProcessManager>::GetInstance()->StartResidentProcessWithMainElement(bundleInfos);
3713     if (!bundleInfos.empty()) {
3714 #ifdef SUPPORT_GRAPHICS
3715         WaitParameter(BOOTEVENT_BOOT_ANIMATION_STARTED.c_str(), "true", amsConfigResolver_->GetBootAnimationTimeoutTime());
3716 #endif
3717         DelayedSingleton<ResidentProcessManager>::GetInstance()->StartResidentProcess(bundleInfos);
3718     }
3719 }
3720 
ConnectBmsService()3721 void AbilityManagerService::ConnectBmsService()
3722 {
3723     HILOG_DEBUG("%{public}s", __func__);
3724     HILOG_INFO("Waiting AppMgr Service run completed.");
3725     while (!DelayedSingleton<AppScheduler>::GetInstance()->Init(shared_from_this())) {
3726         HILOG_ERROR("failed to init AppScheduler");
3727         usleep(REPOLL_TIME_MICRO_SECONDS);
3728     }
3729 
3730     HILOG_INFO("Waiting BundleMgr Service run completed.");
3731     /* wait until connected to bundle manager service */
3732     while (iBundleManager_ == nullptr) {
3733         sptr<IRemoteObject> bundle_obj =
3734             OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
3735         if (bundle_obj == nullptr) {
3736             HILOG_ERROR("failed to get bundle manager service");
3737             usleep(REPOLL_TIME_MICRO_SECONDS);
3738             continue;
3739         }
3740         iBundleManager_ = iface_cast<AppExecFwk::IBundleMgr>(bundle_obj);
3741     }
3742 
3743     HILOG_INFO("Connect bms success!");
3744 }
3745 
GetWantSenderInfo(const sptr<IWantSender> & target,std::shared_ptr<WantSenderInfo> & info)3746 int AbilityManagerService::GetWantSenderInfo(const sptr<IWantSender> &target, std::shared_ptr<WantSenderInfo> &info)
3747 {
3748     HILOG_INFO("Get pending request info.");
3749     CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
3750     CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
3751     CHECK_POINTER_AND_RETURN(info, ERR_INVALID_VALUE);
3752     return pendingWantManager_->GetWantSenderInfo(target, info);
3753 }
3754 
GetAppMemorySize()3755 int AbilityManagerService::GetAppMemorySize()
3756 {
3757     HILOG_INFO("service GetAppMemorySize start");
3758     const char *key = "const.product.arkheaplimit";
3759     const char *def = "512m";
3760     char *valueGet = nullptr;
3761     unsigned int len = 128;
3762     int ret = GetParameter(key, def, valueGet, len);
3763     int resultInt = 0;
3764     if ((ret != GET_PARAMETER_OTHER) && (ret != GET_PARAMETER_INCORRECT)) {
3765         if (valueGet == nullptr) {
3766             HILOG_WARN("%{public}s, valueGet is nullptr", __func__);
3767             return APP_MEMORY_SIZE;
3768         }
3769         int len = strlen(valueGet);
3770         for (int i = 0; i < len; i++) {
3771             if (valueGet[i] >= '0' && valueGet[i] <= '9') {
3772                 resultInt *= SIZE_10;
3773                 resultInt += valueGet[i] - '0';
3774             }
3775         }
3776         if (resultInt == 0) {
3777             return APP_MEMORY_SIZE;
3778         }
3779         return resultInt;
3780     }
3781     return APP_MEMORY_SIZE;
3782 }
3783 
IsRamConstrainedDevice()3784 bool AbilityManagerService::IsRamConstrainedDevice()
3785 {
3786     HILOG_INFO("service IsRamConstrainedDevice start");
3787     const char *key = "const.product.islowram";
3788     const char *def = "0";
3789     char *valueGet = nullptr;
3790     unsigned int len = 128;
3791     int ret = GetParameter(key, def, valueGet, len);
3792     if ((ret != GET_PARAMETER_OTHER) && (ret != GET_PARAMETER_INCORRECT)) {
3793         int value = atoi(valueGet);
3794         if (value) {
3795             return true;
3796         }
3797         return false;
3798     }
3799     return false;
3800 }
3801 
GetMissionSaveTime() const3802 int AbilityManagerService::GetMissionSaveTime() const
3803 {
3804     if (!amsConfigResolver_) {
3805         return 0;
3806     }
3807 
3808     return amsConfigResolver_->GetMissionSaveTime();
3809 }
3810 
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)3811 int32_t AbilityManagerService::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
3812 {
3813     auto abilityRecord = Token::GetAbilityRecordByToken(token);
3814     if (!abilityRecord) {
3815         HILOG_ERROR("abilityRecord is Null.");
3816         return -1;
3817     }
3818 
3819     if (!JudgeSelfCalled(abilityRecord) && (IPCSkeleton::GetCallingPid() != getpid())) {
3820         return -1;
3821     }
3822     auto userId = abilityRecord->GetOwnerMissionUserId();
3823     auto missionListManager = GetListManagerByUserId(userId);
3824     if (!missionListManager) {
3825         HILOG_ERROR("missionListManager is Null. owner mission userId=%{public}d", userId);
3826         return -1;
3827     }
3828     return missionListManager->GetMissionIdByAbilityToken(token);
3829 }
3830 
GetAbilityTokenByMissionId(int32_t missionId)3831 sptr<IRemoteObject> AbilityManagerService::GetAbilityTokenByMissionId(int32_t missionId)
3832 {
3833     if (!currentMissionListManager_) {
3834         return nullptr;
3835     }
3836     return currentMissionListManager_->GetAbilityTokenByMissionId(missionId);
3837 }
3838 
StartRemoteAbilityByCall(const Want & want,const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject> & connect)3839 int AbilityManagerService::StartRemoteAbilityByCall(const Want &want, const sptr<IRemoteObject> &callerToken,
3840     const sptr<IRemoteObject> &connect)
3841 {
3842     HILOG_INFO("%{public}s begin StartRemoteAbilityByCall", __func__);
3843     Want remoteWant = want;
3844     if (AddStartControlParam(remoteWant, callerToken) != ERR_OK) {
3845         HILOG_ERROR("%{public}s AddStartControlParam failed.", __func__);
3846         return ERR_INVALID_VALUE;
3847     }
3848     DistributedClient dmsClient;
3849     return dmsClient.StartRemoteAbilityByCall(remoteWant, connect);
3850 }
3851 
ReleaseRemoteAbility(const sptr<IRemoteObject> & connect,const AppExecFwk::ElementName & element)3852 int AbilityManagerService::ReleaseRemoteAbility(const sptr<IRemoteObject> &connect,
3853     const AppExecFwk::ElementName &element)
3854 {
3855     DistributedClient dmsClient;
3856     return dmsClient.ReleaseRemoteAbility(connect, element);
3857 }
3858 
StartAbilityByCall(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken)3859 int AbilityManagerService::StartAbilityByCall(
3860     const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken)
3861 {
3862     HILOG_INFO("call ability.");
3863     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
3864     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
3865 
3866     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
3867     if (abilityRecord && !JudgeSelfCalled(abilityRecord)) {
3868         return CHECK_PERMISSION_FAILED;
3869     }
3870 
3871     auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
3872         interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
3873     if (result != ERR_OK) {
3874         HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
3875         return result;
3876     }
3877 
3878     if (CheckIfOperateRemote(want)) {
3879         HILOG_INFO("start remote ability by call");
3880         return StartRemoteAbilityByCall(want, callerToken, connect->AsObject());
3881     }
3882 
3883     int32_t callerUserId = GetValidUserId(DEFAULT_INVAL_VALUE);
3884     if (!JudgeMultiUserConcurrency(callerUserId)) {
3885         HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
3886         return ERR_INVALID_VALUE;
3887     }
3888 
3889     AbilityRequest abilityRequest;
3890     abilityRequest.callType = AbilityCallType::CALL_REQUEST_TYPE;
3891     abilityRequest.callerUid = IPCSkeleton::GetCallingUid();
3892     abilityRequest.callerToken = callerToken;
3893     abilityRequest.startSetting = nullptr;
3894     abilityRequest.want = want;
3895     abilityRequest.connect = connect;
3896     result = GenerateAbilityRequest(want, -1, abilityRequest, callerToken, GetUserId());
3897     ComponentRequest componentRequest = initComponentRequest(callerToken, -1, result);
3898     if (CheckProxyComponent(want, result) && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
3899         return componentRequest.requestResult;
3900     }
3901     if (result != ERR_OK) {
3902         HILOG_ERROR("Generate ability request error.");
3903         return result;
3904     }
3905 
3906     if (!abilityRequest.abilityInfo.isStageBasedModel) {
3907         HILOG_ERROR("target ability is not stage base model.");
3908         return RESOLVE_CALL_ABILITY_VERSION_ERR;
3909     }
3910 
3911     result = CheckStartByCallPermission(abilityRequest);
3912     if (result != ERR_OK) {
3913         HILOG_ERROR("CheckStartByCallPermission fail, result: %{public}d", result);
3914         return result;
3915     }
3916 
3917     HILOG_DEBUG("abilityInfo.applicationInfo.singleton is %{public}s",
3918         abilityRequest.abilityInfo.applicationInfo.singleton ? "true" : "false");
3919 
3920     if (!currentMissionListManager_) {
3921         HILOG_ERROR("currentMissionListManager_ is Null. curentUserId=%{public}d", GetUserId());
3922         return ERR_INVALID_VALUE;
3923     }
3924     UpdateCallerInfo(abilityRequest.want);
3925     ReportEventToSuspendManager(abilityRequest.abilityInfo);
3926     if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
3927         return componentRequest.requestResult;
3928     }
3929     return currentMissionListManager_->ResolveLocked(abilityRequest);
3930 }
3931 
ReleaseCall(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)3932 int AbilityManagerService::ReleaseCall(
3933     const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
3934 {
3935     HILOG_DEBUG("Release called ability.");
3936 
3937     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
3938     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
3939     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3940 
3941     std::string elementName = element.GetURI();
3942     HILOG_DEBUG("try to release called ability, name: %{public}s.", elementName.c_str());
3943 
3944     if (CheckIsRemote(element.GetDeviceID())) {
3945         HILOG_INFO("release remote ability");
3946         return ReleaseRemoteAbility(connect->AsObject(), element);
3947     }
3948 
3949     int result = ERR_OK;
3950     if (IsReleaseCallInterception(connect, element, result)) {
3951         return result;
3952     }
3953 
3954     return currentMissionListManager_->ReleaseCallLocked(connect, element);
3955 }
3956 
JudgeAbilityVisibleControl(const AppExecFwk::AbilityInfo & abilityInfo,int callerUid)3957 int AbilityManagerService::JudgeAbilityVisibleControl(const AppExecFwk::AbilityInfo &abilityInfo, int callerUid)
3958 {
3959     HILOG_DEBUG("Judge ability visible begin.");
3960     if (!abilityInfo.visible) {
3961         HILOG_INFO("Ability visible is false.");
3962         if (callerUid == -1) {
3963             callerUid = IPCSkeleton::GetCallingUid();
3964         }
3965         if (!CheckCallerEligibility(abilityInfo, callerUid)) {
3966             HILOG_ERROR("called ability has no permission.");
3967             return ABILITY_VISIBLE_FALSE_DENY_REQUEST;
3968         }
3969     }
3970     HILOG_DEBUG("Judge ability visible success.");
3971     return ERR_OK;
3972 }
3973 
CheckCallerEligibility(const AppExecFwk::AbilityInfo & abilityInfo,int callerUid)3974 bool AbilityManagerService::CheckCallerEligibility(const AppExecFwk::AbilityInfo &abilityInfo, int callerUid)
3975 {
3976     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
3977     if (!isSaCall) {
3978         auto bms = GetBundleManager();
3979         if (!bms) {
3980             HILOG_ERROR("fail to get bundle manager.");
3981             return false;
3982         }
3983 
3984         if (AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
3985             return true;
3986         }
3987 
3988         std::string bundleName;
3989         bool result = IN_PROCESS_CALL(bms->GetBundleNameForUid(callerUid, bundleName));
3990         if (!result) {
3991             HILOG_ERROR("GetBundleNameForUid from bms fail.");
3992             return false;
3993         }
3994         AppExecFwk::ApplicationInfo callerAppInfo;
3995         result = IN_PROCESS_CALL(bms->GetApplicationInfo(bundleName,
3996             AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO,
3997             GetUserId(), callerAppInfo));
3998         if (!result) {
3999             HILOG_ERROR("GetApplicationInfo from bms fail.");
4000             return false;
4001         }
4002 
4003         auto apl = callerAppInfo.appPrivilegeLevel;
4004         if (apl != AbilityUtil::SYSTEM_BASIC && apl != AbilityUtil::SYSTEM_CORE) {
4005             HILOG_DEBUG("caller is normal app.");
4006             auto callerTokenId = IPCSkeleton::GetCallingTokenID();
4007             auto targetTokenId = abilityInfo.applicationInfo.accessTokenId;
4008             if (callerTokenId != targetTokenId) {
4009                 HILOG_ERROR("the bundle name of caller is different from target one, caller: %{public}s "
4010                             "target: %{public}s",
4011                     bundleName.c_str(),
4012                     abilityInfo.bundleName.c_str());
4013                 return false;
4014             }
4015         }
4016     }
4017     HILOG_DEBUG("Success to check caller permission.");
4018     return true;
4019 }
4020 
StartUser(int userId)4021 int AbilityManagerService::StartUser(int userId)
4022 {
4023     HILOG_DEBUG("%{public}s, userId:%{public}d", __func__, userId);
4024     if (IPCSkeleton::GetCallingUid() != ACCOUNT_MGR_SERVICE_UID) {
4025         HILOG_ERROR("%{public}s: Permission verification failed, not account process", __func__);
4026         return CHECK_PERMISSION_FAILED;
4027     }
4028 
4029     if (userController_) {
4030         return userController_->StartUser(userId, true);
4031     }
4032     return 0;
4033 }
4034 
StopUser(int userId,const sptr<IStopUserCallback> & callback)4035 int AbilityManagerService::StopUser(int userId, const sptr<IStopUserCallback> &callback)
4036 {
4037     HILOG_DEBUG("%{public}s", __func__);
4038     if (IPCSkeleton::GetCallingUid() != ACCOUNT_MGR_SERVICE_UID) {
4039         HILOG_ERROR("%{public}s: Permission verification failed, not account process", __func__);
4040         return CHECK_PERMISSION_FAILED;
4041     }
4042 
4043     auto ret = -1;
4044     if (userController_) {
4045         ret = userController_->StopUser(userId);
4046         HILOG_DEBUG("ret = %{public}d", ret);
4047     }
4048     if (callback) {
4049         callback->OnStopUserDone(userId, ret);
4050     }
4051     return 0;
4052 }
4053 
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)4054 void AbilityManagerService::OnAcceptWantResponse(
4055     const AAFwk::Want &want, const std::string &flag)
4056 {
4057     HILOG_DEBUG("On accept want response");
4058     if (!currentMissionListManager_) {
4059         return;
4060     }
4061     currentMissionListManager_->OnAcceptWantResponse(want, flag);
4062 }
4063 
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)4064 void AbilityManagerService::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
4065 {
4066     HILOG_DEBUG("%{public}s called.", __func__);
4067     if (!currentMissionListManager_) {
4068         return;
4069     }
4070     currentMissionListManager_->OnStartSpecifiedAbilityTimeoutResponse(want);
4071 }
4072 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info)4073 int AbilityManagerService::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info)
4074 {
4075     HILOG_DEBUG("Get running ability infos.");
4076     auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyRunningInfoPerm();
4077     if (!currentMissionListManager_ || !connectManager_ || !dataAbilityManager_) {
4078         return ERR_INVALID_VALUE;
4079     }
4080 
4081     currentMissionListManager_->GetAbilityRunningInfos(info, isPerm);
4082     UpdateFocusState(info);
4083 
4084     return ERR_OK;
4085 }
4086 
UpdateFocusState(std::vector<AbilityRunningInfo> & info)4087 void AbilityManagerService::UpdateFocusState(std::vector<AbilityRunningInfo> &info)
4088 {
4089     if (info.empty()) {
4090         return;
4091     }
4092 
4093 #ifdef SUPPORT_GRAPHICS
4094     sptr<IRemoteObject> token;
4095     int ret = IN_PROCESS_CALL(GetTopAbility(token));
4096     if (ret != ERR_OK || token == nullptr) {
4097         return;
4098     }
4099 
4100     auto abilityRecord = Token::GetAbilityRecordByToken(token);
4101     if (abilityRecord == nullptr) {
4102         HILOG_WARN("%{public}s abilityRecord is null.", __func__);
4103         return;
4104     }
4105 
4106     for (auto &item : info) {
4107         if (item.uid == abilityRecord->GetUid() && item.pid == abilityRecord->GetPid() &&
4108             item.ability == abilityRecord->GetWant().GetElement()) {
4109             item.abilityState = static_cast<int>(AbilityState::ACTIVE);
4110             break;
4111         }
4112     }
4113 #endif
4114 }
4115 
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info)4116 int AbilityManagerService::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info)
4117 {
4118     HILOG_DEBUG("Get extension infos, upperLimit : %{public}d", upperLimit);
4119     auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyRunningInfoPerm();
4120     if (!connectManager_) {
4121         return ERR_INVALID_VALUE;
4122     }
4123 
4124     connectManager_->GetExtensionRunningInfos(upperLimit, info, GetUserId(), isPerm);
4125     return ERR_OK;
4126 }
4127 
GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> & info)4128 int AbilityManagerService::GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> &info)
4129 {
4130     return DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfos(info);
4131 }
4132 
GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> & info,int32_t userId)4133 int AbilityManagerService::GetProcessRunningInfosByUserId(
4134     std::vector<AppExecFwk::RunningProcessInfo> &info, int32_t userId)
4135 {
4136     return DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfosByUserId(info, userId);
4137 }
4138 
ClearUserData(int32_t userId)4139 void AbilityManagerService::ClearUserData(int32_t userId)
4140 {
4141     HILOG_DEBUG("%{public}s", __func__);
4142     std::unique_lock<std::shared_mutex> lock(managersMutex_);
4143     missionListManagers_.erase(userId);
4144     connectManagers_.erase(userId);
4145     dataAbilityManagers_.erase(userId);
4146     pendingWantManagers_.erase(userId);
4147 }
4148 
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)4149 int AbilityManagerService::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
4150 {
4151     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4152     if (!isSaCall) {
4153         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4154         return 0;
4155     }
4156 
4157     if (!currentMissionListManager_) {
4158         HILOG_ERROR("snapshot: currentMissionListManager_ is nullptr.");
4159         return INNER_ERR;
4160     }
4161     currentMissionListManager_->RegisterSnapshotHandler(handler);
4162     HILOG_INFO("snapshot: AbilityManagerService register snapshot handler success.");
4163     return ERR_OK;
4164 }
4165 
GetMissionSnapshot(const std::string & deviceId,int32_t missionId,MissionSnapshot & missionSnapshot,bool isLowResolution)4166 int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, int32_t missionId,
4167     MissionSnapshot& missionSnapshot, bool isLowResolution)
4168 {
4169     if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
4170         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4171         return CHECK_PERMISSION_FAILED;
4172     }
4173 
4174     if (CheckIsRemote(deviceId)) {
4175         HILOG_INFO("get remote mission snapshot.");
4176         return GetRemoteMissionSnapshotInfo(deviceId, missionId, missionSnapshot);
4177     }
4178     HILOG_INFO("get local mission snapshot.");
4179     if (!currentMissionListManager_) {
4180         HILOG_ERROR("snapshot: currentMissionListManager_ is nullptr.");
4181         return INNER_ERR;
4182     }
4183     auto token = GetAbilityTokenByMissionId(missionId);
4184     bool result = currentMissionListManager_->GetMissionSnapshot(missionId, token, missionSnapshot, isLowResolution);
4185     if (!result) {
4186         return INNER_ERR;
4187     }
4188     return ERR_OK;
4189 }
4190 
UpdateMissionSnapShot(const sptr<IRemoteObject> & token)4191 void AbilityManagerService::UpdateMissionSnapShot(const sptr<IRemoteObject>& token)
4192 {
4193     CHECK_POINTER_LOG(currentMissionListManager_, "Current mission manager not init.");
4194     auto abilityRecord = Token::GetAbilityRecordByToken(token);
4195     if (abilityRecord && !JudgeSelfCalled(abilityRecord)) {
4196         return;
4197     }
4198     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4199     if (!isSaCall) {
4200         auto bms = GetBundleManager();
4201         CHECK_POINTER_IS_NULLPTR(bms);
4202         AppExecFwk::ApplicationInfo appInfo;
4203         if (!IN_PROCESS_CALL(bms->GetApplicationInfo(BUNDLE_NAME_LAUNCHER,
4204             AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, GetUserId(), appInfo))) {
4205             HILOG_ERROR("Not found GetApplicationInfo according to the bundle name.");
4206             return;
4207         }
4208         auto tokenId = IPCSkeleton::GetCallingTokenID();
4209         if (tokenId != appInfo.accessTokenId) {
4210             HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4211             return;
4212         }
4213     }
4214     currentMissionListManager_->UpdateSnapShot(token);
4215 }
4216 
EnableRecoverAbility(const sptr<IRemoteObject> & token)4217 void AbilityManagerService::EnableRecoverAbility(const sptr<IRemoteObject>& token)
4218 {
4219     if (token == nullptr) {
4220         return;
4221     }
4222     auto record = Token::GetAbilityRecordByToken(token);
4223     if (record == nullptr) {
4224         HILOG_ERROR("%{public}s AppRecovery::failed find abilityRecord by given token.", __func__);
4225         return;
4226     }
4227 
4228     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
4229     auto tokenID = record->GetApplicationInfo().accessTokenId;
4230     if (callingTokenId != tokenID) {
4231         HILOG_ERROR("AppRecovery ScheduleRecoverAbility not self, not enabled");
4232         return;
4233     }
4234 
4235     auto it = appRecoveryHistory_.find(record->GetUid());
4236     if (it == appRecoveryHistory_.end()) {
4237         appRecoveryHistory_.emplace(record->GetUid(), 0);
4238     }
4239 }
4240 
RecoverAbilityRestart(const Want & want)4241 void AbilityManagerService::RecoverAbilityRestart(const Want& want)
4242 {
4243     std::string identity = IPCSkeleton::ResetCallingIdentity();
4244     int32_t userId = GetValidUserId(DEFAULT_INVAL_VALUE);
4245     int32_t ret = StartAbility(want, userId, 0);
4246     if (ret != ERR_OK) {
4247         HILOG_ERROR("%{public}s AppRecovery::failed to restart ability.  %{public}d", __func__, ret);
4248     }
4249     IPCSkeleton::SetCallingIdentity(identity);
4250 }
4251 
ScheduleRecoverAbility(const sptr<IRemoteObject> & token,int32_t reason)4252 void AbilityManagerService::ScheduleRecoverAbility(const sptr<IRemoteObject>& token, int32_t reason)
4253 {
4254     if (token == nullptr) {
4255         return;
4256     }
4257     auto record = Token::GetAbilityRecordByToken(token);
4258     if (record == nullptr) {
4259         HILOG_ERROR("%{public}s AppRecovery::failed find abilityRecord by given token.", __func__);
4260         return;
4261     }
4262 
4263     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
4264     auto tokenID = record->GetApplicationInfo().accessTokenId;
4265     if (callingTokenId != tokenID) {
4266         HILOG_ERROR("AppRecovery ScheduleRecoverAbility not self, not enabled");
4267         return;
4268     }
4269 
4270     AAFwk::Want want;
4271     {
4272         std::lock_guard<std::recursive_mutex> guard(globalLock_);
4273         auto type = record->GetAbilityInfo().type;
4274         if (type != AppExecFwk::AbilityType::PAGE) {
4275             HILOG_ERROR("%{public}s AppRecovery::only do recover for page ability.", __func__);
4276             return;
4277         }
4278 
4279         constexpr int64_t MIN_RECOVERY_TIME = 60;
4280         int64_t now = time(nullptr);
4281         auto it = appRecoveryHistory_.find(record->GetUid());
4282         if ((it != appRecoveryHistory_.end()) &&
4283             (it->second + MIN_RECOVERY_TIME > now)) {
4284             HILOG_ERROR("%{public}s AppRecovery recover app more than once in one minute, just kill app(%{public}d).",
4285                 __func__, record->GetPid());
4286             kill(record->GetPid(), SIGKILL);
4287             return;
4288         }
4289 
4290         auto appInfo = record->GetApplicationInfo();
4291         auto abilityInfo = record->GetAbilityInfo();
4292         appRecoveryHistory_[record->GetUid()] = now;
4293         want = record->GetWant();
4294         want.SetParam(AAFwk::Want::PARAM_ABILITY_RECOVERY_RESTART, true);
4295 
4296         HiSysEvent::Write(HiSysEvent::Domain::AAFWK, "APP_RECOVERY", HiSysEvent::EventType::BEHAVIOR,
4297             "APP_UID", record->GetUid(),
4298             "VERSION_CODE", std::to_string(appInfo.versionCode),
4299             "VERSION_NAME", appInfo.versionName,
4300             "BUNDLE_NAME", appInfo.bundleName,
4301             "ABILITY_NAME", abilityInfo.name);
4302         kill(record->GetPid(), SIGKILL);
4303     }
4304 
4305     constexpr int delaytime = 2000;
4306     std::string taskName = "AppRecovery_kill:" + std::to_string(record->GetPid());
4307     auto task = std::bind(&AbilityManagerService::RecoverAbilityRestart, this, want);
4308     handler_->PostTask(task, taskName, delaytime);
4309 }
4310 
GetRemoteMissionSnapshotInfo(const std::string & deviceId,int32_t missionId,MissionSnapshot & missionSnapshot)4311 int32_t AbilityManagerService::GetRemoteMissionSnapshotInfo(const std::string& deviceId, int32_t missionId,
4312     MissionSnapshot& missionSnapshot)
4313 {
4314     HILOG_INFO("GetRemoteMissionSnapshotInfo begin");
4315     std::unique_ptr<MissionSnapshot> missionSnapshotPtr = std::make_unique<MissionSnapshot>();
4316     DistributedClient dmsClient;
4317     int result = dmsClient.GetRemoteMissionSnapshotInfo(deviceId, missionId, missionSnapshotPtr);
4318     if (result != ERR_OK) {
4319         HILOG_ERROR("GetRemoteMissionSnapshotInfo failed, result = %{public}d", result);
4320         return result;
4321     }
4322     missionSnapshot = *missionSnapshotPtr;
4323     return ERR_OK;
4324 }
4325 
StartFreezingScreen()4326 void AbilityManagerService::StartFreezingScreen()
4327 {
4328     HILOG_INFO("%{public}s", __func__);
4329 #ifdef SUPPORT_GRAPHICS
4330     std::vector<Rosen::DisplayId> displayIds = Rosen::DisplayManager::GetInstance().GetAllDisplayIds();
4331     IN_PROCESS_CALL_WITHOUT_RET(Rosen::DisplayManager::GetInstance().Freeze(displayIds));
4332 #endif
4333 }
4334 
StopFreezingScreen()4335 void AbilityManagerService::StopFreezingScreen()
4336 {
4337     HILOG_INFO("%{public}s", __func__);
4338 #ifdef SUPPORT_GRAPHICS
4339     std::vector<Rosen::DisplayId> displayIds = Rosen::DisplayManager::GetInstance().GetAllDisplayIds();
4340     IN_PROCESS_CALL_WITHOUT_RET(Rosen::DisplayManager::GetInstance().Unfreeze(displayIds));
4341 #endif
4342 }
4343 
UserStarted(int32_t userId)4344 void AbilityManagerService::UserStarted(int32_t userId)
4345 {
4346     HILOG_INFO("%{public}s", __func__);
4347     InitConnectManager(userId, false);
4348     InitMissionListManager(userId, false);
4349     InitDataAbilityManager(userId, false);
4350     InitPendWantManager(userId, false);
4351 }
4352 
SwitchToUser(int32_t oldUserId,int32_t userId)4353 void AbilityManagerService::SwitchToUser(int32_t oldUserId, int32_t userId)
4354 {
4355     HILOG_INFO("%{public}s, oldUserId:%{public}d, newUserId:%{public}d", __func__, oldUserId, userId);
4356     SwitchManagers(userId);
4357     PauseOldUser(oldUserId);
4358     bool isBoot = false;
4359     if (oldUserId == U0_USER_ID) {
4360         isBoot = true;
4361     }
4362     ConnectBmsService();
4363     StartUserApps(userId, isBoot);
4364     PauseOldConnectManager(oldUserId);
4365 }
4366 
SwitchManagers(int32_t userId,bool switchUser)4367 void AbilityManagerService::SwitchManagers(int32_t userId, bool switchUser)
4368 {
4369     HILOG_INFO("%{public}s, SwitchManagers:%{public}d-----begin", __func__, userId);
4370     InitConnectManager(userId, switchUser);
4371     if (userId != U0_USER_ID) {
4372         InitMissionListManager(userId, switchUser);
4373     }
4374     InitDataAbilityManager(userId, switchUser);
4375     InitPendWantManager(userId, switchUser);
4376     HILOG_INFO("%{public}s, SwitchManagers:%{public}d-----end", __func__, userId);
4377 }
4378 
PauseOldUser(int32_t userId)4379 void AbilityManagerService::PauseOldUser(int32_t userId)
4380 {
4381     HILOG_INFO("%{public}s, PauseOldUser:%{public}d-----begin", __func__, userId);
4382     PauseOldMissionListManager(userId);
4383     HILOG_INFO("%{public}s, PauseOldUser:%{public}d-----end", __func__, userId);
4384 }
4385 
PauseOldMissionListManager(int32_t userId)4386 void AbilityManagerService::PauseOldMissionListManager(int32_t userId)
4387 {
4388     HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----begin", __func__, userId);
4389     std::shared_lock<std::shared_mutex> lock(managersMutex_);
4390     auto it = missionListManagers_.find(userId);
4391     if (it == missionListManagers_.end()) {
4392         HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end1", __func__, userId);
4393         return;
4394     }
4395     auto manager = it->second;
4396     if (!manager) {
4397         HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end2", __func__, userId);
4398         return;
4399     }
4400     manager->PauseManager();
4401     HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end", __func__, userId);
4402 }
4403 
PauseOldConnectManager(int32_t userId)4404 void AbilityManagerService::PauseOldConnectManager(int32_t userId)
4405 {
4406     HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----begin", __func__, userId);
4407     if (userId == U0_USER_ID) {
4408         HILOG_INFO("%{public}s, u0 not stop, id:%{public}d-----nullptr", __func__, userId);
4409         return;
4410     }
4411 
4412     std::shared_lock<std::shared_mutex> lock(managersMutex_);
4413     auto it = connectManagers_.find(userId);
4414     if (it == connectManagers_.end()) {
4415         HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----no user", __func__, userId);
4416         return;
4417     }
4418     auto manager = it->second;
4419     if (!manager) {
4420         HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----nullptr", __func__, userId);
4421         return;
4422     }
4423     manager->StopAllExtensions();
4424     HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----end", __func__, userId);
4425 }
4426 
StartUserApps(int32_t userId,bool isBoot)4427 void AbilityManagerService::StartUserApps(int32_t userId, bool isBoot)
4428 {
4429     HILOG_INFO("StartUserApps, userId:%{public}d, currentUserId:%{public}d", userId, GetUserId());
4430     if (currentMissionListManager_ && currentMissionListManager_->IsStarted()) {
4431         HILOG_INFO("missionListManager ResumeManager");
4432         currentMissionListManager_->ResumeManager();
4433     }
4434     StartHighestPriorityAbility(userId, isBoot);
4435 }
4436 
InitConnectManager(int32_t userId,bool switchUser)4437 void AbilityManagerService::InitConnectManager(int32_t userId, bool switchUser)
4438 {
4439     bool find = false;
4440     {
4441         std::shared_lock<std::shared_mutex> lock(managersMutex_);
4442         auto it = connectManagers_.find(userId);
4443         find = (it != connectManagers_.end());
4444         if (find) {
4445             if (switchUser) {
4446                 connectManager_ = it->second;
4447             }
4448         }
4449     }
4450     if (!find) {
4451         auto manager = std::make_shared<AbilityConnectManager>(userId);
4452         manager->SetEventHandler(handler_);
4453         std::unique_lock<std::shared_mutex> lock(managersMutex_);
4454         connectManagers_.emplace(userId, manager);
4455         if (switchUser) {
4456             connectManager_ = manager;
4457         }
4458     }
4459 }
4460 
InitDataAbilityManager(int32_t userId,bool switchUser)4461 void AbilityManagerService::InitDataAbilityManager(int32_t userId, bool switchUser)
4462 {
4463     bool find = false;
4464     {
4465         std::shared_lock<std::shared_mutex> lock(managersMutex_);
4466         auto it = dataAbilityManagers_.find(userId);
4467         find = (it != dataAbilityManagers_.end());
4468         if (find) {
4469             if (switchUser) {
4470                 dataAbilityManager_ = it->second;
4471             }
4472         }
4473     }
4474     if (!find) {
4475         auto manager = std::make_shared<DataAbilityManager>();
4476         std::unique_lock<std::shared_mutex> lock(managersMutex_);
4477         dataAbilityManagers_.emplace(userId, manager);
4478         if (switchUser) {
4479             dataAbilityManager_ = manager;
4480         }
4481     }
4482 }
4483 
InitPendWantManager(int32_t userId,bool switchUser)4484 void AbilityManagerService::InitPendWantManager(int32_t userId, bool switchUser)
4485 {
4486     bool find = false;
4487     {
4488         std::shared_lock<std::shared_mutex> lock(managersMutex_);
4489         auto it = pendingWantManagers_.find(userId);
4490         find = (it != pendingWantManagers_.end());
4491         if (find) {
4492             if (switchUser) {
4493                 pendingWantManager_ = it->second;
4494             }
4495         }
4496     }
4497     if (!find) {
4498         auto manager = std::make_shared<PendingWantManager>();
4499         std::unique_lock<std::shared_mutex> lock(managersMutex_);
4500         pendingWantManagers_.emplace(userId, manager);
4501         if (switchUser) {
4502             pendingWantManager_ = manager;
4503         }
4504     }
4505 }
4506 
GetValidUserId(const int32_t userId)4507 int32_t AbilityManagerService::GetValidUserId(const int32_t userId)
4508 {
4509     HILOG_DEBUG("%{public}s, userId = %{public}d.", __func__, userId);
4510     int32_t validUserId = userId;
4511 
4512     if (DEFAULT_INVAL_VALUE == userId) {
4513         validUserId = IPCSkeleton::GetCallingUid() / BASE_USER_RANGE;
4514         HILOG_INFO("%{public}s, validUserId = %{public}d, CallingUid = %{public}d.", __func__, validUserId,
4515             IPCSkeleton::GetCallingUid());
4516         if (validUserId == U0_USER_ID) {
4517             validUserId = GetUserId();
4518         }
4519     }
4520     return validUserId;
4521 }
4522 
SetAbilityController(const sptr<IAbilityController> & abilityController,bool imAStabilityTest)4523 int AbilityManagerService::SetAbilityController(const sptr<IAbilityController> &abilityController,
4524     bool imAStabilityTest)
4525 {
4526     HILOG_DEBUG("%{public}s, imAStabilityTest: %{public}d", __func__, imAStabilityTest);
4527     auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyControllerPerm();
4528     if (!isPerm) {
4529         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4530         return CHECK_PERMISSION_FAILED;
4531     }
4532 
4533     std::lock_guard<std::recursive_mutex> guard(globalLock_);
4534     abilityController_ = abilityController;
4535     controllerIsAStabilityTest_ = imAStabilityTest;
4536     HILOG_DEBUG("%{public}s, end", __func__);
4537     return ERR_OK;
4538 }
4539 
SendANRProcessID(int pid)4540 int AbilityManagerService::SendANRProcessID(int pid)
4541 {
4542     HILOG_INFO("SendANRProcessID come, pid is %{public}d", pid);
4543     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4544     auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
4545     if (!isSaCall && !isShellCall) {
4546         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
4547         return CHECK_PERMISSION_FAILED;
4548     }
4549 
4550     AppExecFwk::ApplicationInfo appInfo;
4551     bool debug;
4552     auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
4553     if (appScheduler->GetApplicationInfoByProcessID(pid, appInfo, debug) == ERR_OK) {
4554         auto it = appRecoveryHistory_.find(appInfo.uid);
4555         if (it != appRecoveryHistory_.end()) {
4556             return ERR_OK;
4557         }
4558     }
4559 
4560     if (debug) {
4561         HILOG_ERROR("SendANRProcessID error, debug mode.");
4562         return ERR_INVALID_VALUE;
4563     }
4564 
4565     if (amsConfigResolver_->GetAnrHandleType() == 1) {
4566         HILOG_INFO("no need kill app, return.");
4567         return ERR_OK;
4568     }
4569 
4570     auto timeoutTask = [bundleName = appInfo.bundleName]() {
4571         DelayedSingleton<AppScheduler>::GetInstance()->KillApplication(bundleName);
4572     };
4573 
4574     handler_->PostTask(timeoutTask, "TIME_OUT_TASK", KILL_APP_TIME);
4575     return ERR_OK;
4576 }
4577 
IsRunningInStabilityTest()4578 bool AbilityManagerService::IsRunningInStabilityTest()
4579 {
4580     std::lock_guard<std::recursive_mutex> guard(globalLock_);
4581     bool ret = abilityController_ != nullptr && controllerIsAStabilityTest_;
4582     HILOG_DEBUG("%{public}s, IsRunningInStabilityTest: %{public}d", __func__, ret);
4583     return ret;
4584 }
4585 
IsAbilityControllerStart(const Want & want,const std::string & bundleName)4586 bool AbilityManagerService::IsAbilityControllerStart(const Want &want, const std::string &bundleName)
4587 {
4588     HILOG_DEBUG("method call, controllerIsAStabilityTest_: %{public}d", controllerIsAStabilityTest_);
4589     if (abilityController_ == nullptr) {
4590         HILOG_DEBUG("abilityController_ is nullptr");
4591         return true;
4592     }
4593 
4594     if (controllerIsAStabilityTest_) {
4595         bool isStart = abilityController_->AllowAbilityStart(want, bundleName);
4596         if (!isStart) {
4597             HILOG_INFO("Not finishing start ability because controller starting: %{public}s", bundleName.c_str());
4598             return false;
4599         }
4600     }
4601     return true;
4602 }
4603 
IsAbilityControllerForeground(const std::string & bundleName)4604 bool AbilityManagerService::IsAbilityControllerForeground(const std::string &bundleName)
4605 {
4606     HILOG_DEBUG("method call, controllerIsAStabilityTest_: %{public}d", controllerIsAStabilityTest_);
4607     if (abilityController_ == nullptr) {
4608         HILOG_DEBUG("abilityController_ is nullptr");
4609         return true;
4610     }
4611 
4612     if (controllerIsAStabilityTest_) {
4613         bool isResume = abilityController_->AllowAbilityBackground(bundleName);
4614         if (!isResume) {
4615             HILOG_INFO("Not finishing terminate ability because controller resuming: %{public}s", bundleName.c_str());
4616             return false;
4617         }
4618     }
4619     return true;
4620 }
4621 
InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo & extensionInfo,AppExecFwk::AbilityInfo & abilityInfo)4622 int32_t AbilityManagerService::InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo,
4623     AppExecFwk::AbilityInfo &abilityInfo)
4624 {
4625     abilityInfo.applicationName = extensionInfo.applicationInfo.name;
4626     abilityInfo.applicationInfo = extensionInfo.applicationInfo;
4627     abilityInfo.bundleName = extensionInfo.bundleName;
4628     abilityInfo.package = extensionInfo.moduleName;
4629     abilityInfo.moduleName = extensionInfo.moduleName;
4630     abilityInfo.name = extensionInfo.name;
4631     abilityInfo.srcEntrance = extensionInfo.srcEntrance;
4632     abilityInfo.srcPath = extensionInfo.srcEntrance;
4633     abilityInfo.iconPath = extensionInfo.icon;
4634     abilityInfo.iconId = extensionInfo.iconId;
4635     abilityInfo.label = extensionInfo.label;
4636     abilityInfo.labelId = extensionInfo.labelId;
4637     abilityInfo.description = extensionInfo.description;
4638     abilityInfo.descriptionId = extensionInfo.descriptionId;
4639     abilityInfo.priority = extensionInfo.priority;
4640     abilityInfo.permissions = extensionInfo.permissions;
4641     abilityInfo.readPermission = extensionInfo.readPermission;
4642     abilityInfo.writePermission = extensionInfo.writePermission;
4643     abilityInfo.uri = extensionInfo.uri;
4644     abilityInfo.extensionAbilityType = extensionInfo.type;
4645     abilityInfo.visible = extensionInfo.visible;
4646     abilityInfo.resourcePath = extensionInfo.resourcePath;
4647     abilityInfo.enabled = extensionInfo.enabled;
4648     abilityInfo.isModuleJson = true;
4649     abilityInfo.isStageBasedModel = true;
4650     abilityInfo.process = extensionInfo.process;
4651     abilityInfo.metadata = extensionInfo.metadata;
4652     abilityInfo.compileMode = extensionInfo.compileMode;
4653     abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
4654     if (!extensionInfo.hapPath.empty()) {
4655         abilityInfo.hapPath = extensionInfo.hapPath;
4656     }
4657     return 0;
4658 }
4659 
StartUserTest(const Want & want,const sptr<IRemoteObject> & observer)4660 int AbilityManagerService::StartUserTest(const Want &want, const sptr<IRemoteObject> &observer)
4661 {
4662     HILOG_DEBUG("enter");
4663     if (observer == nullptr) {
4664         HILOG_ERROR("observer is nullptr");
4665         return ERR_INVALID_VALUE;
4666     }
4667 
4668     std::string bundleName = want.GetStringParam("-b");
4669     if (bundleName.empty()) {
4670         HILOG_ERROR("Invalid bundle name");
4671         return ERR_INVALID_VALUE;
4672     }
4673 
4674     auto bms = GetBundleManager();
4675     CHECK_POINTER_AND_RETURN(bms, START_USER_TEST_FAIL);
4676     AppExecFwk::BundleInfo bundleInfo;
4677     if (!IN_PROCESS_CALL(
4678         bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, U0_USER_ID))) {
4679         HILOG_ERROR("Failed to get bundle info by U0_USER_ID %{public}d.", U0_USER_ID);
4680         int32_t userId = GetUserId();
4681         if (!IN_PROCESS_CALL(
4682             bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId))) {
4683             HILOG_ERROR("Failed to get bundle info by userId %{public}d.", userId);
4684             return GET_BUNDLE_INFO_FAILED;
4685         }
4686     }
4687 
4688     return DelayedSingleton<AppScheduler>::GetInstance()->StartUserTest(want, observer, bundleInfo, GetUserId());
4689 }
4690 
FinishUserTest(const std::string & msg,const int64_t & resultCode,const std::string & bundleName)4691 int AbilityManagerService::FinishUserTest(
4692     const std::string &msg, const int64_t &resultCode, const std::string &bundleName)
4693 {
4694     HILOG_DEBUG("enter");
4695     if (bundleName.empty()) {
4696         HILOG_ERROR("Invalid bundle name.");
4697         return ERR_INVALID_VALUE;
4698     }
4699 
4700     return DelayedSingleton<AppScheduler>::GetInstance()->FinishUserTest(msg, resultCode, bundleName);
4701 }
4702 
GetTopAbility(sptr<IRemoteObject> & token)4703 int AbilityManagerService::GetTopAbility(sptr<IRemoteObject> &token)
4704 {
4705     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4706     if (!isSaCall) {
4707         HILOG_ERROR("Permission verification failed");
4708         return CHECK_PERMISSION_FAILED;
4709     }
4710 #ifdef SUPPORT_GRAPHICS
4711     if (!wmsHandler_) {
4712         HILOG_ERROR("wmsHandler_ is nullptr.");
4713         return ERR_INVALID_VALUE;
4714     }
4715     wmsHandler_->GetFocusWindow(token);
4716 
4717     if (!token) {
4718         HILOG_ERROR("token is nullptr");
4719         return ERR_INVALID_VALUE;
4720     }
4721 #endif
4722     return ERR_OK;
4723 }
4724 
DelegatorDoAbilityForeground(const sptr<IRemoteObject> & token)4725 int AbilityManagerService::DelegatorDoAbilityForeground(const sptr<IRemoteObject> &token)
4726 {
4727     HILOG_DEBUG("enter");
4728     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
4729 
4730     auto missionId = GetMissionIdByAbilityToken(token);
4731     if (missionId < 0) {
4732         HILOG_ERROR("Invalid mission id.");
4733         return ERR_INVALID_VALUE;
4734     }
4735 
4736     NotifyHandleAbilityStateChange(token, ABILITY_MOVE_TO_FOREGROUND_CODE);
4737     return DelegatorMoveMissionToFront(missionId);
4738 }
4739 
DelegatorDoAbilityBackground(const sptr<IRemoteObject> & token)4740 int AbilityManagerService::DelegatorDoAbilityBackground(const sptr<IRemoteObject> &token)
4741 {
4742     HILOG_DEBUG("enter");
4743     NotifyHandleAbilityStateChange(token, ABILITY_MOVE_TO_BACKGROUND_CODE);
4744     return MinimizeAbility(token, true);
4745 }
4746 
DoAbilityForeground(const sptr<IRemoteObject> & token,uint32_t flag)4747 int AbilityManagerService::DoAbilityForeground(const sptr<IRemoteObject> &token, uint32_t flag)
4748 {
4749     HILOG_DEBUG("DoAbilityForeground, sceneFlag:%{public}u", flag);
4750     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
4751     if (!VerificationToken(token) && !VerificationAllToken(token)) {
4752         HILOG_ERROR("%{public}s token error.", __func__);
4753         return ERR_INVALID_VALUE;
4754     }
4755 
4756     std::lock_guard<std::recursive_mutex> guard(globalLock_);
4757     auto abilityRecord = Token::GetAbilityRecordByToken(token);
4758     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4759     if (!JudgeSelfCalled(abilityRecord)) {
4760         return CHECK_PERMISSION_FAILED;
4761     }
4762     int result = JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
4763     if (result != ERR_OK) {
4764         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
4765         return result;
4766     }
4767 
4768     auto type = abilityRecord->GetAbilityInfo().type;
4769     if (type != AppExecFwk::AbilityType::PAGE) {
4770         HILOG_ERROR("Cannot minimize except page ability.");
4771         return ERR_WRONG_INTERFACE_CALL;
4772     }
4773 
4774     if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
4775         HILOG_ERROR("IsAbilityControllerForeground false.");
4776         return ERR_WOULD_BLOCK;
4777     }
4778 
4779     if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
4780         HILOG_DEBUG("pending state is FOREGROUND.");
4781         abilityRecord->SetPendingState(AbilityState::FOREGROUND);
4782         return ERR_OK;
4783     } else {
4784         HILOG_DEBUG("pending state is not FOREGROUND.");
4785         abilityRecord->SetPendingState(AbilityState::FOREGROUND);
4786     }
4787     abilityRecord->ProcessForegroundAbility(flag);
4788     return ERR_OK;
4789 }
4790 
DoAbilityBackground(const sptr<IRemoteObject> & token,uint32_t flag)4791 int AbilityManagerService::DoAbilityBackground(const sptr<IRemoteObject> &token, uint32_t flag)
4792 {
4793     HILOG_DEBUG("DoAbilityBackground, sceneFlag:%{public}u", flag);
4794     CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
4795 
4796     auto abilityRecord = Token::GetAbilityRecordByToken(token);
4797     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4798 
4799     abilityRecord->lifeCycleStateInfo_.sceneFlag = flag;
4800     int ret = MinimizeAbility(token);
4801     abilityRecord->lifeCycleStateInfo_.sceneFlag = SCENE_FLAG_NORMAL;
4802     return ret;
4803 }
4804 
DelegatorMoveMissionToFront(int32_t missionId)4805 int AbilityManagerService::DelegatorMoveMissionToFront(int32_t missionId)
4806 {
4807     HILOG_INFO("enter missionId : %{public}d", missionId);
4808     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
4809 
4810     if (!IsAbilityControllerStartById(missionId)) {
4811         HILOG_ERROR("IsAbilityControllerStart false");
4812         return ERR_WOULD_BLOCK;
4813     }
4814 
4815     return currentMissionListManager_->MoveMissionToFront(missionId);
4816 }
4817 
UpdateCallerInfo(Want & want)4818 void AbilityManagerService::UpdateCallerInfo(Want& want)
4819 {
4820     int32_t tokenId = (int32_t)IPCSkeleton::GetCallingTokenID();
4821     int32_t callerUid = IPCSkeleton::GetCallingUid();
4822     int32_t callerPid = IPCSkeleton::GetCallingPid();
4823     want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
4824     want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
4825     want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
4826 }
4827 
JudgeMultiUserConcurrency(const int32_t userId)4828 bool AbilityManagerService::JudgeMultiUserConcurrency(const int32_t userId)
4829 {
4830     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4831 
4832     if (userId == U0_USER_ID) {
4833         HILOG_DEBUG("%{public}s, userId is 0.", __func__);
4834         return true;
4835     }
4836 
4837     HILOG_DEBUG("userId : %{public}d, current userId : %{public}d", userId, GetUserId());
4838 
4839     // Only non-concurrent mode is supported
4840     bool concurrencyMode = CONCURRENCY_MODE_FALSE;
4841     if (!concurrencyMode) {
4842         return (userId == GetUserId());
4843     }
4844 
4845     return true;
4846 }
4847 
4848 #ifdef ABILITY_COMMAND_FOR_TEST
ForceTimeoutForTest(const std::string & abilityName,const std::string & state)4849 int AbilityManagerService::ForceTimeoutForTest(const std::string &abilityName, const std::string &state)
4850 {
4851     if (abilityName.empty()) {
4852         HILOG_ERROR("abilityName is empty.");
4853         return INVALID_DATA;
4854     }
4855     if (abilityName == "clean") {
4856         timeoutMap_.clear();
4857         return ERR_OK;
4858     }
4859     if (state != AbilityRecord::ConvertAbilityState(AbilityState::INITIAL) &&
4860         state != AbilityRecord::ConvertAbilityState(AbilityState::INACTIVE) &&
4861         state != AbilityRecord::ConvertAbilityState(AbilityState::FOREGROUND) &&
4862         state != AbilityRecord::ConvertAbilityState(AbilityState::BACKGROUND) &&
4863         state != AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING) &&
4864         state != std::string("COMMAND")) {
4865         HILOG_ERROR("lifecycle state is invalid.");
4866         return INVALID_DATA;
4867     }
4868     timeoutMap_.insert(std::make_pair(state, abilityName));
4869     return ERR_OK;
4870 }
4871 #endif
4872 
CheckStaticCfgPermission(AppExecFwk::AbilityInfo & abilityInfo)4873 int AbilityManagerService::CheckStaticCfgPermission(AppExecFwk::AbilityInfo &abilityInfo)
4874 {
4875     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4876     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4877     if (isSaCall) {
4878         // do not need check static config permission when start ability by SA
4879         return AppExecFwk::Constants::PERMISSION_GRANTED;
4880     }
4881 
4882     auto tokenId = IPCSkeleton::GetCallingTokenID();
4883     if (abilityInfo.applicationInfo.accessTokenId == tokenId) {
4884         return ERR_OK;
4885     }
4886 
4887     if ((abilityInfo.type == AppExecFwk::AbilityType::EXTENSION &&
4888         abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::DATASHARE) ||
4889         (abilityInfo.type == AppExecFwk::AbilityType::DATA)) {
4890         // just need check the read permission and write permission of extension ability or data ability
4891         if (!abilityInfo.readPermission.empty()) {
4892             int checkReadPermission = AccessTokenKit::VerifyAccessToken(tokenId, abilityInfo.readPermission);
4893             if (checkReadPermission == ERR_OK) {
4894                 return AppExecFwk::Constants::PERMISSION_GRANTED;
4895             }
4896             HILOG_WARN("verify access token fail, read permission: %{public}s", abilityInfo.readPermission.c_str());
4897         }
4898         if (!abilityInfo.writePermission.empty()) {
4899             int checkWritePermission = AccessTokenKit::VerifyAccessToken(tokenId, abilityInfo.writePermission);
4900             if (checkWritePermission == ERR_OK) {
4901                 return AppExecFwk::Constants::PERMISSION_GRANTED;
4902             }
4903             HILOG_WARN("verify access token fail, write permission: %{public}s", abilityInfo.writePermission.c_str());
4904         }
4905 
4906         if (!abilityInfo.readPermission.empty() || !abilityInfo.writePermission.empty()) {
4907             // 'readPermission' and 'writePermission' take precedence over 'permission'
4908             // when 'readPermission' or 'writePermission' is not empty, no need check 'permission'
4909             return AppExecFwk::Constants::PERMISSION_NOT_GRANTED;
4910         }
4911     }
4912 
4913     // verify permission if 'permission' is not empty
4914     if (abilityInfo.permissions.empty() || AccessTokenKit::VerifyAccessToken(tokenId,
4915         PermissionConstants::PERMISSION_START_INVISIBLE_ABILITY) == ERR_OK) {
4916         return AppExecFwk::Constants::PERMISSION_GRANTED;
4917     }
4918 
4919     for (auto permission : abilityInfo.permissions) {
4920         if (AccessTokenKit::VerifyAccessToken(tokenId, permission)
4921             != AppExecFwk::Constants::PERMISSION_GRANTED) {
4922             HILOG_ERROR("verify access token fail, permission: %{public}s", permission.c_str());
4923             return AppExecFwk::Constants::PERMISSION_NOT_GRANTED;
4924         }
4925     }
4926 
4927     return AppExecFwk::Constants::PERMISSION_GRANTED;
4928 }
4929 
IsNeedTimeoutForTest(const std::string & abilityName,const std::string & state) const4930 bool AbilityManagerService::IsNeedTimeoutForTest(const std::string &abilityName, const std::string &state) const
4931 {
4932     for (auto iter = timeoutMap_.begin(); iter != timeoutMap_.end(); iter++) {
4933         if (iter->first == state && iter->second == abilityName) {
4934             return true;
4935         }
4936     }
4937     return false;
4938 }
4939 
GetValidDataAbilityUri(const std::string & abilityInfoUri,std::string & adjustUri)4940 bool AbilityManagerService::GetValidDataAbilityUri(const std::string &abilityInfoUri, std::string &adjustUri)
4941 {
4942     // note: do not use abilityInfo.uri directly, need check uri first.
4943     size_t firstSeparator = abilityInfoUri.find_first_of('/');
4944     size_t lastSeparator = abilityInfoUri.find_last_of('/');
4945     if (lastSeparator - firstSeparator != 1) {
4946         HILOG_ERROR("ability info uri error, uri: %{public}s", abilityInfoUri.c_str());
4947         return false;
4948     }
4949 
4950     adjustUri = abilityInfoUri;
4951     adjustUri.insert(lastSeparator, "/");
4952     return true;
4953 }
4954 
GetDataAbilityUri(const std::vector<AppExecFwk::AbilityInfo> & abilityInfos,const std::string & mainAbility,std::string & uri)4955 bool AbilityManagerService::GetDataAbilityUri(const std::vector<AppExecFwk::AbilityInfo> &abilityInfos,
4956     const std::string &mainAbility, std::string &uri)
4957 {
4958     if (abilityInfos.empty() || mainAbility.empty()) {
4959         HILOG_ERROR("abilityInfos or mainAbility is empty. mainAbility: %{public}s", mainAbility.c_str());
4960         return false;
4961     }
4962 
4963     std::string dataAbilityUri;
4964     for (auto abilityInfo : abilityInfos) {
4965         if (abilityInfo.type == AppExecFwk::AbilityType::DATA &&
4966             abilityInfo.name == mainAbility) {
4967             dataAbilityUri = abilityInfo.uri;
4968             HILOG_INFO("get data ability uri: %{public}s", dataAbilityUri.c_str());
4969             break;
4970         }
4971     }
4972 
4973     return GetValidDataAbilityUri(dataAbilityUri, uri);
4974 }
4975 
GetAbilityRunningInfo(std::vector<AbilityRunningInfo> & info,std::shared_ptr<AbilityRecord> & abilityRecord)4976 void AbilityManagerService::GetAbilityRunningInfo(std::vector<AbilityRunningInfo> &info,
4977     std::shared_ptr<AbilityRecord> &abilityRecord)
4978 {
4979     AbilityRunningInfo runningInfo;
4980     AppExecFwk::RunningProcessInfo processInfo;
4981 
4982     runningInfo.ability = abilityRecord->GetWant().GetElement();
4983     runningInfo.startTime = abilityRecord->GetStartTime();
4984     runningInfo.abilityState = static_cast<int>(abilityRecord->GetAbilityState());
4985 
4986     DelayedSingleton<AppScheduler>::GetInstance()->
4987         GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
4988     runningInfo.pid = processInfo.pid_;
4989     runningInfo.uid = processInfo.uid_;
4990     runningInfo.processName = processInfo.processName_;
4991     info.emplace_back(runningInfo);
4992 }
4993 
VerifyAccountPermission(int32_t userId)4994 int AbilityManagerService::VerifyAccountPermission(int32_t userId)
4995 {
4996     if ((userId < 0) || (userController_ && (userController_->GetCurrentUserId() == userId))) {
4997         return ERR_OK;
4998     }
4999     return AAFwk::PermissionVerification::GetInstance()->VerifyAccountPermission();
5000 }
5001 
5002 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAmsService()5003 int AbilityManagerService::BlockAmsService()
5004 {
5005     HILOG_DEBUG("%{public}s", __func__);
5006     if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5007         HILOG_ERROR("Not shell call");
5008         return ERR_PERMISSION_DENIED;
5009     }
5010     if (handler_) {
5011         HILOG_DEBUG("%{public}s begin post block ams service task", __func__);
5012         auto BlockAmsServiceTask = [aams = shared_from_this()]() {
5013             while (1) {
5014                 HILOG_DEBUG("%{public}s begin waiting", __func__);
5015                 std::this_thread::sleep_for(BLOCK_AMS_SERVICE_TIME*1s);
5016             }
5017         };
5018         handler_->PostTask(BlockAmsServiceTask, "blockamsservice");
5019         return ERR_OK;
5020     }
5021     return ERR_NO_INIT;
5022 }
5023 
BlockAbility(int32_t abilityRecordId)5024 int AbilityManagerService::BlockAbility(int32_t abilityRecordId)
5025 {
5026     HILOG_DEBUG("%{public}s", __func__);
5027     if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5028         HILOG_ERROR("Not shell call");
5029         return ERR_PERMISSION_DENIED;
5030     }
5031     CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
5032     return currentMissionListManager_->BlockAbility(abilityRecordId);
5033 }
5034 
BlockAppService()5035 int AbilityManagerService::BlockAppService()
5036 {
5037     HILOG_DEBUG("%{public}s", __func__);
5038     if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5039         HILOG_ERROR("Not shell call");
5040         return ERR_PERMISSION_DENIED;
5041     }
5042     return DelayedSingleton<AppScheduler>::GetInstance()->BlockAppService();
5043 }
5044 #endif
5045 
FreeInstallAbilityFromRemote(const Want & want,const sptr<IRemoteObject> & callback,int32_t userId,int requestCode)5046 int AbilityManagerService::FreeInstallAbilityFromRemote(const Want &want, const sptr<IRemoteObject> &callback,
5047     int32_t userId, int requestCode)
5048 {
5049     auto callingUid = IPCSkeleton::GetCallingUid();
5050     if (callingUid != DMS_UID) {
5051         HILOG_ERROR("The interface only support for DMS");
5052         return CHECK_PERMISSION_FAILED;
5053     }
5054     int32_t validUserId = GetValidUserId(userId);
5055     if (freeInstallManager_ == nullptr) {
5056         HILOG_ERROR("freeInstallManager_ is nullptr");
5057         return ERR_INVALID_VALUE;
5058     }
5059     return freeInstallManager_->FreeInstallAbilityFromRemote(want, callback, validUserId, requestCode);
5060 }
5061 
GetTopAbility()5062 AppExecFwk::ElementName AbilityManagerService::GetTopAbility()
5063 {
5064     HILOG_DEBUG("%{public}s start.", __func__);
5065     AppExecFwk::ElementName elementName = {};
5066 #ifdef SUPPORT_GRAPHICS
5067     sptr<IRemoteObject> token;
5068     int ret = IN_PROCESS_CALL(GetTopAbility(token));
5069     if (ret) {
5070         return elementName;
5071     }
5072     if (!token) {
5073         HILOG_ERROR("token is nullptr");
5074         return elementName;
5075     }
5076     auto abilityRecord = Token::GetAbilityRecordByToken(token);
5077     if (abilityRecord == nullptr) {
5078         HILOG_ERROR("%{public}s abilityRecord is null.", __func__);
5079         return elementName;
5080     }
5081     elementName = abilityRecord->GetWant().GetElement();
5082     bool isDeviceEmpty = elementName.GetDeviceID().empty();
5083     std::string localDeviceId;
5084     bool hasLocalDeviceId = GetLocalDeviceId(localDeviceId);
5085     if (isDeviceEmpty && hasLocalDeviceId) {
5086         elementName.SetDeviceID(localDeviceId);
5087     }
5088 #endif
5089     return elementName;
5090 }
5091 
Dump(int fd,const std::vector<std::u16string> & args)5092 int AbilityManagerService::Dump(int fd, const std::vector<std::u16string>& args)
5093 {
5094     HILOG_DEBUG("Dump begin fd: %{public}d", fd);
5095     std::string result;
5096     auto errCode = Dump(args, result);
5097     int ret = dprintf(fd, "%s\n", result.c_str());
5098     if (ret < 0) {
5099         HILOG_ERROR("dprintf error");
5100         return ERR_AAFWK_HIDUMP_ERROR;
5101     }
5102     HILOG_DEBUG("Dump end");
5103     return errCode;
5104 }
5105 
Dump(const std::vector<std::u16string> & args,std::string & result)5106 int AbilityManagerService::Dump(const std::vector<std::u16string>& args, std::string& result)
5107 {
5108     ErrCode errCode = ERR_OK;
5109     auto size = args.size();
5110     if (size == 0) {
5111         ShowHelp(result);
5112         return errCode;
5113     }
5114 
5115     std::vector<std::string> argsStr;
5116     for (auto arg : args) {
5117         argsStr.emplace_back(Str16ToStr8(arg));
5118     }
5119 
5120     if (argsStr[0] == "-h") {
5121         ShowHelp(result);
5122     } else {
5123         errCode = ProcessMultiParam(argsStr, result);
5124         if (errCode == ERR_AAFWK_HIDUMP_INVALID_ARGS) {
5125             ShowIllegalInfomation(result);
5126         }
5127     }
5128     return errCode;
5129 }
5130 
ProcessMultiParam(std::vector<std::string> & argsStr,std::string & result)5131 ErrCode AbilityManagerService::ProcessMultiParam(std::vector<std::string>& argsStr, std::string& result)
5132 {
5133     HILOG_DEBUG("%{public}s begin", __func__);
5134     bool isClient = false;
5135     bool isUser = false;
5136     int userID = DEFAULT_INVAL_VALUE;
5137     std::vector<std::string>::iterator it;
5138     for (it = argsStr.begin(); it != argsStr.end();) {
5139         if (*it == ARGS_CLIENT) {
5140             isClient = true;
5141             it = argsStr.erase(it);
5142             continue;
5143         }
5144         if (*it == ARGS_USER_ID) {
5145             it = argsStr.erase(it);
5146             if (it == argsStr.end()) {
5147                 HILOG_ERROR("ARGS_USER_ID id invalid");
5148                 return ERR_AAFWK_HIDUMP_INVALID_ARGS;
5149             }
5150             (void)StrToInt(*it, userID);
5151             if (userID < 0) {
5152                 HILOG_ERROR("ARGS_USER_ID id invalid");
5153                 return ERR_AAFWK_HIDUMP_INVALID_ARGS;
5154             }
5155             isUser = true;
5156             it = argsStr.erase(it);
5157             continue;
5158         }
5159         it++;
5160     }
5161     std::string cmd;
5162     for (unsigned int i = 0; i < argsStr.size(); i++) {
5163         cmd.append(argsStr[i]);
5164         if (i != argsStr.size() - 1) {
5165             cmd.append(" ");
5166         }
5167     }
5168     HILOG_INFO("%{public}s, isClient:%{public}d, userID is : %{public}d, cmd is : %{public}s",
5169         __func__, isClient, userID, cmd.c_str());
5170 
5171     std::vector<std::string> dumpResults;
5172     DumpSysState(cmd, dumpResults, isClient, isUser, userID);
5173     for (auto it : dumpResults) {
5174         result += it + "\n";
5175     }
5176     return ERR_OK;
5177 }
5178 
ShowHelp(std::string & result)5179 void AbilityManagerService::ShowHelp(std::string& result)
5180 {
5181     result.append("Usage:\n")
5182         .append("-h                          ")
5183         .append("help text for the tool\n")
5184         .append("-a [-c | -u {UserId}]       ")
5185         .append("dump all ability infomation in the system or all ability infomation of client/UserId\n")
5186         .append("-l                          ")
5187         .append("dump all mission list information in the system\n")
5188         .append("-i {AbilityRecordId}        ")
5189         .append("dump an ability infomation by ability record id\n")
5190         .append("-e                          ")
5191         .append("dump all extension infomation in the system(FA: ServiceAbilityRecords, Stage: ExtensionRecords)\n")
5192         .append("-p [PendingWantRecordId]    ")
5193         .append("dump all pendingwant record infomation in the system\n")
5194         .append("-r                          ")
5195         .append("dump all process in the system\n")
5196         .append("-d                          ")
5197         .append("dump all data ability infomation in the system");
5198 }
5199 
ShowIllegalInfomation(std::string & result)5200 void AbilityManagerService::ShowIllegalInfomation(std::string& result)
5201 {
5202     result.append(ILLEGAL_INFOMATION);
5203 }
5204 
DumpAbilityInfoDone(std::vector<std::string> & infos,const sptr<IRemoteObject> & callerToken)5205 int AbilityManagerService::DumpAbilityInfoDone(std::vector<std::string> &infos, const sptr<IRemoteObject> &callerToken)
5206 {
5207     HILOG_DEBUG("DumpAbilityInfoDone begin");
5208     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
5209     if (abilityRecord == nullptr) {
5210         HILOG_ERROR("abilityRecord nullptr");
5211         return ERR_INVALID_VALUE;
5212     }
5213     if (!JudgeSelfCalled(abilityRecord)) {
5214         return CHECK_PERMISSION_FAILED;
5215     }
5216     abilityRecord->DumpAbilityInfoDone(infos);
5217     return ERR_OK;
5218 }
5219 
5220 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)5221 int AbilityManagerService::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
5222 {
5223     HILOG_DEBUG("%{public}s", __func__);
5224     auto abilityRecord = Token::GetAbilityRecordByToken(token);
5225     if (!abilityRecord) {
5226         HILOG_ERROR("no such ability record");
5227         return -1;
5228     }
5229 
5230     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
5231     auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
5232     if (callingTokenId != tokenID) {
5233         HILOG_ERROR("SetMissionLabel not self, not enabled");
5234         return -1;
5235     }
5236 
5237     auto userId = abilityRecord->GetOwnerMissionUserId();
5238     auto missionListManager = GetListManagerByUserId(userId);
5239     if (!missionListManager) {
5240         HILOG_ERROR("failed to find mission list manager when set mission label.");
5241         return -1;
5242     }
5243 
5244     return missionListManager->SetMissionLabel(token, label);
5245 }
5246 
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<OHOS::Media::PixelMap> & icon)5247 int AbilityManagerService::SetMissionIcon(const sptr<IRemoteObject> &token,
5248     const std::shared_ptr<OHOS::Media::PixelMap> &icon)
5249 {
5250     HILOG_DEBUG("%{public}s", __func__);
5251     auto abilityRecord = Token::GetAbilityRecordByToken(token);
5252     if (!abilityRecord) {
5253         HILOG_ERROR("no such ability record");
5254         return -1;
5255     }
5256 
5257     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
5258     auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
5259     if (callingTokenId != tokenID) {
5260         HILOG_ERROR("not self, not enable to set mission icon");
5261         return -1;
5262     }
5263 
5264     auto userId = abilityRecord->GetOwnerMissionUserId();
5265     auto missionListManager = GetListManagerByUserId(userId);
5266     if (!missionListManager) {
5267         HILOG_ERROR("failed to find mission list manager.");
5268         return -1;
5269     }
5270 
5271     return missionListManager->SetMissionIcon(token, icon);
5272 }
5273 
RegisterWindowManagerServiceHandler(const sptr<IWindowManagerServiceHandler> & handler)5274 int AbilityManagerService::RegisterWindowManagerServiceHandler(const sptr<IWindowManagerServiceHandler> &handler)
5275 {
5276     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
5277     auto isGatewayCall = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
5278     if (!isSaCall && !isGatewayCall) {
5279         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
5280         return CHECK_PERMISSION_FAILED;
5281     }
5282     wmsHandler_ = handler;
5283     HILOG_DEBUG("%{public}s: WMS handler registered successfully.", __func__);
5284     return ERR_OK;
5285 }
5286 
GetWMSHandler() const5287 sptr<IWindowManagerServiceHandler> AbilityManagerService::GetWMSHandler() const
5288 {
5289     return wmsHandler_;
5290 }
5291 
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & abilityToken)5292 void AbilityManagerService::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &abilityToken)
5293 {
5294     HILOG_DEBUG("%{public}s is called.", __func__);
5295     std::shared_lock<std::shared_mutex> lock(managersMutex_);
5296     for (auto& item : missionListManagers_) {
5297         if (item.second) {
5298             item.second->CompleteFirstFrameDrawing(abilityToken);
5299         }
5300     }
5301 }
5302 
ShowPickerDialog(const Want & want,int32_t userId,const sptr<IRemoteObject> & callerToken)5303 int32_t AbilityManagerService::ShowPickerDialog(
5304     const Want& want, int32_t userId, const sptr<IRemoteObject> &callerToken)
5305 {
5306     AAFwk::Want newWant = want;
5307     constexpr char PICKER_DIALOG_ABILITY_BUNDLE_NAME[] = "com.ohos.sharepickerdialog";
5308     constexpr char PICKER_DIALOG_ABILITY_NAME[] = "PickerDialog";
5309     constexpr char TOKEN_KEY[] = "ohos.ability.params.token";
5310     newWant.SetElementName(PICKER_DIALOG_ABILITY_BUNDLE_NAME, PICKER_DIALOG_ABILITY_NAME);
5311     newWant.SetParam(TOKEN_KEY, callerToken);
5312     // note: clear actions
5313     newWant.SetAction("");
5314     return IN_PROCESS_CALL(StartAbility(newWant, DEFAULT_INVAL_VALUE, userId));
5315 }
5316 #endif
5317 
CheckWindowMode(int32_t windowMode,const std::vector<AppExecFwk::SupportWindowMode> & windowModes) const5318 bool AbilityManagerService::CheckWindowMode(int32_t windowMode,
5319     const std::vector<AppExecFwk::SupportWindowMode>& windowModes) const
5320 {
5321     HILOG_INFO("Window mode is %{public}d.", windowMode);
5322     if (windowMode == AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED) {
5323         return true;
5324     }
5325     auto it = windowModeMap.find(windowMode);
5326     if (it != windowModeMap.end()) {
5327         auto bmsWindowMode = it->second;
5328         for (auto mode : windowModes) {
5329             if (mode == bmsWindowMode) {
5330                 return true;
5331             }
5332         }
5333     }
5334     return false;
5335 }
5336 
CheckCallServicePermission(const AbilityRequest & abilityRequest)5337 int AbilityManagerService::CheckCallServicePermission(const AbilityRequest &abilityRequest)
5338 {
5339     if (!IsUseNewStartUpRule(abilityRequest)) {
5340         return CheckCallerPermissionOldRule(abilityRequest);
5341     }
5342 
5343     if (abilityRequest.abilityInfo.isStageBasedModel) {
5344         auto extensionType = abilityRequest.abilityInfo.extensionAbilityType;
5345         HILOG_INFO("extensionType is %{public}d.", static_cast<int>(extensionType));
5346         if (extensionType == AppExecFwk::ExtensionAbilityType::SERVICE ||
5347             extensionType == AppExecFwk::ExtensionAbilityType::DATASHARE) {
5348             return CheckCallServiceExtensionPermission(abilityRequest);
5349         } else {
5350             return CheckCallOtherExtensionPermission(abilityRequest);
5351         }
5352     } else {
5353         return CheckCallServiceAbilityPermission(abilityRequest);
5354     }
5355 }
5356 
CheckCallDataAbilityPermission(AbilityRequest & abilityRequest)5357 int AbilityManagerService::CheckCallDataAbilityPermission(AbilityRequest &abilityRequest)
5358 {
5359     HILOG_INFO("%{public}s begin", __func__);
5360     abilityRequest.appInfo = abilityRequest.abilityInfo.applicationInfo;
5361     abilityRequest.uid = abilityRequest.appInfo.uid;
5362     if (abilityRequest.appInfo.name.empty() || abilityRequest.appInfo.bundleName.empty()) {
5363         HILOG_ERROR("Invalid app info for data ability acquiring.");
5364         return ERR_INVALID_VALUE;
5365     }
5366     if (abilityRequest.abilityInfo.type != AppExecFwk::AbilityType::DATA) {
5367         HILOG_ERROR("BMS query result is not a data ability.");
5368         return ERR_WRONG_INTERFACE_CALL;
5369     }
5370 
5371     if (!IsUseNewStartUpRule(abilityRequest)) {
5372         return CheckCallerPermissionOldRule(abilityRequest);
5373     }
5374 
5375     AAFwk::PermissionVerification::VerificationInfo verificationInfo = CreateVerificationInfo(abilityRequest);
5376     if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
5377         return ERR_INVALID_VALUE;
5378     }
5379     int result = AAFwk::PermissionVerification::GetInstance()->CheckCallDataAbilityPermission(verificationInfo);
5380     if (result != ERR_OK) {
5381         HILOG_ERROR("Do not have permission to start DataAbility");
5382         return result;
5383     }
5384 
5385     return ERR_OK;
5386 }
5387 
CreateVerificationInfo(const AbilityRequest & abilityRequest)5388 AAFwk::PermissionVerification::VerificationInfo AbilityManagerService::CreateVerificationInfo(
5389     const AbilityRequest &abilityRequest)
5390 {
5391     AAFwk::PermissionVerification::VerificationInfo verificationInfo;
5392     verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
5393     verificationInfo.visible = abilityRequest.abilityInfo.visible;
5394     HILOG_DEBUG("Call ServiceAbility or DataAbility, target bundleName: %{public}s.",
5395         abilityRequest.appInfo.bundleName.c_str());
5396     if (whiteListassociatedWakeUpFlag_ &&
5397         WHITE_LIST_ASS_WAKEUP_SET.find(abilityRequest.appInfo.bundleName) != WHITE_LIST_ASS_WAKEUP_SET.end()) {
5398         HILOG_DEBUG("Call ServiceAbility or DataAbility, target bundle in white-list, allow associatedWakeUp.");
5399         verificationInfo.associatedWakeUp = true;
5400     } else {
5401         verificationInfo.associatedWakeUp = abilityRequest.appInfo.associatedWakeUp;
5402     }
5403     if (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
5404         AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5405         HILOG_INFO("Caller is not an application.");
5406         return verificationInfo;
5407     }
5408     std::shared_ptr<AbilityRecord> callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
5409     if (callerAbility) {
5410         verificationInfo.apiTargetVersion = callerAbility->GetApplicationInfo().apiTargetVersion;
5411     }
5412 
5413     return verificationInfo;
5414 }
5415 
CheckCallServiceExtensionPermission(const AbilityRequest & abilityRequest)5416 int AbilityManagerService::CheckCallServiceExtensionPermission(const AbilityRequest &abilityRequest)
5417 {
5418     HILOG_INFO("CheckCallServiceExtensionPermission begin");
5419     if (!IsUseNewStartUpRule(abilityRequest)) {
5420         return CheckCallerPermissionOldRule(abilityRequest);
5421     }
5422 
5423     AAFwk::PermissionVerification::VerificationInfo verificationInfo;
5424     verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
5425     verificationInfo.visible = abilityRequest.abilityInfo.visible;
5426     if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
5427         return ERR_INVALID_VALUE;
5428     }
5429 
5430     int result = AAFwk::PermissionVerification::GetInstance()->CheckCallServiceExtensionPermission(verificationInfo);
5431     if (result != ERR_OK) {
5432         HILOG_ERROR("Do not have permission to start ServiceExtension or DataShareExtension");
5433     }
5434     return result;
5435 }
5436 
CheckCallOtherExtensionPermission(const AbilityRequest & abilityRequest)5437 int AbilityManagerService::CheckCallOtherExtensionPermission(const AbilityRequest &abilityRequest)
5438 {
5439     HILOG_INFO("CheckCallOtherExtensionPermission begin");
5440     if (!IsUseNewStartUpRule(abilityRequest)) {
5441         return CheckCallerPermissionOldRule(abilityRequest);
5442     }
5443 
5444     if (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
5445         AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
5446         return ERR_OK;
5447     }
5448 
5449     auto extensionType = abilityRequest.abilityInfo.extensionAbilityType;
5450     HILOG_DEBUG("OtherExtension type: %{public}d.", static_cast<int32_t>(extensionType));
5451     if (extensionType == AppExecFwk::ExtensionAbilityType::WINDOW) {
5452         return ERR_OK;
5453     }
5454     const std::string fileAccessPermission = "ohos.permission.FILE_ACCESS_MANAGER";
5455     if (extensionType == AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION &&
5456         AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(fileAccessPermission)) {
5457         HILOG_DEBUG("Temporary, FILEACCESS_EXTENSION use serviceExtension start-up rule.");
5458         return CheckCallServiceExtensionPermission(abilityRequest);
5459     }
5460 
5461     HILOG_ERROR("CheckCallOtherExtensionPermission, Not SA, can not start other Extension");
5462     return CHECK_PERMISSION_FAILED;
5463 }
5464 
5465 
CheckCallServiceAbilityPermission(const AbilityRequest & abilityRequest)5466 int AbilityManagerService::CheckCallServiceAbilityPermission(const AbilityRequest &abilityRequest)
5467 {
5468     HILOG_INFO("%{public}s begin", __func__);
5469     if (!IsUseNewStartUpRule(abilityRequest)) {
5470         return CheckCallerPermissionOldRule(abilityRequest);
5471     }
5472 
5473     AAFwk::PermissionVerification::VerificationInfo verificationInfo = CreateVerificationInfo(abilityRequest);
5474     if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
5475         return ERR_INVALID_VALUE;
5476     }
5477 
5478     int result = AAFwk::PermissionVerification::GetInstance()->CheckCallServiceAbilityPermission(verificationInfo);
5479     if (result != ERR_OK) {
5480         HILOG_ERROR("Do not have permission to start ServiceAbility");
5481     }
5482     return result;
5483 }
5484 
CheckCallAbilityPermission(const AbilityRequest & abilityRequest)5485 int AbilityManagerService::CheckCallAbilityPermission(const AbilityRequest &abilityRequest)
5486 {
5487     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
5488     HILOG_INFO("%{public}s begin", __func__);
5489     if (!IsUseNewStartUpRule(abilityRequest)) {
5490         return CheckCallerPermissionOldRule(abilityRequest);
5491     }
5492 
5493     AAFwk::PermissionVerification::VerificationInfo verificationInfo;
5494     verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
5495     verificationInfo.visible = abilityRequest.abilityInfo.visible;
5496     if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
5497         return ERR_INVALID_VALUE;
5498     }
5499 
5500     int result = AAFwk::PermissionVerification::GetInstance()->CheckCallAbilityPermission(verificationInfo);
5501     if (result != ERR_OK) {
5502         HILOG_ERROR("Do not have permission to start PageAbility(FA) or Ability(Stage)");
5503     }
5504     return result;
5505 }
5506 
CheckStartByCallPermission(const AbilityRequest & abilityRequest)5507 int AbilityManagerService::CheckStartByCallPermission(const AbilityRequest &abilityRequest)
5508 {
5509     HILOG_INFO("%{public}s begin", __func__);
5510     // check whether the target ability is singleton mode and page type.
5511     if (abilityRequest.abilityInfo.type == AppExecFwk::AbilityType::PAGE &&
5512         abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SINGLETON) {
5513         HILOG_DEBUG("Called ability is common ability and singleton.");
5514     } else {
5515         HILOG_ERROR("Called ability is not common ability or singleton.");
5516         return RESOLVE_CALL_ABILITY_TYPE_ERR;
5517     }
5518 
5519     if (!IsUseNewStartUpRule(abilityRequest)) {
5520         return CheckCallerPermissionOldRule(abilityRequest, true);
5521     }
5522 
5523     AAFwk::PermissionVerification::VerificationInfo verificationInfo;
5524     verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
5525     verificationInfo.visible = abilityRequest.abilityInfo.visible;
5526     if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
5527         return ERR_INVALID_VALUE;
5528     }
5529 
5530     if (AAFwk::PermissionVerification::GetInstance()->CheckStartByCallPermission(verificationInfo) != ERR_OK) {
5531         HILOG_ERROR("Do not have permission to StartAbilityByCall.");
5532         return RESOLVE_CALL_NO_PERMISSIONS;
5533     }
5534     HILOG_DEBUG("The caller has permission to resolve the call proxy of common ability.");
5535 
5536     return ERR_OK;
5537 }
5538 
IsCallFromBackground(const AbilityRequest & abilityRequest,bool & isBackgroundCall)5539 int AbilityManagerService::IsCallFromBackground(const AbilityRequest &abilityRequest, bool &isBackgroundCall)
5540 {
5541     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
5542     if (AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
5543         return ERR_OK;
5544     }
5545 
5546     if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5547         isBackgroundCall = true;
5548         return ERR_OK;
5549     }
5550 
5551     if (AbilityUtil::IsStartFreeInstall(abilityRequest.want)) {
5552         isBackgroundCall = false;
5553         return ERR_OK;
5554     }
5555 
5556     AppExecFwk::RunningProcessInfo processInfo;
5557     std::shared_ptr<AbilityRecord> callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
5558     if (callerAbility) {
5559         DelayedSingleton<AppScheduler>::GetInstance()->
5560             GetRunningProcessInfoByToken(callerAbility->GetToken(), processInfo);
5561     } else {
5562         auto callerPid = IPCSkeleton::GetCallingPid();
5563         DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByPid(callerPid, processInfo);
5564         if (processInfo.processName_.empty() && !AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
5565             HILOG_DEBUG("Can not find caller application by callerPid: %{private}d.", callerPid);
5566             if (AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(
5567                 PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND)) {
5568                 HILOG_DEBUG("Caller has PERMISSION_START_ABILITIES_FROM_BACKGROUND, PASS.");
5569                 isBackgroundCall = false;
5570                 return ERR_OK;
5571             }
5572             HILOG_ERROR("Caller does not have PERMISSION_START_ABILITIES_FROM_BACKGROUND, REJECT.");
5573             return ERR_INVALID_VALUE;
5574         }
5575     }
5576 
5577     if (IsDelegatorCall(processInfo, abilityRequest)) {
5578         HILOG_DEBUG("The call is from AbilityDelegator, allow background-call.");
5579         isBackgroundCall = false;
5580         return ERR_OK;
5581     }
5582 
5583     if (backgroundJudgeFlag_) {
5584         isBackgroundCall = processInfo.state_ != AppExecFwk::AppProcessState::APP_STATE_FOREGROUND &&
5585             !processInfo.isFocused;
5586     } else {
5587         isBackgroundCall = !processInfo.isFocused;
5588         if (!processInfo.isFocused && processInfo.state_ == AppExecFwk::AppProcessState::APP_STATE_FOREGROUND) {
5589             // Allow background startup within 1 second after application startup if state is FOREGROUND
5590             int64_t aliveTime = AbilityUtil::SystemTimeMillis() - processInfo.startTimeMillis_;
5591             isBackgroundCall = aliveTime > APP_ALIVE_TIME_MS;
5592             HILOG_DEBUG("Process %{public}s is alive %{public}s ms.",
5593                 processInfo.processName_.c_str(), std::to_string(aliveTime).c_str());
5594         }
5595     }
5596     HILOG_DEBUG("backgroundJudgeFlag: %{public}d, isBackgroundCall: %{public}d, callerAppState: %{public}d.",
5597         static_cast<int32_t>(backgroundJudgeFlag_),
5598         static_cast<int32_t>(isBackgroundCall),
5599         static_cast<int32_t>(processInfo.state_));
5600 
5601     return ERR_OK;
5602 }
5603 
IsDelegatorCall(const AppExecFwk::RunningProcessInfo & processInfo,const AbilityRequest & abilityRequest)5604 inline bool AbilityManagerService::IsDelegatorCall(
5605     const AppExecFwk::RunningProcessInfo &processInfo, const AbilityRequest &abilityRequest)
5606 {
5607     /*  To make sure the AbilityDelegator is not counterfeited
5608      *   1. The caller-process must be test-process
5609      *   2. The callerToken must be nullptr
5610      */
5611     if (processInfo.isTestProcess &&
5612         !abilityRequest.callerToken && abilityRequest.want.GetBoolParam(IS_DELEGATOR_CALL, false)) {
5613         return true;
5614     }
5615     return false;
5616 }
5617 
CheckCallerPermissionOldRule(const AbilityRequest & abilityRequest,const bool isStartByCall)5618 int AbilityManagerService::CheckCallerPermissionOldRule(const AbilityRequest &abilityRequest, const bool isStartByCall)
5619 {
5620     if (IPCSkeleton::GetCallingTokenID() == abilityRequest.abilityInfo.applicationInfo.accessTokenId) {
5621         return ERR_OK;
5622     }
5623     if (isStartByCall) {
5624         auto abilityInfo = abilityRequest.abilityInfo;
5625         auto callerUid = abilityRequest.callerUid;
5626 
5627         if (!CheckCallerEligibility(abilityInfo, callerUid)) {
5628             HILOG_ERROR("called ability has no permission.");
5629             return RESOLVE_CALL_NO_PERMISSIONS;
5630         }
5631 
5632         HILOG_DEBUG("the caller has permission to resolve the call proxy of common ability.");
5633         // check whether the target ability is singleton mode and page type.
5634         if (abilityInfo.type == AppExecFwk::AbilityType::PAGE &&
5635             abilityInfo.launchMode == AppExecFwk::LaunchMode::SINGLETON) {
5636             HILOG_DEBUG("called ability is common ability and singleton.");
5637         } else {
5638             HILOG_ERROR("called ability is not common ability or singleton.");
5639             return RESOLVE_CALL_ABILITY_TYPE_ERR;
5640         }
5641         return ERR_OK;
5642     } else {
5643         return JudgeAbilityVisibleControl(abilityRequest.abilityInfo);
5644     }
5645 }
5646 
IsUseNewStartUpRule(const AbilityRequest & abilityRequest)5647 bool AbilityManagerService::IsUseNewStartUpRule(const AbilityRequest &abilityRequest)
5648 {
5649     if (!startUpNewRule_) {
5650         return false;
5651     }
5652 
5653     if (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
5654         AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5655         HILOG_INFO("Caller is not an application.");
5656         return true;
5657     }
5658 
5659     // TEMP, white list
5660     std::shared_ptr<AbilityRecord> callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
5661     if (callerAbility) {
5662         const std::string bundleName = callerAbility->GetApplicationInfo().bundleName;
5663         HILOG_DEBUG("IsUseNewStartUpRule, caller bundleName is %{public}s.", bundleName.c_str());
5664         if (newRuleExceptLauncherSystemUI_ &&
5665             (bundleName == BUNDLE_NAME_LAUNCHER || bundleName == BUNDLE_NAME_SYSTEMUI)) {
5666             return false;
5667         }
5668     }
5669     HILOG_INFO("Use new startup rule");
5670     return true;
5671 }
5672 
CheckNewRuleSwitchState(const std::string & param)5673 bool AbilityManagerService::CheckNewRuleSwitchState(const std::string &param)
5674 {
5675     char value[NEW_RULE_VALUE_SIZE] = "false";
5676     int retSysParam = GetParameter(param.c_str(), "false", value, NEW_RULE_VALUE_SIZE);
5677     HILOG_INFO("CheckNewRuleSwitchState, %{public}s value is %{public}s.", param.c_str(), value);
5678     if (retSysParam > 0 && !std::strcmp(value, "true")) {
5679         return true;
5680     }
5681     return false;
5682 }
5683 
GetStartUpNewRuleFlag() const5684 bool AbilityManagerService::GetStartUpNewRuleFlag() const
5685 {
5686     return startUpNewRule_;
5687 }
5688 
CallRequestDone(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & callStub)5689 void AbilityManagerService::CallRequestDone(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &callStub)
5690 {
5691     auto abilityRecord = Token::GetAbilityRecordByToken(token);
5692     CHECK_POINTER(abilityRecord);
5693     if (!JudgeSelfCalled(abilityRecord)) {
5694         return;
5695     }
5696     abilityRecord->CallRequestDone(callStub);
5697 }
5698 
AddStartControlParam(Want & want,const sptr<IRemoteObject> & callerToken)5699 int AbilityManagerService::AddStartControlParam(Want &want, const sptr<IRemoteObject> &callerToken)
5700 {
5701     if (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
5702         AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
5703         return ERR_OK;
5704     }
5705     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
5706     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
5707     int32_t apiVersion = abilityRecord->GetApplicationInfo().apiTargetVersion;
5708     want.SetParam(DMS_API_VERSION, apiVersion);
5709     bool isCallerBackground = true;
5710     AppExecFwk::RunningProcessInfo processInfo;
5711     DelayedSingleton<AppScheduler>::GetInstance()->
5712         GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
5713     if (backgroundJudgeFlag_) {
5714         isCallerBackground = processInfo.state_ != AppExecFwk::AppProcessState::APP_STATE_FOREGROUND;
5715     } else {
5716         isCallerBackground = !processInfo.isFocused;
5717     }
5718     want.SetParam(DMS_IS_CALLER_BACKGROUND, isCallerBackground);
5719     return ERR_OK;
5720 }
5721 
JudgeSelfCalled(const std::shared_ptr<AbilityRecord> & abilityRecord)5722 bool AbilityManagerService::JudgeSelfCalled(const std::shared_ptr<AbilityRecord> &abilityRecord)
5723 {
5724     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
5725     if (isSaCall) {
5726         return true;
5727     }
5728 
5729     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
5730     auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
5731     if (callingTokenId != tokenID && !AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
5732         HILOG_ERROR("Is not self, not enabled");
5733         return false;
5734     }
5735 
5736     return true;
5737 }
5738 
SetComponentInterception(const sptr<AppExecFwk::IComponentInterception> & componentInterception)5739 int AbilityManagerService::SetComponentInterception(
5740     const sptr<AppExecFwk::IComponentInterception> &componentInterception)
5741 {
5742     HILOG_DEBUG("%{public}s", __func__);
5743     auto isPerm = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
5744     if (!isPerm) {
5745         HILOG_ERROR("%{public}s: Permission verification failed", __func__);
5746         return CHECK_PERMISSION_FAILED;
5747     }
5748 
5749     std::lock_guard<std::recursive_mutex> guard(globalLock_);
5750     componentInterception_ = componentInterception;
5751     HILOG_DEBUG("%{public}s, end", __func__);
5752     return ERR_OK;
5753 }
5754 
IsComponentInterceptionStart(const Want & want,ComponentRequest & componentRequest,AbilityRequest & request)5755 bool AbilityManagerService::IsComponentInterceptionStart(const Want &want, ComponentRequest &componentRequest,
5756     AbilityRequest &request)
5757 {
5758     if (componentInterception_ != nullptr) {
5759         Want newWant = want;
5760         int32_t type = static_cast<int32_t>(request.abilityInfo.type);
5761         newWant.SetParam("abilityType", type);
5762         int32_t launchMode = static_cast<int32_t>(request.abilityInfo.launchMode);
5763         newWant.SetParam("launchMode", launchMode);
5764         int32_t callType = static_cast<int32_t>(request.callType);
5765         newWant.SetParam("callType", callType);
5766         if (callType == AbilityCallType::CALL_REQUEST_TYPE) {
5767             newWant.SetParam("abilityConnectionObj", request.connect->AsObject());
5768         }
5769 
5770         HILOG_DEBUG("%{public}s", __func__);
5771         sptr<Want> extraParam = new (std::nothrow) Want();
5772         bool isStart = componentInterception_->AllowComponentStart(newWant, componentRequest.callerToken,
5773             componentRequest.requestCode, componentRequest.componentStatus, extraParam);
5774         componentRequest.requestResult = extraParam->GetIntParam("requestResult", 0);
5775         UpdateAbilityRequestInfo(extraParam, request);
5776         if (!isStart) {
5777             HILOG_INFO("not finishing start component because interception, requestResult: %{public}d",
5778                 componentRequest.requestResult);
5779             return false;
5780         }
5781     }
5782     return true;
5783 }
5784 
CheckProxyComponent(const Want & want,const int result)5785 bool AbilityManagerService::CheckProxyComponent(const Want &want, const int result)
5786 {
5787     // do proxy component while the deviceId is not empty
5788     return ((!want.GetElement().GetDeviceID().empty()) || (result != ERR_OK));
5789 }
5790 
IsReleaseCallInterception(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element,int & result)5791 bool AbilityManagerService::IsReleaseCallInterception(const sptr<IAbilityConnection> &connect,
5792     const AppExecFwk::ElementName &element, int &result)
5793 {
5794     if  (componentInterception_ == nullptr) {
5795         return false;
5796     }
5797     HILOG_DEBUG("%{public}s", __func__);
5798     sptr<Want> extraParam = new (std::nothrow) Want();
5799     bool isInterception = componentInterception_->ReleaseCallInterception(connect->AsObject(), element, extraParam);
5800     result = extraParam->GetIntParam("requestResult", 0);
5801     return isInterception;
5802 }
5803 
NotifyHandleAbilityStateChange(const sptr<IRemoteObject> & abilityToken,int opCode)5804 void AbilityManagerService::NotifyHandleAbilityStateChange(const sptr<IRemoteObject> &abilityToken, int opCode)
5805 {
5806     if (componentInterception_ != nullptr) {
5807         componentInterception_->NotifyHandleAbilityStateChange(abilityToken, opCode);
5808     }
5809 }
5810 
initComponentRequest(const sptr<IRemoteObject> & callerToken,const int requestCode,const int componentStatus)5811 ComponentRequest AbilityManagerService::initComponentRequest(const sptr<IRemoteObject> &callerToken,
5812     const int requestCode, const int componentStatus)
5813 {
5814     ComponentRequest componentRequest;
5815     componentRequest.callerToken = callerToken;
5816     componentRequest.requestCode = requestCode;
5817     componentRequest.componentStatus = componentStatus;
5818     return componentRequest;
5819 }
5820 
UpdateAbilityRequestInfo(const sptr<Want> & want,AbilityRequest & request)5821 void AbilityManagerService::UpdateAbilityRequestInfo(const sptr<Want> &want, AbilityRequest &request)
5822 {
5823     if (want == nullptr) {
5824         return;
5825     }
5826     sptr<IRemoteObject> tempCallBack = want->GetRemoteObject(Want::PARAM_RESV_ABILITY_INFO_CALLBACK);
5827     if (tempCallBack == nullptr) {
5828         return;
5829     }
5830     int32_t procCode = want->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
5831     if (procCode != 0) {
5832         request.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
5833     }
5834     int32_t tokenCode = want->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
5835     if (tokenCode != 0) {
5836         request.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
5837     }
5838     request.abilityInfoCallback = tempCallBack;
5839 }
5840 
SendResultToAbilityByToken(const Want & want,const sptr<IRemoteObject> & abilityToken,int32_t requestCode,int32_t resultCode,int32_t userId)5841 int32_t AbilityManagerService::SendResultToAbilityByToken(const Want &want, const sptr<IRemoteObject> &abilityToken,
5842     int32_t requestCode, int32_t resultCode, int32_t userId)
5843 {
5844     HILOG_DEBUG("%{public}s, requestCode: %{public}d, resultCode: %{public}d", __func__, requestCode, resultCode);
5845     auto isGatewayCall = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
5846     if (!isGatewayCall) {
5847         HILOG_ERROR("%{public}s, Permission verification failed", __func__);
5848         return CHECK_PERMISSION_FAILED;
5849     }
5850     std::shared_ptr<AbilityRecord> abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
5851     if (abilityRecord == nullptr) {
5852         HILOG_ERROR("%{public}s, abilityRecord is null", __func__);
5853         return ERR_INVALID_VALUE;
5854     }
5855     abilityRecord->SetResult(std::make_shared<AbilityResult>(requestCode, resultCode, want));
5856     abilityRecord->SendResult();
5857     return ERR_OK;
5858 }
5859 
GetFocusAbility()5860 std::shared_ptr<AbilityRecord> AbilityManagerService::GetFocusAbility()
5861 {
5862 #ifdef SUPPORT_GRAPHICS
5863     sptr<IRemoteObject> token;
5864     if (!wmsHandler_) {
5865         HILOG_ERROR("wmsHandler_ is nullptr.");
5866         return nullptr;
5867     }
5868 
5869     wmsHandler_->GetFocusWindow(token);
5870     if (!token) {
5871         HILOG_ERROR("token is nullptr");
5872         return nullptr;
5873     }
5874 
5875     auto abilityRecord = Token::GetAbilityRecordByToken(token);
5876     if (!abilityRecord) {
5877         HILOG_ERROR("abilityRecord is nullptr.");
5878     }
5879     return abilityRecord;
5880 #endif
5881 
5882     return nullptr;
5883 }
5884 }  // namespace AAFwk
5885 }  // namespace OHOS
5886