1 /*
2 * Copyright (c) 2023 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
18 #include <atomic>
19 #include <chrono>
20 #include <csignal>
21 #include <cstdlib>
22 #include <fstream>
23 #include <functional>
24 #include <getopt.h>
25 #include <memory>
26 #include <mutex>
27 #include <nlohmann/json.hpp>
28 #include <string>
29 #include <thread>
30 #include <unistd.h>
31 #include <unordered_set>
32
33 #include "ability_info.h"
34 #include "ability_interceptor.h"
35 #include "ability_manager_errors.h"
36 #include "ability_util.h"
37 #include "accesstoken_kit.h"
38 #include "app_exit_reason_data_manager.h"
39 #include "application_util.h"
40 #include "bundle_mgr_client.h"
41 #include "connection_state_manager.h"
42 #include "distributed_client.h"
43 #include "dlp_utils.h"
44 #include "errors.h"
45 #include "hilog_wrapper.h"
46 #include "hisysevent.h"
47 #include "hitrace_meter.h"
48 #include "if_system_ability_manager.h"
49 #include "in_process_call_wrapper.h"
50 #include "ipc_skeleton.h"
51 #include "ipc_types.h"
52 #include "iservice_registry.h"
53 #include "itest_observer.h"
54 #include "mission_info.h"
55 #include "mission_info_mgr.h"
56 #include "mock_session_manager_service.h"
57 #include "os_account_manager_wrapper.h"
58 #include "parameters.h"
59 #include "permission_constants.h"
60 #include "recovery_param.h"
61 #include "sa_mgr_client.h"
62 #include "scene_board_judgement.h"
63 #include "session_info.h"
64 #include "softbus_bus_center.h"
65 #include "start_ability_handler/start_ability_sandbox_savefile.h"
66 #include "start_options.h"
67 #include "string_ex.h"
68 #include "system_ability_definition.h"
69 #include "system_ability_token_callback.h"
70 #include "ui_extension_utils.h"
71 #include "uri_permission_manager_client.h"
72
73 #ifdef SUPPORT_GRAPHICS
74 #include "application_anr_listener.h"
75 #include "display_manager.h"
76 #include "input_manager.h"
77 #endif
78
79 #ifdef EFFICIENCY_MANAGER_ENABLE
80 #include "suspend_manager_client.h"
81 #endif // EFFICIENCY_MANAGER_ENABLE
82
83 #ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
84 #include "res_sched_client.h"
85 #include "res_type.h"
86 #endif // RESOURCE_SCHEDULE_SERVICE_ENABLE
87
88 using OHOS::AppExecFwk::ElementName;
89 using OHOS::Security::AccessToken::AccessTokenKit;
90
91 namespace OHOS {
92 namespace AAFwk {
93 namespace {
94 #define CHECK_CALLER_IS_SYSTEM_APP \
95 if (!AAFwk::PermissionVerification::GetInstance()->JudgeCallerIsAllowedToUseSystemAPI()) { \
96 HILOG_ERROR("The caller is not system-app, can not use system-api"); \
97 return ERR_NOT_SYSTEM_APP; \
98 }
99
100 const std::string ARGS_USER_ID = "-u";
101 const std::string ARGS_CLIENT = "-c";
102 const std::string ILLEGAL_INFOMATION = "The arguments are illegal and you can enter '-h' for help.";
103
104 constexpr int32_t NEW_RULE_VALUE_SIZE = 6;
105 constexpr int64_t APP_ALIVE_TIME_MS = 1000; // Allow background startup within 1 second after application startup
106 constexpr int32_t REGISTER_FOCUS_DELAY = 5000;
107 const std::string IS_DELEGATOR_CALL = "isDelegatorCall";
108 // Startup rule switch
109 const std::string COMPONENT_STARTUP_NEW_RULES = "component.startup.newRules";
110 const std::string NEW_RULES_EXCEPT_LAUNCHER_SYSTEMUI = "component.startup.newRules.except.LauncherSystemUI";
111 const std::string BACKGROUND_JUDGE_FLAG = "component.startup.backgroundJudge.flag";
112 const std::string WHITE_LIST_ASS_WAKEUP_FLAG = "component.startup.whitelist.associatedWakeUp";
113 // White list app
114 const std::string BUNDLE_NAME_LAUNCHER = "com.ohos.launcher";
115 const std::string BUNDLE_NAME_SETTINGSDATA = "com.ohos.settingsdata";
116 const std::string BUNDLE_NAME_SCENEBOARD = "com.ohos.sceneboard";
117 // Support prepare terminate
118 constexpr int32_t PREPARE_TERMINATE_ENABLE_SIZE = 6;
119 const char* PREPARE_TERMINATE_ENABLE_PARAMETER = "persist.sys.prepare_terminate";
120 const std::string DLP_BUNDLE_NAME = "com.ohos.dlpmanager";
121 // UIExtension type
122 const std::string UIEXTENSION_TYPE_KEY = "ability.want.params.uiExtensionType";
123 // Share picker params
124 constexpr char SHARE_PICKER_DIALOG_BUNDLE_NAME_KEY[] = "const.system.sharePicker.bundleName";
125 constexpr char SHARE_PICKER_DIALOG_ABILITY_NAME_KEY[] = "const.system.sharePicker.abilityName";
126 constexpr char SHARE_PICKER_DIALOG_DEFAULY_BUNDLE_NAME[] = "com.ohos.sharepickerdialog";
127 constexpr char SHARE_PICKER_DIALOG_DEFAULY_ABILITY_NAME[] = "PickerDialog";
128 constexpr char TOKEN_KEY[] = "ohos.ability.params.token";
129 // Broker params key
130 const std::string KEY_VISIBLE_ID = "ohos.anco.param.visible";
131
132 const std::unordered_set<std::string> WHITE_LIST_ASS_WAKEUP_SET = { BUNDLE_NAME_SETTINGSDATA };
133
134 std::atomic<bool> g_isDmsAlive = false;
135
CheckCallerIsDlpManager(const sptr<AppExecFwk::IBundleMgr> & bundleManager)136 bool CheckCallerIsDlpManager(const sptr<AppExecFwk::IBundleMgr> &bundleManager)
137 {
138 if (!bundleManager) {
139 return false;
140 }
141
142 std::string bundleName;
143 auto callerUid = IPCSkeleton::GetCallingUid();
144 if (IN_PROCESS_CALL(bundleManager->GetNameForUid(callerUid, bundleName)) != ERR_OK) {
145 HILOG_WARN("Get Bundle Name failed.");
146 return false;
147 }
148 if (bundleName != DLP_BUNDLE_NAME) {
149 HILOG_WARN("Wrong Caller.");
150 return false;
151 }
152 return true;
153 }
154 } // namespace
155
156 using namespace std::chrono;
157 using namespace std::chrono_literals;
158 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
159 using namespace BackgroundTaskMgr;
160 #endif
161 const bool CONCURRENCY_MODE_FALSE = false;
162 const int32_t MAIN_USER_ID = 100;
163 constexpr auto DATA_ABILITY_START_TIMEOUT = 5s;
164 constexpr int32_t NON_ANONYMIZE_LENGTH = 6;
165 constexpr uint32_t SCENE_FLAG_NORMAL = 0;
166 const int32_t MAX_NUMBER_OF_DISTRIBUTED_MISSIONS = 20;
167 const int32_t SWITCH_ACCOUNT_TRY = 3;
168 #ifdef ABILITY_COMMAND_FOR_TEST
169 const int32_t BLOCK_AMS_SERVICE_TIME = 65;
170 #endif
171 const std::string EMPTY_DEVICE_ID = "";
172 const int32_t APP_MEMORY_SIZE = 512;
173 const int32_t GET_PARAMETER_INCORRECT = -9;
174 const int32_t GET_PARAMETER_OTHER = -1;
175 const int32_t SIZE_10 = 10;
176 const int32_t ACCOUNT_MGR_SERVICE_UID = 3058;
177 const int32_t BROKER_UID = 5528;
178 const int32_t BROKER_RESERVE_UID = 5005;
179 const int32_t DMS_UID = 5522;
180 const int32_t PREPARE_TERMINATE_TIMEOUT_MULTIPLE = 10;
181 const std::string BUNDLE_NAME_KEY = "bundleName";
182 const std::string DM_PKG_NAME = "ohos.distributedhardware.devicemanager";
183 const std::string ACTION_CHOOSE = "ohos.want.action.select";
184 const std::string HIGHEST_PRIORITY_ABILITY_ENTITY = "flag.home.intent.from.system";
185 const std::string DMS_API_VERSION = "dmsApiVersion";
186 const std::string DMS_IS_CALLER_BACKGROUND = "dmsIsCallerBackGround";
187 const std::string DMS_PROCESS_NAME = "distributedsched";
188 const std::string DMS_MISSION_ID = "dmsMissionId";
189 const std::string DLP_INDEX = "ohos.dlp.params.index";
190 const std::string BOOTEVENT_APPFWK_READY = "bootevent.appfwk.ready";
191 const std::string BOOTEVENT_BOOT_COMPLETED = "bootevent.boot.completed";
192 const std::string BOOTEVENT_BOOT_ANIMATION_STARTED = "bootevent.bootanimation.started";
193 const std::string NEED_STARTINGWINDOW = "ohos.ability.NeedStartingWindow";
194 const std::string PERMISSIONMGR_BUNDLE_NAME = "com.ohos.permissionmanager";
195 const std::string PERMISSIONMGR_ABILITY_NAME = "com.ohos.permissionmanager.GrantAbility";
196 const int DEFAULT_DMS_MISSION_ID = -1;
197 const std::map<std::string, AbilityManagerService::DumpKey> AbilityManagerService::dumpMap = {
198 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--all", KEY_DUMP_ALL),
199 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-a", KEY_DUMP_ALL),
200 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--stack-list", KEY_DUMP_STACK_LIST),
201 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-l", KEY_DUMP_STACK_LIST),
202 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--stack", KEY_DUMP_STACK),
203 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-s", KEY_DUMP_STACK),
204 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission", KEY_DUMP_MISSION),
205 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-m", KEY_DUMP_MISSION),
206 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--top", KEY_DUMP_TOP_ABILITY),
207 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-t", KEY_DUMP_TOP_ABILITY),
208 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--waiting-queue", KEY_DUMP_WAIT_QUEUE),
209 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-w", KEY_DUMP_WAIT_QUEUE),
210 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--serv", KEY_DUMP_SERVICE),
211 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-e", KEY_DUMP_SERVICE),
212 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--data", KEY_DUMP_DATA),
213 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-d", KEY_DUMP_DATA),
214 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-focus", KEY_DUMP_FOCUS_ABILITY),
215 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-f", KEY_DUMP_FOCUS_ABILITY),
216 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--win-mode", KEY_DUMP_WINDOW_MODE),
217 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-z", KEY_DUMP_WINDOW_MODE),
218 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission-list", KEY_DUMP_MISSION_LIST),
219 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-L", KEY_DUMP_MISSION_LIST),
220 std::map<std::string, AbilityManagerService::DumpKey>::value_type("--mission-infos", KEY_DUMP_MISSION_INFOS),
221 std::map<std::string, AbilityManagerService::DumpKey>::value_type("-S", KEY_DUMP_MISSION_INFOS),
222 };
223
224 const std::map<std::string, AbilityManagerService::DumpsysKey> AbilityManagerService::dumpsysMap = {
225 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--all", KEY_DUMPSYS_ALL),
226 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-a", KEY_DUMPSYS_ALL),
227 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--mission-list", KEY_DUMPSYS_MISSION_LIST),
228 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-l", KEY_DUMPSYS_MISSION_LIST),
229 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--ability", KEY_DUMPSYS_ABILITY),
230 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-i", KEY_DUMPSYS_ABILITY),
231 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--extension", KEY_DUMPSYS_SERVICE),
232 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-e", KEY_DUMPSYS_SERVICE),
233 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--pending", KEY_DUMPSYS_PENDING),
234 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-p", KEY_DUMPSYS_PENDING),
235 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--process", KEY_DUMPSYS_PROCESS),
236 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-r", KEY_DUMPSYS_PROCESS),
237 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("--data", KEY_DUMPSYS_DATA),
238 std::map<std::string, AbilityManagerService::DumpsysKey>::value_type("-d", KEY_DUMPSYS_DATA),
239 };
240
241 const std::map<int32_t, AppExecFwk::SupportWindowMode> AbilityManagerService::windowModeMap = {
242 std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_FULLSCREEN,
243 AppExecFwk::SupportWindowMode::FULLSCREEN),
244 std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_PRIMARY,
245 AppExecFwk::SupportWindowMode::SPLIT),
246 std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_SECONDARY,
247 AppExecFwk::SupportWindowMode::SPLIT),
248 std::map<int32_t, AppExecFwk::SupportWindowMode>::value_type(MULTI_WINDOW_DISPLAY_FLOATING,
249 AppExecFwk::SupportWindowMode::FLOATING),
250 };
251
252 const bool REGISTER_RESULT =
253 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<AbilityManagerService>::GetInstance().get());
254 sptr<AbilityManagerService> AbilityManagerService::instance_;
255
AbilityManagerService()256 AbilityManagerService::AbilityManagerService()
257 : SystemAbility(ABILITY_MGR_SERVICE_ID, true),
258 state_(ServiceRunningState::STATE_NOT_START),
259 iBundleManager_(nullptr)
260 {
261 DumpFuncInit();
262 DumpSysFuncInit();
263 }
264
~AbilityManagerService()265 AbilityManagerService::~AbilityManagerService()
266 {}
267
OnStart()268 void AbilityManagerService::OnStart()
269 {
270 if (state_ == ServiceRunningState::STATE_RUNNING) {
271 HILOG_INFO("AMS has already started.");
272 return;
273 }
274 HILOG_INFO("AMS starting.");
275 if (!Init()) {
276 HILOG_ERROR("Failed to init AMS.");
277 return;
278 }
279 state_ = ServiceRunningState::STATE_RUNNING;
280 /* Publish service maybe failed, so we need call this function at the last,
281 * so it can't affect the TDD test program */
282 instance_ = DelayedSingleton<AbilityManagerService>::GetInstance().get();
283 if (instance_ == nullptr) {
284 HILOG_ERROR("AMS enter OnStart, but instance_ is nullptr!");
285 return;
286 }
287 bool ret = Publish(instance_);
288 if (!ret) {
289 HILOG_ERROR("Publish AMS failed!");
290 return;
291 }
292
293 SetParameter(BOOTEVENT_APPFWK_READY.c_str(), "true");
294 WatchParameter(BOOTEVENT_BOOT_COMPLETED.c_str(), AAFwk::ApplicationUtil::AppFwkBootEventCallback, nullptr);
295 AddSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID);
296 AddSystemAbilityListener(DISTRIBUTED_SCHED_SA_ID);
297 AddSystemAbilityListener(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
298 HILOG_INFO("AMS start success.");
299 }
300
Init()301 bool AbilityManagerService::Init()
302 {
303 taskHandler_ = TaskHandlerWrap::CreateQueueHandler(AbilityConfig::NAME_ABILITY_MGR_SERVICE);
304 eventHandler_ = std::make_shared<AbilityEventHandler>(taskHandler_, weak_from_this());
305 freeInstallManager_ = std::make_shared<FreeInstallManager>(weak_from_this());
306 CHECK_POINTER_RETURN_BOOL(freeInstallManager_);
307
308 // init user controller.
309 userController_ = std::make_shared<UserController>();
310 userController_->Init();
311
312 InitConnectManager(MAIN_USER_ID, true);
313 InitDataAbilityManager(MAIN_USER_ID, true);
314 InitPendWantManager(MAIN_USER_ID, true);
315 systemDataAbilityManager_ = std::make_shared<DataAbilityManager>();
316
317 AmsConfigurationParameter::GetInstance().Parse();
318 HILOG_INFO("ams config parse");
319 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
320 uiAbilityLifecycleManager_ = std::make_shared<UIAbilityLifecycleManager>();
321 } else {
322 InitMissionListManager(MAIN_USER_ID, true);
323 }
324 SwitchManagers(U0_USER_ID, false);
325 int amsTimeOut = AmsConfigurationParameter::GetInstance().GetAMSTimeOutTime();
326 HILOG_INFO("amsTimeOut is %{public}d", amsTimeOut);
327 #ifdef SUPPORT_GRAPHICS
328 auto anrListener = std::make_shared<ApplicationAnrListener>();
329 MMI::InputManager::GetInstance()->SetAnrObserver(anrListener);
330 DelayedSingleton<SystemDialogScheduler>::GetInstance()->SetDeviceType(OHOS::system::GetDeviceType());
331 implicitStartProcessor_ = std::make_shared<ImplicitStartProcessor>();
332 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
333 InitFocusListener();
334 }
335 InitPrepareTerminateConfig();
336 #endif
337
338 DelayedSingleton<ConnectionStateManager>::GetInstance()->Init(taskHandler_);
339
340 interceptorExecuter_ = std::make_shared<AbilityInterceptorExecuter>();
341 interceptorExecuter_->AddInterceptor(std::make_shared<CrowdTestInterceptor>());
342 interceptorExecuter_->AddInterceptor(std::make_shared<ControlInterceptor>());
343 #ifdef SUPPORT_ERMS
344 afterCheckExecuter_ = std::make_shared<AbilityInterceptorExecuter>();
345 afterCheckExecuter_->AddInterceptor(std::make_shared<EcologicalRuleInterceptor>());
346 #else
347 interceptorExecuter_->AddInterceptor(std::make_shared<EcologicalRuleInterceptor>());
348 #endif
349 bool isAppJumpEnabled = OHOS::system::GetBoolParameter(
350 OHOS::AppExecFwk::PARAMETER_APP_JUMP_INTERCEPTOR_ENABLE, false);
351 HILOG_ERROR("GetBoolParameter -> isAppJumpEnabled:%{public}s", (isAppJumpEnabled ? "true" : "false"));
352 if (isAppJumpEnabled) {
353 HILOG_INFO("App jump intercetor enabled, add AbilityJumpInterceptor to Executer");
354 interceptorExecuter_->AddInterceptor(std::make_shared<AbilityJumpInterceptor>());
355 } else {
356 HILOG_INFO("App jump intercetor disabled");
357 }
358 InitStartAbilityChain();
359
360 auto startResidentAppsTask = [aams = shared_from_this()]() { aams->StartResidentApps(); };
361 taskHandler_->SubmitTask(startResidentAppsTask, "StartResidentApps");
362
363 auto initStartupFlagTask = [aams = shared_from_this()]() { aams->InitStartupFlag(); };
364 taskHandler_->SubmitTask(initStartupFlagTask, "InitStartupFlag");
365 HILOG_INFO("Init success.");
366 return true;
367 }
368
InitStartupFlag()369 void AbilityManagerService::InitStartupFlag()
370 {
371 startUpNewRule_ = CheckNewRuleSwitchState(COMPONENT_STARTUP_NEW_RULES);
372 newRuleExceptLauncherSystemUI_ = CheckNewRuleSwitchState(NEW_RULES_EXCEPT_LAUNCHER_SYSTEMUI);
373 backgroundJudgeFlag_ = CheckNewRuleSwitchState(BACKGROUND_JUDGE_FLAG);
374 whiteListassociatedWakeUpFlag_ = CheckNewRuleSwitchState(WHITE_LIST_ASS_WAKEUP_FLAG);
375 }
376
InitStartAbilityChain()377 void AbilityManagerService::InitStartAbilityChain()
378 {
379 auto startSandboxSaveFile = std::make_shared<StartAbilitySandboxSavefile>();
380 startAbilityChain_.emplace(startSandboxSaveFile->GetPriority(), startSandboxSaveFile);
381 }
382
OnStop()383 void AbilityManagerService::OnStop()
384 {
385 HILOG_INFO("Stop AMS.");
386 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
387 std::unique_lock<ffrt::mutex> lock(bgtaskObserverMutex_);
388 if (bgtaskObserver_) {
389 int ret = BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*bgtaskObserver_);
390 if (ret != ERR_OK) {
391 HILOG_ERROR("unsubscribe bgtask failed, err:%{public}d.", ret);
392 }
393 }
394 bgtaskObserver_.reset();
395 #endif
396 if (abilityBundleEventCallback_) {
397 auto bms = GetBundleManager();
398 if (bms) {
399 bool ret = IN_PROCESS_CALL(bms->UnregisterBundleEventCallback(abilityBundleEventCallback_));
400 if (ret != ERR_OK) {
401 HILOG_ERROR("unsubscribe bundle event callback failed, err:%{public}d.", ret);
402 }
403 }
404 }
405 eventHandler_.reset();
406 taskHandler_.reset();
407 state_ = ServiceRunningState::STATE_NOT_START;
408 }
409
QueryServiceState() const410 ServiceRunningState AbilityManagerService::QueryServiceState() const
411 {
412 return state_;
413 }
414
StartAbility(const Want & want,int32_t userId,int requestCode)415 int AbilityManagerService::StartAbility(const Want &want, int32_t userId, int requestCode)
416 {
417 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
418 HILOG_INFO("%{public}s coldStart:%{public}d", __func__, want.GetBoolParam("coldStart", false));
419 if (IsCrossUserCall(userId)) {
420 CHECK_CALLER_IS_SYSTEM_APP;
421 }
422 EventInfo eventInfo = BuildEventInfo(want, userId);
423 EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
424 int32_t ret = StartAbilityWrap(want, nullptr, requestCode, userId);
425 if (ret != ERR_OK) {
426 eventInfo.errCode = ret;
427 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
428 }
429 return ret;
430 }
431
StartAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)432 int AbilityManagerService::StartAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
433 int32_t userId, int requestCode)
434 {
435 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
436 if (IsCrossUserCall(userId)) {
437 CHECK_CALLER_IS_SYSTEM_APP;
438 }
439 auto flags = want.GetFlags();
440 EventInfo eventInfo = BuildEventInfo(want, userId);
441 EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
442 if ((flags & Want::FLAG_ABILITY_CONTINUATION) == Want::FLAG_ABILITY_CONTINUATION) {
443 HILOG_ERROR("StartAbility with continuation flags is not allowed!");
444 eventInfo.errCode = ERR_INVALID_VALUE;
445 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
446 return ERR_INVALID_CONTINUATION_FLAG;
447 }
448
449 HILOG_INFO("Start ability come, ability is %{public}s, userId is %{public}d",
450 want.GetElement().GetAbilityName().c_str(), userId);
451
452 int32_t ret = StartAbilityWrap(want, callerToken, requestCode, userId);
453 if (ret != ERR_OK) {
454 eventInfo.errCode = ret;
455 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
456 }
457 return ret;
458 }
459
StartAbilityByUIContentSession(const Want & want,const sptr<IRemoteObject> & callerToken,const sptr<SessionInfo> & sessionInfo,int32_t userId,int requestCode)460 int AbilityManagerService::StartAbilityByUIContentSession(const Want &want, const sptr<IRemoteObject> &callerToken,
461 const sptr<SessionInfo> &sessionInfo, int32_t userId, int requestCode)
462 {
463 sptr<IRemoteObject> token;
464 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
465 Rosen::FocusChangeInfo focusChangeInfo;
466 Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusChangeInfo);
467 token = focusChangeInfo.abilityToken_;
468 } else {
469 if (!wmsHandler_) {
470 HILOG_ERROR("wmsHandler_ is nullptr.");
471 return ERR_INVALID_VALUE;
472 }
473 wmsHandler_->GetFocusWindow(token);
474 }
475
476 if (!token) {
477 HILOG_ERROR("token is nullptr");
478 return ERR_INVALID_VALUE;
479 }
480
481 if (token != sessionInfo->callerToken) {
482 HILOG_ERROR("callerToken is not equal to top ablity token");
483 return NOT_TOP_ABILITY;
484 }
485 return StartAbility(want, callerToken, userId, requestCode);
486 }
487
StartAbilityByUIContentSession(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,const sptr<SessionInfo> & sessionInfo,int32_t userId,int requestCode)488 int AbilityManagerService::StartAbilityByUIContentSession(const Want &want, const StartOptions &startOptions,
489 const sptr<IRemoteObject> &callerToken, const sptr<SessionInfo> &sessionInfo, int32_t userId, int requestCode)
490 {
491 sptr<IRemoteObject> token;
492 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
493 Rosen::FocusChangeInfo focusChangeInfo;
494 Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusChangeInfo);
495 token = focusChangeInfo.abilityToken_;
496 } else {
497 if (!wmsHandler_) {
498 HILOG_ERROR("wmsHandler_ is nullptr.");
499 return ERR_INVALID_VALUE;
500 }
501 wmsHandler_->GetFocusWindow(token);
502 }
503
504 if (!token) {
505 HILOG_ERROR("token is nullptr");
506 return ERR_INVALID_VALUE;
507 }
508
509 if (token != sessionInfo->callerToken) {
510 HILOG_ERROR("callerToken is not equal to top ablity token");
511 return NOT_TOP_ABILITY;
512 }
513 return StartAbility(want, startOptions, callerToken, userId, requestCode);
514 }
515
StartAbilityAsCaller(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)516 int AbilityManagerService::StartAbilityAsCaller(const Want &want, const sptr<IRemoteObject> &callerToken,
517 int32_t userId, int requestCode)
518 {
519 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
520 CHECK_CALLER_IS_SYSTEM_APP;
521 auto flags = want.GetFlags();
522 EventInfo eventInfo = BuildEventInfo(want, userId);
523 EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
524 if ((flags & Want::FLAG_ABILITY_CONTINUATION) == Want::FLAG_ABILITY_CONTINUATION) {
525 HILOG_ERROR("StartAbility with continuation flags is not allowed!");
526 eventInfo.errCode = ERR_INVALID_VALUE;
527 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
528 return ERR_INVALID_CONTINUATION_FLAG;
529 }
530
531 HILOG_INFO("Start ability come, ability is %{public}s, userId is %{public}d",
532 want.GetElement().GetAbilityName().c_str(), userId);
533 std::string callerPkg;
534 std::string targetPkg;
535 if (AbilityUtil::CheckJumpInterceptorWant(want, callerPkg, targetPkg)) {
536 HILOG_INFO("the call is from interceptor dialog, callerPkg:%{public}s, targetPkg:%{public}s",
537 callerPkg.c_str(), targetPkg.c_str());
538 AbilityUtil::AddAbilityJumpRuleToBms(callerPkg, targetPkg, GetUserId());
539 }
540 int32_t ret = StartAbilityWrap(want, callerToken, requestCode, userId, true);
541 if (ret != ERR_OK) {
542 eventInfo.errCode = ret;
543 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
544 }
545 return ret;
546 }
547
StartAbilityPublicPrechainCheck(StartAbilityParams & params)548 int AbilityManagerService::StartAbilityPublicPrechainCheck(StartAbilityParams ¶ms)
549 {
550 // 1. CheckCallerToken
551 if (params.callerToken != nullptr && !VerificationAllToken(params.callerToken)) {
552 auto isSpecificSA = AAFwk::PermissionVerification::GetInstance()->
553 CheckSpecificSystemAbilityAccessPermission();
554 if (!isSpecificSA) {
555 HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
556 return ERR_INVALID_CALLER;
557 }
558 HILOG_INFO("%{public}s: Caller is specific system ability.", __func__);
559 }
560
561 // 2. validUserId, multi-user
562 if (!JudgeMultiUserConcurrency(params.GetValidUserId())) {
563 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
564 return ERR_CROSS_USER;
565 }
566
567 return ERR_OK;
568 }
569
StartAbilityPrechainInterceptor(StartAbilityParams & params)570 int AbilityManagerService::StartAbilityPrechainInterceptor(StartAbilityParams ¶ms)
571 {
572 auto interceptorResult = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
573 interceptorExecuter_->DoProcess(params.want, params.requestCode, GetUserId(), true);
574 if (interceptorResult != ERR_OK) {
575 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
576 return interceptorResult;
577 }
578
579 return ERR_OK;
580 }
581
StartAbilityInChain(StartAbilityParams & params,int & result)582 bool AbilityManagerService::StartAbilityInChain(StartAbilityParams ¶ms, int &result)
583 {
584 std::shared_ptr<StartAbilityHandler> reqHandler;
585 for (const auto &item : startAbilityChain_) {
586 if (item.second->MatchStartRequest(params)) {
587 reqHandler = item.second;
588 }
589 }
590
591 if (!reqHandler) {
592 return false;
593 }
594
595 result = StartAbilityPublicPrechainCheck(params);
596 if (result != ERR_OK) {
597 return true;
598 }
599 result = StartAbilityPrechainInterceptor(params);
600 if (result != ERR_OK) {
601 return true;
602 }
603 result = reqHandler->HandleStartRequest(params);
604 return true;
605 }
606
StartAbilityWrap(const Want & want,const sptr<IRemoteObject> & callerToken,int requestCode,int32_t userId,bool isStartAsCaller)607 int AbilityManagerService::StartAbilityWrap(const Want &want, const sptr<IRemoteObject> &callerToken,
608 int requestCode, int32_t userId, bool isStartAsCaller)
609 {
610 StartAbilityParams startParams(const_cast<Want &>(want));
611 startParams.callerToken = callerToken;
612 startParams.userId = userId;
613 startParams.requestCode = requestCode;
614 startParams.isStartAsCaller = isStartAsCaller;
615
616 int result = ERR_OK;
617 if (StartAbilityInChain(startParams, result)) {
618 return result;
619 }
620
621 return StartAbilityInner(want, callerToken, requestCode, userId, isStartAsCaller);
622 }
623
StartAbilityInner(const Want & want,const sptr<IRemoteObject> & callerToken,int requestCode,int32_t userId,bool isStartAsCaller)624 int AbilityManagerService::StartAbilityInner(const Want &want, const sptr<IRemoteObject> &callerToken,
625 int requestCode, int32_t userId, bool isStartAsCaller)
626 {
627 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
628 {
629 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "CHECK_DLP");
630 if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
631 VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
632 !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
633 HILOG_ERROR("%{public}s: Permission verification failed.", __func__);
634 return CHECK_PERMISSION_FAILED;
635 }
636
637 if (AbilityUtil::HandleDlpApp(const_cast<Want &>(want))) {
638 return StartExtensionAbility(want, callerToken, userId, AppExecFwk::ExtensionAbilityType::SERVICE);
639 }
640 }
641
642 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
643 auto isSpecificSA = AAFwk::PermissionVerification::GetInstance()->
644 CheckSpecificSystemAbilityAccessPermission();
645 if (!isSpecificSA) {
646 HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
647 return ERR_INVALID_CALLER;
648 }
649 HILOG_INFO("%{public}s: Caller is specific system ability.", __func__);
650 }
651
652 auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
653 interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
654 if (result != ERR_OK) {
655 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
656 return result;
657 }
658
659 int32_t oriValidUserId = GetValidUserId(userId);
660 int32_t validUserId = oriValidUserId;
661
662 if (callerToken != nullptr && CheckIfOperateRemote(want)) {
663 HILOG_INFO("try to StartRemoteAbility");
664 return StartRemoteAbility(want, requestCode, validUserId, callerToken);
665 }
666
667 if (!JudgeMultiUserConcurrency(validUserId)) {
668 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
669 return ERR_CROSS_USER;
670 }
671
672 AbilityRequest abilityRequest;
673 #ifdef SUPPORT_GRAPHICS
674 if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
675 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
676 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
677 return componentRequest.requestResult;
678 }
679 abilityRequest.Voluation(want, requestCode, callerToken);
680 if (!isStartAsCaller) {
681 HILOG_DEBUG("do not start as caller, UpdateCallerInfo");
682 UpdateCallerInfo(abilityRequest.want, callerToken);
683 }
684 CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
685 return implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
686 }
687 #endif
688 result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
689 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
690 if (CheckProxyComponent(want, result) && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
691 return componentRequest.requestResult;
692 }
693 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
694 std::string callerBundleName = abilityRecord ? abilityRecord->GetAbilityInfo().bundleName : "";
695 bool selfFreeInstallEnable = (result == RESOLVE_ABILITY_ERR && want.GetElement().GetModuleName() != "" &&
696 want.GetElement().GetBundleName() == callerBundleName);
697 bool isStartFreeInstallByWant = AbilityUtil::IsStartFreeInstall(want);
698 if (isStartFreeInstallByWant || selfFreeInstallEnable) {
699 if (freeInstallManager_ == nullptr) {
700 return ERR_INVALID_VALUE;
701 }
702 Want localWant = want;
703 if (!localWant.GetDeviceId().empty()) {
704 localWant.SetDeviceId("");
705 }
706 if (!isStartAsCaller) {
707 HILOG_DEBUG("do not start as caller, UpdateCallerInfo");
708 UpdateCallerInfo(localWant, callerToken);
709 }
710
711 if (isStartFreeInstallByWant) {
712 return freeInstallManager_->StartFreeInstall(localWant, validUserId, requestCode, callerToken, true);
713 }
714 int32_t ret = freeInstallManager_->StartFreeInstall(localWant, validUserId, requestCode, callerToken, false);
715 if (ret == ERR_OK) {
716 result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
717 }
718 }
719
720 if (result != ERR_OK) {
721 HILOG_ERROR("Generate ability request local error.");
722 return result;
723 }
724
725 if (!isStartAsCaller) {
726 HILOG_DEBUG("do not start as caller, UpdateCallerInfo");
727 UpdateCallerInfo(abilityRequest.want, callerToken);
728 }
729
730 auto abilityInfo = abilityRequest.abilityInfo;
731 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
732 HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
733 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
734
735 result = CheckStaticCfgPermission(abilityInfo, isStartAsCaller,
736 abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0));
737 if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
738 HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
739 return ERR_STATIC_CFG_PERMISSION;
740 }
741
742 auto type = abilityInfo.type;
743 if (type == AppExecFwk::AbilityType::DATA) {
744 HILOG_ERROR("Cannot start data ability by start ability.");
745 return ERR_WRONG_INTERFACE_CALL;
746 } else if (type == AppExecFwk::AbilityType::EXTENSION) {
747 auto isSACall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
748 auto isGatewayCall = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
749 auto isSystemAppCall = AAFwk::PermissionVerification::GetInstance()->IsSystemAppCall();
750 auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
751 auto isToPermissionMgr = IsTargetPermission(want);
752 if (!isSACall && !isGatewayCall && !isSystemAppCall && !isShellCall && !isToPermissionMgr) {
753 HILOG_ERROR("Cannot start extension by start ability, use startServiceExtensionAbility.");
754 return ERR_WRONG_INTERFACE_CALL;
755 }
756
757 if (isSystemAppCall || isToPermissionMgr) {
758 result = CheckCallServicePermission(abilityRequest);
759 if (result != ERR_OK) {
760 HILOG_ERROR("Check permission failed");
761 return result;
762 }
763 }
764 } else if (type == AppExecFwk::AbilityType::SERVICE) {
765 HILOG_DEBUG("Check call service or extension permission, name is %{public}s.", abilityInfo.name.c_str());
766 result = CheckCallServicePermission(abilityRequest);
767 if (result != ERR_OK) {
768 HILOG_ERROR("Check permission failed");
769 return result;
770 }
771 } else {
772 HILOG_DEBUG("Check call ability permission, name is %{public}s.", abilityInfo.name.c_str());
773 result = CheckCallAbilityPermission(abilityRequest);
774 if (result != ERR_OK) {
775 HILOG_ERROR("Check permission failed");
776 return result;
777 }
778 }
779
780 #ifdef SUPPORT_ERMS
781 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
782 afterCheckExecuter_->DoProcess(abilityRequest.want, requestCode, GetUserId(), true);
783 if (result != ERR_OK) {
784 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
785 return result;
786 }
787 #endif
788
789 if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
790 HILOG_DEBUG("PreLoadAppDataAbilities:%{public}s.", abilityInfo.bundleName.c_str());
791 result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
792 if (result != ERR_OK) {
793 HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d.",
794 abilityInfo.bundleName.c_str(), result);
795 return result;
796 }
797 }
798
799 if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
800 auto connectManager = GetConnectManagerByUserId(validUserId);
801 if (!connectManager) {
802 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
803 return ERR_INVALID_VALUE;
804 }
805 HILOG_DEBUG("Start service or extension, name is %{public}s.", abilityInfo.name.c_str());
806 ReportEventToSuspendManager(abilityInfo);
807 return connectManager->StartAbility(abilityRequest);
808 }
809
810 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
811 return componentRequest.requestResult;
812 }
813 if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
814 HILOG_ERROR("IsAbilityControllerStart failed: %{public}s.", abilityInfo.bundleName.c_str());
815 return ERR_WOULD_BLOCK;
816 }
817 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
818 return uiAbilityLifecycleManager_->NotifySCBToStartUIAbility(abilityRequest, oriValidUserId);
819 }
820 auto missionListManager = GetListManagerByUserId(oriValidUserId);
821 if (missionListManager == nullptr) {
822 HILOG_ERROR("missionListManager is nullptr. userId=%{public}d", validUserId);
823 return ERR_INVALID_VALUE;
824 }
825 ReportAbilitStartInfoToRSS(abilityInfo);
826 ReportEventToSuspendManager(abilityInfo);
827 HILOG_DEBUG("Start ability, name is %{public}s.", abilityInfo.name.c_str());
828 return missionListManager->StartAbility(abilityRequest);
829 }
830
StartAbility(const Want & want,const AbilityStartSetting & abilityStartSetting,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)831 int AbilityManagerService::StartAbility(const Want &want, const AbilityStartSetting &abilityStartSetting,
832 const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
833 {
834 StartAbilityParams startParams(const_cast<Want &>(want));
835 startParams.callerToken = callerToken;
836 startParams.userId = userId;
837 startParams.requestCode = requestCode;
838
839 int result = ERR_OK;
840 if (StartAbilityInChain(startParams, result)) {
841 return result;
842 }
843
844 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
845 HILOG_DEBUG("Start ability setting.");
846 if (IsCrossUserCall(userId)) {
847 CHECK_CALLER_IS_SYSTEM_APP;
848 }
849 EventInfo eventInfo = BuildEventInfo(want, userId);
850 EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
851
852 if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
853 VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
854 !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
855 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
856 eventInfo.errCode = CHECK_PERMISSION_FAILED;
857 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
858 return CHECK_PERMISSION_FAILED;
859 }
860
861 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
862 eventInfo.errCode = ERR_INVALID_VALUE;
863 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
864 return ERR_INVALID_CALLER;
865 }
866
867 result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
868 interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
869 if (result != ERR_OK) {
870 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
871 eventInfo.errCode = result;
872 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
873 return result;
874 }
875
876 int32_t oriValidUserId = GetValidUserId(userId);
877 int32_t validUserId = oriValidUserId;
878
879 if (AbilityUtil::IsStartFreeInstall(want)) {
880 if (CheckIfOperateRemote(want) || freeInstallManager_ == nullptr) {
881 HILOG_ERROR("can not start remote free install");
882 return ERR_INVALID_VALUE;
883 }
884 Want localWant = want;
885 UpdateCallerInfo(localWant, callerToken);
886 return freeInstallManager_->StartFreeInstall(localWant, validUserId, requestCode, callerToken, true);
887 }
888
889 if (!JudgeMultiUserConcurrency(validUserId)) {
890 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
891 eventInfo.errCode = ERR_INVALID_VALUE;
892 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
893 return ERR_CROSS_USER;
894 }
895
896 AbilityRequest abilityRequest;
897 #ifdef SUPPORT_GRAPHICS
898 if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
899 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode);
900 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
901 return componentRequest.requestResult;
902 }
903 abilityRequest.Voluation(
904 want, requestCode, callerToken, std::make_shared<AbilityStartSetting>(abilityStartSetting));
905 abilityRequest.callType = AbilityCallType::START_SETTINGS_TYPE;
906 CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
907 result = implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
908 if (result != ERR_OK) {
909 HILOG_ERROR("implicit start ability error.");
910 eventInfo.errCode = result;
911 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
912 }
913 return result;
914 }
915 #endif
916 result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
917 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
918 if (result != ERR_OK && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
919 return componentRequest.requestResult;
920 }
921 if (result != ERR_OK) {
922 HILOG_ERROR("Generate ability request local error.");
923 eventInfo.errCode = result;
924 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
925 return result;
926 }
927
928 auto abilityInfo = abilityRequest.abilityInfo;
929 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
930 HILOG_DEBUG("userId : %{public}d, singleton is : %{public}d",
931 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
932
933 result = CheckStaticCfgPermission(abilityInfo, false, -1);
934 if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
935 HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
936 eventInfo.errCode = result;
937 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
938 return ERR_STATIC_CFG_PERMISSION;
939 }
940 result = CheckCallAbilityPermission(abilityRequest);
941 if (result != ERR_OK) {
942 HILOG_ERROR("%{public}s CheckCallAbilityPermission error.", __func__);
943 eventInfo.errCode = result;
944 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
945 return result;
946 }
947
948 abilityRequest.startSetting = std::make_shared<AbilityStartSetting>(abilityStartSetting);
949
950 if (abilityInfo.type == AppExecFwk::AbilityType::DATA) {
951 HILOG_ERROR("Cannot start data ability, use 'AcquireDataAbility()' instead.");
952 eventInfo.errCode = ERR_INVALID_VALUE;
953 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
954 return ERR_WRONG_INTERFACE_CALL;
955 }
956
957 #ifdef SUPPORT_ERMS
958 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
959 afterCheckExecuter_->DoProcess(abilityRequest.want, requestCode, GetUserId(), true);
960 if (result != ERR_OK) {
961 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
962 return result;
963 }
964 #endif
965
966 if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
967 result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
968 if (result != ERR_OK) {
969 HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
970 abilityInfo.bundleName.c_str(),
971 result);
972 eventInfo.errCode = result;
973 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
974 return result;
975 }
976 }
977 #ifdef SUPPORT_GRAPHICS
978 if (abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
979 HILOG_ERROR("Only support for page type ability.");
980 eventInfo.errCode = ERR_INVALID_VALUE;
981 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
982 return ERR_WRONG_INTERFACE_CALL;
983 }
984 #endif
985 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
986 return componentRequest.requestResult;
987 }
988 if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
989 eventInfo.errCode = ERR_WOULD_BLOCK;
990 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
991 return ERR_WOULD_BLOCK;
992 }
993 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
994 UpdateCallerInfo(abilityRequest.want, callerToken);
995 return uiAbilityLifecycleManager_->NotifySCBToStartUIAbility(abilityRequest, oriValidUserId);
996 }
997 auto missionListManager = GetListManagerByUserId(oriValidUserId);
998 if (missionListManager == nullptr) {
999 HILOG_ERROR("missionListManager is Null. userId=%{public}d", validUserId);
1000 eventInfo.errCode = ERR_INVALID_VALUE;
1001 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1002 return ERR_INVALID_VALUE;
1003 }
1004 UpdateCallerInfo(abilityRequest.want, callerToken);
1005 auto ret = missionListManager->StartAbility(abilityRequest);
1006 if (ret != ERR_OK) {
1007 eventInfo.errCode = ret;
1008 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1009 }
1010 return ret;
1011 }
1012
StartAbility(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)1013 int AbilityManagerService::StartAbility(const Want &want, const StartOptions &startOptions,
1014 const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
1015 {
1016 HILOG_DEBUG("Start ability with startOptions.");
1017 return StartAbilityForOptionWrap(want, startOptions, callerToken, userId, requestCode, false);
1018 }
1019
StartAbilityAsCaller(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode)1020 int AbilityManagerService::StartAbilityAsCaller(const Want &want, const StartOptions &startOptions,
1021 const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode)
1022 {
1023 HILOG_DEBUG("Start ability as caller with startOptions.");
1024 CHECK_CALLER_IS_SYSTEM_APP;
1025 return StartAbilityForOptionWrap(want, startOptions, callerToken, userId, requestCode, true);
1026 }
1027
StartAbilityForOptionWrap(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode,bool isStartAsCaller)1028 int AbilityManagerService::StartAbilityForOptionWrap(const Want &want, const StartOptions &startOptions,
1029 const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode, bool isStartAsCaller)
1030 {
1031 StartAbilityParams startParams(const_cast<Want &>(want));
1032 startParams.callerToken = callerToken;
1033 startParams.userId = userId;
1034 startParams.requestCode = requestCode;
1035 startParams.isStartAsCaller = isStartAsCaller;
1036 startParams.startOptions = &startOptions;
1037
1038 int result = ERR_OK;
1039 if (StartAbilityInChain(startParams, result)) {
1040 return result;
1041 }
1042
1043 return StartAbilityForOptionInner(want, startOptions, callerToken, userId, requestCode, isStartAsCaller);
1044 }
1045
StartAbilityForOptionInner(const Want & want,const StartOptions & startOptions,const sptr<IRemoteObject> & callerToken,int32_t userId,int requestCode,bool isStartAsCaller)1046 int AbilityManagerService::StartAbilityForOptionInner(const Want &want, const StartOptions &startOptions,
1047 const sptr<IRemoteObject> &callerToken, int32_t userId, int requestCode, bool isStartAsCaller)
1048 {
1049 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1050 if (IsCrossUserCall(userId)) {
1051 CHECK_CALLER_IS_SYSTEM_APP;
1052 }
1053 EventInfo eventInfo = BuildEventInfo(want, userId);
1054 EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
1055
1056 if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
1057 VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
1058 !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
1059 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
1060 eventInfo.errCode = CHECK_PERMISSION_FAILED;
1061 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1062 return CHECK_PERMISSION_FAILED;
1063 }
1064
1065 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
1066 eventInfo.errCode = ERR_INVALID_VALUE;
1067 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1068 return ERR_INVALID_CALLER;
1069 }
1070
1071 auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1072 interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
1073 if (result != ERR_OK) {
1074 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1075 eventInfo.errCode = result;
1076 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1077 return result;
1078 }
1079
1080 int32_t oriValidUserId = GetValidUserId(userId);
1081 int32_t validUserId = oriValidUserId;
1082
1083 if (AbilityUtil::IsStartFreeInstall(want)) {
1084 if (CheckIfOperateRemote(want) || freeInstallManager_ == nullptr) {
1085 HILOG_ERROR("can not start remote free install");
1086 return ERR_INVALID_VALUE;
1087 }
1088 Want localWant = want;
1089 if (!isStartAsCaller) {
1090 HILOG_DEBUG("do not start as caller, UpdateCallerInfo");
1091 UpdateCallerInfo(localWant, callerToken);
1092 }
1093 return freeInstallManager_->StartFreeInstall(localWant, validUserId, requestCode, callerToken, true);
1094 }
1095 if (!JudgeMultiUserConcurrency(validUserId)) {
1096 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1097 eventInfo.errCode = ERR_INVALID_VALUE;
1098 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1099 return ERR_CROSS_USER;
1100 }
1101
1102 AbilityRequest abilityRequest;
1103 #ifdef SUPPORT_GRAPHICS
1104 if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
1105 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode);
1106 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
1107 return componentRequest.requestResult;
1108 }
1109 abilityRequest.Voluation(want, requestCode, callerToken);
1110 abilityRequest.want.SetParam(Want::PARAM_RESV_DISPLAY_ID, startOptions.GetDisplayID());
1111 abilityRequest.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions.GetWindowMode());
1112 abilityRequest.callType = AbilityCallType::START_OPTIONS_TYPE;
1113 CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
1114 if (!isStartAsCaller) {
1115 HILOG_DEBUG("do not start as caller, UpdateCallerInfo");
1116 UpdateCallerInfo(abilityRequest.want, callerToken);
1117 }
1118 result = implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
1119 if (result != ERR_OK) {
1120 HILOG_ERROR("implicit start ability error.");
1121 eventInfo.errCode = result;
1122 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1123 }
1124 return result;
1125 }
1126 #endif
1127 result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
1128 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
1129 if (result != ERR_OK && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
1130 return componentRequest.requestResult;
1131 }
1132 if (result != ERR_OK) {
1133 HILOG_ERROR("Generate ability request local error.");
1134 eventInfo.errCode = result;
1135 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1136 return result;
1137 }
1138
1139 if (!isStartAsCaller) {
1140 HILOG_DEBUG("do not start as caller, UpdateCallerInfo");
1141 UpdateCallerInfo(abilityRequest.want, callerToken);
1142 }
1143 auto abilityInfo = abilityRequest.abilityInfo;
1144 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
1145 HILOG_DEBUG("userId : %{public}d, singleton is : %{public}d",
1146 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
1147
1148 result = CheckStaticCfgPermission(abilityInfo, isStartAsCaller,
1149 abilityRequest.want.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0));
1150 if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
1151 HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
1152 eventInfo.errCode = result;
1153 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1154 return ERR_STATIC_CFG_PERMISSION;
1155 }
1156 result = CheckCallAbilityPermission(abilityRequest);
1157 if (result != ERR_OK) {
1158 HILOG_ERROR("%{public}s CheckCallAbilityPermission error.", __func__);
1159 eventInfo.errCode = result;
1160 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1161 return result;
1162 }
1163
1164 if (abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
1165 HILOG_ERROR("Only support for page type ability.");
1166 eventInfo.errCode = ERR_INVALID_VALUE;
1167 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1168 return ERR_INVALID_VALUE;
1169 }
1170
1171 #ifdef SUPPORT_ERMS
1172 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
1173 afterCheckExecuter_->DoProcess(abilityRequest.want, requestCode, GetUserId(), true);
1174 if (result != ERR_OK) {
1175 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
1176 return result;
1177 }
1178 #endif
1179
1180 if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
1181 result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
1182 if (result != ERR_OK) {
1183 HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
1184 abilityInfo.bundleName.c_str(),
1185 result);
1186 eventInfo.errCode = result;
1187 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1188 return result;
1189 }
1190 }
1191
1192 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
1193 return componentRequest.requestResult;
1194 }
1195 if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
1196 eventInfo.errCode = ERR_WOULD_BLOCK;
1197 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1198 return ERR_WOULD_BLOCK;
1199 }
1200 #ifdef SUPPORT_GRAPHICS
1201 if (abilityInfo.isStageBasedModel && !CheckWindowMode(startOptions.GetWindowMode(), abilityInfo.windowModes)) {
1202 return ERR_AAFWK_INVALID_WINDOW_MODE;
1203 }
1204 #endif
1205
1206 abilityRequest.want.SetParam(Want::PARAM_RESV_DISPLAY_ID, startOptions.GetDisplayID());
1207 abilityRequest.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions.GetWindowMode());
1208 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1209 return uiAbilityLifecycleManager_->NotifySCBToStartUIAbility(abilityRequest, oriValidUserId);
1210 }
1211 auto missionListManager = GetListManagerByUserId(oriValidUserId);
1212 if (missionListManager == nullptr) {
1213 HILOG_ERROR("missionListManager is Null. userId=%{public}d", oriValidUserId);
1214 eventInfo.errCode = ERR_INVALID_VALUE;
1215 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1216 return ERR_INVALID_VALUE;
1217 }
1218
1219 auto ret = missionListManager->StartAbility(abilityRequest);
1220 if (ret != ERR_OK) {
1221 eventInfo.errCode = ret;
1222 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1223 }
1224 return ret;
1225 }
1226
RequestDialogService(const Want & want,const sptr<IRemoteObject> & callerToken)1227 int32_t AbilityManagerService::RequestDialogService(const Want &want, const sptr<IRemoteObject> &callerToken)
1228 {
1229 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1230 auto flags = want.GetFlags();
1231 if ((flags & Want::FLAG_ABILITY_CONTINUATION) == Want::FLAG_ABILITY_CONTINUATION) {
1232 HILOG_ERROR("RequestDialogService with continuation flags is not allowed!");
1233 return ERR_INVALID_CONTINUATION_FLAG;
1234 }
1235
1236 HILOG_INFO("request dialog service, target is %{public}s", want.GetElement().GetURI().c_str());
1237 return RequestDialogServiceInner(want, callerToken, -1, -1);
1238 }
1239
ReportDrawnCompleted(const sptr<IRemoteObject> & callerToken)1240 int32_t AbilityManagerService::ReportDrawnCompleted(const sptr<IRemoteObject> &callerToken)
1241 {
1242 HILOG_DEBUG("called.");
1243 if (callerToken == nullptr) {
1244 HILOG_ERROR("callerToken is nullptr");
1245 return INNER_ERR;
1246 }
1247
1248 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
1249 if (abilityRecord == nullptr) {
1250 HILOG_ERROR("abilityRecord is nullptr");
1251 return INNER_ERR;
1252 }
1253 auto abilityInfo = abilityRecord->GetAbilityInfo();
1254
1255 EventInfo eventInfo;
1256 eventInfo.userId = IPCSkeleton::GetCallingUid() / BASE_USER_RANGE;
1257 eventInfo.pid = IPCSkeleton::GetCallingPid();
1258 eventInfo.bundleName = abilityInfo.bundleName;
1259 eventInfo.moduleName = abilityInfo.moduleName;
1260 eventInfo.abilityName = abilityInfo.name;
1261 EventReport::SendAppEvent(EventName::DRAWN_COMPLETED, HiSysEventType::BEHAVIOR, eventInfo);
1262 return ERR_OK;
1263 }
1264
RequestDialogServiceInner(const Want & want,const sptr<IRemoteObject> & callerToken,int requestCode,int32_t userId)1265 int32_t AbilityManagerService::RequestDialogServiceInner(const Want &want, const sptr<IRemoteObject> &callerToken,
1266 int requestCode, int32_t userId)
1267 {
1268 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1269 if (callerToken == nullptr || !VerificationAllToken(callerToken)) {
1270 HILOG_WARN("caller is invalid.");
1271 return ERR_INVALID_CALLER;
1272 }
1273
1274 {
1275 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "CHECK_DLP");
1276 if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
1277 !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
1278 HILOG_ERROR("%{public}s: Permission verification failed.", __func__);
1279 return CHECK_PERMISSION_FAILED;
1280 }
1281
1282 if (AbilityUtil::HandleDlpApp(const_cast<Want &>(want))) {
1283 HILOG_ERROR("Cannot handle dlp by RequestDialogService.");
1284 return ERR_WRONG_INTERFACE_CALL;
1285 }
1286 }
1287
1288 auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1289 interceptorExecuter_->DoProcess(want, requestCode, GetUserId(), true);
1290 if (result != ERR_OK) {
1291 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1292 return result;
1293 }
1294
1295 int32_t oriValidUserId = GetValidUserId(userId);
1296 int32_t validUserId = oriValidUserId;
1297 if (!JudgeMultiUserConcurrency(validUserId)) {
1298 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1299 return ERR_CROSS_USER;
1300 }
1301
1302 AbilityRequest abilityRequest;
1303 result = GenerateAbilityRequest(want, requestCode, abilityRequest, callerToken, validUserId);
1304 ComponentRequest componentRequest = initComponentRequest(callerToken, requestCode, result);
1305 if (CheckProxyComponent(want, result) && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
1306 return componentRequest.requestResult;
1307 }
1308 if (result != ERR_OK) {
1309 HILOG_ERROR("Generate ability request local error when RequestDialogService.");
1310 return result;
1311 }
1312 UpdateCallerInfo(abilityRequest.want, callerToken);
1313
1314 auto abilityInfo = abilityRequest.abilityInfo;
1315 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
1316 HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
1317 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
1318
1319 result = CheckStaticCfgPermission(abilityInfo, false, -1);
1320 if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
1321 HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
1322 return ERR_STATIC_CFG_PERMISSION;
1323 }
1324
1325 auto type = abilityInfo.type;
1326 if (type == AppExecFwk::AbilityType::PAGE) {
1327 result = CheckCallAbilityPermission(abilityRequest);
1328 if (result != ERR_OK) {
1329 HILOG_ERROR("Check permission failed");
1330 return result;
1331 }
1332 } else if (type == AppExecFwk::AbilityType::EXTENSION &&
1333 abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::SERVICE) {
1334 HILOG_DEBUG("Check call ability permission, name is %{public}s.", abilityInfo.name.c_str());
1335 result = CheckCallServicePermission(abilityRequest);
1336 if (result != ERR_OK) {
1337 HILOG_ERROR("Check permission failed");
1338 return result;
1339 }
1340 } else {
1341 HILOG_ERROR("RequestDialogService do not support other component.");
1342 return ERR_WRONG_INTERFACE_CALL;
1343 }
1344
1345 #ifdef SUPPORT_ERMS
1346 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
1347 afterCheckExecuter_->DoProcess(abilityRequest.want, requestCode, GetUserId(), true);
1348 if (result != ERR_OK) {
1349 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
1350 return result;
1351 }
1352 #endif
1353
1354 if (type == AppExecFwk::AbilityType::EXTENSION) {
1355 auto connectManager = GetConnectManagerByUserId(validUserId);
1356 if (!connectManager) {
1357 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
1358 return ERR_INVALID_VALUE;
1359 }
1360 HILOG_DEBUG("request dialog service, start service extension,name is %{public}s.", abilityInfo.name.c_str());
1361 ReportEventToSuspendManager(abilityInfo);
1362 return connectManager->StartAbility(abilityRequest);
1363 }
1364
1365 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
1366 return componentRequest.requestResult;
1367 }
1368 if (!IsAbilityControllerStart(want, abilityInfo.bundleName)) {
1369 HILOG_ERROR("IsAbilityControllerStart failed : %{public}s.", abilityInfo.bundleName.c_str());
1370 return ERR_WOULD_BLOCK;
1371 }
1372 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1373 ReportAbilitStartInfoToRSS(abilityInfo);
1374 ReportEventToSuspendManager(abilityInfo);
1375 return uiAbilityLifecycleManager_->NotifySCBToStartUIAbility(abilityRequest, oriValidUserId);
1376 }
1377 auto missionListManager = GetListManagerByUserId(oriValidUserId);
1378 if (missionListManager == nullptr) {
1379 HILOG_ERROR("missionListManager is nullptr. userId:%{public}d", validUserId);
1380 return ERR_INVALID_VALUE;
1381 }
1382 ReportAbilitStartInfoToRSS(abilityInfo);
1383 ReportEventToSuspendManager(abilityInfo);
1384 HILOG_DEBUG("RequestDialogService, start ability, name is %{public}s.", abilityInfo.name.c_str());
1385 return missionListManager->StartAbility(abilityRequest);
1386 }
1387
StartUIAbilityBySCB(sptr<SessionInfo> sessionInfo)1388 int AbilityManagerService::StartUIAbilityBySCB(sptr<SessionInfo> sessionInfo)
1389 {
1390 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1391 HILOG_DEBUG("Call.");
1392 if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) {
1393 HILOG_ERROR("sessionInfo is nullptr");
1394 return ERR_INVALID_VALUE;
1395 }
1396
1397 if (sessionInfo->userId == DEFAULT_INVAL_VALUE) {
1398 sessionInfo->userId = GetUserId();
1399 } else if (sessionInfo->userId != GetUserId()) {
1400 HILOG_ERROR("this userId is not valid");
1401 return ERR_CROSS_USER;
1402 }
1403
1404 auto currentUserId = GetUserId();
1405 EventInfo eventInfo = BuildEventInfo(sessionInfo->want, currentUserId);
1406 EventReport::SendAbilityEvent(EventName::START_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
1407
1408 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
1409 HILOG_ERROR("Not sceneboard called, not allowed.");
1410 return ERR_WRONG_INTERFACE_CALL;
1411 }
1412
1413 auto requestCode = sessionInfo->requestCode;
1414 auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1415 interceptorExecuter_->DoProcess(sessionInfo->want, requestCode, currentUserId, true);
1416 if (result != ERR_OK) {
1417 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1418 eventInfo.errCode = result;
1419 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1420 return result;
1421 }
1422
1423 AbilityRequest abilityRequest;
1424 result = GenerateAbilityRequest(sessionInfo->want, requestCode, abilityRequest,
1425 sessionInfo->callerToken, currentUserId);
1426 if (result != ERR_OK) {
1427 HILOG_ERROR("Generate ability request local error.");
1428 return result;
1429 }
1430 abilityRequest.collaboratorType = sessionInfo->collaboratorType;
1431
1432 auto abilityInfo = abilityRequest.abilityInfo;
1433 if (!AAFwk::PermissionVerification::GetInstance()->IsSystemAppCall() &&
1434 abilityInfo.type != AppExecFwk::AbilityType::PAGE) {
1435 HILOG_ERROR("Only support for page type ability.");
1436 return ERR_INVALID_VALUE;
1437 }
1438
1439 #ifdef SUPPORT_ERMS
1440 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
1441 afterCheckExecuter_->DoProcess(abilityRequest.want, requestCode, GetUserId(), true);
1442 if (result != ERR_OK) {
1443 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
1444 return result;
1445 }
1446 #endif
1447
1448 if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) {
1449 result = PreLoadAppDataAbilities(abilityInfo.bundleName, currentUserId);
1450 if (result != ERR_OK) {
1451 HILOG_ERROR("StartAbility: App data ability preloading failed, '%{public}s', %{public}d",
1452 abilityInfo.bundleName.c_str(), result);
1453 return result;
1454 }
1455 }
1456
1457 if (uiAbilityLifecycleManager_ == nullptr) {
1458 HILOG_ERROR("uiAbilityLifecycleManager_ is nullptr");
1459 return ERR_INVALID_VALUE;
1460 }
1461 return uiAbilityLifecycleManager_->StartUIAbility(abilityRequest, sessionInfo);
1462 }
1463
CheckCallingTokenId(const std::string & bundleName,int32_t userId)1464 bool AbilityManagerService::CheckCallingTokenId(const std::string &bundleName, int32_t userId)
1465 {
1466 auto bms = GetBundleManager();
1467 if (bms == nullptr) {
1468 HILOG_ERROR("bms is invalid.");
1469 return false;
1470 }
1471 AppExecFwk::ApplicationInfo appInfo;
1472 IN_PROCESS_CALL_WITHOUT_RET(bms->GetApplicationInfo(bundleName,
1473 AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, userId, appInfo));
1474 auto accessTokenId = IPCSkeleton::GetCallingTokenID();
1475 if (accessTokenId != appInfo.accessTokenId) {
1476 HILOG_ERROR("Permission verification failed");
1477 return false;
1478 }
1479 return true;
1480 }
1481
IsBackgroundTaskUid(const int uid)1482 bool AbilityManagerService::IsBackgroundTaskUid(const int uid)
1483 {
1484 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
1485 std::lock_guard<ffrt::mutex> lock(bgtaskObserverMutex_);
1486 if (bgtaskObserver_) {
1487 return bgtaskObserver_->IsBackgroundTaskUid(uid);
1488 }
1489 return false;
1490 #else
1491 return false;
1492 #endif
1493 }
1494
IsDmsAlive() const1495 bool AbilityManagerService::IsDmsAlive() const
1496 {
1497 return g_isDmsAlive.load();
1498 }
1499
AppUpgradeCompleted(const std::string & bundleName,int32_t uid)1500 void AbilityManagerService::AppUpgradeCompleted(const std::string &bundleName, int32_t uid)
1501 {
1502 if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
1503 HILOG_ERROR("Not sa call");
1504 return;
1505 }
1506
1507 auto bms = GetBundleManager();
1508 CHECK_POINTER(bms);
1509 auto userId = uid / BASE_USER_RANGE;
1510
1511 AppExecFwk::BundleInfo bundleInfo;
1512 if (!IN_PROCESS_CALL(
1513 bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, userId))) {
1514 HILOG_ERROR("Failed to get bundle info.");
1515 return;
1516 }
1517
1518 RecordAppExitReasonAtUpgrade(bundleInfo);
1519
1520 if (userId != U0_USER_ID) {
1521 HILOG_ERROR("Application upgrade for non U0 users.");
1522 return;
1523 }
1524
1525 if (!bundleInfo.isKeepAlive) {
1526 HILOG_WARN("Not a resident application.");
1527 return;
1528 }
1529
1530 std::vector<AppExecFwk::BundleInfo> bundleInfos = { bundleInfo };
1531 DelayedSingleton<ResidentProcessManager>::GetInstance()->StartResidentProcessWithMainElement(bundleInfos);
1532
1533 if (!bundleInfos.empty()) {
1534 DelayedSingleton<ResidentProcessManager>::GetInstance()->StartResidentProcess(bundleInfos);
1535 }
1536 }
1537
RecordAppExitReason(Reason exitReason)1538 int32_t AbilityManagerService::RecordAppExitReason(Reason exitReason)
1539 {
1540 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && !currentMissionListManager_) {
1541 HILOG_ERROR("currentMissionListManager_ is null.");
1542 return ERR_NULL_OBJECT;
1543 }
1544
1545 auto bms = GetBundleManager();
1546 CHECK_POINTER_AND_RETURN(bms, ERR_NULL_OBJECT);
1547
1548 std::string bundleName;
1549 int32_t callerUid = IPCSkeleton::GetCallingUid();
1550 if (IN_PROCESS_CALL(bms->GetNameForUid(callerUid, bundleName)) != ERR_OK) {
1551 HILOG_ERROR("Get Bundle Name failed.");
1552 return ERR_INVALID_VALUE;
1553 }
1554
1555 std::vector<std::string> abilityList;
1556 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1557 uiAbilityLifecycleManager_->GetActiveAbilityList(bundleName, abilityList);
1558 } else {
1559 currentMissionListManager_->GetActiveAbilityList(bundleName, abilityList);
1560 }
1561
1562 return DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->SetAppExitReason(
1563 bundleName, abilityList, exitReason);
1564 }
1565
ForceExitApp(const int32_t pid,Reason exitReason)1566 int32_t AbilityManagerService::ForceExitApp(const int32_t pid, Reason exitReason)
1567 {
1568 if (exitReason < REASON_UNKNOWN || exitReason > REASON_UPGRADE) {
1569 HILOG_ERROR("Force exit reason invalid.");
1570 return ERR_INVALID_VALUE;
1571 }
1572
1573 if (!AAFwk::PermissionVerification::GetInstance()->IsSACall() &&
1574 !AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
1575 HILOG_ERROR("Not sa or shell call");
1576 return ERR_PERMISSION_DENIED;
1577 }
1578
1579 std::string bundleName;
1580 int32_t uid;
1581 DelayedSingleton<AppScheduler>::GetInstance()->GetBundleNameByPid(pid, bundleName, uid);
1582 if (bundleName.empty()) {
1583 HILOG_ERROR("Get bundle name by pid failed.");
1584 return ERR_INVALID_VALUE;
1585 }
1586
1587 int32_t targetUserId = uid / BASE_USER_RANGE;
1588 std::vector<std::string> abilityLists;
1589 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1590 uiAbilityLifecycleManager_->GetActiveAbilityList(bundleName, abilityLists, targetUserId);
1591 } else if (targetUserId == U0_USER_ID) {
1592 std::lock_guard lock(managersMutex_);
1593 HILOG_INFO("called.");
1594 for (auto item: missionListManagers_) {
1595 if (item.second) {
1596 std::vector<std::string> abilityList;
1597 item.second->GetActiveAbilityList(bundleName, abilityList);
1598 if (!abilityList.empty()) {
1599 abilityLists.insert(abilityLists.end(), abilityList.begin(), abilityList.end());
1600 }
1601 }
1602 }
1603 HILOG_INFO("end.");
1604 } else {
1605 auto listManager = GetListManagerByUserId(targetUserId);
1606 if (listManager) {
1607 listManager->GetActiveAbilityList(bundleName, abilityLists);
1608 }
1609 }
1610
1611 int32_t result = DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->SetAppExitReason(
1612 bundleName, abilityLists, exitReason);
1613
1614 DelayedSingleton<AppScheduler>::GetInstance()->KillApplication(bundleName);
1615
1616 return result;
1617 }
1618
GetConfiguration(AppExecFwk::Configuration & config)1619 int32_t AbilityManagerService::GetConfiguration(AppExecFwk::Configuration& config)
1620 {
1621 auto appMgr = GetAppMgr();
1622 if (appMgr == nullptr) {
1623 HILOG_WARN("GetAppMgr failed");
1624 return -1;
1625 }
1626
1627 return appMgr->GetConfiguration(config);
1628 }
1629
GetAppMgr()1630 OHOS::sptr<OHOS::AppExecFwk::IAppMgr> AbilityManagerService::GetAppMgr()
1631 {
1632 if (appMgr_) {
1633 return appMgr_;
1634 }
1635
1636 OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
1637 OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1638 if (!systemAbilityManager) {
1639 return nullptr;
1640 }
1641 OHOS::sptr<OHOS::IRemoteObject> object = systemAbilityManager->GetSystemAbility(OHOS::APP_MGR_SERVICE_ID);
1642 appMgr_ = OHOS::iface_cast<OHOS::AppExecFwk::IAppMgr>(object);
1643 return appMgr_;
1644 }
1645
CheckOptExtensionAbility(const Want & want,AbilityRequest & abilityRequest,int32_t validUserId,AppExecFwk::ExtensionAbilityType extensionType)1646 int AbilityManagerService::CheckOptExtensionAbility(const Want &want, AbilityRequest &abilityRequest,
1647 int32_t validUserId, AppExecFwk::ExtensionAbilityType extensionType)
1648 {
1649 auto abilityInfo = abilityRequest.abilityInfo;
1650 auto type = abilityInfo.type;
1651 if (type != AppExecFwk::AbilityType::EXTENSION) {
1652 HILOG_ERROR("Not extension ability, not allowed.");
1653 return ERR_WRONG_INTERFACE_CALL;
1654 }
1655 if (extensionType != AppExecFwk::ExtensionAbilityType::UNSPECIFIED &&
1656 extensionType != abilityInfo.extensionAbilityType) {
1657 HILOG_ERROR("Extension ability type not match, set type: %{public}d, real type: %{public}d",
1658 static_cast<int32_t>(extensionType), static_cast<int32_t>(abilityInfo.extensionAbilityType));
1659 return ERR_WRONG_INTERFACE_CALL;
1660 }
1661
1662 auto result = CheckStaticCfgPermission(abilityInfo, false, -1);
1663 if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
1664 HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
1665 return ERR_STATIC_CFG_PERMISSION;
1666 }
1667
1668 if (extensionType == AppExecFwk::ExtensionAbilityType::DATASHARE ||
1669 extensionType == AppExecFwk::ExtensionAbilityType::SERVICE) {
1670 result = CheckCallServiceExtensionPermission(abilityRequest);
1671 if (result != ERR_OK) {
1672 return result;
1673 }
1674 } else {
1675 result = CheckCallOtherExtensionPermission(abilityRequest);
1676 if (result != ERR_OK) {
1677 return result;
1678 }
1679 }
1680
1681 UpdateCallerInfo(abilityRequest.want, abilityRequest.callerToken);
1682 return ERR_OK;
1683 }
1684
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1685 void AbilityManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
1686 {
1687 HILOG_INFO("systemAbilityId: %{public}d add", systemAbilityId);
1688 switch (systemAbilityId) {
1689 case BACKGROUND_TASK_MANAGER_SERVICE_ID: {
1690 SubscribeBackgroundTask();
1691 break;
1692 }
1693 case DISTRIBUTED_SCHED_SA_ID: {
1694 g_isDmsAlive.store(true);
1695 break;
1696 }
1697 case BUNDLE_MGR_SERVICE_SYS_ABILITY_ID: {
1698 SubscribeBundleEventCallback();
1699 break;
1700 }
1701 default:
1702 break;
1703 }
1704 }
1705
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1706 void AbilityManagerService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
1707 {
1708 HILOG_INFO("systemAbilityId: %{public}d remove", systemAbilityId);
1709 switch (systemAbilityId) {
1710 case BACKGROUND_TASK_MANAGER_SERVICE_ID: {
1711 UnSubscribeBackgroundTask();
1712 break;
1713 }
1714 case DISTRIBUTED_SCHED_SA_ID: {
1715 g_isDmsAlive.store(false);
1716 break;
1717 }
1718 case BUNDLE_MGR_SERVICE_SYS_ABILITY_ID: {
1719 UnsubscribeBundleEventCallback();
1720 break;
1721 }
1722 default:
1723 break;
1724 }
1725 }
1726
SubscribeBackgroundTask()1727 void AbilityManagerService::SubscribeBackgroundTask()
1728 {
1729 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
1730 std::unique_lock<ffrt::mutex> lock(bgtaskObserverMutex_);
1731 if (bgtaskObserver_) {
1732 return;
1733 }
1734 bgtaskObserver_ = std::make_shared<BackgroundTaskObserver>();
1735 int ret = BackgroundTaskMgrHelper::SubscribeBackgroundTask(*bgtaskObserver_);
1736 if (ret != ERR_OK) {
1737 bgtaskObserver_ = nullptr;
1738 HILOG_ERROR("%{public}s failed, err:%{public}d.", __func__, ret);
1739 return;
1740 }
1741 bgtaskObserver_->GetContinuousTaskApps();
1742 HILOG_INFO("%{public}s success.", __func__);
1743 #endif
1744 }
1745
UnSubscribeBackgroundTask()1746 void AbilityManagerService::UnSubscribeBackgroundTask()
1747 {
1748 #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE
1749 std::unique_lock<ffrt::mutex> lock(bgtaskObserverMutex_);
1750 if (!bgtaskObserver_) {
1751 return;
1752 }
1753 bgtaskObserver_ = nullptr;
1754 HILOG_INFO("%{public}s success.", __func__);
1755 #endif
1756 }
1757
SubscribeBundleEventCallback()1758 void AbilityManagerService::SubscribeBundleEventCallback()
1759 {
1760 HILOG_DEBUG("SubscribeBundleEventCallback to receive hap updates.");
1761 if (abilityBundleEventCallback_) {
1762 return;
1763 }
1764
1765 // Register abilityBundleEventCallback to receive hap updates
1766 abilityBundleEventCallback_ = new (std::nothrow) AbilityBundleEventCallback(taskHandler_);
1767 auto bms = GetBundleManager();
1768 if (bms) {
1769 bool ret = IN_PROCESS_CALL(bms->RegisterBundleEventCallback(abilityBundleEventCallback_));
1770 if (!ret) {
1771 HILOG_ERROR("RegisterBundleEventCallback failed!");
1772 }
1773 } else {
1774 HILOG_ERROR("Get BundleManager failed!");
1775 }
1776 HILOG_DEBUG("SubscribeBundleEventCallback success.");
1777 }
1778
UnsubscribeBundleEventCallback()1779 void AbilityManagerService::UnsubscribeBundleEventCallback()
1780 {
1781 if (!abilityBundleEventCallback_) {
1782 return;
1783 }
1784 abilityBundleEventCallback_ = nullptr;
1785 HILOG_DEBUG("UnsubscribeBundleEventCallback success.");
1786 }
1787
ReportAbilitStartInfoToRSS(const AppExecFwk::AbilityInfo & abilityInfo)1788 void AbilityManagerService::ReportAbilitStartInfoToRSS(const AppExecFwk::AbilityInfo &abilityInfo)
1789 {
1790 #ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE
1791 if (abilityInfo.type == AppExecFwk::AbilityType::PAGE &&
1792 abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
1793 std::vector<AppExecFwk::RunningProcessInfo> runningProcessInfos;
1794 if (IN_PROCESS_CALL(GetProcessRunningInfos(runningProcessInfos)) != ERR_OK) {
1795 return;
1796 }
1797 bool isColdStart = true;
1798 int32_t pid = 0;
1799 for (auto const &info : runningProcessInfos) {
1800 if (info.uid_ == abilityInfo.applicationInfo.uid) {
1801 isColdStart = false;
1802 pid = info.pid_;
1803 break;
1804 }
1805 }
1806 std::unordered_map<std::string, std::string> eventParams {
1807 { "name", "ability_start" },
1808 { "uid", std::to_string(abilityInfo.applicationInfo.uid) },
1809 { "bundleName", abilityInfo.applicationInfo.bundleName },
1810 { "abilityName", abilityInfo.name },
1811 { "pid", std::to_string(pid) }
1812 };
1813 ResourceSchedule::ResSchedClient::GetInstance().ReportData(
1814 ResourceSchedule::ResType::RES_TYPE_APP_ABILITY_START, isColdStart ? 1 : 0, eventParams);
1815 }
1816 #endif
1817 }
1818
ReportEventToSuspendManager(const AppExecFwk::AbilityInfo & abilityInfo)1819 void AbilityManagerService::ReportEventToSuspendManager(const AppExecFwk::AbilityInfo &abilityInfo)
1820 {
1821 #ifdef EFFICIENCY_MANAGER_ENABLE
1822 std::string reason = (abilityInfo.type == AppExecFwk::AbilityType::PAGE) ?
1823 "THAW_BY_START_PAGE_ABILITY" : "THAW_BY_START_NOT_PAGE_ABILITY";
1824 SuspendManager::SuspendManagerClient::GetInstance().ThawOneApplication(
1825 abilityInfo.applicationInfo.uid,
1826 abilityInfo.applicationInfo.bundleName, reason);
1827 #endif // EFFICIENCY_MANAGER_ENABLE
1828 }
1829
StartExtensionAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,AppExecFwk::ExtensionAbilityType extensionType)1830 int AbilityManagerService::StartExtensionAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
1831 int32_t userId, AppExecFwk::ExtensionAbilityType extensionType)
1832 {
1833 HILOG_INFO("Start extension ability come, bundlename: %{public}s, ability is %{public}s, userId is %{public}d",
1834 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
1835 CHECK_CALLER_IS_SYSTEM_APP;
1836 EventInfo eventInfo = BuildEventInfo(want, userId);
1837 eventInfo.extensionType = static_cast<int32_t>(extensionType);
1838 EventReport::SendExtensionEvent(EventName::START_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
1839
1840 auto result = CheckDlpForExtension(want, callerToken, userId, eventInfo, EventName::START_EXTENSION_ERROR);
1841 if (result != ERR_OK) {
1842 HILOG_ERROR("CheckDlpForExtension error.");
1843 return result;
1844 }
1845
1846 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
1847 HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
1848 eventInfo.errCode = ERR_INVALID_VALUE;
1849 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1850 return ERR_INVALID_CALLER;
1851 }
1852
1853 result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1854 interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
1855 if (result != ERR_OK) {
1856 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1857 eventInfo.errCode = result;
1858 EventReport::SendAbilityEvent(EventName::START_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
1859 return result;
1860 }
1861
1862 int32_t validUserId = GetValidUserId(userId);
1863 if (!JudgeMultiUserConcurrency(validUserId)) {
1864 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1865 eventInfo.errCode = ERR_INVALID_VALUE;
1866 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1867 return ERR_CROSS_USER;
1868 }
1869
1870 AbilityRequest abilityRequest;
1871 #ifdef SUPPORT_GRAPHICS
1872 if (ImplicitStartProcessor::IsImplicitStartAction(want)) {
1873 abilityRequest.Voluation(want, DEFAULT_INVAL_VALUE, callerToken);
1874 abilityRequest.callType = AbilityCallType::START_EXTENSION_TYPE;
1875 abilityRequest.extensionType = extensionType;
1876 CHECK_POINTER_AND_RETURN(implicitStartProcessor_, ERR_IMPLICIT_START_ABILITY_FAIL);
1877 result = implicitStartProcessor_->ImplicitStartAbility(abilityRequest, validUserId);
1878 if (result != ERR_OK) {
1879 HILOG_ERROR("implicit start ability error.");
1880 eventInfo.errCode = result;
1881 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1882 }
1883 return result;
1884 }
1885 #endif
1886 result = GenerateExtensionAbilityRequest(want, abilityRequest, callerToken, validUserId);
1887 if (result != ERR_OK) {
1888 HILOG_ERROR("Generate ability request local error.");
1889 eventInfo.errCode = result;
1890 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1891 return result;
1892 }
1893
1894 auto abilityInfo = abilityRequest.abilityInfo;
1895 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
1896 HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
1897 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
1898
1899 result = CheckOptExtensionAbility(want, abilityRequest, validUserId, extensionType);
1900 if (result != ERR_OK) {
1901 HILOG_ERROR("CheckOptExtensionAbility error.");
1902 eventInfo.errCode = result;
1903 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1904 return result;
1905 }
1906
1907 #ifdef SUPPORT_ERMS
1908 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
1909 afterCheckExecuter_->DoProcess(abilityRequest.want, 0, GetUserId(), false);
1910 if (result != ERR_OK) {
1911 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
1912 return result;
1913 }
1914 #endif
1915
1916 auto connectManager = GetConnectManagerByUserId(validUserId);
1917 if (!connectManager) {
1918 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
1919 eventInfo.errCode = ERR_INVALID_VALUE;
1920 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1921 return ERR_INVALID_VALUE;
1922 }
1923 UpdateCallerInfo(abilityRequest.want, callerToken);
1924 HILOG_INFO("Start extension begin, name is %{public}s.", abilityInfo.name.c_str());
1925 eventInfo.errCode = connectManager->StartAbility(abilityRequest);
1926 if (eventInfo.errCode != ERR_OK) {
1927 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1928 }
1929 return eventInfo.errCode;
1930 }
1931
StartUIExtensionAbility(const sptr<SessionInfo> & extensionSessionInfo,int32_t userId)1932 int AbilityManagerService::StartUIExtensionAbility(const sptr<SessionInfo> &extensionSessionInfo, int32_t userId)
1933 {
1934 HILOG_DEBUG("Start ui extension ability come");
1935 CHECK_POINTER_AND_RETURN(extensionSessionInfo, ERR_INVALID_VALUE);
1936 std::string extensionTypeStr = extensionSessionInfo->want.GetStringParam(UIEXTENSION_TYPE_KEY);
1937 AppExecFwk::ExtensionAbilityType extensionType = extensionTypeStr.empty() ?
1938 AppExecFwk::ExtensionAbilityType::UI : AppExecFwk::ConvertToExtensionAbilityType(extensionTypeStr);
1939 EventInfo eventInfo = BuildEventInfo(extensionSessionInfo->want, userId);
1940 eventInfo.extensionType = static_cast<int32_t>(extensionType);
1941 EventReport::SendExtensionEvent(EventName::START_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
1942
1943 sptr<IRemoteObject> callerToken = extensionSessionInfo->callerToken;
1944
1945 if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, extensionSessionInfo->want) ||
1946 VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
1947 !DlpUtils::DlpAccessOtherAppsCheck(callerToken, extensionSessionInfo->want)) {
1948 HILOG_ERROR("StartUIExtensionAbility: Permission verification failed.");
1949 eventInfo.errCode = CHECK_PERMISSION_FAILED;
1950 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1951 return CHECK_PERMISSION_FAILED;
1952 }
1953
1954 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
1955 HILOG_ERROR("StartUIExtensionAbility VerificationAllToken failed.");
1956 eventInfo.errCode = ERR_INVALID_VALUE;
1957 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1958 return ERR_INVALID_CALLER;
1959 }
1960
1961 auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
1962 if (callerRecord == nullptr || !JudgeSelfCalled(callerRecord)) {
1963 HILOG_ERROR("invalid callerToken.");
1964 eventInfo.errCode = ERR_INVALID_VALUE;
1965 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1966 return ERR_INVALID_CALLER;
1967 }
1968
1969 auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
1970 interceptorExecuter_->DoProcess(extensionSessionInfo->want, 0, GetUserId(), false);
1971 if (result != ERR_OK) {
1972 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
1973 eventInfo.errCode = result;
1974 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1975 return result;
1976 }
1977
1978 int32_t validUserId = GetValidUserId(userId);
1979 if (!JudgeMultiUserConcurrency(validUserId)) {
1980 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
1981 eventInfo.errCode = ERR_INVALID_VALUE;
1982 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1983 return ERR_INVALID_VALUE;
1984 }
1985
1986 if (ImplicitStartProcessor::IsImplicitStartAction(extensionSessionInfo->want)) {
1987 HILOG_ERROR("UI extension ability donot support implicit start.");
1988 eventInfo.errCode = ERR_INVALID_VALUE;
1989 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
1990 return ERR_INVALID_VALUE;
1991 }
1992
1993 AbilityRequest abilityRequest;
1994 abilityRequest.Voluation(extensionSessionInfo->want, DEFAULT_INVAL_VALUE, callerToken);
1995 abilityRequest.callType = AbilityCallType::START_EXTENSION_TYPE;
1996 abilityRequest.sessionInfo = extensionSessionInfo;
1997 result = GenerateExtensionAbilityRequest(extensionSessionInfo->want, abilityRequest, callerToken, validUserId);
1998 if (result != ERR_OK) {
1999 HILOG_ERROR("Generate ability request local error.");
2000 eventInfo.errCode = result;
2001 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2002 return result;
2003 }
2004 abilityRequest.extensionType = abilityRequest.abilityInfo.extensionAbilityType;
2005
2006 auto abilityInfo = abilityRequest.abilityInfo;
2007 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
2008 HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
2009 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
2010
2011 result = CheckOptExtensionAbility(extensionSessionInfo->want, abilityRequest, validUserId, extensionType);
2012 if (result != ERR_OK) {
2013 HILOG_ERROR("CheckOptExtensionAbility error.");
2014 eventInfo.errCode = result;
2015 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2016 return result;
2017 }
2018
2019 result = JudgeAbilityVisibleControl(abilityInfo);
2020 if (result != ERR_OK) {
2021 HILOG_ERROR("JudgeAbilityVisibleControl error.");
2022 eventInfo.errCode = result;
2023 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2024 return result;
2025 }
2026
2027 #ifdef SUPPORT_ERMS
2028 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
2029 afterCheckExecuter_->DoProcess(abilityRequest.want, 0, GetUserId(), false);
2030 if (result != ERR_OK) {
2031 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
2032 return result;
2033 }
2034 #endif
2035
2036 auto connectManager = GetConnectManagerByUserId(validUserId);
2037 if (!connectManager) {
2038 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
2039 eventInfo.errCode = ERR_INVALID_VALUE;
2040 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2041 return ERR_INVALID_VALUE;
2042 }
2043 HILOG_INFO("Start extension begin, name is %{public}s.", abilityInfo.name.c_str());
2044 eventInfo.errCode = connectManager->StartAbility(abilityRequest);
2045 if (eventInfo.errCode != ERR_OK) {
2046 EventReport::SendExtensionEvent(EventName::START_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2047 }
2048 return eventInfo.errCode;
2049 }
2050
StopExtensionAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,AppExecFwk::ExtensionAbilityType extensionType)2051 int AbilityManagerService::StopExtensionAbility(const Want &want, const sptr<IRemoteObject> &callerToken,
2052 int32_t userId, AppExecFwk::ExtensionAbilityType extensionType)
2053 {
2054 HILOG_INFO("Stop extension ability come, bundlename: %{public}s, ability is %{public}s, userId is %{public}d",
2055 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
2056 CHECK_CALLER_IS_SYSTEM_APP;
2057 EventInfo eventInfo = BuildEventInfo(want, userId);
2058 eventInfo.extensionType = static_cast<int32_t>(extensionType);
2059 EventReport::SendExtensionEvent(EventName::STOP_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
2060
2061 auto result = CheckDlpForExtension(want, callerToken, userId, eventInfo, EventName::STOP_EXTENSION_ERROR);
2062 if (result != ERR_OK) {
2063 HILOG_ERROR("CheckDlpForExtension error.");
2064 return result;
2065 }
2066
2067 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
2068 HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
2069 if (!AAFwk::PermissionVerification::GetInstance()->CheckSpecificSystemAbilityAccessPermission()) {
2070 HILOG_ERROR("VerificationAllToken failed.");
2071 eventInfo.errCode = ERR_INVALID_VALUE;
2072 EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2073 return ERR_INVALID_CALLER;
2074 }
2075 HILOG_DEBUG("Caller is specific system ability.");
2076 }
2077
2078 int32_t validUserId = GetValidUserId(userId);
2079 if (!JudgeMultiUserConcurrency(validUserId)) {
2080 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
2081 eventInfo.errCode = ERR_INVALID_VALUE;
2082 EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2083 return ERR_CROSS_USER;
2084 }
2085
2086 if (callerToken != nullptr && CheckIfOperateRemote(want)) {
2087 auto callerUid = IPCSkeleton::GetCallingUid();
2088 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
2089 DistributedClient dmsClient;
2090 return dmsClient.StopRemoteExtensionAbility(want, callerUid, accessToken, eventInfo.extensionType);
2091 }
2092
2093 AbilityRequest abilityRequest;
2094 result = GenerateExtensionAbilityRequest(want, abilityRequest, callerToken, validUserId);
2095 if (result != ERR_OK) {
2096 HILOG_ERROR("Generate ability request local error.");
2097 eventInfo.errCode = result;
2098 EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2099 return result;
2100 }
2101
2102 auto abilityInfo = abilityRequest.abilityInfo;
2103 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
2104 HILOG_DEBUG("userId is : %{public}d, singleton is : %{public}d",
2105 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
2106
2107 result = CheckOptExtensionAbility(want, abilityRequest, validUserId, extensionType);
2108 if (result != ERR_OK) {
2109 HILOG_ERROR("CheckOptExtensionAbility error.");
2110 eventInfo.errCode = result;
2111 EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2112 return result;
2113 }
2114
2115 auto connectManager = GetConnectManagerByUserId(validUserId);
2116 if (!connectManager) {
2117 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
2118 eventInfo.errCode = ERR_INVALID_VALUE;
2119 EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2120 return ERR_INVALID_VALUE;
2121 }
2122 HILOG_INFO("Stop extension begin, name is %{public}s.", abilityInfo.name.c_str());
2123 eventInfo.errCode = connectManager->StopServiceAbility(abilityRequest);
2124 if (eventInfo.errCode != ERR_OK) {
2125 EventReport::SendExtensionEvent(EventName::STOP_EXTENSION_ERROR, HiSysEventType::FAULT, eventInfo);
2126 }
2127 return eventInfo.errCode;
2128 }
2129
MoveAbilityToBackground(const sptr<IRemoteObject> & token)2130 int AbilityManagerService::MoveAbilityToBackground(const sptr<IRemoteObject> &token)
2131 {
2132 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2133 HILOG_DEBUG("Move ability to background begin");
2134 if (!VerificationAllToken(token)) {
2135 return ERR_INVALID_VALUE;
2136 }
2137 auto abilityRecord = Token::GetAbilityRecordByToken(token);
2138 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2139 if (!JudgeSelfCalled(abilityRecord)) {
2140 return CHECK_PERMISSION_FAILED;
2141 }
2142
2143 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
2144 return ERR_WOULD_BLOCK;
2145 }
2146
2147 auto ownerUserId = abilityRecord->GetOwnerMissionUserId();
2148 auto missionListManager = GetListManagerByUserId(ownerUserId);
2149 if (!missionListManager) {
2150 HILOG_ERROR("missionListManager is Null. ownerUserId=%{public}d", ownerUserId);
2151 return ERR_INVALID_VALUE;
2152 }
2153 return missionListManager->MoveAbilityToBackground(abilityRecord);
2154 }
2155
TerminateAbility(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant)2156 int AbilityManagerService::TerminateAbility(const sptr<IRemoteObject> &token, int resultCode, const Want *resultWant)
2157 {
2158 auto abilityRecord = Token::GetAbilityRecordByToken(token);
2159 if (!abilityRecord) {
2160 HILOG_ERROR("abilityRecord is Null.");
2161 return ERR_INVALID_VALUE;
2162 }
2163 return TerminateAbilityWithFlag(token, resultCode, resultWant, true);
2164 }
2165
CloseAbility(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant)2166 int AbilityManagerService::CloseAbility(const sptr<IRemoteObject> &token, int resultCode, const Want *resultWant)
2167 {
2168 EventInfo eventInfo;
2169 EventReport::SendAbilityEvent(EventName::CLOSE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
2170 return TerminateAbilityWithFlag(token, resultCode, resultWant, false);
2171 }
2172
TerminateAbilityWithFlag(const sptr<IRemoteObject> & token,int resultCode,const Want * resultWant,bool flag)2173 int AbilityManagerService::TerminateAbilityWithFlag(const sptr<IRemoteObject> &token, int resultCode,
2174 const Want *resultWant, bool flag)
2175 {
2176 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2177 HILOG_DEBUG("Terminate ability begin, flag:%{public}d.", flag);
2178 if (!VerificationAllToken(token)) {
2179 HILOG_ERROR("%{public}s VerificationAllToken failed.", __func__);
2180 return ERR_INVALID_VALUE;
2181 }
2182
2183 auto abilityRecord = Token::GetAbilityRecordByToken(token);
2184 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2185 if (!JudgeSelfCalled(abilityRecord)) {
2186 return CHECK_PERMISSION_FAILED;
2187 }
2188
2189 if (IsSystemUiApp(abilityRecord->GetAbilityInfo())) {
2190 HILOG_ERROR("System ui not allow terminate.");
2191 return ERR_INVALID_VALUE;
2192 }
2193
2194 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
2195 auto type = abilityRecord->GetAbilityInfo().type;
2196 if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
2197 auto connectManager = GetConnectManagerByUserId(userId);
2198 if (!connectManager) {
2199 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
2200 return ERR_INVALID_VALUE;
2201 }
2202 return connectManager->TerminateAbility(token);
2203 }
2204
2205 if (type == AppExecFwk::AbilityType::DATA) {
2206 HILOG_ERROR("Cannot terminate data ability, use 'ReleaseDataAbility()' instead.");
2207 return ERR_WRONG_INTERFACE_CALL;
2208 }
2209
2210 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
2211 return ERR_WOULD_BLOCK;
2212 }
2213
2214 auto ownerUserId = abilityRecord->GetOwnerMissionUserId();
2215 auto missionListManager = GetListManagerByUserId(ownerUserId);
2216 if (missionListManager == nullptr) {
2217 HILOG_ERROR("missionListManager is Null. ownerUserId=%{public}d", ownerUserId);
2218 return ERR_INVALID_VALUE;
2219 }
2220 NotifyHandleAbilityStateChange(token, TERMINATE_ABILITY_CODE);
2221 return missionListManager->TerminateAbility(abilityRecord, resultCode, resultWant, flag);
2222 }
2223
TerminateUIExtensionAbility(const sptr<SessionInfo> & extensionSessionInfo,int resultCode,const Want * resultWant)2224 int AbilityManagerService::TerminateUIExtensionAbility(const sptr<SessionInfo> &extensionSessionInfo, int resultCode,
2225 const Want *resultWant)
2226 {
2227 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2228 HILOG_DEBUG("Terminate ui extension ability begin.");
2229 CHECK_POINTER_AND_RETURN(extensionSessionInfo, ERR_INVALID_VALUE);
2230 auto abilityRecord = Token::GetAbilityRecordByToken(extensionSessionInfo->callerToken);
2231 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2232 std::shared_ptr<AbilityConnectManager> connectManager;
2233 std::shared_ptr<AbilityRecord> targetRecord;
2234 GetConnectManagerAndUIExtensionBySessionInfo(extensionSessionInfo, connectManager, targetRecord);
2235 CHECK_POINTER_AND_RETURN(targetRecord, ERR_INVALID_VALUE);
2236 CHECK_POINTER_AND_RETURN(connectManager, ERR_INVALID_VALUE);
2237
2238 if (!JudgeSelfCalled(targetRecord) && !JudgeSelfCalled(abilityRecord)) {
2239 return CHECK_PERMISSION_FAILED;
2240 }
2241
2242 auto result = JudgeAbilityVisibleControl(targetRecord->GetAbilityInfo());
2243 if (result != ERR_OK) {
2244 HILOG_ERROR("JudgeAbilityVisibleControl error.");
2245 return result;
2246 }
2247
2248 if (!UIExtensionUtils::IsUIExtension(targetRecord->GetAbilityInfo().extensionAbilityType)) {
2249 HILOG_ERROR("Cannot terminate except ui extension ability.");
2250 return ERR_WRONG_INTERFACE_CALL;
2251 }
2252 connectManager->CommandAbilityWindow(targetRecord, extensionSessionInfo, WIN_CMD_DESTROY);
2253 return ERR_OK;
2254 }
2255
CloseUIAbilityBySCB(const sptr<SessionInfo> & sessionInfo)2256 int AbilityManagerService::CloseUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo)
2257 {
2258 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2259 HILOG_DEBUG("call");
2260 if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) {
2261 HILOG_ERROR("sessionInfo is nullptr");
2262 return ERR_INVALID_VALUE;
2263 }
2264
2265 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
2266 HILOG_ERROR("Not sceneboard called, not allowed.");
2267 return ERR_WRONG_INTERFACE_CALL;
2268 }
2269
2270 if (!uiAbilityLifecycleManager_) {
2271 HILOG_ERROR("failed, uiAbilityLifecycleManager is nullptr");
2272 return ERR_INVALID_VALUE;
2273 }
2274 auto abilityRecord = uiAbilityLifecycleManager_->GetUIAbilityRecordBySessionInfo(sessionInfo);
2275 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2276 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
2277 return ERR_WOULD_BLOCK;
2278 }
2279
2280 if (sessionInfo->isClearSession) {
2281 const auto &abilityInfo = abilityRecord->GetAbilityInfo();
2282 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
2283 DeleteAbilityRecoverInfo(abilityInfo.bundleName, abilityInfo.moduleName, abilityInfo.name);
2284 }
2285
2286 EventInfo eventInfo;
2287 eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
2288 eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
2289 EventReport::SendAbilityEvent(EventName::CLOSE_UI_ABILITY_BY_SCB, HiSysEventType::BEHAVIOR, eventInfo);
2290 eventInfo.errCode = uiAbilityLifecycleManager_->CloseUIAbility(abilityRecord, sessionInfo->resultCode,
2291 &(sessionInfo->want));
2292 if (eventInfo.errCode != ERR_OK) {
2293 EventReport::SendAbilityEvent(EventName::CLOSE_UI_ABILITY_BY_SCB_ERROR, HiSysEventType::FAULT, eventInfo);
2294 }
2295 return eventInfo.errCode;
2296 }
2297
SendResultToAbility(int32_t requestCode,int32_t resultCode,Want & resultWant)2298 int AbilityManagerService::SendResultToAbility(int32_t requestCode, int32_t resultCode, Want &resultWant)
2299 {
2300 HILOG_INFO("%{public}s", __func__);
2301 Security::AccessToken::NativeTokenInfo nativeTokenInfo;
2302 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
2303 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(accessToken);
2304 int32_t result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(accessToken, nativeTokenInfo);
2305 if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE ||
2306 result != ERR_OK || nativeTokenInfo.processName != DMS_PROCESS_NAME) {
2307 HILOG_ERROR("Check processName failed");
2308 return ERR_INVALID_VALUE;
2309 }
2310 int missionId = resultWant.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID);
2311 resultWant.RemoveParam(DMS_MISSION_ID);
2312 if (missionId == DEFAULT_DMS_MISSION_ID) {
2313 HILOG_ERROR("MissionId is empty");
2314 return ERR_INVALID_VALUE;
2315 }
2316 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2317 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
2318 abilityRecord = uiAbilityLifecycleManager_->GetAbilityRecordsById(missionId);
2319 } else {
2320 sptr<IRemoteObject> abilityToken = GetAbilityTokenByMissionId(missionId);
2321 CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
2322 abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
2323 }
2324 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2325
2326 abilityRecord->SetResult(std::make_shared<AbilityResult>(requestCode, resultCode, resultWant));
2327 abilityRecord->SendResult(0, 0);
2328 return ERR_OK;
2329 }
2330
StartRemoteAbility(const Want & want,int requestCode,int32_t validUserId,const sptr<IRemoteObject> & callerToken)2331 int AbilityManagerService::StartRemoteAbility(const Want &want, int requestCode, int32_t validUserId,
2332 const sptr<IRemoteObject> &callerToken)
2333 {
2334 HILOG_INFO("%{public}s", __func__);
2335 Want remoteWant = want;
2336 if (AddStartControlParam(remoteWant, callerToken) != ERR_OK) {
2337 HILOG_ERROR("%{public}s AddStartControlParam failed.", __func__);
2338 return ERR_INVALID_VALUE;
2339 }
2340 if (AbilityUtil::IsStartFreeInstall(remoteWant)) {
2341 return freeInstallManager_ == nullptr ? ERR_INVALID_VALUE :
2342 freeInstallManager_->StartRemoteFreeInstall(remoteWant, requestCode, validUserId, callerToken);
2343 }
2344 if (remoteWant.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) {
2345 HILOG_INFO("%{public}s: try to StartAbilityForResult", __func__);
2346 int32_t missionId = -1;
2347 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
2348 missionId = uiAbilityLifecycleManager_->GetSessionIdByAbilityToken(callerToken);
2349 if (!missionId) {
2350 HILOG_ERROR("Invalid missionId id.");
2351 return ERR_INVALID_VALUE;
2352 }
2353 } else {
2354 missionId = GetMissionIdByAbilityToken(callerToken);
2355 }
2356 if (missionId < 0) {
2357 return ERR_INVALID_VALUE;
2358 }
2359 remoteWant.SetParam(DMS_MISSION_ID, missionId);
2360 }
2361
2362 int32_t callerUid = IPCSkeleton::GetCallingUid();
2363 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
2364 DistributedClient dmsClient;
2365 HILOG_DEBUG("get callerUid = %d, AccessTokenID = %u", callerUid, accessToken);
2366 int result = dmsClient.StartRemoteAbility(remoteWant, callerUid, requestCode, accessToken);
2367 if (result != ERR_NONE) {
2368 HILOG_ERROR("AbilityManagerService::StartRemoteAbility failed, result = %{public}d", result);
2369 }
2370 return result;
2371 }
2372
CheckIsRemote(const std::string & deviceId)2373 bool AbilityManagerService::CheckIsRemote(const std::string& deviceId)
2374 {
2375 if (deviceId.empty()) {
2376 HILOG_INFO("CheckIsRemote: deviceId is empty.");
2377 return false;
2378 }
2379 std::string localDeviceId;
2380 if (!GetLocalDeviceId(localDeviceId)) {
2381 HILOG_ERROR("CheckIsRemote: get local deviceId failed");
2382 return false;
2383 }
2384 if (localDeviceId == deviceId) {
2385 HILOG_INFO("CheckIsRemote: deviceId is local.");
2386 return false;
2387 }
2388 HILOG_DEBUG("CheckIsRemote, deviceId = %{public}s", AnonymizeDeviceId(deviceId).c_str());
2389 return true;
2390 }
2391
CheckIfOperateRemote(const Want & want)2392 bool AbilityManagerService::CheckIfOperateRemote(const Want &want)
2393 {
2394 std::string deviceId = want.GetElement().GetDeviceID();
2395 if (deviceId.empty() || want.GetElement().GetBundleName().empty() ||
2396 want.GetElement().GetAbilityName().empty()) {
2397 HILOG_DEBUG("CheckIfOperateRemote: DeviceId or BundleName or GetAbilityName empty");
2398 return false;
2399 }
2400 return CheckIsRemote(deviceId);
2401 }
2402
GetLocalDeviceId(std::string & localDeviceId)2403 bool AbilityManagerService::GetLocalDeviceId(std::string& localDeviceId)
2404 {
2405 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2406 auto localNode = std::make_unique<NodeBasicInfo>();
2407 int32_t errCode = GetLocalNodeDeviceInfo(DM_PKG_NAME.c_str(), localNode.get());
2408 if (errCode != ERR_OK) {
2409 HILOG_ERROR("AbilityManagerService::GetLocalNodeDeviceInfo errCode = %{public}d", errCode);
2410 return false;
2411 }
2412 if (localNode != nullptr) {
2413 localDeviceId = localNode->networkId;
2414 HILOG_DEBUG("get local deviceId, deviceId = %{public}s",
2415 AnonymizeDeviceId(localDeviceId).c_str());
2416 return true;
2417 }
2418 HILOG_ERROR("AbilityManagerService::GetLocalDeviceId localDeviceId null");
2419 return false;
2420 }
2421
AnonymizeDeviceId(const std::string & deviceId)2422 std::string AbilityManagerService::AnonymizeDeviceId(const std::string& deviceId)
2423 {
2424 if (deviceId.length() < NON_ANONYMIZE_LENGTH) {
2425 return EMPTY_DEVICE_ID;
2426 }
2427 std::string anonDeviceId = deviceId.substr(0, NON_ANONYMIZE_LENGTH);
2428 anonDeviceId.append("******");
2429 return anonDeviceId;
2430 }
2431
MinimizeAbility(const sptr<IRemoteObject> & token,bool fromUser)2432 int AbilityManagerService::MinimizeAbility(const sptr<IRemoteObject> &token, bool fromUser)
2433 {
2434 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2435 HILOG_INFO("Minimize ability, fromUser:%{public}d.", fromUser);
2436 if (!VerificationAllToken(token)) {
2437 return ERR_INVALID_VALUE;
2438 }
2439
2440 auto abilityRecord = Token::GetAbilityRecordByToken(token);
2441 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2442 if (!JudgeSelfCalled(abilityRecord)) {
2443 return CHECK_PERMISSION_FAILED;
2444 }
2445
2446 auto type = abilityRecord->GetAbilityInfo().type;
2447 if (type != AppExecFwk::AbilityType::PAGE) {
2448 HILOG_ERROR("Cannot minimize except page ability.");
2449 return ERR_WRONG_INTERFACE_CALL;
2450 }
2451
2452 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
2453 return ERR_WOULD_BLOCK;
2454 }
2455
2456 auto missionListManager = GetListManagerByUserId(abilityRecord->GetOwnerMissionUserId());
2457 if (!missionListManager) {
2458 HILOG_ERROR("missionListManager is Null.");
2459 return ERR_INVALID_VALUE;
2460 }
2461 return missionListManager->MinimizeAbility(token, fromUser);
2462 }
2463
MinimizeUIExtensionAbility(const sptr<SessionInfo> & extensionSessionInfo,bool fromUser)2464 int AbilityManagerService::MinimizeUIExtensionAbility(const sptr<SessionInfo> &extensionSessionInfo,
2465 bool fromUser)
2466 {
2467 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2468 HILOG_INFO("Minimize ui extension ability, fromUser:%{public}d.", fromUser);
2469 CHECK_POINTER_AND_RETURN(extensionSessionInfo, ERR_INVALID_VALUE);
2470 auto abilityRecord = Token::GetAbilityRecordByToken(extensionSessionInfo->callerToken);
2471 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2472 if (!JudgeSelfCalled(abilityRecord)) {
2473 return CHECK_PERMISSION_FAILED;
2474 }
2475
2476 std::shared_ptr<AbilityConnectManager> connectManager;
2477 std::shared_ptr<AbilityRecord> targetRecord;
2478 GetConnectManagerAndUIExtensionBySessionInfo(extensionSessionInfo, connectManager, targetRecord);
2479 CHECK_POINTER_AND_RETURN(targetRecord, ERR_INVALID_VALUE);
2480 CHECK_POINTER_AND_RETURN(connectManager, ERR_INVALID_VALUE);
2481
2482 auto result = JudgeAbilityVisibleControl(targetRecord->GetAbilityInfo());
2483 if (result != ERR_OK) {
2484 HILOG_ERROR("JudgeAbilityVisibleControl error.");
2485 return result;
2486 }
2487
2488 if (!UIExtensionUtils::IsUIExtension(targetRecord->GetAbilityInfo().extensionAbilityType)) {
2489 HILOG_ERROR("Cannot minimize except ui extension ability.");
2490 return ERR_WRONG_INTERFACE_CALL;
2491 }
2492 connectManager->CommandAbilityWindow(targetRecord, extensionSessionInfo, WIN_CMD_BACKGROUND);
2493 return ERR_OK;
2494 }
2495
MinimizeUIAbilityBySCB(const sptr<SessionInfo> & sessionInfo,bool fromUser)2496 int AbilityManagerService::MinimizeUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo, bool fromUser)
2497 {
2498 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2499 HILOG_DEBUG("call");
2500 if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) {
2501 HILOG_ERROR("sessionInfo is nullptr");
2502 return ERR_INVALID_VALUE;
2503 }
2504
2505 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
2506 HILOG_ERROR("Not sceneboard called, not allowed.");
2507 return ERR_WRONG_INTERFACE_CALL;
2508 }
2509
2510 if (!uiAbilityLifecycleManager_) {
2511 HILOG_ERROR("failed, uiAbilityLifecycleManager is nullptr");
2512 return ERR_INVALID_VALUE;
2513 }
2514 auto abilityRecord = uiAbilityLifecycleManager_->GetUIAbilityRecordBySessionInfo(sessionInfo);
2515 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2516 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
2517 return ERR_WOULD_BLOCK;
2518 }
2519
2520 return uiAbilityLifecycleManager_->MinimizeUIAbility(abilityRecord, fromUser);
2521 }
2522
ConnectAbility(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,int32_t userId)2523 int AbilityManagerService::ConnectAbility(
2524 const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, int32_t userId)
2525 {
2526 return ConnectAbilityCommon(want, connect, callerToken, AppExecFwk::ExtensionAbilityType::SERVICE, userId);
2527 }
2528
ConnectAbilityCommon(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,AppExecFwk::ExtensionAbilityType extensionType,int32_t userId)2529 int AbilityManagerService::ConnectAbilityCommon(
2530 const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken,
2531 AppExecFwk::ExtensionAbilityType extensionType, int32_t userId)
2532 {
2533 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2534 HILOG_DEBUG("Connect ability called, element uri: %{public}s.", want.GetElement().GetURI().c_str());
2535 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2536 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2537 if (extensionType == AppExecFwk::ExtensionAbilityType::SERVICE && IsCrossUserCall(userId)) {
2538 CHECK_CALLER_IS_SYSTEM_APP;
2539 }
2540 EventInfo eventInfo = BuildEventInfo(want, userId);
2541 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
2542
2543 auto result = CheckDlpForExtension(want, callerToken, userId, eventInfo, EventName::CONNECT_SERVICE_ERROR);
2544 if (result != ERR_OK) {
2545 HILOG_ERROR("CheckDlpForExtension error.");
2546 eventInfo.errCode = result;
2547 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2548 return result;
2549 }
2550
2551 result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
2552 interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
2553 if (result != ERR_OK) {
2554 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
2555 eventInfo.errCode = result;
2556 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2557 return result;
2558 }
2559
2560 int32_t validUserId = GetValidUserId(userId);
2561
2562 if (AbilityUtil::IsStartFreeInstall(want) && freeInstallManager_ != nullptr) {
2563 std::string localDeviceId;
2564 if (!GetLocalDeviceId(localDeviceId)) {
2565 HILOG_ERROR("%{public}s: Get Local DeviceId failed", __func__);
2566 eventInfo.errCode = ERR_INVALID_VALUE;
2567 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2568 return ERR_INVALID_VALUE;
2569 }
2570 result = freeInstallManager_->ConnectFreeInstall(want, validUserId, callerToken, localDeviceId);
2571 if (result != ERR_OK) {
2572 eventInfo.errCode = result;
2573 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2574 return result;
2575 }
2576 }
2577
2578 Want abilityWant = want;
2579 AbilityRequest abilityRequest;
2580 std::string uri = abilityWant.GetUri().ToString();
2581 if (!uri.empty()) {
2582 // if the want include uri, it may only has uri information. it is probably a datashare extension.
2583 HILOG_INFO("%{public}s called. uri:%{public}s, userId %{public}d", __func__, uri.c_str(), validUserId);
2584 AppExecFwk::ExtensionAbilityInfo extensionInfo;
2585 auto bms = GetBundleManager();
2586 CHECK_POINTER_AND_RETURN(bms, ERR_INVALID_VALUE);
2587
2588 abilityWant.SetParam("abilityConnectionObj", connect->AsObject());
2589 ComponentRequest componentRequest = initComponentRequest(callerToken);
2590 if (!IsComponentInterceptionStart(abilityWant, componentRequest, abilityRequest)) {
2591 return componentRequest.requestResult;
2592 }
2593 abilityWant.RemoveParam("abilityConnectionObj");
2594
2595 bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfoByUri(uri, validUserId, extensionInfo));
2596 if (!queryResult || extensionInfo.name.empty() || extensionInfo.bundleName.empty()) {
2597 HILOG_ERROR("Invalid extension ability info.");
2598 eventInfo.errCode = ERR_INVALID_VALUE;
2599 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2600 return ERR_INVALID_VALUE;
2601 }
2602 abilityWant.SetElementName(extensionInfo.bundleName, extensionInfo.name);
2603 }
2604
2605 if (CheckIfOperateRemote(abilityWant)) {
2606 HILOG_INFO("AbilityManagerService::ConnectAbility. try to ConnectRemoteAbility");
2607 eventInfo.errCode = ConnectRemoteAbility(abilityWant, callerToken, connect->AsObject());
2608 if (eventInfo.errCode != ERR_OK) {
2609 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2610 }
2611 return eventInfo.errCode;
2612 }
2613 UpdateCallerInfo(abilityWant, callerToken);
2614
2615 #ifdef SUPPORT_ERMS
2616 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
2617 afterCheckExecuter_->DoProcess(abilityRequest.want, 0, GetUserId(), false);
2618 if (result != ERR_OK) {
2619 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
2620 return result;
2621 }
2622 #endif
2623
2624 if (callerToken != nullptr && callerToken->GetObjectDescriptor() != u"ohos.aafwk.AbilityToken") {
2625 HILOG_INFO("%{public}s invalid Token.", __func__);
2626 eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, nullptr, extensionType);
2627 if (eventInfo.errCode != ERR_OK) {
2628 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2629 }
2630 return eventInfo.errCode;
2631 }
2632 eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, callerToken, extensionType);
2633 if (eventInfo.errCode != ERR_OK) {
2634 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2635 }
2636 return eventInfo.errCode;
2637 }
2638
ConnectUIExtensionAbility(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<SessionInfo> & sessionInfo,int32_t userId)2639 int AbilityManagerService::ConnectUIExtensionAbility(const Want &want, const sptr<IAbilityConnection> &connect,
2640 const sptr<SessionInfo> &sessionInfo, int32_t userId)
2641 {
2642 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2643 HILOG_DEBUG("Connect ui extension called, bundlename: %{public}s, ability is %{public}s, userId is %{pravite}d",
2644 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
2645 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2646 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2647 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
2648
2649 if (IsCrossUserCall(userId)) {
2650 CHECK_CALLER_IS_SYSTEM_APP;
2651 }
2652
2653 EventInfo eventInfo = BuildEventInfo(want, userId);
2654 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
2655 sptr<IRemoteObject> callerToken = sessionInfo->callerToken;
2656
2657 if (callerToken != nullptr && !VerificationAllToken(callerToken)) {
2658 HILOG_ERROR("ConnectUIExtensionAbility VerificationAllToken failed.");
2659 eventInfo.errCode = ERR_INVALID_VALUE;
2660 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2661 return ERR_INVALID_CALLER;
2662 }
2663
2664 auto result = CheckDlpForExtension(want, callerToken, userId, eventInfo, EventName::CONNECT_SERVICE_ERROR);
2665 if (result != ERR_OK) {
2666 HILOG_ERROR("CheckDlpForExtension error.");
2667 eventInfo.errCode = result;
2668 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2669 return result;
2670 }
2671
2672 result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
2673 interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
2674 if (result != ERR_OK) {
2675 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
2676 eventInfo.errCode = result;
2677 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2678 return result;
2679 }
2680
2681 int32_t validUserId = GetValidUserId(userId);
2682
2683 Want abilityWant = want;
2684 AbilityRequest abilityRequest;
2685 std::string uri = abilityWant.GetUri().ToString();
2686 if (!uri.empty()) {
2687 // if the want include uri, it may only has uri information.
2688 HILOG_INFO("%{public}s called. uri:%{public}s, userId %{public}d", __func__, uri.c_str(), validUserId);
2689 AppExecFwk::ExtensionAbilityInfo extensionInfo;
2690 auto bms = GetBundleManager();
2691 CHECK_POINTER_AND_RETURN(bms, ERR_INVALID_VALUE);
2692
2693 abilityWant.SetParam("abilityConnectionObj", connect->AsObject());
2694 ComponentRequest componentRequest = initComponentRequest(callerToken);
2695 if (!IsComponentInterceptionStart(abilityWant, componentRequest, abilityRequest)) {
2696 return componentRequest.requestResult;
2697 }
2698 abilityWant.RemoveParam("abilityConnectionObj");
2699
2700 bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfoByUri(uri, validUserId, extensionInfo));
2701 if (!queryResult || extensionInfo.name.empty() || extensionInfo.bundleName.empty()) {
2702 HILOG_ERROR("Invalid extension ability info.");
2703 eventInfo.errCode = ERR_INVALID_VALUE;
2704 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2705 return ERR_INVALID_VALUE;
2706 }
2707 abilityWant.SetElementName(extensionInfo.bundleName, extensionInfo.name);
2708 }
2709
2710 UpdateCallerInfo(abilityWant, callerToken);
2711
2712 #ifdef SUPPORT_ERMS
2713 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
2714 afterCheckExecuter_->DoProcess(abilityRequest.want, 0, GetUserId(), false);
2715 if (result != ERR_OK) {
2716 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
2717 return result;
2718 }
2719 #endif
2720
2721 if (callerToken != nullptr && callerToken->GetObjectDescriptor() != u"ohos.aafwk.AbilityToken") {
2722 HILOG_INFO("%{public}s invalid Token.", __func__);
2723 eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, nullptr,
2724 AppExecFwk::ExtensionAbilityType::UI, sessionInfo);
2725 if (eventInfo.errCode != ERR_OK) {
2726 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2727 }
2728 return eventInfo.errCode;
2729 }
2730 eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, callerToken,
2731 AppExecFwk::ExtensionAbilityType::UI, sessionInfo);
2732 if (eventInfo.errCode != ERR_OK) {
2733 EventReport::SendExtensionEvent(EventName::CONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2734 }
2735 return eventInfo.errCode;
2736 }
2737
BuildEventInfo(const Want & want,int32_t userId)2738 EventInfo AbilityManagerService::BuildEventInfo(const Want &want, int32_t userId)
2739 {
2740 EventInfo eventInfo;
2741 eventInfo.userId = userId;
2742 eventInfo.bundleName = want.GetElement().GetBundleName();
2743 eventInfo.moduleName = want.GetElement().GetModuleName();
2744 eventInfo.abilityName = want.GetElement().GetAbilityName();
2745 return eventInfo;
2746 }
2747
DisconnectAbility(const sptr<IAbilityConnection> & connect)2748 int AbilityManagerService::DisconnectAbility(const sptr<IAbilityConnection> &connect)
2749 {
2750 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2751 HILOG_DEBUG("Disconnect ability begin.");
2752 EventInfo eventInfo;
2753 EventReport::SendExtensionEvent(EventName::DISCONNECT_SERVICE, HiSysEventType::BEHAVIOR, eventInfo);
2754 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2755 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2756
2757 if (ERR_OK != DisconnectLocalAbility(connect) &&
2758 ERR_OK != DisconnectRemoteAbility(connect->AsObject())) {
2759 eventInfo.errCode = INNER_ERR;
2760 EventReport::SendExtensionEvent(EventName::DISCONNECT_SERVICE_ERROR, HiSysEventType::FAULT, eventInfo);
2761 }
2762 return ERR_OK;
2763 }
2764
ConnectLocalAbility(const Want & want,const int32_t userId,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,AppExecFwk::ExtensionAbilityType extensionType,const sptr<SessionInfo> & sessionInfo)2765 int AbilityManagerService::ConnectLocalAbility(const Want &want, const int32_t userId,
2766 const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken,
2767 AppExecFwk::ExtensionAbilityType extensionType, const sptr<SessionInfo> &sessionInfo)
2768 {
2769 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2770 HILOG_INFO("Connect local ability begin.");
2771 if (!JudgeMultiUserConcurrency(userId)) {
2772 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
2773 return ERR_CROSS_USER;
2774 }
2775
2776 AbilityRequest abilityRequest;
2777 ErrCode result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, callerToken, userId);
2778 abilityRequest.sessionInfo = sessionInfo;
2779
2780 Want requestWant = want;
2781 CHECK_POINTER_AND_RETURN_LOG(connect, ERR_INVALID_VALUE, "connect is nullptr");
2782 CHECK_POINTER_AND_RETURN_LOG(connect->AsObject(), ERR_INVALID_VALUE, "abilityConnectionObj is nullptr");
2783 requestWant.SetParam("abilityConnectionObj", connect->AsObject());
2784 HILOG_DEBUG("requestWant SetParam success");
2785 ComponentRequest componentRequest = initComponentRequest(callerToken);
2786 if (!IsComponentInterceptionStart(requestWant, componentRequest, abilityRequest)) {
2787 return componentRequest.requestResult;
2788 }
2789
2790 if (result != ERR_OK) {
2791 HILOG_ERROR("Generate ability request error.");
2792 return result;
2793 }
2794
2795 if (abilityRequest.abilityInfo.isStageBasedModel) {
2796 bool isService = (abilityRequest.abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::SERVICE);
2797 if (isService && extensionType != AppExecFwk::ExtensionAbilityType::SERVICE) {
2798 HILOG_ERROR("Service extension type, please use ConnectAbility.");
2799 return ERR_WRONG_INTERFACE_CALL;
2800 }
2801 }
2802 auto abilityInfo = abilityRequest.abilityInfo;
2803 int32_t validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : userId;
2804 HILOG_DEBUG("validUserId : %{public}d, singleton is : %{public}d",
2805 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
2806
2807 result = CheckStaticCfgPermission(abilityInfo, false, -1);
2808 if (result != AppExecFwk::Constants::PERMISSION_GRANTED) {
2809 HILOG_ERROR("CheckStaticCfgPermission error, result is %{public}d.", result);
2810 return ERR_STATIC_CFG_PERMISSION;
2811 }
2812
2813 if (AAFwk::UIExtensionUtils::IsUIExtension(extensionType)) {
2814 AppExecFwk::ExtensionAbilityType targetExtensionType = abilityInfo.extensionAbilityType;
2815 if (targetExtensionType != AppExecFwk::ExtensionAbilityType::UI
2816 && targetExtensionType != AppExecFwk::ExtensionAbilityType::WINDOW) {
2817 HILOG_ERROR("Try to connect UI extension, but target ability is not UI extension.");
2818 return ERR_WRONG_INTERFACE_CALL;
2819 }
2820 }
2821
2822 auto type = abilityInfo.type;
2823 if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
2824 HILOG_ERROR("Connect ability failed, target ability is not Service.");
2825 return TARGET_ABILITY_NOT_SERVICE;
2826 }
2827 result = CheckCallServicePermission(abilityRequest);
2828 if (result != ERR_OK) {
2829 HILOG_ERROR("%{public}s CheckCallServicePermission error.", __func__);
2830 return result;
2831 }
2832 result = PreLoadAppDataAbilities(abilityInfo.bundleName, validUserId);
2833 if (result != ERR_OK) {
2834 HILOG_ERROR("ConnectAbility: App data ability preloading failed, '%{public}s', %{public}d",
2835 abilityInfo.bundleName.c_str(),
2836 result);
2837 return result;
2838 }
2839
2840 auto connectManager = GetConnectManagerByUserId(validUserId);
2841 if (connectManager == nullptr) {
2842 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", validUserId);
2843 return ERR_INVALID_VALUE;
2844 }
2845
2846 ReportEventToSuspendManager(abilityInfo);
2847 return connectManager->ConnectAbilityLocked(abilityRequest, connect, callerToken, sessionInfo);
2848 }
2849
ConnectRemoteAbility(Want & want,const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject> & connect)2850 int AbilityManagerService::ConnectRemoteAbility(Want &want, const sptr<IRemoteObject> &callerToken,
2851 const sptr<IRemoteObject> &connect)
2852 {
2853 HILOG_INFO("%{public}s begin ConnectAbilityRemote", __func__);
2854 if (AddStartControlParam(want, callerToken) != ERR_OK) {
2855 HILOG_ERROR("%{public}s AddStartControlParam failed.", __func__);
2856 return ERR_INVALID_VALUE;
2857 }
2858 DistributedClient dmsClient;
2859 return dmsClient.ConnectRemoteAbility(want, connect);
2860 }
2861
DisconnectLocalAbility(const sptr<IAbilityConnection> & connect)2862 int AbilityManagerService::DisconnectLocalAbility(const sptr<IAbilityConnection> &connect)
2863 {
2864 HILOG_INFO("Disconnect local ability begin.");
2865 CHECK_POINTER_AND_RETURN(connectManager_, ERR_NO_INIT);
2866 if (connectManager_->DisconnectAbilityLocked(connect) == ERR_OK) {
2867 return ERR_OK;
2868 }
2869 // If current connectManager_ does not exist connect, then try connectManagerU0
2870 auto connectManagerU0 = GetConnectManagerByUserId(U0_USER_ID);
2871 CHECK_POINTER_AND_RETURN(connectManagerU0, ERR_NO_INIT);
2872 return connectManagerU0->DisconnectAbilityLocked(connect);
2873 }
2874
DisconnectRemoteAbility(const sptr<IRemoteObject> & connect)2875 int AbilityManagerService::DisconnectRemoteAbility(const sptr<IRemoteObject> &connect)
2876 {
2877 HILOG_INFO("%{public}s begin DisconnectAbilityRemote", __func__);
2878 int32_t callerUid = IPCSkeleton::GetCallingUid();
2879 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
2880 DistributedClient dmsClient;
2881 return dmsClient.DisconnectRemoteAbility(connect, callerUid, accessToken);
2882 }
2883
ContinueMission(const std::string & srcDeviceId,const std::string & dstDeviceId,int32_t missionId,const sptr<IRemoteObject> & callBack,AAFwk::WantParams & wantParams)2884 int AbilityManagerService::ContinueMission(const std::string &srcDeviceId, const std::string &dstDeviceId,
2885 int32_t missionId, const sptr<IRemoteObject> &callBack, AAFwk::WantParams &wantParams)
2886 {
2887 HILOG_INFO("amsServ %{public}s called.", __func__);
2888 HILOG_INFO("ContinueMission missionId: %{public}d", missionId);
2889 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2890 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2891 return CHECK_PERMISSION_FAILED;
2892 }
2893
2894 DistributedClient dmsClient;
2895 return dmsClient.ContinueMission(srcDeviceId, dstDeviceId, missionId, callBack, wantParams);
2896 }
2897
ContinueMission(const std::string & srcDeviceId,const std::string & dstDeviceId,const std::string & bundleName,const sptr<IRemoteObject> & callBack,AAFwk::WantParams & wantParams)2898 int AbilityManagerService::ContinueMission(const std::string &srcDeviceId, const std::string &dstDeviceId,
2899 const std::string &bundleName, const sptr<IRemoteObject> &callBack, AAFwk::WantParams &wantParams)
2900 {
2901 HILOG_INFO("amsServ %{public}s called.", __func__);
2902 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2903 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2904 return CHECK_PERMISSION_FAILED;
2905 }
2906
2907 DistributedClient dmsClient;
2908 return dmsClient.ContinueMission(srcDeviceId, dstDeviceId, bundleName, callBack, wantParams);
2909 }
2910
ContinueAbility(const std::string & deviceId,int32_t missionId,uint32_t versionCode)2911 int AbilityManagerService::ContinueAbility(const std::string &deviceId, int32_t missionId, uint32_t versionCode)
2912 {
2913 HILOG_INFO("ContinueAbility missionId = %{public}d, version = %{public}u.", missionId, versionCode);
2914
2915 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2916 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
2917 abilityRecord = uiAbilityLifecycleManager_->GetAbilityRecordsById(missionId);
2918 } else {
2919 sptr<IRemoteObject> abilityToken = GetAbilityTokenByMissionId(missionId);
2920 CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
2921 abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
2922 }
2923 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2924
2925 abilityRecord->ContinueAbility(deviceId, versionCode);
2926 return ERR_OK;
2927 }
2928
StartContinuation(const Want & want,const sptr<IRemoteObject> & abilityToken,int32_t status)2929 int AbilityManagerService::StartContinuation(const Want &want, const sptr<IRemoteObject> &abilityToken, int32_t status)
2930 {
2931 HILOG_INFO("Start Continuation.");
2932 if (!CheckIfOperateRemote(want)) {
2933 HILOG_ERROR("deviceId or bundle name or abilityName empty");
2934 return ERR_INVALID_VALUE;
2935 }
2936 CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
2937
2938 int32_t appUid = IPCSkeleton::GetCallingUid();
2939 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
2940 HILOG_INFO("AbilityManagerService::Try to StartContinuation, AccessTokenID = %{public}u", accessToken);
2941 int32_t missionId = -1;
2942 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
2943 missionId = uiAbilityLifecycleManager_->GetSessionIdByAbilityToken(abilityToken);
2944 if (!missionId) {
2945 HILOG_ERROR("Invalid missionId id.");
2946 return ERR_INVALID_VALUE;
2947 }
2948 } else {
2949 missionId = GetMissionIdByAbilityToken(abilityToken);
2950 }
2951 if (missionId < 0) {
2952 HILOG_ERROR("AbilityManagerService::StartContinuation failed to get missionId.");
2953 return ERR_INVALID_VALUE;
2954 }
2955 DistributedClient dmsClient;
2956 auto result = dmsClient.StartContinuation(want, missionId, appUid, status, accessToken);
2957 if (result != ERR_OK) {
2958 HILOG_ERROR("StartContinuation failed, result = %{public}d, notify caller", result);
2959 NotifyContinuationResult(missionId, result);
2960 }
2961 return result;
2962 }
2963
NotifyCompleteContinuation(const std::string & deviceId,int32_t sessionId,bool isSuccess)2964 void AbilityManagerService::NotifyCompleteContinuation(const std::string &deviceId,
2965 int32_t sessionId, bool isSuccess)
2966 {
2967 HILOG_INFO("NotifyCompleteContinuation.");
2968 DistributedClient dmsClient;
2969 dmsClient.NotifyCompleteContinuation(Str8ToStr16(deviceId), sessionId, isSuccess);
2970 }
2971
NotifyContinuationResult(int32_t missionId,int32_t result)2972 int AbilityManagerService::NotifyContinuationResult(int32_t missionId, int32_t result)
2973 {
2974 HILOG_INFO("Notify Continuation Result : %{public}d.", result);
2975
2976 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2977 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
2978 abilityRecord = uiAbilityLifecycleManager_->GetAbilityRecordsById(missionId);
2979 } else {
2980 sptr<IRemoteObject> abilityToken = GetAbilityTokenByMissionId(missionId);
2981 CHECK_POINTER_AND_RETURN(abilityToken, ERR_INVALID_VALUE);
2982 abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
2983 }
2984 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
2985
2986 abilityRecord->NotifyContinuationResult(result);
2987 return ERR_OK;
2988 }
2989
StartSyncRemoteMissions(const std::string & devId,bool fixConflict,int64_t tag)2990 int AbilityManagerService::StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag)
2991 {
2992 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
2993 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
2994 return CHECK_PERMISSION_FAILED;
2995 }
2996 DistributedClient dmsClient;
2997 return dmsClient.StartSyncRemoteMissions(devId, fixConflict, tag);
2998 }
2999
StopSyncRemoteMissions(const std::string & devId)3000 int AbilityManagerService::StopSyncRemoteMissions(const std::string& devId)
3001 {
3002 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3003 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3004 return CHECK_PERMISSION_FAILED;
3005 }
3006 DistributedClient dmsClient;
3007 return dmsClient.StopSyncRemoteMissions(devId);
3008 }
3009
RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> & observer)3010 int AbilityManagerService::RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer)
3011 {
3012 return DelayedSingleton<ConnectionStateManager>::GetInstance()->RegisterObserver(observer);
3013 }
3014
UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> & observer)3015 int AbilityManagerService::UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer)
3016 {
3017 return DelayedSingleton<ConnectionStateManager>::GetInstance()->UnregisterObserver(observer);
3018 }
3019
GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> & infos)3020 int AbilityManagerService::GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> &infos)
3021 {
3022 if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
3023 HILOG_ERROR("can not get dlp connection infos if caller is not sa.");
3024 return CHECK_PERMISSION_FAILED;
3025 }
3026 DelayedSingleton<ConnectionStateManager>::GetInstance()->GetDlpConnectionInfos(infos);
3027
3028 return ERR_OK;
3029 }
3030
RegisterMissionListener(const std::string & deviceId,const sptr<IRemoteMissionListener> & listener)3031 int AbilityManagerService::RegisterMissionListener(const std::string &deviceId,
3032 const sptr<IRemoteMissionListener> &listener)
3033 {
3034 CHECK_CALLER_IS_SYSTEM_APP;
3035 std::string localDeviceId;
3036 if (!GetLocalDeviceId(localDeviceId) || localDeviceId == deviceId) {
3037 HILOG_ERROR("RegisterMissionListener: Check DeviceId failed");
3038 return REGISTER_REMOTE_MISSION_LISTENER_FAIL;
3039 }
3040 CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
3041 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3042 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3043 return CHECK_PERMISSION_FAILED;
3044 }
3045 DistributedClient dmsClient;
3046 return dmsClient.RegisterMissionListener(Str8ToStr16(deviceId), listener->AsObject());
3047 }
3048
RegisterOnListener(const std::string & type,const sptr<IRemoteOnListener> & listener)3049 int AbilityManagerService::RegisterOnListener(const std::string &type,
3050 const sptr<IRemoteOnListener> &listener)
3051 {
3052 CHECK_CALLER_IS_SYSTEM_APP;
3053 CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
3054 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3055 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3056 return CHECK_PERMISSION_FAILED;
3057 }
3058 DistributedClient dmsClient;
3059 return dmsClient.RegisterOnListener(type, listener->AsObject());
3060 }
3061
RegisterOffListener(const std::string & type,const sptr<IRemoteOnListener> & listener)3062 int AbilityManagerService::RegisterOffListener(const std::string &type,
3063 const sptr<IRemoteOnListener> &listener)
3064 {
3065 CHECK_CALLER_IS_SYSTEM_APP;
3066 CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
3067 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3068 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3069 return CHECK_PERMISSION_FAILED;
3070 }
3071 DistributedClient dmsClient;
3072 return dmsClient.RegisterOffListener(type, listener->AsObject());
3073 }
3074
UnRegisterMissionListener(const std::string & deviceId,const sptr<IRemoteMissionListener> & listener)3075 int AbilityManagerService::UnRegisterMissionListener(const std::string &deviceId,
3076 const sptr<IRemoteMissionListener> &listener)
3077 {
3078 CHECK_CALLER_IS_SYSTEM_APP;
3079 std::string localDeviceId;
3080 if (!GetLocalDeviceId(localDeviceId) || localDeviceId == deviceId) {
3081 HILOG_ERROR("RegisterMissionListener: Check DeviceId failed");
3082 return REGISTER_REMOTE_MISSION_LISTENER_FAIL;
3083 }
3084 CHECK_POINTER_AND_RETURN(listener, ERR_INVALID_VALUE);
3085 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3086 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3087 return CHECK_PERMISSION_FAILED;
3088 }
3089 DistributedClient dmsClient;
3090 return dmsClient.UnRegisterMissionListener(Str8ToStr16(deviceId), listener->AsObject());
3091 }
3092
GetWantSender(const WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken)3093 sptr<IWantSender> AbilityManagerService::GetWantSender(
3094 const WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken)
3095 {
3096 HILOG_INFO("Get want Sender.");
3097 CHECK_POINTER_AND_RETURN(pendingWantManager_, nullptr);
3098
3099 auto bms = GetBundleManager();
3100 CHECK_POINTER_AND_RETURN(bms, nullptr);
3101
3102 int32_t callerUid = IPCSkeleton::GetCallingUid();
3103 int32_t userId = wantSenderInfo.userId;
3104 bool bundleMgrResult = false;
3105 if (userId < 0) {
3106 if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
3107 GetOsAccountLocalIdFromUid(callerUid, userId) != 0) {
3108 HILOG_ERROR("GetOsAccountLocalIdFromUid failed. uid=%{public}d", callerUid);
3109 return nullptr;
3110 }
3111 }
3112
3113 int32_t appUid = 0;
3114 if (!wantSenderInfo.allWants.empty()) {
3115 AppExecFwk::BundleInfo bundleInfo;
3116 std::string bundleName = wantSenderInfo.allWants.back().want.GetElement().GetBundleName();
3117 bundleMgrResult = IN_PROCESS_CALL(bms->GetBundleInfo(bundleName,
3118 AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
3119 if (bundleMgrResult) {
3120 appUid = bundleInfo.uid;
3121 }
3122 HILOG_INFO("App bundleName: %{public}s, uid: %{public}d", bundleName.c_str(), appUid);
3123 }
3124 if (!CheckSenderWantInfo(callerUid, wantSenderInfo)) {
3125 HILOG_ERROR("check bundleName failed");
3126 return nullptr;
3127 }
3128
3129 std::string apl;
3130 if (!wantSenderInfo.bundleName.empty()) {
3131 AppExecFwk::BundleInfo bundleInfo;
3132 bundleMgrResult = IN_PROCESS_CALL(bms->GetBundleInfo(wantSenderInfo.bundleName,
3133 AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
3134 if (bundleMgrResult) {
3135 apl = bundleInfo.applicationInfo.appPrivilegeLevel;
3136 }
3137 }
3138
3139 HILOG_INFO("AbilityManagerService::GetWantSender: bundleName = %{public}s", wantSenderInfo.bundleName.c_str());
3140 return pendingWantManager_->GetWantSender(callerUid, appUid, apl, wantSenderInfo, callerToken);
3141 }
3142
SendWantSender(const sptr<IWantSender> & target,const SenderInfo & senderInfo)3143 int AbilityManagerService::SendWantSender(const sptr<IWantSender> &target, const SenderInfo &senderInfo)
3144 {
3145 HILOG_INFO("Send want sender.");
3146 CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
3147 CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
3148 return pendingWantManager_->SendWantSender(target, senderInfo);
3149 }
3150
CancelWantSender(const sptr<IWantSender> & sender)3151 void AbilityManagerService::CancelWantSender(const sptr<IWantSender> &sender)
3152 {
3153 HILOG_INFO("Cancel want sender.");
3154 CHECK_POINTER(pendingWantManager_);
3155 CHECK_POINTER(sender);
3156
3157 auto bms = GetBundleManager();
3158 CHECK_POINTER(bms);
3159
3160 int32_t callerUid = IPCSkeleton::GetCallingUid();
3161 sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(sender->AsObject());
3162
3163 int userId = -1;
3164 if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
3165 GetOsAccountLocalIdFromUid(callerUid, userId) != 0) {
3166 HILOG_ERROR("GetOsAccountLocalIdFromUid failed. uid=%{public}d", callerUid);
3167 return;
3168 }
3169 std::string apl;
3170 if (record->GetKey() != nullptr && !record->GetKey()->GetBundleName().empty()) {
3171 AppExecFwk::BundleInfo bundleInfo;
3172 bool bundleMgrResult = IN_PROCESS_CALL(bms->GetBundleInfo(record->GetKey()->GetBundleName(),
3173 AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId));
3174 if (!bundleMgrResult) {
3175 HILOG_ERROR("GetBundleInfo is fail.");
3176 return;
3177 }
3178 apl = bundleInfo.applicationInfo.appPrivilegeLevel;
3179 }
3180
3181 pendingWantManager_->CancelWantSender(apl, sender);
3182 }
3183
GetPendingWantUid(const sptr<IWantSender> & target)3184 int AbilityManagerService::GetPendingWantUid(const sptr<IWantSender> &target)
3185 {
3186 HILOG_INFO("%{public}s:begin.", __func__);
3187
3188 if (pendingWantManager_ == nullptr) {
3189 HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
3190 return -1;
3191 }
3192 if (target == nullptr) {
3193 HILOG_ERROR("%s, target is nullptr", __func__);
3194 return -1;
3195 }
3196 return pendingWantManager_->GetPendingWantUid(target);
3197 }
3198
GetPendingWantUserId(const sptr<IWantSender> & target)3199 int AbilityManagerService::GetPendingWantUserId(const sptr<IWantSender> &target)
3200 {
3201 HILOG_INFO("%{public}s:begin.", __func__);
3202
3203 if (pendingWantManager_ == nullptr) {
3204 HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
3205 return -1;
3206 }
3207 if (target == nullptr) {
3208 HILOG_ERROR("%s, target is nullptr", __func__);
3209 return -1;
3210 }
3211 return pendingWantManager_->GetPendingWantUserId(target);
3212 }
3213
GetPendingWantBundleName(const sptr<IWantSender> & target)3214 std::string AbilityManagerService::GetPendingWantBundleName(const sptr<IWantSender> &target)
3215 {
3216 HILOG_INFO("Get pending want bundle name.");
3217 CHECK_POINTER_AND_RETURN(pendingWantManager_, "");
3218 CHECK_POINTER_AND_RETURN(target, "");
3219 return pendingWantManager_->GetPendingWantBundleName(target);
3220 }
3221
GetPendingWantCode(const sptr<IWantSender> & target)3222 int AbilityManagerService::GetPendingWantCode(const sptr<IWantSender> &target)
3223 {
3224 HILOG_INFO("%{public}s:begin.", __func__);
3225
3226 if (pendingWantManager_ == nullptr) {
3227 HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
3228 return -1;
3229 }
3230 if (target == nullptr) {
3231 HILOG_ERROR("%s, target is nullptr", __func__);
3232 return -1;
3233 }
3234 return pendingWantManager_->GetPendingWantCode(target);
3235 }
3236
GetPendingWantType(const sptr<IWantSender> & target)3237 int AbilityManagerService::GetPendingWantType(const sptr<IWantSender> &target)
3238 {
3239 HILOG_INFO("%{public}s:begin.", __func__);
3240
3241 if (pendingWantManager_ == nullptr) {
3242 HILOG_ERROR("%s, pendingWantManager_ is nullptr", __func__);
3243 return -1;
3244 }
3245 if (target == nullptr) {
3246 HILOG_ERROR("%s, target is nullptr", __func__);
3247 return -1;
3248 }
3249 return pendingWantManager_->GetPendingWantType(target);
3250 }
3251
RegisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & receiver)3252 void AbilityManagerService::RegisterCancelListener(const sptr<IWantSender> &sender,
3253 const sptr<IWantReceiver> &receiver)
3254 {
3255 HILOG_INFO("Register cancel listener.");
3256 CHECK_POINTER(pendingWantManager_);
3257 CHECK_POINTER(sender);
3258 CHECK_POINTER(receiver);
3259 pendingWantManager_->RegisterCancelListener(sender, receiver);
3260 }
3261
UnregisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & receiver)3262 void AbilityManagerService::UnregisterCancelListener(
3263 const sptr<IWantSender> &sender, const sptr<IWantReceiver> &receiver)
3264 {
3265 HILOG_INFO("Unregister cancel listener.");
3266 CHECK_POINTER(pendingWantManager_);
3267 CHECK_POINTER(sender);
3268 CHECK_POINTER(receiver);
3269 pendingWantManager_->UnregisterCancelListener(sender, receiver);
3270 }
3271
GetPendingRequestWant(const sptr<IWantSender> & target,std::shared_ptr<Want> & want)3272 int AbilityManagerService::GetPendingRequestWant(const sptr<IWantSender> &target, std::shared_ptr<Want> &want)
3273 {
3274 HILOG_INFO("Get pending request want.");
3275 CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
3276 CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
3277 CHECK_POINTER_AND_RETURN(want, ERR_INVALID_VALUE);
3278 CHECK_CALLER_IS_SYSTEM_APP;
3279 return pendingWantManager_->GetPendingRequestWant(target, want);
3280 }
3281
LockMissionForCleanup(int32_t missionId)3282 int AbilityManagerService::LockMissionForCleanup(int32_t missionId)
3283 {
3284 HILOG_INFO("request unlock mission for clean up all, id :%{public}d", missionId);
3285 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3286 CHECK_CALLER_IS_SYSTEM_APP;
3287
3288 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3289 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3290 return CHECK_PERMISSION_FAILED;
3291 }
3292 return currentMissionListManager_->SetMissionLockedState(missionId, true);
3293 }
3294
UnlockMissionForCleanup(int32_t missionId)3295 int AbilityManagerService::UnlockMissionForCleanup(int32_t missionId)
3296 {
3297 HILOG_INFO("request unlock mission for clean up all, id :%{public}d", missionId);
3298 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3299 CHECK_CALLER_IS_SYSTEM_APP;
3300
3301 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3302 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3303 return CHECK_PERMISSION_FAILED;
3304 }
3305 return currentMissionListManager_->SetMissionLockedState(missionId, false);
3306 }
3307
RegisterMissionListener(const sptr<IMissionListener> & listener)3308 int AbilityManagerService::RegisterMissionListener(const sptr<IMissionListener> &listener)
3309 {
3310 HILOG_INFO("request RegisterMissionListener ");
3311 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3312 CHECK_CALLER_IS_SYSTEM_APP;
3313
3314 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3315 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3316 return CHECK_PERMISSION_FAILED;
3317 }
3318 return currentMissionListManager_->RegisterMissionListener(listener);
3319 }
3320
UnRegisterMissionListener(const sptr<IMissionListener> & listener)3321 int AbilityManagerService::UnRegisterMissionListener(const sptr<IMissionListener> &listener)
3322 {
3323 HILOG_INFO("request RegisterMissionListener ");
3324 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3325 CHECK_CALLER_IS_SYSTEM_APP;
3326
3327 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3328 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3329 return CHECK_PERMISSION_FAILED;
3330 }
3331 return currentMissionListManager_->UnRegisterMissionListener(listener);
3332 }
3333
GetMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)3334 int AbilityManagerService::GetMissionInfos(const std::string& deviceId, int32_t numMax,
3335 std::vector<MissionInfo> &missionInfos)
3336 {
3337 HILOG_INFO("request GetMissionInfos.");
3338 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3339 CHECK_CALLER_IS_SYSTEM_APP;
3340
3341 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3342 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3343 return CHECK_PERMISSION_FAILED;
3344 }
3345
3346 if (CheckIsRemote(deviceId)) {
3347 return GetRemoteMissionInfos(deviceId, numMax, missionInfos);
3348 }
3349
3350 return currentMissionListManager_->GetMissionInfos(numMax, missionInfos);
3351 }
3352
GetRemoteMissionInfos(const std::string & deviceId,int32_t numMax,std::vector<MissionInfo> & missionInfos)3353 int AbilityManagerService::GetRemoteMissionInfos(const std::string& deviceId, int32_t numMax,
3354 std::vector<MissionInfo> &missionInfos)
3355 {
3356 HILOG_INFO("GetRemoteMissionInfos begin");
3357 DistributedClient dmsClient;
3358 int result = dmsClient.GetMissionInfos(deviceId, numMax, missionInfos);
3359 if (result != ERR_OK) {
3360 HILOG_ERROR("GetRemoteMissionInfos failed, result = %{public}d", result);
3361 return result;
3362 }
3363 return ERR_OK;
3364 }
3365
GetMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)3366 int AbilityManagerService::GetMissionInfo(const std::string& deviceId, int32_t missionId,
3367 MissionInfo &missionInfo)
3368 {
3369 HILOG_INFO("request GetMissionInfo, missionId:%{public}d", missionId);
3370 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3371 CHECK_CALLER_IS_SYSTEM_APP;
3372
3373 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3374 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3375 return CHECK_PERMISSION_FAILED;
3376 }
3377
3378 if (CheckIsRemote(deviceId)) {
3379 return GetRemoteMissionInfo(deviceId, missionId, missionInfo);
3380 }
3381
3382 return currentMissionListManager_->GetMissionInfo(missionId, missionInfo);
3383 }
3384
GetRemoteMissionInfo(const std::string & deviceId,int32_t missionId,MissionInfo & missionInfo)3385 int AbilityManagerService::GetRemoteMissionInfo(const std::string& deviceId, int32_t missionId,
3386 MissionInfo &missionInfo)
3387 {
3388 HILOG_INFO("GetMissionInfoFromDms begin");
3389 std::vector<MissionInfo> missionVector;
3390 int result = GetRemoteMissionInfos(deviceId, MAX_NUMBER_OF_DISTRIBUTED_MISSIONS, missionVector);
3391 if (result != ERR_OK) {
3392 return result;
3393 }
3394 for (auto iter = missionVector.begin(); iter != missionVector.end(); iter++) {
3395 if (iter->id == missionId) {
3396 missionInfo = *iter;
3397 return ERR_OK;
3398 }
3399 }
3400 HILOG_WARN("missionId not found");
3401 return ERR_INVALID_VALUE;
3402 }
3403
CleanMission(int32_t missionId)3404 int AbilityManagerService::CleanMission(int32_t missionId)
3405 {
3406 HILOG_INFO("request CleanMission, missionId:%{public}d", missionId);
3407 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3408 CHECK_CALLER_IS_SYSTEM_APP;
3409
3410 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3411 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3412 return CHECK_PERMISSION_FAILED;
3413 }
3414
3415 return currentMissionListManager_->ClearMission(missionId);
3416 }
3417
CleanAllMissions()3418 int AbilityManagerService::CleanAllMissions()
3419 {
3420 HILOG_INFO("request CleanAllMissions ");
3421 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3422 CHECK_CALLER_IS_SYSTEM_APP;
3423
3424 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3425 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3426 return CHECK_PERMISSION_FAILED;
3427 }
3428
3429 Want want;
3430 want.SetElementName(AbilityConfig::LAUNCHER_BUNDLE_NAME, AbilityConfig::LAUNCHER_ABILITY_NAME);
3431 if (!IsAbilityControllerStart(want, AbilityConfig::LAUNCHER_BUNDLE_NAME)) {
3432 HILOG_ERROR("IsAbilityControllerStart failed: %{public}s", want.GetBundle().c_str());
3433 return ERR_WOULD_BLOCK;
3434 }
3435
3436 return currentMissionListManager_->ClearAllMissions();
3437 }
3438
MoveMissionToFront(int32_t missionId)3439 int AbilityManagerService::MoveMissionToFront(int32_t missionId)
3440 {
3441 HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId);
3442 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3443 CHECK_CALLER_IS_SYSTEM_APP;
3444
3445 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3446 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3447 return CHECK_PERMISSION_FAILED;
3448 }
3449
3450 if (!IsAbilityControllerStartById(missionId)) {
3451 HILOG_ERROR("IsAbilityControllerStart false");
3452 return ERR_WOULD_BLOCK;
3453 }
3454
3455 return currentMissionListManager_->MoveMissionToFront(missionId);
3456 }
3457
MoveMissionToFront(int32_t missionId,const StartOptions & startOptions)3458 int AbilityManagerService::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions)
3459 {
3460 HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId);
3461 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
3462 CHECK_CALLER_IS_SYSTEM_APP;
3463
3464 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3465 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3466 return CHECK_PERMISSION_FAILED;
3467 }
3468
3469 if (!IsAbilityControllerStartById(missionId)) {
3470 HILOG_ERROR("IsAbilityControllerStart false");
3471 return ERR_WOULD_BLOCK;
3472 }
3473
3474 auto options = std::make_shared<StartOptions>(startOptions);
3475 return currentMissionListManager_->MoveMissionToFront(missionId, options);
3476 }
3477
MoveMissionsToForeground(const std::vector<int32_t> & missionIds,int32_t topMissionId)3478 int AbilityManagerService::MoveMissionsToForeground(const std::vector<int32_t>& missionIds, int32_t topMissionId)
3479 {
3480 CHECK_CALLER_IS_SYSTEM_APP;
3481 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3482 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3483 return CHECK_PERMISSION_FAILED;
3484 }
3485 if (wmsHandler_) {
3486 auto ret = wmsHandler_->MoveMissionsToForeground(missionIds, topMissionId);
3487 if (ret) {
3488 HILOG_ERROR("MoveMissionsToForeground failed, missiondIds may be invalid");
3489 return ERR_INVALID_VALUE;
3490 } else {
3491 return NO_ERROR;
3492 }
3493 }
3494 return ERR_NO_INIT;
3495 }
3496
MoveMissionsToBackground(const std::vector<int32_t> & missionIds,std::vector<int32_t> & result)3497 int AbilityManagerService::MoveMissionsToBackground(const std::vector<int32_t>& missionIds,
3498 std::vector<int32_t>& result)
3499 {
3500 CHECK_CALLER_IS_SYSTEM_APP;
3501 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
3502 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
3503 return CHECK_PERMISSION_FAILED;
3504 }
3505 if (wmsHandler_) {
3506 auto ret = wmsHandler_->MoveMissionsToBackground(missionIds, result);
3507 if (ret) {
3508 HILOG_ERROR("MoveMissionsToBackground failed, missiondIds may be invalid");
3509 return ERR_INVALID_VALUE;
3510 } else {
3511 return NO_ERROR;
3512 }
3513 }
3514 return ERR_NO_INIT;
3515 }
3516
GetMissionIdByToken(const sptr<IRemoteObject> & token)3517 int32_t AbilityManagerService::GetMissionIdByToken(const sptr<IRemoteObject> &token)
3518 {
3519 HILOG_INFO("request GetMissionIdByToken.");
3520 if (!token) {
3521 HILOG_ERROR("token is invalid.");
3522 return -1;
3523 }
3524
3525 return GetMissionIdByAbilityToken(token);
3526 }
3527
IsAbilityControllerStartById(int32_t missionId)3528 bool AbilityManagerService::IsAbilityControllerStartById(int32_t missionId)
3529 {
3530 InnerMissionInfo innerMissionInfo;
3531 int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
3532 missionId, innerMissionInfo);
3533 if (getMission != ERR_OK) {
3534 HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
3535 return true;
3536 }
3537 if (!IsAbilityControllerStart(innerMissionInfo.missionInfo.want, innerMissionInfo.missionInfo.want.GetBundle())) {
3538 HILOG_ERROR("IsAbilityControllerStart failed: %{public}s",
3539 innerMissionInfo.missionInfo.want.GetBundle().c_str());
3540 return false;
3541 }
3542 return true;
3543 }
3544
GetServiceRecordByElementName(const std::string & element)3545 std::shared_ptr<AbilityRecord> AbilityManagerService::GetServiceRecordByElementName(const std::string &element)
3546 {
3547 if (!connectManager_) {
3548 HILOG_ERROR("Connect manager is nullptr.");
3549 return nullptr;
3550 }
3551 return connectManager_->GetServiceRecordByElementName(element);
3552 }
3553
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)3554 std::list<std::shared_ptr<ConnectionRecord>> AbilityManagerService::GetConnectRecordListByCallback(
3555 sptr<IAbilityConnection> callback)
3556 {
3557 if (!connectManager_) {
3558 HILOG_ERROR("Connect manager is nullptr.");
3559 std::list<std::shared_ptr<ConnectionRecord>> connectList;
3560 return connectList;
3561 }
3562 return connectManager_->GetConnectRecordListByCallback(callback);
3563 }
3564
AcquireDataAbility(const Uri & uri,bool tryBind,const sptr<IRemoteObject> & callerToken)3565 sptr<IAbilityScheduler> AbilityManagerService::AcquireDataAbility(
3566 const Uri &uri, bool tryBind, const sptr<IRemoteObject> &callerToken)
3567 {
3568 auto bms = GetBundleManager();
3569 CHECK_POINTER_AND_RETURN(bms, nullptr);
3570
3571 auto localUri(uri);
3572 if (localUri.GetScheme() != AbilityConfig::SCHEME_DATA_ABILITY) {
3573 HILOG_ERROR("Acquire data ability with invalid uri scheme.");
3574 return nullptr;
3575 }
3576 std::vector<std::string> pathSegments;
3577 localUri.GetPathSegments(pathSegments);
3578 if (pathSegments.empty()) {
3579 HILOG_ERROR("Acquire data ability with invalid uri path.");
3580 return nullptr;
3581 }
3582
3583 auto userId = GetValidUserId(INVALID_USER_ID);
3584 AbilityRequest abilityRequest;
3585 std::string dataAbilityUri = localUri.ToString();
3586 HILOG_INFO("called. userId %{public}d", userId);
3587 bool queryResult = IN_PROCESS_CALL(bms->QueryAbilityInfoByUri(dataAbilityUri, userId, abilityRequest.abilityInfo));
3588 if (!queryResult || abilityRequest.abilityInfo.name.empty() || abilityRequest.abilityInfo.bundleName.empty()) {
3589 HILOG_ERROR("Invalid ability info for data ability acquiring.");
3590 return nullptr;
3591 }
3592
3593 abilityRequest.callerToken = callerToken;
3594 auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
3595 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
3596 if (!isSaCall && CheckCallDataAbilityPermission(abilityRequest, isShellCall, isSaCall) != ERR_OK) {
3597 HILOG_ERROR("Invalid ability request info for data ability acquiring.");
3598 return nullptr;
3599 }
3600
3601 HILOG_DEBUG("Query data ability info: %{public}s|%{public}s|%{public}s",
3602 abilityRequest.appInfo.name.c_str(), abilityRequest.appInfo.bundleName.c_str(),
3603 abilityRequest.abilityInfo.name.c_str());
3604
3605 if (CheckStaticCfgPermission(abilityRequest.abilityInfo, false, -1, true, isSaCall) !=
3606 AppExecFwk::Constants::PERMISSION_GRANTED) {
3607 if (!VerificationAllToken(callerToken)) {
3608 HILOG_INFO("VerificationAllToken fail");
3609 return nullptr;
3610 }
3611 }
3612
3613 if (abilityRequest.abilityInfo.applicationInfo.singleton) {
3614 userId = U0_USER_ID;
3615 }
3616
3617 std::shared_ptr<DataAbilityManager> dataAbilityManager = GetDataAbilityManagerByUserId(userId);
3618 CHECK_POINTER_AND_RETURN(dataAbilityManager, nullptr);
3619 ReportEventToSuspendManager(abilityRequest.abilityInfo);
3620 bool isNotHap = isSaCall || isShellCall;
3621 UpdateCallerInfo(abilityRequest.want, callerToken);
3622 return dataAbilityManager->Acquire(abilityRequest, tryBind, callerToken, isNotHap);
3623 }
3624
ReleaseDataAbility(sptr<IAbilityScheduler> dataAbilityScheduler,const sptr<IRemoteObject> & callerToken)3625 int AbilityManagerService::ReleaseDataAbility(
3626 sptr<IAbilityScheduler> dataAbilityScheduler, const sptr<IRemoteObject> &callerToken)
3627 {
3628 HILOG_INFO("%{public}s, called.", __func__);
3629 if (!dataAbilityScheduler || !callerToken) {
3630 HILOG_ERROR("dataAbilitySchedule or callerToken is nullptr");
3631 return ERR_INVALID_VALUE;
3632 }
3633
3634 std::shared_ptr<DataAbilityManager> dataAbilityManager = GetDataAbilityManager(dataAbilityScheduler);
3635 if (!dataAbilityManager) {
3636 HILOG_ERROR("dataAbilityScheduler is not exists");
3637 return ERR_INVALID_VALUE;
3638 }
3639
3640 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
3641 auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
3642 bool isNotHap = isSaCall || isShellCall;
3643 return dataAbilityManager->Release(dataAbilityScheduler, callerToken, isNotHap);
3644 }
3645
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)3646 int AbilityManagerService::AttachAbilityThread(
3647 const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
3648 {
3649 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3650 HILOG_INFO("Attach ability thread.");
3651 CHECK_POINTER_AND_RETURN(scheduler, ERR_INVALID_VALUE);
3652 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && !VerificationAllToken(token)) {
3653 return ERR_INVALID_VALUE;
3654 }
3655 auto abilityRecord = Token::GetAbilityRecordByToken(token);
3656 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
3657 if (!JudgeSelfCalled(abilityRecord)) {
3658 return CHECK_PERMISSION_FAILED;
3659 }
3660
3661 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
3662 auto abilityInfo = abilityRecord->GetAbilityInfo();
3663 auto type = abilityInfo.type;
3664 // force timeout ability for test
3665 if (IsNeedTimeoutForTest(abilityInfo.name, AbilityRecord::ConvertAbilityState(AbilityState::INITIAL))) {
3666 HILOG_WARN("force timeout ability for test, state:INITIAL, ability: %{public}s",
3667 abilityInfo.name.c_str());
3668 return ERR_OK;
3669 }
3670 int returnCode = -1;
3671 if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
3672 auto connectManager = GetConnectManagerByUserId(userId);
3673 if (!connectManager) {
3674 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
3675 return ERR_INVALID_VALUE;
3676 }
3677 returnCode = connectManager->AttachAbilityThreadLocked(scheduler, token);
3678 } else if (type == AppExecFwk::AbilityType::DATA) {
3679 auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
3680 if (!dataAbilityManager) {
3681 HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
3682 return ERR_INVALID_VALUE;
3683 }
3684 returnCode = dataAbilityManager->AttachAbilityThread(scheduler, token);
3685 } else {
3686 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
3687 returnCode = uiAbilityLifecycleManager_->AttachAbilityThread(scheduler, token);
3688 } else {
3689 int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
3690 auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
3691 if (!missionListManager) {
3692 HILOG_ERROR("missionListManager is Null. userId=%{public}d", ownerMissionUserId);
3693 return ERR_INVALID_VALUE;
3694 }
3695 returnCode = missionListManager->AttachAbilityThread(scheduler, token);
3696 }
3697 }
3698 return returnCode;
3699 }
3700
DumpFuncInit()3701 void AbilityManagerService::DumpFuncInit()
3702 {
3703 dumpFuncMap_[KEY_DUMP_SERVICE] = &AbilityManagerService::DumpStateInner;
3704 dumpFuncMap_[KEY_DUMP_DATA] = &AbilityManagerService::DataDumpStateInner;
3705 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
3706 HILOG_DEBUG("Support by scb, not ability server.");
3707 return;
3708 }
3709 dumpFuncMap_[KEY_DUMP_ALL] = &AbilityManagerService::DumpInner;
3710 dumpFuncMap_[KEY_DUMP_MISSION] = &AbilityManagerService::DumpMissionInner;
3711 dumpFuncMap_[KEY_DUMP_MISSION_LIST] = &AbilityManagerService::DumpMissionListInner;
3712 dumpFuncMap_[KEY_DUMP_MISSION_INFOS] = &AbilityManagerService::DumpMissionInfosInner;
3713 }
3714
DumpSysFuncInit()3715 void AbilityManagerService::DumpSysFuncInit()
3716 {
3717 dumpsysFuncMap_[KEY_DUMPSYS_ALL] = &AbilityManagerService::DumpSysInner;
3718 dumpsysFuncMap_[KEY_DUMPSYS_SERVICE] = &AbilityManagerService::DumpSysStateInner;
3719 dumpsysFuncMap_[KEY_DUMPSYS_PENDING] = &AbilityManagerService::DumpSysPendingInner;
3720 dumpsysFuncMap_[KEY_DUMPSYS_PROCESS] = &AbilityManagerService::DumpSysProcess;
3721 dumpsysFuncMap_[KEY_DUMPSYS_DATA] = &AbilityManagerService::DataDumpSysStateInner;
3722 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
3723 HILOG_DEBUG("Support by scb, not ability server.");
3724 return;
3725 }
3726 dumpsysFuncMap_[KEY_DUMPSYS_MISSION_LIST] = &AbilityManagerService::DumpSysMissionListInner;
3727 dumpsysFuncMap_[KEY_DUMPSYS_ABILITY] = &AbilityManagerService::DumpSysAbilityInner;
3728 }
3729
DumpSysInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3730 void AbilityManagerService::DumpSysInner(
3731 const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
3732 {
3733 std::vector<std::string> argList;
3734 SplitStr(args, " ", argList);
3735 if (argList.empty()) {
3736 return;
3737 }
3738 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
3739 DumpSysMissionListInner(args, info, isClient, isUserID, userId);
3740 }
3741 DumpSysStateInner(args, info, isClient, isUserID, userId);
3742 DumpSysPendingInner(args, info, isClient, isUserID, userId);
3743 DumpSysProcess(args, info, isClient, isUserID, userId);
3744 }
3745
DumpSysMissionListInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3746 void AbilityManagerService::DumpSysMissionListInner(
3747 const std::string &args, std::vector<std::string> &info, bool isClient, bool isUserID, int userId)
3748 {
3749 std::shared_ptr<MissionListManager> targetManager;
3750 if (isUserID) {
3751 HILOG_INFO("called.");
3752 std::lock_guard<ffrt::mutex> lock(managersMutex_);
3753 auto it = missionListManagers_.find(userId);
3754 if (it == missionListManagers_.end()) {
3755 info.push_back("error: No user found.");
3756 HILOG_INFO("error.");
3757 return;
3758 }
3759 targetManager = it->second;
3760 HILOG_INFO("end.");
3761 } else {
3762 targetManager = currentMissionListManager_;
3763 }
3764
3765 CHECK_POINTER(targetManager);
3766
3767 std::vector<std::string> argList;
3768 SplitStr(args, " ", argList);
3769 if (argList.empty()) {
3770 return;
3771 }
3772
3773 if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
3774 targetManager->DumpMissionList(info, isClient, argList[1]);
3775 } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
3776 targetManager->DumpMissionList(info, isClient);
3777 } else {
3778 info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
3779 }
3780 }
DumpSysAbilityInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3781 void AbilityManagerService::DumpSysAbilityInner(
3782 const std::string &args, std::vector<std::string> &info, bool isClient, bool isUserID, int userId)
3783 {
3784 std::shared_ptr<MissionListManager> targetManager;
3785 if (isUserID) {
3786 HILOG_INFO("called.");
3787 std::lock_guard<ffrt::mutex> lock(managersMutex_);
3788 auto it = missionListManagers_.find(userId);
3789 if (it == missionListManagers_.end()) {
3790 info.push_back("error: No user found.");
3791 HILOG_INFO("error.");
3792 return;
3793 }
3794 targetManager = it->second;
3795 HILOG_INFO("end.");
3796 } else {
3797 targetManager = currentMissionListManager_;
3798 }
3799
3800 CHECK_POINTER(targetManager);
3801
3802 std::vector<std::string> argList;
3803 SplitStr(args, " ", argList);
3804 if (argList.empty()) {
3805 return;
3806 }
3807 if (argList.size() >= MIN_DUMP_ARGUMENT_NUM) {
3808 HILOG_INFO("argList = %{public}s", argList[1].c_str());
3809 std::vector<std::string> params(argList.begin() + MIN_DUMP_ARGUMENT_NUM, argList.end());
3810 try {
3811 auto abilityId = static_cast<int32_t>(std::stoi(argList[1]));
3812 targetManager->DumpMissionListByRecordId(info, isClient, abilityId, params);
3813 } catch (...) {
3814 HILOG_WARN("stoi(%{public}s) failed", argList[1].c_str());
3815 info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
3816 }
3817 } else {
3818 info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
3819 }
3820 }
3821
DumpSysStateInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3822 void AbilityManagerService::DumpSysStateInner(
3823 const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
3824 {
3825 HILOG_INFO("DumpSysStateInner begin:%{public}s", args.c_str());
3826 std::shared_ptr<AbilityConnectManager> targetManager;
3827
3828 if (isUserID) {
3829 HILOG_INFO("called.");
3830 std::lock_guard<ffrt::mutex> lock(managersMutex_);
3831 auto it = connectManagers_.find(userId);
3832 if (it == connectManagers_.end()) {
3833 info.push_back("error: No user found.");
3834 HILOG_INFO("error.");
3835 return;
3836 }
3837 targetManager = it->second;
3838 HILOG_INFO("end.");
3839 } else {
3840 targetManager = connectManager_;
3841 }
3842
3843 CHECK_POINTER(targetManager);
3844
3845 std::vector<std::string> argList;
3846 SplitStr(args, " ", argList);
3847 if (argList.empty()) {
3848 return;
3849 }
3850
3851 if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
3852 targetManager->DumpState(info, isClient, argList[1]);
3853 } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
3854 targetManager->DumpState(info, isClient);
3855 } else {
3856 HILOG_INFO("uri = %{public}s", argList[1].c_str());
3857 std::vector<std::string> params(argList.begin() + MIN_DUMP_ARGUMENT_NUM, argList.end());
3858 targetManager->DumpStateByUri(info, isClient, argList[1], params);
3859 }
3860 }
3861
DumpSysPendingInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3862 void AbilityManagerService::DumpSysPendingInner(
3863 const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
3864 {
3865 std::shared_ptr<PendingWantManager> targetManager;
3866 if (isUserID) {
3867 HILOG_INFO("called.");
3868 std::lock_guard<ffrt::mutex> lock(managersMutex_);
3869 auto it = pendingWantManagers_.find(userId);
3870 if (it == pendingWantManagers_.end()) {
3871 info.push_back("error: No user found.");
3872 HILOG_INFO("error.");
3873 return;
3874 }
3875 targetManager = it->second;
3876 HILOG_INFO("end.");
3877 } else {
3878 targetManager = pendingWantManager_;
3879 }
3880
3881 CHECK_POINTER(targetManager);
3882
3883 std::vector<std::string> argList;
3884 SplitStr(args, " ", argList);
3885 if (argList.empty()) {
3886 return;
3887 }
3888
3889 if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
3890 targetManager->DumpByRecordId(info, argList[1]);
3891 } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
3892 targetManager->Dump(info);
3893 } else {
3894 info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
3895 }
3896 }
3897
DumpSysProcess(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3898 void AbilityManagerService::DumpSysProcess(
3899 const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
3900 {
3901 std::vector<std::string> argList;
3902 SplitStr(args, " ", argList);
3903 if (argList.empty()) {
3904 return;
3905 }
3906 std::vector<AppExecFwk::RunningProcessInfo> ProcessInfos;
3907 int ret = 0;
3908 if (isUserID) {
3909 ret = GetProcessRunningInfosByUserId(ProcessInfos, userId);
3910 } else {
3911 ret = GetProcessRunningInfos(ProcessInfos);
3912 }
3913
3914 if (ret != ERR_OK || ProcessInfos.size() == 0) {
3915 return;
3916 }
3917
3918 std::string dumpInfo = " AppRunningRecords:";
3919 info.push_back(dumpInfo);
3920 auto processInfoID = 0;
3921 auto hasProcessName = (argList.size() == MIN_DUMP_ARGUMENT_NUM ? true : false);
3922 for (const auto& ProcessInfo : ProcessInfos) {
3923 if (hasProcessName && argList[1] != ProcessInfo.processName_) {
3924 continue;
3925 }
3926
3927 dumpInfo = " AppRunningRecord ID #" + std::to_string(processInfoID);
3928 processInfoID++;
3929 info.push_back(dumpInfo);
3930 dumpInfo = " process name [" + ProcessInfo.processName_ + "]";
3931 info.push_back(dumpInfo);
3932 dumpInfo = " pid #" + std::to_string(ProcessInfo.pid_) +
3933 " uid #" + std::to_string(ProcessInfo.uid_);
3934 info.push_back(dumpInfo);
3935 auto appState = static_cast<AppState>(ProcessInfo.state_);
3936 dumpInfo = " state #" + DelayedSingleton<AppScheduler>::GetInstance()->ConvertAppState(appState);
3937 info.push_back(dumpInfo);
3938 }
3939 }
3940
DataDumpSysStateInner(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)3941 void AbilityManagerService::DataDumpSysStateInner(
3942 const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
3943 {
3944 std::shared_ptr<DataAbilityManager> targetManager;
3945 if (isUserID) {
3946 HILOG_INFO("called.");
3947 std::lock_guard<ffrt::mutex> lock(managersMutex_);
3948 auto it = dataAbilityManagers_.find(userId);
3949 if (it == dataAbilityManagers_.end()) {
3950 info.push_back("error: No user found.");
3951 HILOG_INFO("error.");
3952 return;
3953 }
3954 targetManager = it->second;
3955 HILOG_INFO("end.");
3956 } else {
3957 targetManager = dataAbilityManager_;
3958 }
3959
3960 CHECK_POINTER(targetManager);
3961
3962 std::vector<std::string> argList;
3963 SplitStr(args, " ", argList);
3964 if (argList.empty()) {
3965 return;
3966 }
3967 if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
3968 targetManager->DumpSysState(info, isClient, argList[1]);
3969 } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
3970 targetManager->DumpSysState(info, isClient);
3971 } else {
3972 info.emplace_back("error: invalid argument, please see 'hidumper -s AbilityManagerService -a '-h''.");
3973 }
3974 }
3975
DumpInner(const std::string & args,std::vector<std::string> & info)3976 void AbilityManagerService::DumpInner(const std::string &args, std::vector<std::string> &info)
3977 {
3978 if (currentMissionListManager_) {
3979 currentMissionListManager_->Dump(info);
3980 }
3981 }
3982
DumpMissionListInner(const std::string & args,std::vector<std::string> & info)3983 void AbilityManagerService::DumpMissionListInner(const std::string &args, std::vector<std::string> &info)
3984 {
3985 if (currentMissionListManager_) {
3986 currentMissionListManager_->DumpMissionList(info, false, "");
3987 }
3988 }
3989
DumpMissionInfosInner(const std::string & args,std::vector<std::string> & info)3990 void AbilityManagerService::DumpMissionInfosInner(const std::string &args, std::vector<std::string> &info)
3991 {
3992 if (currentMissionListManager_) {
3993 currentMissionListManager_->DumpMissionInfos(info);
3994 }
3995 }
3996
DumpMissionInner(const std::string & args,std::vector<std::string> & info)3997 void AbilityManagerService::DumpMissionInner(const std::string &args, std::vector<std::string> &info)
3998 {
3999 CHECK_POINTER_LOG(currentMissionListManager_, "Current mission manager not init.");
4000 std::vector<std::string> argList;
4001 SplitStr(args, " ", argList);
4002 if (argList.empty()) {
4003 return;
4004 }
4005 if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
4006 info.push_back("error: invalid argument, please see 'ability dump -h'.");
4007 return;
4008 }
4009 int missionId = DEFAULT_INVAL_VALUE;
4010 (void)StrToInt(argList[1], missionId);
4011 currentMissionListManager_->DumpMission(missionId, info);
4012 }
4013
DumpStateInner(const std::string & args,std::vector<std::string> & info)4014 void AbilityManagerService::DumpStateInner(const std::string &args, std::vector<std::string> &info)
4015 {
4016 CHECK_POINTER_LOG(connectManager_, "Current mission manager not init.");
4017 std::vector<std::string> argList;
4018 SplitStr(args, " ", argList);
4019 if (argList.empty()) {
4020 return;
4021 }
4022 if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
4023 connectManager_->DumpState(info, false, argList[1]);
4024 } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
4025 connectManager_->DumpState(info, false);
4026 } else {
4027 info.emplace_back("error: invalid argument, please see 'ability dump -h'.");
4028 }
4029 }
4030
DataDumpStateInner(const std::string & args,std::vector<std::string> & info)4031 void AbilityManagerService::DataDumpStateInner(const std::string &args, std::vector<std::string> &info)
4032 {
4033 std::vector<std::string> argList;
4034 SplitStr(args, " ", argList);
4035 if (argList.empty()) {
4036 return;
4037 }
4038 if (argList.size() == MIN_DUMP_ARGUMENT_NUM) {
4039 dataAbilityManager_->DumpState(info, argList[1]);
4040 } else if (argList.size() < MIN_DUMP_ARGUMENT_NUM) {
4041 dataAbilityManager_->DumpState(info);
4042 } else {
4043 info.emplace_back("error: invalid argument, please see 'ability dump -h'.");
4044 }
4045 }
4046
DumpState(const std::string & args,std::vector<std::string> & info)4047 void AbilityManagerService::DumpState(const std::string &args, std::vector<std::string> &info)
4048 {
4049 std::vector<std::string> argList;
4050 SplitStr(args, " ", argList);
4051 if (argList.empty()) {
4052 return;
4053 }
4054 auto it = dumpMap.find(argList[0]);
4055 if (it == dumpMap.end()) {
4056 return;
4057 }
4058 DumpKey key = it->second;
4059 auto itFunc = dumpFuncMap_.find(key);
4060 if (itFunc != dumpFuncMap_.end()) {
4061 auto dumpFunc = itFunc->second;
4062 if (dumpFunc != nullptr) {
4063 (this->*dumpFunc)(args, info);
4064 return;
4065 }
4066 }
4067 info.push_back("error: invalid argument, please see 'ability dump -h'.");
4068 }
4069
DumpSysState(const std::string & args,std::vector<std::string> & info,bool isClient,bool isUserID,int userId)4070 void AbilityManagerService::DumpSysState(
4071 const std::string& args, std::vector<std::string>& info, bool isClient, bool isUserID, int userId)
4072 {
4073 HILOG_DEBUG("%{public}s begin", __func__);
4074 std::vector<std::string> argList;
4075 SplitStr(args, " ", argList);
4076 if (argList.empty()) {
4077 return;
4078 }
4079 auto it = dumpsysMap.find(argList[0]);
4080 if (it == dumpsysMap.end()) {
4081 return;
4082 }
4083 DumpsysKey key = it->second;
4084 auto itFunc = dumpsysFuncMap_.find(key);
4085 if (itFunc != dumpsysFuncMap_.end()) {
4086 auto dumpsysFunc = itFunc->second;
4087 if (dumpsysFunc != nullptr) {
4088 (this->*dumpsysFunc)(args, info, isClient, isUserID, userId);
4089 return;
4090 }
4091 }
4092 info.push_back("error: invalid argument, please see 'ability dump -h'.");
4093 }
4094
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)4095 int AbilityManagerService::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state, const PacMap &saveData)
4096 {
4097 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4098 HILOG_INFO("Ability transition done come, state:%{public}d.", state);
4099 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && !VerificationAllToken(token)) {
4100 return ERR_INVALID_VALUE;
4101 }
4102 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4103 CHECK_POINTER_AND_RETURN_LOG(abilityRecord, ERR_INVALID_VALUE, "Ability record is nullptr.");
4104 if (!JudgeSelfCalled(abilityRecord)) {
4105 return CHECK_PERMISSION_FAILED;
4106 }
4107
4108 auto abilityInfo = abilityRecord->GetAbilityInfo();
4109 HILOG_DEBUG("Ability transition done come, state:%{public}d, name:%{public}s", state, abilityInfo.name.c_str());
4110 auto type = abilityInfo.type;
4111 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
4112 // force timeout ability for test
4113 int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
4114 bool isTerminate = abilityRecord->IsAbilityState(AbilityState::TERMINATING) && targetState == AbilityState::INITIAL;
4115 std::string tempState = isTerminate ? AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING) :
4116 AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
4117 if (IsNeedTimeoutForTest(abilityInfo.name, tempState)) {
4118 HILOG_WARN("force timeout ability for test, state:%{public}s, ability: %{public}s",
4119 tempState.c_str(),
4120 abilityInfo.name.c_str());
4121 return ERR_OK;
4122 }
4123 if (type == AppExecFwk::AbilityType::SERVICE || type == AppExecFwk::AbilityType::EXTENSION) {
4124 auto connectManager = GetConnectManagerByUserId(userId);
4125 if (!connectManager) {
4126 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
4127 return ERR_INVALID_VALUE;
4128 }
4129 return connectManager->AbilityTransitionDone(token, state);
4130 }
4131 if (type == AppExecFwk::AbilityType::DATA) {
4132 auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
4133 if (!dataAbilityManager) {
4134 HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
4135 return ERR_INVALID_VALUE;
4136 }
4137 return dataAbilityManager->AbilityTransitionDone(token, state);
4138 }
4139 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4140 return uiAbilityLifecycleManager_->AbilityTransactionDone(token, state, saveData);
4141 } else {
4142 int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
4143 auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
4144 if (!missionListManager) {
4145 HILOG_ERROR("missionListManager is Null. userId=%{public}d", ownerMissionUserId);
4146 return ERR_INVALID_VALUE;
4147 }
4148 return missionListManager->AbilityTransactionDone(token, state, saveData);
4149 }
4150 }
4151
ScheduleConnectAbilityDone(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)4152 int AbilityManagerService::ScheduleConnectAbilityDone(
4153 const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
4154 {
4155 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4156 HILOG_INFO("Schedule connect ability done.");
4157 if (!VerificationAllToken(token)) {
4158 return ERR_INVALID_VALUE;
4159 }
4160
4161 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4162 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4163 if (!JudgeSelfCalled(abilityRecord)) {
4164 return CHECK_PERMISSION_FAILED;
4165 }
4166
4167 auto type = abilityRecord->GetAbilityInfo().type;
4168 if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
4169 HILOG_ERROR("Connect ability failed, target ability is not service.");
4170 return TARGET_ABILITY_NOT_SERVICE;
4171 }
4172 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
4173 auto connectManager = GetConnectManagerByUserId(userId);
4174 if (!connectManager) {
4175 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
4176 return ERR_INVALID_VALUE;
4177 }
4178 return connectManager->ScheduleConnectAbilityDoneLocked(token, remoteObject);
4179 }
4180
ScheduleDisconnectAbilityDone(const sptr<IRemoteObject> & token)4181 int AbilityManagerService::ScheduleDisconnectAbilityDone(const sptr<IRemoteObject> &token)
4182 {
4183 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4184 HILOG_INFO("Schedule disconnect ability done.");
4185 if (!VerificationAllToken(token)) {
4186 return ERR_INVALID_VALUE;
4187 }
4188
4189 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4190 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4191 if (!JudgeSelfCalled(abilityRecord)) {
4192 return CHECK_PERMISSION_FAILED;
4193 }
4194
4195 auto type = abilityRecord->GetAbilityInfo().type;
4196 if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
4197 HILOG_ERROR("Connect ability failed, target ability is not service.");
4198 return TARGET_ABILITY_NOT_SERVICE;
4199 }
4200 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
4201 auto connectManager = GetConnectManagerByUserId(userId);
4202 if (!connectManager) {
4203 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
4204 return ERR_INVALID_VALUE;
4205 }
4206 return connectManager->ScheduleDisconnectAbilityDoneLocked(token);
4207 }
4208
ScheduleCommandAbilityDone(const sptr<IRemoteObject> & token)4209 int AbilityManagerService::ScheduleCommandAbilityDone(const sptr<IRemoteObject> &token)
4210 {
4211 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4212 HILOG_INFO("Schedule command ability done.");
4213 if (!VerificationAllToken(token)) {
4214 return ERR_INVALID_VALUE;
4215 }
4216
4217 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4218 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4219 if (!JudgeSelfCalled(abilityRecord)) {
4220 return CHECK_PERMISSION_FAILED;
4221 }
4222 // force timeout ability for test
4223 if (IsNeedTimeoutForTest(abilityRecord->GetAbilityInfo().name, std::string("COMMAND"))) {
4224 HILOG_WARN("force timeout ability for test, state:COMMAND, ability: %{public}s",
4225 abilityRecord->GetAbilityInfo().name.c_str());
4226 return ERR_OK;
4227 }
4228 auto type = abilityRecord->GetAbilityInfo().type;
4229 if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
4230 HILOG_ERROR("Connect ability failed, target ability is not service.");
4231 return TARGET_ABILITY_NOT_SERVICE;
4232 }
4233 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
4234 auto connectManager = GetConnectManagerByUserId(userId);
4235 if (!connectManager) {
4236 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
4237 return ERR_INVALID_VALUE;
4238 }
4239 return connectManager->ScheduleCommandAbilityDoneLocked(token);
4240 }
4241
ScheduleCommandAbilityWindowDone(const sptr<IRemoteObject> & token,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd,AbilityCommand abilityCmd)4242 int AbilityManagerService::ScheduleCommandAbilityWindowDone(
4243 const sptr<IRemoteObject> &token,
4244 const sptr<SessionInfo> &sessionInfo,
4245 WindowCommand winCmd,
4246 AbilityCommand abilityCmd)
4247 {
4248 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4249 HILOG_INFO("enter.");
4250 if (!VerificationAllToken(token)) {
4251 return ERR_INVALID_VALUE;
4252 }
4253
4254 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4255 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
4256 if (!JudgeSelfCalled(abilityRecord)) {
4257 return CHECK_PERMISSION_FAILED;
4258 }
4259
4260 if (!UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)
4261 && !UIExtensionUtils::IsWindowExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
4262 HILOG_ERROR("target ability is not ui or window extension.");
4263 return ERR_INVALID_VALUE;
4264 }
4265 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
4266 auto connectManager = GetConnectManagerByUserId(userId);
4267 if (!connectManager) {
4268 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
4269 return ERR_INVALID_VALUE;
4270 }
4271 return connectManager->ScheduleCommandAbilityWindowDone(token, sessionInfo, winCmd, abilityCmd);
4272 }
4273
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const int32_t state)4274 void AbilityManagerService::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
4275 {
4276 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4277 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4278 CHECK_POINTER(abilityRecord);
4279 HILOG_INFO("On ability request done, name is %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
4280 auto userId = abilityRecord->GetApplicationInfo().uid / BASE_USER_RANGE;
4281
4282 auto type = abilityRecord->GetAbilityInfo().type;
4283 switch (type) {
4284 case AppExecFwk::AbilityType::DATA: {
4285 auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
4286 if (!dataAbilityManager) {
4287 HILOG_ERROR("dataAbilityManager is Null. userId=%{public}d", userId);
4288 return;
4289 }
4290 dataAbilityManager->OnAbilityRequestDone(token, state);
4291 break;
4292 }
4293 case AppExecFwk::AbilityType::SERVICE:
4294 case AppExecFwk::AbilityType::EXTENSION: {
4295 auto connectManager = GetConnectManagerByUserId(userId);
4296 if (!connectManager) {
4297 HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId);
4298 return;
4299 }
4300 connectManager->OnAbilityRequestDone(token, state);
4301 break;
4302 }
4303 default: {
4304 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4305 uiAbilityLifecycleManager_->OnAbilityRequestDone(token, state);
4306 } else {
4307 int32_t ownerMissionUserId = abilityRecord->GetOwnerMissionUserId();
4308 auto missionListManager = GetListManagerByUserId(ownerMissionUserId);
4309 if (!missionListManager) {
4310 HILOG_ERROR("missionListManager is Null. userId=%{public}d", ownerMissionUserId);
4311 return;
4312 }
4313 missionListManager->OnAbilityRequestDone(token, state);
4314 }
4315 break;
4316 }
4317 }
4318 }
4319
OnAppStateChanged(const AppInfo & info)4320 void AbilityManagerService::OnAppStateChanged(const AppInfo &info)
4321 {
4322 HILOG_INFO("On app state changed.");
4323 CHECK_POINTER_LOG(connectManager_, "Connect manager not init.");
4324 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4325 CHECK_POINTER_LOG(currentMissionListManager_, "Current mission list manager not init.");
4326 }
4327 connectManager_->OnAppStateChanged(info);
4328 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4329 uiAbilityLifecycleManager_->OnAppStateChanged(info, GetUserId());
4330 } else {
4331 currentMissionListManager_->OnAppStateChanged(info);
4332 }
4333 dataAbilityManager_->OnAppStateChanged(info);
4334 }
4335
GetEventHandler()4336 std::shared_ptr<AbilityEventHandler> AbilityManagerService::GetEventHandler()
4337 {
4338 return eventHandler_;
4339 }
4340
InitMissionListManager(int userId,bool switchUser)4341 void AbilityManagerService::InitMissionListManager(int userId, bool switchUser)
4342 {
4343 bool find = false;
4344 {
4345 std::lock_guard<ffrt::mutex> lock(managersMutex_);
4346 auto iterator = missionListManagers_.find(userId);
4347 find = (iterator != missionListManagers_.end());
4348 if (find) {
4349 if (switchUser) {
4350 DelayedSingleton<MissionInfoMgr>::GetInstance()->Init(userId);
4351 currentMissionListManager_ = iterator->second;
4352 }
4353 }
4354 }
4355 if (!find) {
4356 auto manager = std::make_shared<MissionListManager>(userId);
4357 manager->Init();
4358 std::unique_lock<ffrt::mutex> lock(managersMutex_);
4359 missionListManagers_.emplace(userId, manager);
4360 if (switchUser) {
4361 currentMissionListManager_ = manager;
4362 }
4363 }
4364 }
4365
4366 // multi user scene
GetUserId() const4367 int32_t AbilityManagerService::GetUserId() const
4368 {
4369 if (userController_) {
4370 auto userId = userController_->GetCurrentUserId();
4371 HILOG_DEBUG("userId is %{public}d", userId);
4372 return userId;
4373 }
4374 return U0_USER_ID;
4375 }
4376
StartHighestPriorityAbility(int32_t userId,bool isBoot)4377 void AbilityManagerService::StartHighestPriorityAbility(int32_t userId, bool isBoot)
4378 {
4379 HILOG_DEBUG("%{public}s", __func__);
4380 auto bms = GetBundleManager();
4381 CHECK_POINTER(bms);
4382
4383 /* Query the highest priority ability or extension ability, and start it. usually, it is OOBE or launcher */
4384 Want want;
4385 want.AddEntity(HIGHEST_PRIORITY_ABILITY_ENTITY);
4386 AppExecFwk::AbilityInfo abilityInfo;
4387 AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
4388 int attemptNums = 0;
4389 while (!IN_PROCESS_CALL(bms->ImplicitQueryInfoByPriority(want,
4390 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT, userId,
4391 abilityInfo, extensionAbilityInfo))) {
4392 HILOG_INFO("Waiting query highest priority ability info completed.");
4393 ++attemptNums;
4394 if (!isBoot && attemptNums > SWITCH_ACCOUNT_TRY) {
4395 HILOG_ERROR("Query highest priority ability failed.");
4396 return;
4397 }
4398 AbilityRequest abilityRequest;
4399 ComponentRequest componentRequest = initComponentRequest();
4400 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
4401 return;
4402 }
4403 usleep(REPOLL_TIME_MICRO_SECONDS);
4404 }
4405
4406 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
4407 HILOG_ERROR("Query highest priority ability failed");
4408 return;
4409 }
4410
4411 Want abilityWant; // donot use 'want' here, because the entity of 'want' is not empty
4412 if (!abilityInfo.name.empty()) {
4413 /* highest priority ability */
4414 HILOG_INFO("Start the highest priority ability. bundleName: %{public}s, ability:%{public}s",
4415 abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4416 abilityWant.SetElementName(abilityInfo.bundleName, abilityInfo.name);
4417 } else {
4418 /* highest priority extension ability */
4419 HILOG_INFO("Start the highest priority extension ability. bundleName: %{public}s, ability:%{public}s",
4420 extensionAbilityInfo.bundleName.c_str(), extensionAbilityInfo.name.c_str());
4421 abilityWant.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
4422 }
4423
4424 #ifdef SUPPORT_GRAPHICS
4425 abilityWant.SetParam(NEED_STARTINGWINDOW, false);
4426 // wait BOOT_ANIMATION_STARTED to start LAUNCHER
4427 WaitParameter(BOOTEVENT_BOOT_ANIMATION_STARTED.c_str(), "true",
4428 AmsConfigurationParameter::GetInstance().GetBootAnimationTimeoutTime());
4429 #endif
4430
4431 /* note: OOBE APP need disable itself, otherwise, it will be started when restart system everytime */
4432 (void)StartAbility(abilityWant, userId, DEFAULT_INVAL_VALUE);
4433 }
4434
GenerateAbilityRequest(const Want & want,int requestCode,AbilityRequest & request,const sptr<IRemoteObject> & callerToken,int32_t userId)4435 int AbilityManagerService::GenerateAbilityRequest(
4436 const Want &want, int requestCode, AbilityRequest &request, const sptr<IRemoteObject> &callerToken, int32_t userId)
4437 {
4438 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4439 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
4440 if (abilityRecord && abilityRecord->GetAppIndex() != 0 &&
4441 abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
4442 (const_cast<Want &>(want)).SetParam(DLP_INDEX, abilityRecord->GetAppIndex());
4443 }
4444 request.want = want;
4445 request.requestCode = requestCode;
4446 request.callerToken = callerToken;
4447 request.startSetting = nullptr;
4448
4449 sptr<IRemoteObject> abilityInfoCallback = want.GetRemoteObject(Want::PARAM_RESV_ABILITY_INFO_CALLBACK);
4450 if (abilityInfoCallback != nullptr) {
4451 auto isPerm = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
4452 if (isPerm) {
4453 request.abilityInfoCallback = abilityInfoCallback;
4454 }
4455 }
4456
4457 auto bms = GetBundleManager();
4458 CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
4459 #ifdef SUPPORT_GRAPHICS
4460 if (want.GetAction().compare(ACTION_CHOOSE) == 0) {
4461 return ShowPickerDialog(want, userId, callerToken);
4462 }
4463 #endif
4464 auto abilityInfoFlag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION |
4465 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION |
4466 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA);
4467 HILOG_DEBUG("QueryAbilityInfo from bms, userId is %{public}d.", userId);
4468 int32_t appIndex = want.GetIntParam(DLP_INDEX, 0);
4469 if (appIndex == 0) {
4470 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(want, abilityInfoFlag, userId, request.abilityInfo));
4471 } else {
4472 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxAbilityInfo(want, appIndex,
4473 abilityInfoFlag, userId, request.abilityInfo));
4474 }
4475 if (request.abilityInfo.name.empty() || request.abilityInfo.bundleName.empty()) {
4476 // try to find extension
4477 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
4478 if (appIndex == 0) {
4479 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag,
4480 userId, extensionInfos));
4481 } else {
4482 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
4483 abilityInfoFlag, userId, extensionInfos));
4484 }
4485 if (extensionInfos.size() <= 0) {
4486 HILOG_ERROR("GenerateAbilityRequest error. Get extension info failed.");
4487 return RESOLVE_ABILITY_ERR;
4488 }
4489
4490 AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
4491 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
4492 HILOG_ERROR("extensionInfo empty.");
4493 return RESOLVE_ABILITY_ERR;
4494 }
4495 HILOG_DEBUG("Extension ability info found, name=%{public}s.",
4496 extensionInfo.name.c_str());
4497 // For compatibility translates to AbilityInfo
4498 InitAbilityInfoFromExtension(extensionInfo, request.abilityInfo);
4499 }
4500 HILOG_DEBUG("QueryAbilityInfo success, ability name: %{public}s, is stage mode: %{public}d.",
4501 request.abilityInfo.name.c_str(), request.abilityInfo.isStageBasedModel);
4502
4503 if (request.abilityInfo.applicationInfo.codePath == std::to_string(CollaboratorType::RESERVE_TYPE)) {
4504 request.collaboratorType = CollaboratorType::RESERVE_TYPE;
4505 } else if (request.abilityInfo.applicationInfo.codePath == std::to_string(CollaboratorType::OTHERS_TYPE)) {
4506 request.collaboratorType = CollaboratorType::OTHERS_TYPE;
4507 }
4508 if (request.collaboratorType != CollaboratorType::DEFAULT_TYPE &&
4509 !Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4510 auto collaborator = GetCollaborator(request.collaboratorType);
4511 if (collaborator == nullptr) {
4512 HILOG_ERROR("collaborator GetCollaborator is nullptr.");
4513 return ERR_COLLABORATOR_NOT_REGISTER;
4514 }
4515
4516 uint64_t accessTokenIDEx = IPCSkeleton::GetCallingFullTokenID();
4517
4518 int32_t ret = collaborator->NotifyStartAbility(request.abilityInfo, userId, request.want, accessTokenIDEx);
4519 if (ret != ERR_OK) {
4520 HILOG_ERROR("collaborator: notify broker start ability failed");
4521 return ERR_COLLABORATOR_NOTIFY_FAILED;
4522 }
4523
4524 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(request.want, abilityInfoFlag, userId, request.abilityInfo));
4525
4526 if (request.want.GetBoolParam(KEY_VISIBLE_ID, false) && !request.abilityInfo.visible) {
4527 request.abilityInfo.visible = true;
4528 HILOG_DEBUG("request.abilityInfo.visible set true");
4529 }
4530
4531 HILOG_INFO("collaborator notify broker start ability success");
4532 }
4533
4534 if (request.abilityInfo.type == AppExecFwk::AbilityType::SERVICE && request.abilityInfo.isStageBasedModel) {
4535 HILOG_INFO("Stage mode, abilityInfo SERVICE type reset EXTENSION.");
4536 request.abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
4537 }
4538
4539 if (request.abilityInfo.applicationInfo.name.empty() || request.abilityInfo.applicationInfo.bundleName.empty()) {
4540 HILOG_ERROR("Get app info failed.");
4541 return RESOLVE_APP_ERR;
4542 }
4543 request.appInfo = request.abilityInfo.applicationInfo;
4544 request.uid = request.appInfo.uid;
4545 HILOG_DEBUG("GenerateAbilityRequest end, app name: %{public}s, moduleName name: %{public}s, uid: %{public}d.",
4546 request.appInfo.name.c_str(), request.abilityInfo.moduleName.c_str(), request.uid);
4547
4548 request.want.SetModuleName(request.abilityInfo.moduleName);
4549
4550 if (want.GetBoolParam(Want::PARAM_RESV_START_RECENT, false) &&
4551 AAFwk::PermissionVerification::GetInstance()->VerifyMissionPermission()) {
4552 request.startRecent = true;
4553 }
4554
4555 return ERR_OK;
4556 }
4557
GenerateExtensionAbilityRequest(const Want & want,AbilityRequest & request,const sptr<IRemoteObject> & callerToken,int32_t userId)4558 int AbilityManagerService::GenerateExtensionAbilityRequest(
4559 const Want &want, AbilityRequest &request, const sptr<IRemoteObject> &callerToken, int32_t userId)
4560 {
4561 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
4562 if (abilityRecord && abilityRecord->GetAppIndex() != 0 &&
4563 abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
4564 (const_cast<Want &>(want)).SetParam(DLP_INDEX, abilityRecord->GetAppIndex());
4565 }
4566 request.want = want;
4567 request.callerToken = callerToken;
4568 request.startSetting = nullptr;
4569
4570 auto bms = GetBundleManager();
4571 CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
4572
4573 auto abilityInfoFlag = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION |
4574 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION |
4575 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA);
4576 HILOG_DEBUG("QueryExtensionAbilityInfo from bms, userId is %{public}d.", userId);
4577 // try to find extension
4578 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
4579 int32_t appIndex = want.GetIntParam(DLP_INDEX, 0);
4580 if (appIndex == 0) {
4581 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag, userId, extensionInfos));
4582 } else {
4583 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
4584 abilityInfoFlag, userId, extensionInfos));
4585 }
4586 if (extensionInfos.size() <= 0) {
4587 HILOG_ERROR("GenerateAbilityRequest error. Get extension info failed.");
4588 return RESOLVE_ABILITY_ERR;
4589 }
4590
4591 AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
4592 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
4593 HILOG_ERROR("extensionInfo empty.");
4594 return RESOLVE_ABILITY_ERR;
4595 }
4596 HILOG_DEBUG("Extension ability info found, name=%{public}s.",
4597 extensionInfo.name.c_str());
4598 // For compatibility translates to AbilityInfo
4599 InitAbilityInfoFromExtension(extensionInfo, request.abilityInfo);
4600
4601 HILOG_DEBUG("QueryAbilityInfo success, ability name: %{public}s, is stage mode: %{public}d.",
4602 request.abilityInfo.name.c_str(), request.abilityInfo.isStageBasedModel);
4603
4604 if (request.abilityInfo.applicationInfo.name.empty() || request.abilityInfo.applicationInfo.bundleName.empty()) {
4605 HILOG_ERROR("Get app info failed.");
4606 return RESOLVE_APP_ERR;
4607 }
4608 request.appInfo = request.abilityInfo.applicationInfo;
4609 request.uid = request.appInfo.uid;
4610 HILOG_DEBUG("GenerateAbilityRequest end, app name: %{public}s, bundle name: %{public}s, uid: %{public}d.",
4611 request.appInfo.name.c_str(), request.appInfo.bundleName.c_str(), request.uid);
4612
4613 HILOG_INFO("GenerateExtensionAbilityRequest, moduleName: %{public}s.", request.abilityInfo.moduleName.c_str());
4614 request.want.SetModuleName(request.abilityInfo.moduleName);
4615
4616 return ERR_OK;
4617 }
4618
StopServiceAbility(const Want & want,int32_t userId,const sptr<IRemoteObject> & token)4619 int AbilityManagerService::StopServiceAbility(const Want &want, int32_t userId, const sptr<IRemoteObject> &token)
4620 {
4621 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
4622 HILOG_DEBUG("call.");
4623
4624 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
4625 auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
4626 if (!isSaCall && !isShellCall) {
4627 auto abilityRecord = Token::GetAbilityRecordByToken(token);
4628 if (abilityRecord == nullptr) {
4629 HILOG_ERROR("callerRecord is nullptr");
4630 return ERR_INVALID_VALUE;
4631 }
4632 }
4633
4634 int32_t validUserId = GetValidUserId(userId);
4635 if (!JudgeMultiUserConcurrency(validUserId)) {
4636 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
4637 return ERR_CROSS_USER;
4638 }
4639
4640 AbilityRequest abilityRequest;
4641 auto result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, validUserId);
4642 if (result != ERR_OK) {
4643 HILOG_ERROR("Generate ability request local error.");
4644 return result;
4645 }
4646
4647 auto abilityInfo = abilityRequest.abilityInfo;
4648 validUserId = abilityInfo.applicationInfo.singleton ? U0_USER_ID : validUserId;
4649 HILOG_DEBUG("validUserId : %{public}d, singleton is : %{public}d",
4650 validUserId, static_cast<int>(abilityInfo.applicationInfo.singleton));
4651
4652 auto type = abilityInfo.type;
4653 if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) {
4654 HILOG_ERROR("Target ability is not service type.");
4655 return TARGET_ABILITY_NOT_SERVICE;
4656 }
4657
4658 auto res = JudgeAbilityVisibleControl(abilityInfo);
4659 if (res != ERR_OK) {
4660 HILOG_ERROR("Target ability is invisible");
4661 return res;
4662 }
4663
4664 auto connectManager = GetConnectManagerByUserId(validUserId);
4665 if (connectManager == nullptr) {
4666 return ERR_INVALID_VALUE;
4667 }
4668
4669 return connectManager->StopServiceAbility(abilityRequest);
4670 }
4671
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)4672 void AbilityManagerService::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
4673 {
4674 CHECK_POINTER(abilityRecord);
4675 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4676 if (abilityRecord->GetAbilityInfo().type == AbilityType::PAGE) {
4677 uiAbilityLifecycleManager_->OnAbilityDied(abilityRecord);
4678 return;
4679 }
4680 } else {
4681 auto manager = GetListManagerByUserId(abilityRecord->GetOwnerMissionUserId());
4682 if (manager && abilityRecord->GetAbilityInfo().type == AbilityType::PAGE) {
4683 ReleaseAbilityTokenMap(abilityRecord->GetToken());
4684 manager->OnAbilityDied(abilityRecord, GetUserId());
4685 return;
4686 }
4687 }
4688
4689 auto connectManager = GetConnectManagerByToken(abilityRecord->GetToken());
4690 if (connectManager) {
4691 connectManager->OnAbilityDied(abilityRecord, GetUserId());
4692 return;
4693 }
4694
4695 auto dataAbilityManager = GetDataAbilityManagerByToken(abilityRecord->GetToken());
4696 if (dataAbilityManager) {
4697 dataAbilityManager->OnAbilityDied(abilityRecord);
4698 }
4699 }
4700
OnCallConnectDied(std::shared_ptr<CallRecord> callRecord)4701 void AbilityManagerService::OnCallConnectDied(std::shared_ptr<CallRecord> callRecord)
4702 {
4703 CHECK_POINTER(callRecord);
4704 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4705 uiAbilityLifecycleManager_->OnCallConnectDied(callRecord);
4706 return;
4707 }
4708 if (currentMissionListManager_) {
4709 currentMissionListManager_->OnCallConnectDied(callRecord);
4710 }
4711 }
4712
ReleaseAbilityTokenMap(const sptr<IRemoteObject> & token)4713 void AbilityManagerService::ReleaseAbilityTokenMap(const sptr<IRemoteObject> &token)
4714 {
4715 std::lock_guard<ffrt::mutex> autoLock(abilityTokenLock_);
4716 for (auto iter = callStubTokenMap_.begin(); iter != callStubTokenMap_.end(); iter++) {
4717 if (iter->second == token) {
4718 callStubTokenMap_.erase(iter);
4719 break;
4720 }
4721 }
4722 }
4723
KillProcess(const std::string & bundleName)4724 int AbilityManagerService::KillProcess(const std::string &bundleName)
4725 {
4726 HILOG_DEBUG("Kill process, bundleName: %{public}s", bundleName.c_str());
4727 CHECK_CALLER_IS_SYSTEM_APP;
4728 auto bms = GetBundleManager();
4729 CHECK_POINTER_AND_RETURN(bms, KILL_PROCESS_FAILED);
4730 int32_t userId = GetUserId();
4731 AppExecFwk::BundleInfo bundleInfo;
4732 if (!IN_PROCESS_CALL(
4733 bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId))) {
4734 HILOG_ERROR("Failed to get bundle info when kill process.");
4735 return GET_BUNDLE_INFO_FAILED;
4736 }
4737
4738 if (bundleInfo.isKeepAlive) {
4739 HILOG_ERROR("Can not kill keep alive process.");
4740 return KILL_PROCESS_KEEP_ALIVE;
4741 }
4742
4743 int ret = DelayedSingleton<AppScheduler>::GetInstance()->KillApplication(bundleName);
4744 if (ret != ERR_OK) {
4745 return KILL_PROCESS_FAILED;
4746 }
4747 return ERR_OK;
4748 }
4749
ClearUpApplicationData(const std::string & bundleName)4750 int AbilityManagerService::ClearUpApplicationData(const std::string &bundleName)
4751 {
4752 HILOG_DEBUG("ClearUpApplicationData, bundleName: %{public}s", bundleName.c_str());
4753 CHECK_CALLER_IS_SYSTEM_APP;
4754 int ret = DelayedSingleton<AppScheduler>::GetInstance()->ClearUpApplicationData(bundleName);
4755 if (ret != ERR_OK) {
4756 return CLEAR_APPLICATION_DATA_FAIL;
4757 }
4758 return ERR_OK;
4759 }
4760
UninstallApp(const std::string & bundleName,int32_t uid)4761 int AbilityManagerService::UninstallApp(const std::string &bundleName, int32_t uid)
4762 {
4763 HILOG_DEBUG("Uninstall app, bundleName: %{public}s, uid=%{public}d", bundleName.c_str(), uid);
4764 pid_t callingPid = IPCSkeleton::GetCallingPid();
4765 pid_t pid = getpid();
4766 if (callingPid != pid) {
4767 HILOG_ERROR("%{public}s: Not bundleMgr call.", __func__);
4768 return CHECK_PERMISSION_FAILED;
4769 }
4770
4771 int32_t targetUserId = uid / BASE_USER_RANGE;
4772 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4773 uiAbilityLifecycleManager_->UninstallApp(bundleName, uid, targetUserId);
4774 } else if (targetUserId == U0_USER_ID) {
4775 std::lock_guard<ffrt::mutex> lock(managersMutex_);
4776 HILOG_INFO("UninstallApp.");
4777 for (auto item: missionListManagers_) {
4778 if (item.second) {
4779 item.second->UninstallApp(bundleName, uid);
4780 }
4781 }
4782 HILOG_INFO("UninstallApp end.");
4783 } else {
4784 auto listManager = GetListManagerByUserId(targetUserId);
4785 if (listManager) {
4786 listManager->UninstallApp(bundleName, uid);
4787 }
4788 }
4789
4790 if (pendingWantManager_) {
4791 pendingWantManager_->ClearPendingWantRecord(bundleName, uid);
4792 }
4793 int ret = DelayedSingleton<AppScheduler>::GetInstance()->KillApplicationByUid(bundleName, uid);
4794 if (ret != ERR_OK) {
4795 return UNINSTALL_APP_FAILED;
4796 }
4797 DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->DeleteAppExitReason(bundleName);
4798 return ERR_OK;
4799 }
4800
GetBundleManager()4801 sptr<AppExecFwk::IBundleMgr> AbilityManagerService::GetBundleManager()
4802 {
4803 if (iBundleManager_ == nullptr) {
4804 iBundleManager_ = AbilityUtil::GetBundleManager();
4805 }
4806 return iBundleManager_;
4807 }
4808
PreLoadAppDataAbilities(const std::string & bundleName,const int32_t userId)4809 int AbilityManagerService::PreLoadAppDataAbilities(const std::string &bundleName, const int32_t userId)
4810 {
4811 if (bundleName.empty()) {
4812 HILOG_ERROR("Invalid bundle name when app data abilities preloading.");
4813 return ERR_INVALID_VALUE;
4814 }
4815
4816 auto dataAbilityManager = GetDataAbilityManagerByUserId(userId);
4817 if (dataAbilityManager == nullptr) {
4818 HILOG_ERROR("Invalid data ability manager when app data abilities preloading.");
4819 return ERR_INVALID_STATE;
4820 }
4821
4822 auto bms = GetBundleManager();
4823 CHECK_POINTER_AND_RETURN(bms, GET_ABILITY_SERVICE_FAILED);
4824
4825 AppExecFwk::BundleInfo bundleInfo;
4826 bool ret = IN_PROCESS_CALL(
4827 bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, userId));
4828 if (!ret) {
4829 HILOG_ERROR("Failed to get bundle info when app data abilities preloading, userId is %{public}d", userId);
4830 return RESOLVE_APP_ERR;
4831 }
4832
4833 HILOG_DEBUG("App data abilities preloading for bundle '%{public}s'...", bundleName.data());
4834
4835 auto begin = system_clock::now();
4836 AbilityRequest dataAbilityRequest;
4837 UpdateCallerInfo(dataAbilityRequest.want, nullptr);
4838 dataAbilityRequest.appInfo = bundleInfo.applicationInfo;
4839 for (auto it = bundleInfo.abilityInfos.begin(); it != bundleInfo.abilityInfos.end(); ++it) {
4840 if (it->type != AppExecFwk::AbilityType::DATA) {
4841 continue;
4842 }
4843 if ((system_clock::now() - begin) >= DATA_ABILITY_START_TIMEOUT) {
4844 HILOG_ERROR("App data ability preloading for '%{public}s' timeout.", bundleName.c_str());
4845 return ERR_TIMED_OUT;
4846 }
4847 dataAbilityRequest.abilityInfo = *it;
4848 dataAbilityRequest.uid = bundleInfo.uid;
4849 HILOG_INFO("App data ability preloading: '%{public}s.%{public}s'...",
4850 it->bundleName.c_str(), it->name.c_str());
4851
4852 auto dataAbility = dataAbilityManager->Acquire(dataAbilityRequest, false, nullptr, false);
4853 if (dataAbility == nullptr) {
4854 HILOG_ERROR(
4855 "Failed to preload data ability '%{public}s.%{public}s'.", it->bundleName.c_str(), it->name.c_str());
4856 return ERR_NULL_OBJECT;
4857 }
4858 }
4859
4860 HILOG_INFO("App data abilities preloading done.");
4861
4862 return ERR_OK;
4863 }
4864
IsSystemUiApp(const AppExecFwk::AbilityInfo & info) const4865 bool AbilityManagerService::IsSystemUiApp(const AppExecFwk::AbilityInfo &info) const
4866 {
4867 if (info.bundleName != AbilityConfig::SYSTEM_UI_BUNDLE_NAME) {
4868 return false;
4869 }
4870 return (info.name == AbilityConfig::SYSTEM_UI_NAVIGATION_BAR ||
4871 info.name == AbilityConfig::SYSTEM_UI_STATUS_BAR ||
4872 info.name == AbilityConfig::SYSTEM_UI_ABILITY_NAME);
4873 }
4874
IsSystemUI(const std::string & bundleName) const4875 bool AbilityManagerService::IsSystemUI(const std::string &bundleName) const
4876 {
4877 return bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME;
4878 }
4879
HandleLoadTimeOut(int64_t abilityRecordId,bool isHalf)4880 void AbilityManagerService::HandleLoadTimeOut(int64_t abilityRecordId, bool isHalf)
4881 {
4882 HILOG_DEBUG("Handle load timeout.");
4883 std::lock_guard<ffrt::mutex> lock(managersMutex_);
4884 HILOG_INFO("called.");
4885 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4886 uiAbilityLifecycleManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecordId, isHalf);
4887 return;
4888 }
4889 for (auto& item : missionListManagers_) {
4890 if (item.second) {
4891 item.second->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecordId, isHalf);
4892 }
4893 }
4894 HILOG_INFO("end.");
4895 }
4896
HandleActiveTimeOut(int64_t abilityRecordId)4897 void AbilityManagerService::HandleActiveTimeOut(int64_t abilityRecordId)
4898 {
4899 HILOG_DEBUG("Handle active timeout.");
4900 std::lock_guard<ffrt::mutex> lock(managersMutex_);
4901 HILOG_INFO("called.");
4902 for (auto& item : missionListManagers_) {
4903 if (item.second) {
4904 item.second->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, abilityRecordId);
4905 }
4906 }
4907 HILOG_INFO("end.");
4908 }
4909
HandleInactiveTimeOut(int64_t abilityRecordId)4910 void AbilityManagerService::HandleInactiveTimeOut(int64_t abilityRecordId)
4911 {
4912 HILOG_DEBUG("Handle inactive timeout.");
4913 std::lock_guard<ffrt::mutex> lock(managersMutex_);
4914 HILOG_INFO("called.");
4915 for (auto& item : missionListManagers_) {
4916 if (item.second) {
4917 item.second->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecordId);
4918 }
4919 }
4920
4921 for (auto& item : connectManagers_) {
4922 if (item.second) {
4923 item.second->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecordId);
4924 }
4925 }
4926 HILOG_INFO("end.");
4927 }
4928
HandleForegroundTimeOut(int64_t abilityRecordId,bool isHalf)4929 void AbilityManagerService::HandleForegroundTimeOut(int64_t abilityRecordId, bool isHalf)
4930 {
4931 HILOG_DEBUG("Handle foreground timeout.");
4932 std::lock_guard<ffrt::mutex> lock(managersMutex_);
4933 HILOG_INFO("called.");
4934 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
4935 uiAbilityLifecycleManager_->OnTimeOut(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecordId, isHalf);
4936 return;
4937 }
4938 for (auto& item : missionListManagers_) {
4939 if (item.second) {
4940 item.second->OnTimeOut(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecordId, isHalf);
4941 }
4942 }
4943 HILOG_INFO("end.");
4944 }
4945
HandleShareDataTimeOut(int64_t uniqueId)4946 void AbilityManagerService::HandleShareDataTimeOut(int64_t uniqueId)
4947 {
4948 WantParams wantParam;
4949 int32_t ret = GetShareDataPairAndReturnData(nullptr, ERR_TIMED_OUT, uniqueId, wantParam);
4950 if (ret) {
4951 HILOG_ERROR("acqurieShareData failed.");
4952 }
4953 }
4954
GetShareDataPairAndReturnData(std::shared_ptr<AbilityRecord> abilityRecord,const int32_t & resultCode,const int32_t & uniqueId,WantParams & wantParam)4955 int32_t AbilityManagerService::GetShareDataPairAndReturnData(std::shared_ptr<AbilityRecord> abilityRecord,
4956 const int32_t &resultCode, const int32_t &uniqueId, WantParams &wantParam)
4957 {
4958 HILOG_INFO("resultCode:%{public}d, uniqueId:%{public}d, wantParam size:%{public}d.",
4959 resultCode, uniqueId, wantParam.Size());
4960 auto it = iAcquireShareDataMap_.find(uniqueId);
4961 if (it != iAcquireShareDataMap_.end()) {
4962 auto shareDataPair = it->second;
4963 if (abilityRecord && shareDataPair.first != abilityRecord->GetAbilityRecordId()) {
4964 HILOG_ERROR("abilityRecord is not the abilityRecord from request.");
4965 return ERR_INVALID_VALUE;
4966 }
4967 auto callback = shareDataPair.second;
4968 if (!callback) {
4969 HILOG_ERROR("callback object is nullptr.");
4970 return ERR_INVALID_VALUE;
4971 }
4972 auto ret = callback->AcquireShareDataDone(resultCode, wantParam);
4973 iAcquireShareDataMap_.erase(it);
4974 return ret;
4975 }
4976 HILOG_ERROR("iAcquireShareData is null.");
4977 return ERR_INVALID_VALUE;
4978 }
4979
VerificationToken(const sptr<IRemoteObject> & token)4980 bool AbilityManagerService::VerificationToken(const sptr<IRemoteObject> &token)
4981 {
4982 HILOG_INFO("Verification token.");
4983 CHECK_POINTER_RETURN_BOOL(dataAbilityManager_);
4984 CHECK_POINTER_RETURN_BOOL(connectManager_);
4985 CHECK_POINTER_RETURN_BOOL(currentMissionListManager_);
4986
4987 if (currentMissionListManager_->GetAbilityRecordByToken(token)) {
4988 return true;
4989 }
4990 if (currentMissionListManager_->GetAbilityFromTerminateList(token)) {
4991 return true;
4992 }
4993
4994 if (dataAbilityManager_->GetAbilityRecordByToken(token)) {
4995 HILOG_INFO("Verification token4.");
4996 return true;
4997 }
4998
4999 if (connectManager_->GetExtensionByTokenFromServiceMap(token)) {
5000 HILOG_INFO("Verification token5.");
5001 return true;
5002 }
5003
5004 if (connectManager_->GetExtensionByTokenFromTerminatingMap(token)) {
5005 HILOG_INFO("Verification token5.");
5006 return true;
5007 }
5008
5009 HILOG_ERROR("Failed to verify token.");
5010 return false;
5011 }
5012
VerificationAllToken(const sptr<IRemoteObject> & token)5013 bool AbilityManagerService::VerificationAllToken(const sptr<IRemoteObject> &token)
5014 {
5015 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
5016 HILOG_INFO("VerificationAllToken.");
5017 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5018 HILOG_INFO("Got lock.");
5019 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5020 if (uiAbilityLifecycleManager_ != nullptr && uiAbilityLifecycleManager_->IsContainsAbility(token)) {
5021 return true;
5022 }
5023 } else {
5024 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchMissionListManagers");
5025 for (auto item: missionListManagers_) {
5026 if (item.second && item.second->GetAbilityRecordByToken(token)) {
5027 HILOG_INFO("end.");
5028 return true;
5029 }
5030
5031 if (item.second && item.second->GetAbilityFromTerminateList(token)) {
5032 HILOG_INFO("end.");
5033 return true;
5034 }
5035 }
5036 }
5037
5038 {
5039 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchDataAbilityManagers_");
5040 for (auto item: dataAbilityManagers_) {
5041 if (item.second && item.second->GetAbilityRecordByToken(token)) {
5042 HILOG_INFO("end.");
5043 return true;
5044 }
5045 }
5046 }
5047
5048 {
5049 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchConnectManagers_");
5050 for (auto item: connectManagers_) {
5051 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
5052 HILOG_INFO("end.");
5053 return true;
5054 }
5055 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
5056 HILOG_INFO("end.");
5057 return true;
5058 }
5059 }
5060 }
5061 HILOG_ERROR("Failed to verify all token.");
5062 return false;
5063 }
5064
GetDataAbilityManager(const sptr<IAbilityScheduler> & scheduler)5065 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManager(
5066 const sptr<IAbilityScheduler> &scheduler)
5067 {
5068 if (scheduler == nullptr) {
5069 HILOG_ERROR("the param ability scheduler is nullptr");
5070 return nullptr;
5071 }
5072
5073 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5074 HILOG_INFO("called.");
5075 for (auto& item: dataAbilityManagers_) {
5076 if (item.second && item.second->ContainsDataAbility(scheduler)) {
5077 HILOG_INFO("find end.");
5078 return item.second;
5079 }
5080 }
5081 HILOG_INFO("null end.");
5082 return nullptr;
5083 }
5084
GetListManagerByUserId(int32_t userId)5085 std::shared_ptr<MissionListManager> AbilityManagerService::GetListManagerByUserId(int32_t userId)
5086 {
5087 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5088 HILOG_INFO("called.");
5089 auto it = missionListManagers_.find(userId);
5090 if (it != missionListManagers_.end()) {
5091 HILOG_INFO("find end.");
5092 return it->second;
5093 }
5094 HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
5095 return nullptr;
5096 }
5097
GetConnectManagerByUserId(int32_t userId)5098 std::shared_ptr<AbilityConnectManager> AbilityManagerService::GetConnectManagerByUserId(int32_t userId)
5099 {
5100 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5101 HILOG_INFO("called.");
5102 auto it = connectManagers_.find(userId);
5103 if (it != connectManagers_.end()) {
5104 HILOG_INFO("find end.");
5105 return it->second;
5106 }
5107 HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
5108 return nullptr;
5109 }
5110
GetDataAbilityManagerByUserId(int32_t userId)5111 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManagerByUserId(int32_t userId)
5112 {
5113 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5114 HILOG_INFO("called.");
5115 auto it = dataAbilityManagers_.find(userId);
5116 if (it != dataAbilityManagers_.end()) {
5117 HILOG_INFO("find end.");
5118 return it->second;
5119 }
5120 HILOG_ERROR("%{public}s, Failed to get Manager. UserId = %{public}d", __func__, userId);
5121 return nullptr;
5122 }
5123
GetConnectManagerByToken(const sptr<IRemoteObject> & token)5124 std::shared_ptr<AbilityConnectManager> AbilityManagerService::GetConnectManagerByToken(
5125 const sptr<IRemoteObject> &token)
5126 {
5127 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5128 HILOG_INFO("called.");
5129 for (auto item: connectManagers_) {
5130 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
5131 HILOG_INFO("find end.");
5132 return item.second;
5133 }
5134 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
5135 HILOG_INFO("find end.");
5136 return item.second;
5137 }
5138 }
5139 HILOG_INFO("null end.");
5140 return nullptr;
5141 }
5142
GetDataAbilityManagerByToken(const sptr<IRemoteObject> & token)5143 std::shared_ptr<DataAbilityManager> AbilityManagerService::GetDataAbilityManagerByToken(
5144 const sptr<IRemoteObject> &token)
5145 {
5146 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5147 HILOG_INFO("called.");
5148 for (auto item: dataAbilityManagers_) {
5149 if (item.second && item.second->GetAbilityRecordByToken(token)) {
5150 HILOG_INFO("find end.");
5151 return item.second;
5152 }
5153 }
5154 HILOG_INFO("null end.");
5155 return nullptr;
5156 }
5157
StartResidentApps()5158 void AbilityManagerService::StartResidentApps()
5159 {
5160 HILOG_DEBUG("%{public}s", __func__);
5161 ConnectBmsService();
5162 auto bms = GetBundleManager();
5163 CHECK_POINTER_IS_NULLPTR(bms);
5164 std::vector<AppExecFwk::BundleInfo> bundleInfos;
5165 if (!IN_PROCESS_CALL(
5166 bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, U0_USER_ID))) {
5167 HILOG_ERROR("Get resident bundleinfos failed");
5168 return;
5169 }
5170
5171 HILOG_INFO("StartResidentApps GetBundleInfos size: %{public}zu", bundleInfos.size());
5172
5173 DelayedSingleton<ResidentProcessManager>::GetInstance()->StartResidentProcessWithMainElement(bundleInfos);
5174 if (!bundleInfos.empty()) {
5175 #ifdef SUPPORT_GRAPHICS
5176 WaitParameter(BOOTEVENT_BOOT_ANIMATION_STARTED.c_str(), "true",
5177 AmsConfigurationParameter::GetInstance().GetBootAnimationTimeoutTime());
5178 #endif
5179 DelayedSingleton<ResidentProcessManager>::GetInstance()->StartResidentProcess(bundleInfos);
5180 }
5181 }
5182
ConnectBmsService()5183 void AbilityManagerService::ConnectBmsService()
5184 {
5185 HILOG_DEBUG("%{public}s", __func__);
5186 HILOG_INFO("Waiting AppMgr Service run completed.");
5187 while (!DelayedSingleton<AppScheduler>::GetInstance()->Init(shared_from_this())) {
5188 HILOG_ERROR("failed to init AppScheduler");
5189 usleep(REPOLL_TIME_MICRO_SECONDS);
5190 }
5191
5192 HILOG_INFO("Waiting BundleMgr Service run completed.");
5193 /* wait until connected to bundle manager service */
5194 while (iBundleManager_ == nullptr) {
5195 sptr<IRemoteObject> bundle_obj =
5196 OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
5197 if (bundle_obj == nullptr) {
5198 HILOG_ERROR("failed to get bundle manager service");
5199 usleep(REPOLL_TIME_MICRO_SECONDS);
5200 continue;
5201 }
5202 iBundleManager_ = iface_cast<AppExecFwk::IBundleMgr>(bundle_obj);
5203 }
5204
5205 HILOG_INFO("Connect bms success!");
5206 }
5207
GetWantSenderInfo(const sptr<IWantSender> & target,std::shared_ptr<WantSenderInfo> & info)5208 int AbilityManagerService::GetWantSenderInfo(const sptr<IWantSender> &target, std::shared_ptr<WantSenderInfo> &info)
5209 {
5210 HILOG_INFO("Get pending request info.");
5211 CHECK_POINTER_AND_RETURN(pendingWantManager_, ERR_INVALID_VALUE);
5212 CHECK_POINTER_AND_RETURN(target, ERR_INVALID_VALUE);
5213 CHECK_POINTER_AND_RETURN(info, ERR_INVALID_VALUE);
5214 return pendingWantManager_->GetWantSenderInfo(target, info);
5215 }
5216
GetAppMemorySize()5217 int AbilityManagerService::GetAppMemorySize()
5218 {
5219 HILOG_INFO("service GetAppMemorySize start");
5220 const char *key = "const.product.arkheaplimit";
5221 const char *def = "512m";
5222 char *valueGet = nullptr;
5223 unsigned int len = 128;
5224 int ret = GetParameter(key, def, valueGet, len);
5225 int resultInt = 0;
5226 if ((ret != GET_PARAMETER_OTHER) && (ret != GET_PARAMETER_INCORRECT)) {
5227 if (valueGet == nullptr) {
5228 HILOG_WARN("%{public}s, valueGet is nullptr", __func__);
5229 return APP_MEMORY_SIZE;
5230 }
5231 int len = strlen(valueGet);
5232 for (int i = 0; i < len; i++) {
5233 if (valueGet[i] >= '0' && valueGet[i] <= '9') {
5234 resultInt *= SIZE_10;
5235 resultInt += valueGet[i] - '0';
5236 }
5237 }
5238 if (resultInt == 0) {
5239 return APP_MEMORY_SIZE;
5240 }
5241 return resultInt;
5242 }
5243 return APP_MEMORY_SIZE;
5244 }
5245
IsRamConstrainedDevice()5246 bool AbilityManagerService::IsRamConstrainedDevice()
5247 {
5248 HILOG_INFO("service IsRamConstrainedDevice start");
5249 const char *key = "const.product.islowram";
5250 const char *def = "0";
5251 char *valueGet = nullptr;
5252 unsigned int len = 128;
5253 int ret = GetParameter(key, def, valueGet, len);
5254 if ((ret != GET_PARAMETER_OTHER) && (ret != GET_PARAMETER_INCORRECT)) {
5255 int value = atoi(valueGet);
5256 if (value) {
5257 return true;
5258 }
5259 return false;
5260 }
5261 return false;
5262 }
5263
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)5264 int32_t AbilityManagerService::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
5265 {
5266 auto abilityRecord = Token::GetAbilityRecordByToken(token);
5267 if (!abilityRecord) {
5268 HILOG_ERROR("abilityRecord is Null.");
5269 return -1;
5270 }
5271
5272 if (!JudgeSelfCalled(abilityRecord) && (IPCSkeleton::GetCallingPid() != getpid())) {
5273 return -1;
5274 }
5275 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5276 return uiAbilityLifecycleManager_->GetSessionIdByAbilityToken(token);
5277 }
5278 auto userId = abilityRecord->GetOwnerMissionUserId();
5279 auto missionListManager = GetListManagerByUserId(userId);
5280 if (!missionListManager) {
5281 HILOG_ERROR("missionListManager is Null. owner mission userId=%{public}d", userId);
5282 return -1;
5283 }
5284 return missionListManager->GetMissionIdByAbilityToken(token);
5285 }
5286
GetAbilityTokenByMissionId(int32_t missionId)5287 sptr<IRemoteObject> AbilityManagerService::GetAbilityTokenByMissionId(int32_t missionId)
5288 {
5289 if (!currentMissionListManager_) {
5290 return nullptr;
5291 }
5292 return currentMissionListManager_->GetAbilityTokenByMissionId(missionId);
5293 }
5294
StartRemoteAbilityByCall(const Want & want,const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject> & connect)5295 int AbilityManagerService::StartRemoteAbilityByCall(const Want &want, const sptr<IRemoteObject> &callerToken,
5296 const sptr<IRemoteObject> &connect)
5297 {
5298 HILOG_INFO("%{public}s begin StartRemoteAbilityByCall", __func__);
5299 Want remoteWant = want;
5300 if (AddStartControlParam(remoteWant, callerToken) != ERR_OK) {
5301 HILOG_ERROR("%{public}s AddStartControlParam failed.", __func__);
5302 return ERR_INVALID_VALUE;
5303 }
5304 int32_t missionId = -1;
5305 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5306 missionId = uiAbilityLifecycleManager_->GetSessionIdByAbilityToken(callerToken);
5307 if (!missionId) {
5308 HILOG_ERROR("Invalid missionId id.");
5309 return ERR_INVALID_VALUE;
5310 }
5311 } else {
5312 missionId = GetMissionIdByAbilityToken(callerToken);
5313 }
5314 if (missionId < 0) {
5315 return ERR_INVALID_VALUE;
5316 }
5317 remoteWant.SetParam(DMS_MISSION_ID, missionId);
5318 DistributedClient dmsClient;
5319 return dmsClient.StartRemoteAbilityByCall(remoteWant, connect);
5320 }
5321
ReleaseRemoteAbility(const sptr<IRemoteObject> & connect,const AppExecFwk::ElementName & element)5322 int AbilityManagerService::ReleaseRemoteAbility(const sptr<IRemoteObject> &connect,
5323 const AppExecFwk::ElementName &element)
5324 {
5325 DistributedClient dmsClient;
5326 return dmsClient.ReleaseRemoteAbility(connect, element);
5327 }
5328
StartAbilityByCall(const Want & want,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,int32_t accountId)5329 int AbilityManagerService::StartAbilityByCall(const Want &want, const sptr<IAbilityConnection> &connect,
5330 const sptr<IRemoteObject> &callerToken, int32_t accountId)
5331 {
5332 HILOG_INFO("call ability.");
5333 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
5334 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
5335 if (IsCrossUserCall(accountId)) {
5336 CHECK_CALLER_IS_SYSTEM_APP;
5337 }
5338
5339 if (VerifyAccountPermission(accountId) == CHECK_PERMISSION_FAILED) {
5340 HILOG_ERROR("%{public}s: Permission verification failed.", __func__);
5341 return CHECK_PERMISSION_FAILED;
5342 }
5343
5344 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
5345 if (abilityRecord && !JudgeSelfCalled(abilityRecord)) {
5346 return CHECK_PERMISSION_FAILED;
5347 }
5348
5349 auto result = interceptorExecuter_ == nullptr ? ERR_INVALID_VALUE :
5350 interceptorExecuter_->DoProcess(want, 0, GetUserId(), false);
5351 if (result != ERR_OK) {
5352 HILOG_ERROR("interceptorExecuter_ is nullptr or DoProcess return error.");
5353 return result;
5354 }
5355
5356 if (CheckIfOperateRemote(want)) {
5357 HILOG_INFO("start remote ability by call");
5358 return StartRemoteAbilityByCall(want, callerToken, connect->AsObject());
5359 }
5360
5361 int32_t oriValidUserId = GetValidUserId(accountId);
5362 if (!JudgeMultiUserConcurrency(oriValidUserId)) {
5363 HILOG_ERROR("Multi-user non-concurrent mode is not satisfied.");
5364 return ERR_CROSS_USER;
5365 }
5366
5367 AbilityRequest abilityRequest;
5368 abilityRequest.callType = AbilityCallType::CALL_REQUEST_TYPE;
5369 abilityRequest.callerUid = IPCSkeleton::GetCallingUid();
5370 abilityRequest.callerToken = callerToken;
5371 abilityRequest.startSetting = nullptr;
5372 abilityRequest.want = want;
5373 abilityRequest.connect = connect;
5374 result = GenerateAbilityRequest(want, -1, abilityRequest, callerToken, GetUserId());
5375 ComponentRequest componentRequest = initComponentRequest(callerToken, -1, result);
5376 if (CheckProxyComponent(want, result) && !IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
5377 return componentRequest.requestResult;
5378 }
5379 if (result != ERR_OK) {
5380 HILOG_ERROR("Generate ability request error.");
5381 return result;
5382 }
5383
5384 if (!abilityRequest.abilityInfo.isStageBasedModel) {
5385 HILOG_ERROR("target ability is not stage base model.");
5386 return RESOLVE_CALL_ABILITY_VERSION_ERR;
5387 }
5388
5389 result = CheckStartByCallPermission(abilityRequest);
5390 if (result != ERR_OK) {
5391 HILOG_ERROR("CheckStartByCallPermission fail, result: %{public}d", result);
5392 return result;
5393 }
5394
5395 HILOG_DEBUG("abilityInfo.applicationInfo.singleton is %{public}s",
5396 abilityRequest.abilityInfo.applicationInfo.singleton ? "true" : "false");
5397 UpdateCallerInfo(abilityRequest.want, callerToken);
5398 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5399 return uiAbilityLifecycleManager_->ResolveLocked(abilityRequest, oriValidUserId);
5400 }
5401
5402 auto missionListMgr = GetListManagerByUserId(oriValidUserId);
5403 if (missionListMgr == nullptr) {
5404 HILOG_ERROR("missionListMgr is Null. Designated User Id=%{public}d", oriValidUserId);
5405 return ERR_INVALID_VALUE;
5406 }
5407 ReportEventToSuspendManager(abilityRequest.abilityInfo);
5408 if (!IsComponentInterceptionStart(want, componentRequest, abilityRequest)) {
5409 return componentRequest.requestResult;
5410 }
5411
5412 #ifdef SUPPORT_ERMS
5413 result = afterCheckExecuter_ == nullptr ? ERR_INVALID_VALUE :
5414 afterCheckExecuter_->DoProcess(abilityRequest.want, 0, GetUserId(), false);
5415 if (result != ERR_OK) {
5416 HILOG_ERROR("afterCheckExecuter_ is nullptr or DoProcess return error.");
5417 return result;
5418 }
5419 #endif
5420
5421 return missionListMgr->ResolveLocked(abilityRequest);
5422 }
5423
ReleaseCall(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)5424 int AbilityManagerService::ReleaseCall(
5425 const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
5426 {
5427 HILOG_DEBUG("Release called ability.");
5428
5429 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
5430 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
5431 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5432 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
5433 }
5434
5435 std::string elementName = element.GetURI();
5436 HILOG_DEBUG("try to release called ability, name: %{public}s.", elementName.c_str());
5437
5438 if (CheckIsRemote(element.GetDeviceID())) {
5439 HILOG_INFO("release remote ability");
5440 return ReleaseRemoteAbility(connect->AsObject(), element);
5441 }
5442
5443 int result = ERR_OK;
5444 if (IsReleaseCallInterception(connect, element, result)) {
5445 return result;
5446 }
5447
5448 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5449 return uiAbilityLifecycleManager_->ReleaseCallLocked(connect, element);
5450 }
5451
5452 return currentMissionListManager_->ReleaseCallLocked(connect, element);
5453 }
5454
JudgeAbilityVisibleControl(const AppExecFwk::AbilityInfo & abilityInfo)5455 int AbilityManagerService::JudgeAbilityVisibleControl(const AppExecFwk::AbilityInfo &abilityInfo)
5456 {
5457 HILOG_DEBUG("Call.");
5458 if (abilityInfo.visible) {
5459 return ERR_OK;
5460 }
5461 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
5462 if (callerTokenId == abilityInfo.applicationInfo.accessTokenId ||
5463 callerTokenId == static_cast<uint32_t>(IPCSkeleton::GetSelfTokenID())) { // foundation call is allowed
5464 return ERR_OK;
5465 }
5466 if (AccessTokenKit::VerifyAccessToken(callerTokenId,
5467 PermissionConstants::PERMISSION_START_INVISIBLE_ABILITY) == AppExecFwk::Constants::PERMISSION_GRANTED) {
5468 return ERR_OK;
5469 }
5470 if (AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
5471 return ERR_OK;
5472 }
5473 HILOG_ERROR("callerToken: %{private}u, targetToken: %{private}u, caller doesn's have permission",
5474 callerTokenId, abilityInfo.applicationInfo.accessTokenId);
5475 return ABILITY_VISIBLE_FALSE_DENY_REQUEST;
5476 }
5477
StartUser(int userId)5478 int AbilityManagerService::StartUser(int userId)
5479 {
5480 HILOG_DEBUG("%{public}s, userId:%{public}d", __func__, userId);
5481 if (IPCSkeleton::GetCallingUid() != ACCOUNT_MGR_SERVICE_UID) {
5482 HILOG_ERROR("%{public}s: Permission verification failed, not account process", __func__);
5483 return CHECK_PERMISSION_FAILED;
5484 }
5485
5486 if (userController_) {
5487 return userController_->StartUser(userId, true);
5488 }
5489 return 0;
5490 }
5491
StopUser(int userId,const sptr<IStopUserCallback> & callback)5492 int AbilityManagerService::StopUser(int userId, const sptr<IStopUserCallback> &callback)
5493 {
5494 HILOG_DEBUG("%{public}s", __func__);
5495 if (IPCSkeleton::GetCallingUid() != ACCOUNT_MGR_SERVICE_UID) {
5496 HILOG_ERROR("%{public}s: Permission verification failed, not account process", __func__);
5497 return CHECK_PERMISSION_FAILED;
5498 }
5499
5500 auto ret = -1;
5501 if (userController_) {
5502 ret = userController_->StopUser(userId);
5503 HILOG_DEBUG("ret = %{public}d", ret);
5504 }
5505 if (callback) {
5506 callback->OnStopUserDone(userId, ret);
5507 }
5508 return 0;
5509 }
5510
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)5511 void AbilityManagerService::OnAcceptWantResponse(
5512 const AAFwk::Want &want, const std::string &flag)
5513 {
5514 HILOG_DEBUG("On accept want response");
5515 if (uiAbilityLifecycleManager_ && Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5516 uiAbilityLifecycleManager_->OnAcceptWantResponse(want, flag);
5517 return;
5518 }
5519 if (!currentMissionListManager_) {
5520 return;
5521 }
5522 currentMissionListManager_->OnAcceptWantResponse(want, flag);
5523 }
5524
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)5525 void AbilityManagerService::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
5526 {
5527 HILOG_DEBUG("%{public}s called.", __func__);
5528 if (!currentMissionListManager_) {
5529 return;
5530 }
5531 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5532 currentMissionListManager_->OnStartSpecifiedAbilityTimeoutResponse(want);
5533 }
5534 }
5535
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info)5536 int AbilityManagerService::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info)
5537 {
5538 HILOG_DEBUG("Get running ability infos.");
5539 CHECK_CALLER_IS_SYSTEM_APP;
5540 auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyRunningInfoPerm();
5541 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5542 uiAbilityLifecycleManager_->GetAbilityRunningInfos(info, isPerm, GetUserId());
5543 } else {
5544 if (!currentMissionListManager_) {
5545 return ERR_INVALID_VALUE;
5546 }
5547 currentMissionListManager_->GetAbilityRunningInfos(info, isPerm);
5548 }
5549
5550 UpdateFocusState(info);
5551
5552 return ERR_OK;
5553 }
5554
UpdateFocusState(std::vector<AbilityRunningInfo> & info)5555 void AbilityManagerService::UpdateFocusState(std::vector<AbilityRunningInfo> &info)
5556 {
5557 if (info.empty()) {
5558 return;
5559 }
5560
5561 #ifdef SUPPORT_GRAPHICS
5562 sptr<IRemoteObject> token;
5563 int ret = IN_PROCESS_CALL(GetTopAbility(token));
5564 if (ret != ERR_OK || token == nullptr) {
5565 return;
5566 }
5567
5568 auto abilityRecord = Token::GetAbilityRecordByToken(token);
5569 if (abilityRecord == nullptr) {
5570 HILOG_WARN("%{public}s abilityRecord is null.", __func__);
5571 return;
5572 }
5573
5574 for (auto &item : info) {
5575 if (item.uid == abilityRecord->GetUid() && item.pid == abilityRecord->GetPid() &&
5576 item.ability == abilityRecord->GetWant().GetElement()) {
5577 item.abilityState = static_cast<int>(AbilityState::ACTIVE);
5578 break;
5579 }
5580 }
5581 #endif
5582 }
5583
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info)5584 int AbilityManagerService::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info)
5585 {
5586 HILOG_DEBUG("Get extension infos, upperLimit : %{public}d", upperLimit);
5587 CHECK_CALLER_IS_SYSTEM_APP;
5588 auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyRunningInfoPerm();
5589 if (!connectManager_) {
5590 return ERR_INVALID_VALUE;
5591 }
5592
5593 connectManager_->GetExtensionRunningInfos(upperLimit, info, GetUserId(), isPerm);
5594 return ERR_OK;
5595 }
5596
GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> & info)5597 int AbilityManagerService::GetProcessRunningInfos(std::vector<AppExecFwk::RunningProcessInfo> &info)
5598 {
5599 return DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfos(info);
5600 }
5601
GetProcessRunningInfosByUserId(std::vector<AppExecFwk::RunningProcessInfo> & info,int32_t userId)5602 int AbilityManagerService::GetProcessRunningInfosByUserId(
5603 std::vector<AppExecFwk::RunningProcessInfo> &info, int32_t userId)
5604 {
5605 return DelayedSingleton<AppScheduler>::GetInstance()->GetProcessRunningInfosByUserId(info, userId);
5606 }
5607
ClearUserData(int32_t userId)5608 void AbilityManagerService::ClearUserData(int32_t userId)
5609 {
5610 HILOG_INFO("called.");
5611 std::unique_lock<ffrt::mutex> lock(managersMutex_);
5612 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5613 missionListManagers_.erase(userId);
5614 }
5615 connectManagers_.erase(userId);
5616 dataAbilityManagers_.erase(userId);
5617 pendingWantManagers_.erase(userId);
5618 }
5619
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)5620 int AbilityManagerService::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
5621 {
5622 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
5623 if (!isSaCall) {
5624 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
5625 return 0;
5626 }
5627
5628 if (!currentMissionListManager_) {
5629 HILOG_ERROR("snapshot: currentMissionListManager_ is nullptr.");
5630 return INNER_ERR;
5631 }
5632 currentMissionListManager_->RegisterSnapshotHandler(handler);
5633 HILOG_INFO("snapshot: AbilityManagerService register snapshot handler success.");
5634 return ERR_OK;
5635 }
5636
GetMissionSnapshot(const std::string & deviceId,int32_t missionId,MissionSnapshot & missionSnapshot,bool isLowResolution)5637 int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, int32_t missionId,
5638 MissionSnapshot& missionSnapshot, bool isLowResolution)
5639 {
5640 CHECK_CALLER_IS_SYSTEM_APP;
5641 if (!PermissionVerification::GetInstance()->VerifyMissionPermission()) {
5642 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
5643 return CHECK_PERMISSION_FAILED;
5644 }
5645
5646 if (CheckIsRemote(deviceId)) {
5647 HILOG_INFO("get remote mission snapshot.");
5648 return GetRemoteMissionSnapshotInfo(deviceId, missionId, missionSnapshot);
5649 }
5650 HILOG_INFO("get local mission snapshot.");
5651 if (!currentMissionListManager_) {
5652 HILOG_ERROR("snapshot: currentMissionListManager_ is nullptr.");
5653 return INNER_ERR;
5654 }
5655 auto token = GetAbilityTokenByMissionId(missionId);
5656 bool result = currentMissionListManager_->GetMissionSnapshot(missionId, token, missionSnapshot, isLowResolution);
5657 if (!result) {
5658 return INNER_ERR;
5659 }
5660 return ERR_OK;
5661 }
5662
UpdateMissionSnapShot(const sptr<IRemoteObject> & token,const std::shared_ptr<Media::PixelMap> & pixelMap)5663 void AbilityManagerService::UpdateMissionSnapShot(const sptr<IRemoteObject> &token,
5664 const std::shared_ptr<Media::PixelMap> &pixelMap)
5665 {
5666 if (AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
5667 currentMissionListManager_->UpdateSnapShot(token, pixelMap);
5668 }
5669 }
5670
EnableRecoverAbility(const sptr<IRemoteObject> & token)5671 void AbilityManagerService::EnableRecoverAbility(const sptr<IRemoteObject>& token)
5672 {
5673 if (token == nullptr) {
5674 return;
5675 }
5676 auto record = Token::GetAbilityRecordByToken(token);
5677 if (record == nullptr) {
5678 HILOG_ERROR("%{public}s AppRecovery::failed find abilityRecord by given token.", __func__);
5679 return;
5680 }
5681
5682 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
5683 auto tokenID = record->GetApplicationInfo().accessTokenId;
5684 if (callingTokenId != tokenID) {
5685 HILOG_ERROR("AppRecovery ScheduleRecoverAbility not self, not enabled");
5686 return;
5687 }
5688 {
5689 std::lock_guard<ffrt::mutex> guard(globalLock_);
5690 auto it = appRecoveryHistory_.find(record->GetUid());
5691 if (it == appRecoveryHistory_.end()) {
5692 appRecoveryHistory_.emplace(record->GetUid(), 0);
5693 }
5694 }
5695
5696 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5697 const auto& abilityInfo = record->GetAbilityInfo();
5698 (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->AddAbilityRecoverInfo(
5699 abilityInfo.bundleName, abilityInfo.moduleName, abilityInfo.name,
5700 uiAbilityLifecycleManager_->GetSessionIdByAbilityToken(token));
5701 } else {
5702 auto userId = record->GetOwnerMissionUserId();
5703 auto missionListMgr = GetListManagerByUserId(userId);
5704 if (missionListMgr == nullptr) {
5705 HILOG_ERROR("missionListMgr is nullptr");
5706 return;
5707 }
5708 missionListMgr->EnableRecoverAbility(record->GetMissionId());
5709 }
5710
5711 }
5712
RecoverAbilityRestart(const Want & want)5713 void AbilityManagerService::RecoverAbilityRestart(const Want& want)
5714 {
5715 std::string identity = IPCSkeleton::ResetCallingIdentity();
5716 int32_t userId = GetValidUserId(DEFAULT_INVAL_VALUE);
5717 int32_t ret = StartAbility(want, userId, 0);
5718 if (ret != ERR_OK) {
5719 HILOG_ERROR("%{public}s AppRecovery::failed to restart ability. %{public}d", __func__, ret);
5720 }
5721 IPCSkeleton::SetCallingIdentity(identity);
5722 }
5723
ReportAppRecoverResult(const int32_t appId,const AppExecFwk::ApplicationInfo & appInfo,const std::string & abilityName,const std::string & result)5724 void AbilityManagerService::ReportAppRecoverResult(const int32_t appId, const AppExecFwk::ApplicationInfo &appInfo,
5725 const std::string& abilityName, const std::string& result)
5726 {
5727 HiSysEventWrite(HiSysEvent::Domain::AAFWK, "APP_RECOVERY", HiSysEvent::EventType::BEHAVIOR,
5728 "APP_UID", appId,
5729 "VERSION_CODE", std::to_string(appInfo.versionCode),
5730 "VERSION_NAME", appInfo.versionName,
5731 "BUNDLE_NAME", appInfo.bundleName,
5732 "ABILITY_NAME", abilityName,
5733 "RECOVERY_RESULT", result);
5734 }
5735
AppRecoverKill(pid_t pid,int32_t reason)5736 void AbilityManagerService::AppRecoverKill(pid_t pid, int32_t reason)
5737 {
5738 AppExecFwk::AppFaultDataBySA faultDataSA;
5739 faultDataSA.errorObject.name = "appRecovery";
5740 switch (reason) {
5741 case AppExecFwk::StateReason::CPP_CRASH:
5742 faultDataSA.faultType = AppExecFwk::FaultDataType::CPP_CRASH;
5743 break;
5744 case AppExecFwk::StateReason::JS_ERROR:
5745 faultDataSA.faultType = AppExecFwk::FaultDataType::JS_ERROR;
5746 break;
5747 case AppExecFwk::StateReason::LIFECYCLE:
5748 case AppExecFwk::StateReason::APP_FREEZE:
5749 faultDataSA.faultType = AppExecFwk::FaultDataType::APP_FREEZE;
5750 break;
5751 default:
5752 faultDataSA.faultType = AppExecFwk::FaultDataType::UNKNOWN;
5753 }
5754 faultDataSA.pid = pid;
5755 IN_PROCESS_CALL(DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->NotifyAppFaultBySA(faultDataSA));
5756 }
5757
ScheduleRecoverAbility(const sptr<IRemoteObject> & token,int32_t reason,const Want * want)5758 void AbilityManagerService::ScheduleRecoverAbility(const sptr<IRemoteObject>& token, int32_t reason, const Want *want)
5759 {
5760 if (token == nullptr) {
5761 return;
5762 }
5763 auto record = Token::GetAbilityRecordByToken(token);
5764 if (record == nullptr) {
5765 HILOG_ERROR("%{public}s AppRecovery::failed find abilityRecord by given token.", __func__);
5766 return;
5767 }
5768
5769 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
5770 auto tokenID = record->GetApplicationInfo().accessTokenId;
5771 if (callingTokenId != tokenID) {
5772 HILOG_ERROR("AppRecovery ScheduleRecoverAbility not self, not enabled");
5773 return;
5774 }
5775
5776 if (reason == AppExecFwk::StateReason::APP_FREEZE) {
5777 RecordAppExitReason(REASON_APP_FREEZE);
5778 }
5779
5780 AAFwk::Want curWant;
5781 {
5782 std::lock_guard<ffrt::mutex> guard(globalLock_);
5783 auto type = record->GetAbilityInfo().type;
5784 if (type != AppExecFwk::AbilityType::PAGE) {
5785 HILOG_ERROR("%{public}s AppRecovery::only do recover for page ability.", __func__);
5786 return;
5787 }
5788
5789 constexpr int64_t MIN_RECOVERY_TIME = 60;
5790 int64_t now = time(nullptr);
5791 auto it = appRecoveryHistory_.find(record->GetUid());
5792 auto appInfo = record->GetApplicationInfo();
5793 auto abilityInfo = record->GetAbilityInfo();
5794
5795 if ((it != appRecoveryHistory_.end()) &&
5796 (it->second + MIN_RECOVERY_TIME > now)) {
5797 HILOG_ERROR("%{public}s AppRecovery recover app more than once in one minute, just kill app(%{public}d).",
5798 __func__, record->GetPid());
5799 ReportAppRecoverResult(record->GetUid(), appInfo, abilityInfo.name, "FAIL_WITHIN_ONE_MINUTE");
5800 AppRecoverKill(record->GetPid(), reason);
5801 return;
5802 }
5803
5804 if (want != nullptr) {
5805 HILOG_DEBUG("BundleName:%{public}s targetBundleName:%{public}s.",
5806 appInfo.bundleName.c_str(), want->GetElement().GetBundleName().c_str());
5807 if (want->GetElement().GetBundleName().empty() ||
5808 (appInfo.bundleName.compare(want->GetElement().GetBundleName()) != 0)) {
5809 HILOG_ERROR("AppRecovery BundleName not match, Not recovery ability!");
5810 ReportAppRecoverResult(record->GetUid(), appInfo, abilityInfo.name, "FAIL_BUNDLE_NAME_NOT_MATCH");
5811 return;
5812 } else if (want->GetElement().GetAbilityName().empty()) {
5813 HILOG_DEBUG("AppRecovery recovery target ability is empty");
5814 ReportAppRecoverResult(record->GetUid(), appInfo, abilityInfo.name, "FAIL_TARGET_ABILITY_EMPTY");
5815 return;
5816 } else {
5817 auto bms = GetBundleManager();
5818 if (bms == nullptr) {
5819 HILOG_ERROR("bms is nullptr");
5820 return;
5821 }
5822 AppExecFwk::BundleInfo bundleInfo;
5823 auto bundleName = want->GetElement().GetBundleName();
5824 int32_t userId = GetUserId();
5825 bool ret = IN_PROCESS_CALL(
5826 bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo,
5827 userId));
5828 if (!ret) {
5829 HILOG_ERROR("AppRecovery Failed to get bundle info, not do recovery!");
5830 return;
5831 }
5832 bool isRestartPage = false;
5833 auto abilityName = want->GetElement().GetAbilityName();
5834 for (auto it = bundleInfo.abilityInfos.begin(); it != bundleInfo.abilityInfos.end(); ++it) {
5835 if ((abilityName.compare(it->name) == 0) && it->type == AppExecFwk::AbilityType::PAGE) {
5836 isRestartPage = true;
5837 break;
5838 }
5839 }
5840 if (!isRestartPage) {
5841 HILOG_INFO("AppRecovery the target ability type is not PAGE!");
5842 ReportAppRecoverResult(record->GetUid(), appInfo, abilityName, "FAIL_TARGET_ABILITY_NOT_PAGE");
5843 return;
5844 }
5845 }
5846 }
5847
5848 appRecoveryHistory_[record->GetUid()] = now;
5849 curWant = (want == nullptr) ? record->GetWant() : *want;
5850 curWant.SetParam(AAFwk::Want::PARAM_ABILITY_RECOVERY_RESTART, true);
5851
5852 ReportAppRecoverResult(record->GetUid(), appInfo, abilityInfo.name, "SUCCESS");
5853 AppRecoverKill(record->GetPid(), reason);
5854 }
5855
5856 constexpr int delaytime = 1000;
5857 std::string taskName = "AppRecovery_kill:" + std::to_string(record->GetPid());
5858 auto task = std::bind(&AbilityManagerService::RecoverAbilityRestart, this, curWant);
5859 HILOG_INFO("AppRecovery RecoverAbilityRestart task begin");
5860 taskHandler_->SubmitTask(task, taskName, delaytime);
5861 }
5862
GetRemoteMissionSnapshotInfo(const std::string & deviceId,int32_t missionId,MissionSnapshot & missionSnapshot)5863 int32_t AbilityManagerService::GetRemoteMissionSnapshotInfo(const std::string& deviceId, int32_t missionId,
5864 MissionSnapshot& missionSnapshot)
5865 {
5866 HILOG_INFO("GetRemoteMissionSnapshotInfo begin");
5867 std::unique_ptr<MissionSnapshot> missionSnapshotPtr = std::make_unique<MissionSnapshot>();
5868 DistributedClient dmsClient;
5869 int result = dmsClient.GetRemoteMissionSnapshotInfo(deviceId, missionId, missionSnapshotPtr);
5870 if (result != ERR_OK) {
5871 HILOG_ERROR("GetRemoteMissionSnapshotInfo failed, result = %{public}d", result);
5872 return result;
5873 }
5874 missionSnapshot = *missionSnapshotPtr;
5875 return ERR_OK;
5876 }
5877
StartFreezingScreen()5878 void AbilityManagerService::StartFreezingScreen()
5879 {
5880 HILOG_INFO("%{public}s", __func__);
5881 #ifdef SUPPORT_GRAPHICS
5882 std::vector<Rosen::DisplayId> displayIds = Rosen::DisplayManager::GetInstance().GetAllDisplayIds();
5883 IN_PROCESS_CALL_WITHOUT_RET(Rosen::DisplayManager::GetInstance().Freeze(displayIds));
5884 #endif
5885 }
5886
StopFreezingScreen()5887 void AbilityManagerService::StopFreezingScreen()
5888 {
5889 HILOG_INFO("%{public}s", __func__);
5890 #ifdef SUPPORT_GRAPHICS
5891 std::vector<Rosen::DisplayId> displayIds = Rosen::DisplayManager::GetInstance().GetAllDisplayIds();
5892 IN_PROCESS_CALL_WITHOUT_RET(Rosen::DisplayManager::GetInstance().Unfreeze(displayIds));
5893 #endif
5894 }
5895
UserStarted(int32_t userId)5896 void AbilityManagerService::UserStarted(int32_t userId)
5897 {
5898 HILOG_INFO("called.");
5899 InitConnectManager(userId, false);
5900 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5901 InitMissionListManager(userId, false);
5902 }
5903 InitDataAbilityManager(userId, false);
5904 InitPendWantManager(userId, false);
5905 HILOG_INFO("end.");
5906 }
5907
SwitchToUser(int32_t oldUserId,int32_t userId)5908 void AbilityManagerService::SwitchToUser(int32_t oldUserId, int32_t userId)
5909 {
5910 HILOG_INFO("%{public}s, oldUserId:%{public}d, newUserId:%{public}d", __func__, oldUserId, userId);
5911 SwitchManagers(userId);
5912 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5913 PauseOldUser(oldUserId);
5914 bool isBoot = false;
5915 if (oldUserId == U0_USER_ID) {
5916 isBoot = true;
5917 }
5918 ConnectBmsService();
5919 StartUserApps(userId, isBoot);
5920 }
5921 PauseOldConnectManager(oldUserId);
5922 }
5923
SwitchManagers(int32_t userId,bool switchUser)5924 void AbilityManagerService::SwitchManagers(int32_t userId, bool switchUser)
5925 {
5926 HILOG_INFO("%{public}s, SwitchManagers:%{public}d-----begin", __func__, userId);
5927 InitConnectManager(userId, switchUser);
5928 if (userId != U0_USER_ID && !Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
5929 InitMissionListManager(userId, switchUser);
5930 }
5931 InitDataAbilityManager(userId, switchUser);
5932 InitPendWantManager(userId, switchUser);
5933 HILOG_INFO("%{public}s, SwitchManagers:%{public}d-----end", __func__, userId);
5934 }
5935
PauseOldUser(int32_t userId)5936 void AbilityManagerService::PauseOldUser(int32_t userId)
5937 {
5938 HILOG_INFO("%{public}s, PauseOldUser:%{public}d-----begin", __func__, userId);
5939 PauseOldMissionListManager(userId);
5940 HILOG_INFO("%{public}s, PauseOldUser:%{public}d-----end", __func__, userId);
5941 }
5942
PauseOldMissionListManager(int32_t userId)5943 void AbilityManagerService::PauseOldMissionListManager(int32_t userId)
5944 {
5945 HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----begin", __func__, userId);
5946 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5947 auto it = missionListManagers_.find(userId);
5948 if (it == missionListManagers_.end()) {
5949 HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end1", __func__, userId);
5950 return;
5951 }
5952 auto manager = it->second;
5953 if (!manager) {
5954 HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end2", __func__, userId);
5955 return;
5956 }
5957 manager->PauseManager();
5958 HILOG_INFO("%{public}s, PauseOldMissionListManager:%{public}d-----end", __func__, userId);
5959 }
5960
PauseOldConnectManager(int32_t userId)5961 void AbilityManagerService::PauseOldConnectManager(int32_t userId)
5962 {
5963 HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----begin", __func__, userId);
5964 if (userId == U0_USER_ID) {
5965 HILOG_INFO("%{public}s, u0 not stop, id:%{public}d-----nullptr", __func__, userId);
5966 return;
5967 }
5968
5969 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5970 auto it = connectManagers_.find(userId);
5971 if (it == connectManagers_.end()) {
5972 HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----no user", __func__, userId);
5973 return;
5974 }
5975 auto manager = it->second;
5976 if (!manager) {
5977 HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----nullptr", __func__, userId);
5978 return;
5979 }
5980 manager->StopAllExtensions();
5981 HILOG_INFO("%{public}s, PauseOldConnectManager:%{public}d-----end", __func__, userId);
5982 }
5983
StartUserApps(int32_t userId,bool isBoot)5984 void AbilityManagerService::StartUserApps(int32_t userId, bool isBoot)
5985 {
5986 HILOG_INFO("StartUserApps, userId:%{public}d, currentUserId:%{public}d", userId, GetUserId());
5987 if (currentMissionListManager_ && currentMissionListManager_->IsStarted()) {
5988 HILOG_INFO("missionListManager ResumeManager");
5989 currentMissionListManager_->ResumeManager();
5990 }
5991 StartHighestPriorityAbility(userId, isBoot);
5992 }
5993
InitConnectManager(int32_t userId,bool switchUser)5994 void AbilityManagerService::InitConnectManager(int32_t userId, bool switchUser)
5995 {
5996 bool find = false;
5997 {
5998 std::lock_guard<ffrt::mutex> lock(managersMutex_);
5999 auto it = connectManagers_.find(userId);
6000 find = (it != connectManagers_.end());
6001 if (find) {
6002 if (switchUser) {
6003 connectManager_ = it->second;
6004 }
6005 }
6006 }
6007 if (!find) {
6008 auto manager = std::make_shared<AbilityConnectManager>(userId);
6009 manager->SetTaskHandler(taskHandler_);
6010 manager->SetEventHandler(eventHandler_);
6011 std::unique_lock<ffrt::mutex> lock(managersMutex_);
6012 connectManagers_.emplace(userId, manager);
6013 if (switchUser) {
6014 connectManager_ = manager;
6015 }
6016 }
6017 }
6018
InitDataAbilityManager(int32_t userId,bool switchUser)6019 void AbilityManagerService::InitDataAbilityManager(int32_t userId, bool switchUser)
6020 {
6021 bool find = false;
6022 {
6023 std::lock_guard<ffrt::mutex> lock(managersMutex_);
6024 auto it = dataAbilityManagers_.find(userId);
6025 find = (it != dataAbilityManagers_.end());
6026 if (find) {
6027 if (switchUser) {
6028 dataAbilityManager_ = it->second;
6029 }
6030 }
6031 }
6032 if (!find) {
6033 auto manager = std::make_shared<DataAbilityManager>();
6034 std::unique_lock<ffrt::mutex> lock(managersMutex_);
6035 dataAbilityManagers_.emplace(userId, manager);
6036 if (switchUser) {
6037 dataAbilityManager_ = manager;
6038 }
6039 }
6040 }
6041
InitPendWantManager(int32_t userId,bool switchUser)6042 void AbilityManagerService::InitPendWantManager(int32_t userId, bool switchUser)
6043 {
6044 bool find = false;
6045 {
6046 std::lock_guard<ffrt::mutex> lock(managersMutex_);
6047 auto it = pendingWantManagers_.find(userId);
6048 find = (it != pendingWantManagers_.end());
6049 if (find) {
6050 if (switchUser) {
6051 pendingWantManager_ = it->second;
6052 }
6053 }
6054 }
6055 if (!find) {
6056 auto manager = std::make_shared<PendingWantManager>();
6057 std::unique_lock<ffrt::mutex> lock(managersMutex_);
6058 pendingWantManagers_.emplace(userId, manager);
6059 if (switchUser) {
6060 pendingWantManager_ = manager;
6061 }
6062 }
6063 }
6064
GetValidUserId(const int32_t userId)6065 int32_t AbilityManagerService::GetValidUserId(const int32_t userId)
6066 {
6067 HILOG_DEBUG("userId = %{public}d.", userId);
6068 int32_t validUserId = userId;
6069
6070 if (DEFAULT_INVAL_VALUE == userId) {
6071 validUserId = IPCSkeleton::GetCallingUid() / BASE_USER_RANGE;
6072 HILOG_INFO("validUserId = %{public}d, CallingUid = %{public}d.", validUserId,
6073 IPCSkeleton::GetCallingUid());
6074 if (validUserId == U0_USER_ID) {
6075 validUserId = GetUserId();
6076 }
6077 }
6078 return validUserId;
6079 }
6080
SetAbilityController(const sptr<IAbilityController> & abilityController,bool imAStabilityTest)6081 int AbilityManagerService::SetAbilityController(const sptr<IAbilityController> &abilityController,
6082 bool imAStabilityTest)
6083 {
6084 HILOG_DEBUG("%{public}s, imAStabilityTest: %{public}d", __func__, imAStabilityTest);
6085 auto isPerm = AAFwk::PermissionVerification::GetInstance()->VerifyControllerPerm();
6086 if (!isPerm) {
6087 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
6088 return CHECK_PERMISSION_FAILED;
6089 }
6090
6091 std::lock_guard<ffrt::mutex> guard(globalLock_);
6092 abilityController_ = abilityController;
6093 controllerIsAStabilityTest_ = imAStabilityTest;
6094 HILOG_DEBUG("%{public}s, end", __func__);
6095 return ERR_OK;
6096 }
6097
SendANRProcessID(int pid)6098 int AbilityManagerService::SendANRProcessID(int pid)
6099 {
6100 HILOG_INFO("SendANRProcessID come, pid is %{public}d", pid);
6101 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
6102 auto isShellCall = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
6103 if (!isSaCall && !isShellCall) {
6104 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
6105 return CHECK_PERMISSION_FAILED;
6106 }
6107
6108 AppExecFwk::ApplicationInfo appInfo;
6109 bool debug;
6110 auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
6111 if (appScheduler->GetApplicationInfoByProcessID(pid, appInfo, debug) == ERR_OK) {
6112 std::lock_guard<ffrt::mutex> guard(globalLock_);
6113 auto it = appRecoveryHistory_.find(appInfo.uid);
6114 if (it != appRecoveryHistory_.end()) {
6115 return ERR_OK;
6116 }
6117 }
6118
6119 if (debug) {
6120 HILOG_ERROR("SendANRProcessID error, debug mode.");
6121 return ERR_INVALID_VALUE;
6122 }
6123
6124 auto sysDialog = DelayedSingleton<SystemDialogScheduler>::GetInstance();
6125 if (!sysDialog) {
6126 HILOG_ERROR("SystemDialogScheduler is nullptr.");
6127 return ERR_INVALID_VALUE;
6128 }
6129
6130 Want want;
6131 if (!sysDialog->GetANRDialogWant(GetUserId(), pid, want)) {
6132 HILOG_ERROR("GetANRDialogWant failed.");
6133 return ERR_INVALID_VALUE;
6134 }
6135 return StartAbility(want);
6136 }
6137
IsRunningInStabilityTest()6138 bool AbilityManagerService::IsRunningInStabilityTest()
6139 {
6140 std::lock_guard<ffrt::mutex> guard(globalLock_);
6141 bool ret = abilityController_ != nullptr && controllerIsAStabilityTest_;
6142 HILOG_DEBUG("%{public}s, IsRunningInStabilityTest: %{public}d", __func__, ret);
6143 return ret;
6144 }
6145
IsAbilityControllerStart(const Want & want,const std::string & bundleName)6146 bool AbilityManagerService::IsAbilityControllerStart(const Want &want, const std::string &bundleName)
6147 {
6148 HILOG_DEBUG("method call, controllerIsAStabilityTest_: %{public}d", controllerIsAStabilityTest_);
6149 if (abilityController_ == nullptr) {
6150 HILOG_DEBUG("abilityController_ is nullptr");
6151 return true;
6152 }
6153
6154 if (controllerIsAStabilityTest_) {
6155 bool isStart = abilityController_->AllowAbilityStart(want, bundleName);
6156 if (!isStart) {
6157 HILOG_INFO("Not finishing start ability because controller starting: %{public}s", bundleName.c_str());
6158 return false;
6159 }
6160 }
6161 return true;
6162 }
6163
IsAbilityControllerForeground(const std::string & bundleName)6164 bool AbilityManagerService::IsAbilityControllerForeground(const std::string &bundleName)
6165 {
6166 HILOG_DEBUG("method call, controllerIsAStabilityTest_: %{public}d", controllerIsAStabilityTest_);
6167 if (abilityController_ == nullptr) {
6168 HILOG_DEBUG("abilityController_ is nullptr");
6169 return true;
6170 }
6171
6172 if (controllerIsAStabilityTest_) {
6173 bool isResume = abilityController_->AllowAbilityBackground(bundleName);
6174 if (!isResume) {
6175 HILOG_INFO("Not finishing terminate ability because controller resuming: %{public}s", bundleName.c_str());
6176 return false;
6177 }
6178 }
6179 return true;
6180 }
6181
InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo & extensionInfo,AppExecFwk::AbilityInfo & abilityInfo)6182 int32_t AbilityManagerService::InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo,
6183 AppExecFwk::AbilityInfo &abilityInfo)
6184 {
6185 abilityInfo.applicationName = extensionInfo.applicationInfo.name;
6186 abilityInfo.applicationInfo = extensionInfo.applicationInfo;
6187 abilityInfo.bundleName = extensionInfo.bundleName;
6188 abilityInfo.package = extensionInfo.moduleName;
6189 abilityInfo.moduleName = extensionInfo.moduleName;
6190 abilityInfo.name = extensionInfo.name;
6191 abilityInfo.srcEntrance = extensionInfo.srcEntrance;
6192 abilityInfo.srcPath = extensionInfo.srcEntrance;
6193 abilityInfo.iconPath = extensionInfo.icon;
6194 abilityInfo.iconId = extensionInfo.iconId;
6195 abilityInfo.label = extensionInfo.label;
6196 abilityInfo.labelId = extensionInfo.labelId;
6197 abilityInfo.description = extensionInfo.description;
6198 abilityInfo.descriptionId = extensionInfo.descriptionId;
6199 abilityInfo.priority = extensionInfo.priority;
6200 abilityInfo.permissions = extensionInfo.permissions;
6201 abilityInfo.readPermission = extensionInfo.readPermission;
6202 abilityInfo.writePermission = extensionInfo.writePermission;
6203 abilityInfo.uri = extensionInfo.uri;
6204 abilityInfo.extensionAbilityType = extensionInfo.type;
6205 abilityInfo.visible = extensionInfo.visible;
6206 abilityInfo.resourcePath = extensionInfo.resourcePath;
6207 abilityInfo.enabled = extensionInfo.enabled;
6208 abilityInfo.isModuleJson = true;
6209 abilityInfo.isStageBasedModel = true;
6210 abilityInfo.process = extensionInfo.process;
6211 abilityInfo.metadata = extensionInfo.metadata;
6212 abilityInfo.compileMode = extensionInfo.compileMode;
6213 abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
6214 if (!extensionInfo.hapPath.empty()) {
6215 abilityInfo.hapPath = extensionInfo.hapPath;
6216 }
6217 return 0;
6218 }
6219
StartUserTest(const Want & want,const sptr<IRemoteObject> & observer)6220 int AbilityManagerService::StartUserTest(const Want &want, const sptr<IRemoteObject> &observer)
6221 {
6222 HILOG_DEBUG("enter");
6223 if (observer == nullptr) {
6224 HILOG_ERROR("observer is nullptr");
6225 return ERR_INVALID_VALUE;
6226 }
6227
6228 std::string bundleName = want.GetStringParam("-b");
6229 if (bundleName.empty()) {
6230 HILOG_ERROR("Invalid bundle name");
6231 return ERR_INVALID_VALUE;
6232 }
6233
6234 auto bms = GetBundleManager();
6235 CHECK_POINTER_AND_RETURN(bms, START_USER_TEST_FAIL);
6236 AppExecFwk::BundleInfo bundleInfo;
6237 if (!IN_PROCESS_CALL(
6238 bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, U0_USER_ID))) {
6239 HILOG_ERROR("Failed to get bundle info by U0_USER_ID %{public}d.", U0_USER_ID);
6240 int32_t userId = GetUserId();
6241 if (!IN_PROCESS_CALL(
6242 bms->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, userId))) {
6243 HILOG_ERROR("Failed to get bundle info by userId %{public}d.", userId);
6244 return GET_BUNDLE_INFO_FAILED;
6245 }
6246 }
6247
6248 return DelayedSingleton<AppScheduler>::GetInstance()->StartUserTest(want, observer, bundleInfo, GetUserId());
6249 }
6250
FinishUserTest(const std::string & msg,const int64_t & resultCode,const std::string & bundleName)6251 int AbilityManagerService::FinishUserTest(
6252 const std::string &msg, const int64_t &resultCode, const std::string &bundleName)
6253 {
6254 HILOG_DEBUG("enter");
6255 if (bundleName.empty()) {
6256 HILOG_ERROR("Invalid bundle name.");
6257 return ERR_INVALID_VALUE;
6258 }
6259
6260 return DelayedSingleton<AppScheduler>::GetInstance()->FinishUserTest(msg, resultCode, bundleName);
6261 }
6262
GetTopAbility(sptr<IRemoteObject> & token)6263 int AbilityManagerService::GetTopAbility(sptr<IRemoteObject> &token)
6264 {
6265 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
6266 if (!isSaCall) {
6267 HILOG_ERROR("Permission verification failed");
6268 return CHECK_PERMISSION_FAILED;
6269 }
6270 #ifdef SUPPORT_GRAPHICS
6271 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
6272 Rosen::FocusChangeInfo focusChangeInfo;
6273 Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusChangeInfo);
6274 token = focusChangeInfo.abilityToken_;
6275 } else {
6276 if (!wmsHandler_) {
6277 HILOG_ERROR("wmsHandler_ is nullptr.");
6278 return ERR_INVALID_VALUE;
6279 }
6280 wmsHandler_->GetFocusWindow(token);
6281 }
6282
6283 if (!token) {
6284 HILOG_ERROR("token is nullptr");
6285 return ERR_INVALID_VALUE;
6286 }
6287 #endif
6288 return ERR_OK;
6289 }
6290
DelegatorDoAbilityForeground(const sptr<IRemoteObject> & token)6291 int AbilityManagerService::DelegatorDoAbilityForeground(const sptr<IRemoteObject> &token)
6292 {
6293 HILOG_DEBUG("enter");
6294 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
6295 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
6296 auto sessionId = uiAbilityLifecycleManager_->GetSessionIdByAbilityToken(token);
6297 if (!sessionId) {
6298 HILOG_ERROR("Invalid session id.");
6299 return ERR_INVALID_VALUE;
6300 }
6301 NotifyHandleAbilityStateChange(token, ABILITY_MOVE_TO_FOREGROUND_CODE);
6302 auto&& abilityRecord = Token::GetAbilityRecordByToken(token);
6303 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
6304 auto&& want = abilityRecord->GetWant();
6305 if (!IsAbilityControllerStart(want, want.GetBundle())) {
6306 HILOG_ERROR("SecneBoard IsAbilityControllerStart failed: %{public}s", want.GetBundle().c_str());
6307 return ERR_WOULD_BLOCK;
6308 }
6309 return ERR_OK;
6310 }
6311 auto missionId = GetMissionIdByAbilityToken(token);
6312 if (missionId < 0) {
6313 HILOG_ERROR("Invalid mission id.");
6314 return ERR_INVALID_VALUE;
6315 }
6316 NotifyHandleAbilityStateChange(token, ABILITY_MOVE_TO_FOREGROUND_CODE);
6317 return DelegatorMoveMissionToFront(missionId);
6318 }
6319
DelegatorDoAbilityBackground(const sptr<IRemoteObject> & token)6320 int AbilityManagerService::DelegatorDoAbilityBackground(const sptr<IRemoteObject> &token)
6321 {
6322 HILOG_DEBUG("enter");
6323 NotifyHandleAbilityStateChange(token, ABILITY_MOVE_TO_BACKGROUND_CODE);
6324 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
6325 return ERR_OK;
6326 }
6327 return MinimizeAbility(token, true);
6328 }
6329
DoAbilityForeground(const sptr<IRemoteObject> & token,uint32_t flag)6330 int AbilityManagerService::DoAbilityForeground(const sptr<IRemoteObject> &token, uint32_t flag)
6331 {
6332 HILOG_DEBUG("DoAbilityForeground, sceneFlag:%{public}u", flag);
6333 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
6334 if (!VerificationToken(token) && !VerificationAllToken(token)) {
6335 HILOG_ERROR("%{public}s token error.", __func__);
6336 return ERR_INVALID_VALUE;
6337 }
6338
6339 std::lock_guard<ffrt::mutex> guard(globalLock_);
6340 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6341 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
6342 if (!JudgeSelfCalled(abilityRecord)) {
6343 return CHECK_PERMISSION_FAILED;
6344 }
6345
6346 auto type = abilityRecord->GetAbilityInfo().type;
6347 if (type != AppExecFwk::AbilityType::PAGE) {
6348 HILOG_ERROR("Cannot minimize except page ability.");
6349 return ERR_WRONG_INTERFACE_CALL;
6350 }
6351
6352 if (!IsAbilityControllerForeground(abilityRecord->GetAbilityInfo().bundleName)) {
6353 HILOG_ERROR("IsAbilityControllerForeground false.");
6354 return ERR_WOULD_BLOCK;
6355 }
6356
6357 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
6358 return currentMissionListManager_->DoAbilityForeground(abilityRecord, flag);
6359 }
6360
DoAbilityBackground(const sptr<IRemoteObject> & token,uint32_t flag)6361 int AbilityManagerService::DoAbilityBackground(const sptr<IRemoteObject> &token, uint32_t flag)
6362 {
6363 HILOG_DEBUG("DoAbilityBackground, sceneFlag:%{public}u", flag);
6364 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
6365
6366 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6367 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
6368
6369 abilityRecord->lifeCycleStateInfo_.sceneFlag = flag;
6370 int ret = MinimizeAbility(token);
6371 abilityRecord->lifeCycleStateInfo_.sceneFlag = SCENE_FLAG_NORMAL;
6372 return ret;
6373 }
6374
DelegatorMoveMissionToFront(int32_t missionId)6375 int AbilityManagerService::DelegatorMoveMissionToFront(int32_t missionId)
6376 {
6377 HILOG_INFO("enter missionId : %{public}d", missionId);
6378 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
6379
6380 if (!IsAbilityControllerStartById(missionId)) {
6381 HILOG_ERROR("IsAbilityControllerStart false");
6382 return ERR_WOULD_BLOCK;
6383 }
6384
6385 return currentMissionListManager_->MoveMissionToFront(missionId);
6386 }
6387
UpdateCallerInfo(Want & want,const sptr<IRemoteObject> & callerToken)6388 void AbilityManagerService::UpdateCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)
6389 {
6390 int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
6391 int32_t callerUid = IPCSkeleton::GetCallingUid();
6392 int32_t callerPid = IPCSkeleton::GetCallingPid();
6393 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
6394 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
6395 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
6396 want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
6397 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
6398 want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
6399
6400 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
6401 if (!abilityRecord) {
6402 HILOG_WARN("%{public}s caller abilityRecord is null.", __func__);
6403 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
6404 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, std::string(""));
6405 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
6406 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, std::string(""));
6407 } else {
6408 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
6409 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
6410 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
6411 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
6412 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
6413 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
6414 }
6415 }
6416
JudgeMultiUserConcurrency(const int32_t userId)6417 bool AbilityManagerService::JudgeMultiUserConcurrency(const int32_t userId)
6418 {
6419 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
6420
6421 if (userId == U0_USER_ID) {
6422 HILOG_DEBUG("%{public}s, userId is 0.", __func__);
6423 return true;
6424 }
6425
6426 HILOG_DEBUG("userId : %{public}d, current userId : %{public}d", userId, GetUserId());
6427
6428 // Only non-concurrent mode is supported
6429 bool concurrencyMode = CONCURRENCY_MODE_FALSE;
6430 if (!concurrencyMode) {
6431 return (userId == GetUserId());
6432 }
6433
6434 return true;
6435 }
6436
6437 #ifdef ABILITY_COMMAND_FOR_TEST
ForceTimeoutForTest(const std::string & abilityName,const std::string & state)6438 int AbilityManagerService::ForceTimeoutForTest(const std::string &abilityName, const std::string &state)
6439 {
6440 if (abilityName.empty()) {
6441 HILOG_ERROR("abilityName is empty.");
6442 return INVALID_DATA;
6443 }
6444 if (abilityName == "clean") {
6445 timeoutMap_.clear();
6446 return ERR_OK;
6447 }
6448 if (state != AbilityRecord::ConvertAbilityState(AbilityState::INITIAL) &&
6449 state != AbilityRecord::ConvertAbilityState(AbilityState::INACTIVE) &&
6450 state != AbilityRecord::ConvertAbilityState(AbilityState::FOREGROUND) &&
6451 state != AbilityRecord::ConvertAbilityState(AbilityState::BACKGROUND) &&
6452 state != AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING) &&
6453 state != std::string("COMMAND")) {
6454 HILOG_ERROR("lifecycle state is invalid.");
6455 return INVALID_DATA;
6456 }
6457 timeoutMap_.insert(std::make_pair(state, abilityName));
6458 return ERR_OK;
6459 }
6460 #endif
6461
CheckStaticCfgPermission(AppExecFwk::AbilityInfo & abilityInfo,bool isStartAsCaller,uint32_t callerTokenId,bool isData,bool isSaCall)6462 int AbilityManagerService::CheckStaticCfgPermission(AppExecFwk::AbilityInfo &abilityInfo, bool isStartAsCaller,
6463 uint32_t callerTokenId, bool isData, bool isSaCall)
6464 {
6465 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
6466 if (!isData) {
6467 isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
6468 }
6469 if (isSaCall) {
6470 // do not need check static config permission when start ability by SA
6471 return AppExecFwk::Constants::PERMISSION_GRANTED;
6472 }
6473
6474 uint32_t tokenId;
6475 if (isStartAsCaller) {
6476 tokenId = callerTokenId;
6477 } else {
6478 tokenId = IPCSkeleton::GetCallingTokenID();
6479 }
6480
6481 if (abilityInfo.applicationInfo.accessTokenId == tokenId) {
6482 return ERR_OK;
6483 }
6484
6485 if ((abilityInfo.type == AppExecFwk::AbilityType::EXTENSION &&
6486 abilityInfo.extensionAbilityType == AppExecFwk::ExtensionAbilityType::DATASHARE) ||
6487 (abilityInfo.type == AppExecFwk::AbilityType::DATA)) {
6488 // just need check the read permission and write permission of extension ability or data ability
6489 if (!abilityInfo.readPermission.empty()) {
6490 int checkReadPermission = AccessTokenKit::VerifyAccessToken(tokenId, abilityInfo.readPermission);
6491 if (checkReadPermission == ERR_OK) {
6492 return AppExecFwk::Constants::PERMISSION_GRANTED;
6493 }
6494 HILOG_WARN("verify access token fail, read permission: %{public}s", abilityInfo.readPermission.c_str());
6495 }
6496 if (!abilityInfo.writePermission.empty()) {
6497 int checkWritePermission = AccessTokenKit::VerifyAccessToken(tokenId, abilityInfo.writePermission);
6498 if (checkWritePermission == ERR_OK) {
6499 return AppExecFwk::Constants::PERMISSION_GRANTED;
6500 }
6501 HILOG_WARN("verify access token fail, write permission: %{public}s", abilityInfo.writePermission.c_str());
6502 }
6503
6504 if (!abilityInfo.readPermission.empty() || !abilityInfo.writePermission.empty()) {
6505 // 'readPermission' and 'writePermission' take precedence over 'permission'
6506 // when 'readPermission' or 'writePermission' is not empty, no need check 'permission'
6507 return AppExecFwk::Constants::PERMISSION_NOT_GRANTED;
6508 }
6509 }
6510
6511 // verify permission if 'permission' is not empty
6512 if (abilityInfo.permissions.empty() || AccessTokenKit::VerifyAccessToken(tokenId,
6513 PermissionConstants::PERMISSION_START_INVISIBLE_ABILITY) == ERR_OK) {
6514 return AppExecFwk::Constants::PERMISSION_GRANTED;
6515 }
6516
6517 for (auto permission : abilityInfo.permissions) {
6518 if (AccessTokenKit::VerifyAccessToken(tokenId, permission)
6519 != AppExecFwk::Constants::PERMISSION_GRANTED) {
6520 HILOG_ERROR("verify access token fail, permission: %{public}s", permission.c_str());
6521 return AppExecFwk::Constants::PERMISSION_NOT_GRANTED;
6522 }
6523 }
6524
6525 return AppExecFwk::Constants::PERMISSION_GRANTED;
6526 }
6527
IsNeedTimeoutForTest(const std::string & abilityName,const std::string & state) const6528 bool AbilityManagerService::IsNeedTimeoutForTest(const std::string &abilityName, const std::string &state) const
6529 {
6530 for (auto iter = timeoutMap_.begin(); iter != timeoutMap_.end(); iter++) {
6531 if (iter->first == state && iter->second == abilityName) {
6532 return true;
6533 }
6534 }
6535 return false;
6536 }
6537
GetValidDataAbilityUri(const std::string & abilityInfoUri,std::string & adjustUri)6538 bool AbilityManagerService::GetValidDataAbilityUri(const std::string &abilityInfoUri, std::string &adjustUri)
6539 {
6540 // note: do not use abilityInfo.uri directly, need check uri first.
6541 size_t firstSeparator = abilityInfoUri.find_first_of('/');
6542 size_t lastSeparator = abilityInfoUri.find_last_of('/');
6543 if (lastSeparator - firstSeparator != 1) {
6544 HILOG_ERROR("ability info uri error, uri: %{public}s", abilityInfoUri.c_str());
6545 return false;
6546 }
6547
6548 adjustUri = abilityInfoUri;
6549 adjustUri.insert(lastSeparator, "/");
6550 return true;
6551 }
6552
GetDataAbilityUri(const std::vector<AppExecFwk::AbilityInfo> & abilityInfos,const std::string & mainAbility,std::string & uri)6553 bool AbilityManagerService::GetDataAbilityUri(const std::vector<AppExecFwk::AbilityInfo> &abilityInfos,
6554 const std::string &mainAbility, std::string &uri)
6555 {
6556 if (abilityInfos.empty() || mainAbility.empty()) {
6557 HILOG_ERROR("abilityInfos or mainAbility is empty. mainAbility: %{public}s", mainAbility.c_str());
6558 return false;
6559 }
6560
6561 std::string dataAbilityUri;
6562 for (auto abilityInfo : abilityInfos) {
6563 if (abilityInfo.type == AppExecFwk::AbilityType::DATA &&
6564 abilityInfo.name == mainAbility) {
6565 dataAbilityUri = abilityInfo.uri;
6566 HILOG_INFO("get data ability uri: %{public}s", dataAbilityUri.c_str());
6567 break;
6568 }
6569 }
6570
6571 return GetValidDataAbilityUri(dataAbilityUri, uri);
6572 }
6573
GetAbilityRunningInfo(std::vector<AbilityRunningInfo> & info,std::shared_ptr<AbilityRecord> & abilityRecord)6574 void AbilityManagerService::GetAbilityRunningInfo(std::vector<AbilityRunningInfo> &info,
6575 std::shared_ptr<AbilityRecord> &abilityRecord)
6576 {
6577 AbilityRunningInfo runningInfo;
6578 AppExecFwk::RunningProcessInfo processInfo;
6579
6580 runningInfo.ability = abilityRecord->GetWant().GetElement();
6581 runningInfo.startTime = abilityRecord->GetStartTime();
6582 runningInfo.abilityState = static_cast<int>(abilityRecord->GetAbilityState());
6583
6584 DelayedSingleton<AppScheduler>::GetInstance()->
6585 GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
6586 runningInfo.pid = processInfo.pid_;
6587 runningInfo.uid = processInfo.uid_;
6588 runningInfo.processName = processInfo.processName_;
6589 info.emplace_back(runningInfo);
6590 }
6591
VerifyAccountPermission(int32_t userId)6592 int AbilityManagerService::VerifyAccountPermission(int32_t userId)
6593 {
6594 if ((userId < 0) || (userController_ && (userController_->GetCurrentUserId() == userId))) {
6595 return ERR_OK;
6596 }
6597 return AAFwk::PermissionVerification::GetInstance()->VerifyAccountPermission();
6598 }
6599
6600 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAmsService()6601 int AbilityManagerService::BlockAmsService()
6602 {
6603 HILOG_DEBUG("%{public}s", __func__);
6604 if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
6605 HILOG_ERROR("Not shell call");
6606 return ERR_PERMISSION_DENIED;
6607 }
6608 if (taskHandler_) {
6609 HILOG_DEBUG("%{public}s begin post block ams service task", __func__);
6610 auto BlockAmsServiceTask = [aams = shared_from_this()]() {
6611 while (1) {
6612 HILOG_DEBUG("%{public}s begin waiting", __func__);
6613 std::this_thread::sleep_for(BLOCK_AMS_SERVICE_TIME*1s);
6614 }
6615 };
6616 taskHandler_->SubmitTask(BlockAmsServiceTask, "blockamsservice");
6617 return ERR_OK;
6618 }
6619 return ERR_NO_INIT;
6620 }
6621
BlockAbility(int32_t abilityRecordId)6622 int AbilityManagerService::BlockAbility(int32_t abilityRecordId)
6623 {
6624 HILOG_DEBUG("%{public}s", __func__);
6625 if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
6626 HILOG_ERROR("Not shell call");
6627 return ERR_PERMISSION_DENIED;
6628 }
6629 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
6630 return uiAbilityLifecycleManager_->BlockAbility(abilityRecordId, GetUserId());
6631 }
6632 CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT);
6633 return currentMissionListManager_->BlockAbility(abilityRecordId);
6634 }
6635
BlockAppService()6636 int AbilityManagerService::BlockAppService()
6637 {
6638 HILOG_DEBUG("%{public}s", __func__);
6639 if (AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
6640 HILOG_ERROR("Not shell call");
6641 return ERR_PERMISSION_DENIED;
6642 }
6643 return DelayedSingleton<AppScheduler>::GetInstance()->BlockAppService();
6644 }
6645 #endif
6646
FreeInstallAbilityFromRemote(const Want & want,const sptr<IRemoteObject> & callback,int32_t userId,int requestCode)6647 int AbilityManagerService::FreeInstallAbilityFromRemote(const Want &want, const sptr<IRemoteObject> &callback,
6648 int32_t userId, int requestCode)
6649 {
6650 auto callingUid = IPCSkeleton::GetCallingUid();
6651 if (callingUid != DMS_UID) {
6652 HILOG_ERROR("The interface only support for DMS");
6653 return CHECK_PERMISSION_FAILED;
6654 }
6655 int32_t validUserId = GetValidUserId(userId);
6656 if (freeInstallManager_ == nullptr) {
6657 HILOG_ERROR("freeInstallManager_ is nullptr");
6658 return ERR_INVALID_VALUE;
6659 }
6660 return freeInstallManager_->FreeInstallAbilityFromRemote(want, callback, validUserId, requestCode);
6661 }
6662
GetTopAbility()6663 AppExecFwk::ElementName AbilityManagerService::GetTopAbility()
6664 {
6665 HILOG_DEBUG("%{public}s start.", __func__);
6666 AppExecFwk::ElementName elementName = {};
6667 #ifdef SUPPORT_GRAPHICS
6668 sptr<IRemoteObject> token;
6669 int ret = IN_PROCESS_CALL(GetTopAbility(token));
6670 if (ret) {
6671 return elementName;
6672 }
6673 if (!token) {
6674 HILOG_ERROR("token is nullptr");
6675 return elementName;
6676 }
6677 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6678 if (abilityRecord == nullptr) {
6679 HILOG_ERROR("%{public}s abilityRecord is null.", __func__);
6680 return elementName;
6681 }
6682 elementName = abilityRecord->GetWant().GetElement();
6683 bool isDeviceEmpty = elementName.GetDeviceID().empty();
6684 std::string localDeviceId;
6685 bool hasLocalDeviceId = GetLocalDeviceId(localDeviceId);
6686 if (isDeviceEmpty && hasLocalDeviceId) {
6687 elementName.SetDeviceID(localDeviceId);
6688 }
6689 #endif
6690 return elementName;
6691 }
6692
GetElementNameByToken(const sptr<IRemoteObject> & token)6693 AppExecFwk::ElementName AbilityManagerService::GetElementNameByToken(const sptr<IRemoteObject> &token)
6694 {
6695 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
6696 HILOG_DEBUG("%{public}s start.", __func__);
6697 AppExecFwk::ElementName elementName = {};
6698 #ifdef SUPPORT_GRAPHICS
6699 if (!token) {
6700 HILOG_ERROR("token is nullptr");
6701 return elementName;
6702 }
6703 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6704 if (abilityRecord == nullptr) {
6705 HILOG_ERROR("%{public}s abilityRecord is null.", __func__);
6706 return elementName;
6707 }
6708 elementName = abilityRecord->GetWant().GetElement();
6709 bool isDeviceEmpty = elementName.GetDeviceID().empty();
6710 std::string localDeviceId;
6711 bool hasLocalDeviceId = GetLocalDeviceId(localDeviceId);
6712 if (isDeviceEmpty && hasLocalDeviceId) {
6713 elementName.SetDeviceID(localDeviceId);
6714 }
6715 #endif
6716 return elementName;
6717 }
6718
Dump(int fd,const std::vector<std::u16string> & args)6719 int AbilityManagerService::Dump(int fd, const std::vector<std::u16string>& args)
6720 {
6721 HILOG_DEBUG("Dump begin fd: %{public}d", fd);
6722 std::string result;
6723 auto errCode = Dump(args, result);
6724 int ret = dprintf(fd, "%s\n", result.c_str());
6725 if (ret < 0) {
6726 HILOG_ERROR("dprintf error");
6727 return ERR_AAFWK_HIDUMP_ERROR;
6728 }
6729 HILOG_DEBUG("Dump end");
6730 return errCode;
6731 }
6732
Dump(const std::vector<std::u16string> & args,std::string & result)6733 int AbilityManagerService::Dump(const std::vector<std::u16string>& args, std::string& result)
6734 {
6735 ErrCode errCode = ERR_OK;
6736 auto size = args.size();
6737 if (size == 0) {
6738 ShowHelp(result);
6739 return errCode;
6740 }
6741
6742 std::vector<std::string> argsStr;
6743 for (auto arg : args) {
6744 argsStr.emplace_back(Str16ToStr8(arg));
6745 }
6746
6747 if (argsStr[0] == "-h") {
6748 ShowHelp(result);
6749 } else {
6750 errCode = ProcessMultiParam(argsStr, result);
6751 if (errCode == ERR_AAFWK_HIDUMP_INVALID_ARGS) {
6752 ShowIllegalInfomation(result);
6753 }
6754 }
6755 return errCode;
6756 }
6757
ProcessMultiParam(std::vector<std::string> & argsStr,std::string & result)6758 ErrCode AbilityManagerService::ProcessMultiParam(std::vector<std::string>& argsStr, std::string& result)
6759 {
6760 HILOG_DEBUG("%{public}s begin", __func__);
6761 bool isClient = false;
6762 bool isUser = false;
6763 int userID = DEFAULT_INVAL_VALUE;
6764 std::vector<std::string>::iterator it;
6765 for (it = argsStr.begin(); it != argsStr.end();) {
6766 if (*it == ARGS_CLIENT) {
6767 isClient = true;
6768 it = argsStr.erase(it);
6769 continue;
6770 }
6771 if (*it == ARGS_USER_ID) {
6772 it = argsStr.erase(it);
6773 if (it == argsStr.end()) {
6774 HILOG_ERROR("ARGS_USER_ID id invalid");
6775 return ERR_AAFWK_HIDUMP_INVALID_ARGS;
6776 }
6777 (void)StrToInt(*it, userID);
6778 if (userID < 0) {
6779 HILOG_ERROR("ARGS_USER_ID id invalid");
6780 return ERR_AAFWK_HIDUMP_INVALID_ARGS;
6781 }
6782 isUser = true;
6783 it = argsStr.erase(it);
6784 continue;
6785 }
6786 it++;
6787 }
6788 std::string cmd;
6789 for (unsigned int i = 0; i < argsStr.size(); i++) {
6790 cmd.append(argsStr[i]);
6791 if (i != argsStr.size() - 1) {
6792 cmd.append(" ");
6793 }
6794 }
6795 HILOG_INFO("%{public}s, isClient:%{public}d, userID is : %{public}d, cmd is : %{public}s",
6796 __func__, isClient, userID, cmd.c_str());
6797
6798 std::vector<std::string> dumpResults;
6799 DumpSysState(cmd, dumpResults, isClient, isUser, userID);
6800 for (auto it : dumpResults) {
6801 result += it + "\n";
6802 }
6803 return ERR_OK;
6804 }
6805
ShowHelp(std::string & result)6806 void AbilityManagerService::ShowHelp(std::string& result)
6807 {
6808 result.append("Usage:\n")
6809 .append("-h ")
6810 .append("help text for the tool\n")
6811 .append("-a [-c | -u {UserId}] ")
6812 .append("dump all ability infomation in the system or all ability infomation of client/UserId\n")
6813 .append("-l ")
6814 .append("dump all mission list information in the system\n")
6815 .append("-i {AbilityRecordId} ")
6816 .append("dump an ability infomation by ability record id\n")
6817 .append("-e ")
6818 .append("dump all extension infomation in the system(FA: ServiceAbilityRecords, Stage: ExtensionRecords)\n")
6819 .append("-p [PendingWantRecordId] ")
6820 .append("dump all pendingwant record infomation in the system\n")
6821 .append("-r ")
6822 .append("dump all process in the system\n")
6823 .append("-d ")
6824 .append("dump all data ability infomation in the system");
6825 }
6826
ShowIllegalInfomation(std::string & result)6827 void AbilityManagerService::ShowIllegalInfomation(std::string& result)
6828 {
6829 result.append(ILLEGAL_INFOMATION);
6830 }
6831
DumpAbilityInfoDone(std::vector<std::string> & infos,const sptr<IRemoteObject> & callerToken)6832 int AbilityManagerService::DumpAbilityInfoDone(std::vector<std::string> &infos, const sptr<IRemoteObject> &callerToken)
6833 {
6834 HILOG_DEBUG("DumpAbilityInfoDone begin");
6835 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
6836 if (abilityRecord == nullptr) {
6837 HILOG_ERROR("abilityRecord nullptr");
6838 return ERR_INVALID_VALUE;
6839 }
6840 if (!JudgeSelfCalled(abilityRecord)) {
6841 return CHECK_PERMISSION_FAILED;
6842 }
6843 abilityRecord->DumpAbilityInfoDone(infos);
6844 return ERR_OK;
6845 }
6846
SetMissionContinueState(const sptr<IRemoteObject> & token,const AAFwk::ContinueState & state)6847 int AbilityManagerService::SetMissionContinueState(const sptr<IRemoteObject> &token, const AAFwk::ContinueState &state)
6848 {
6849 HILOG_DEBUG("SetMissionContinueState begin. State: %{public}d", state);
6850
6851 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
6852
6853 int32_t missionId = GetMissionIdByAbilityToken(token);
6854 if (missionId == -1) {
6855 HILOG_ERROR("SetMissionContinueState failed to get missionId. State: %{public}d", state);
6856 return ERR_INVALID_VALUE;
6857 }
6858
6859 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6860 if (!abilityRecord) {
6861 HILOG_ERROR("SetMissionContinueState: No such ability record. Mission id: %{public}d, state: %{public}d",
6862 missionId, state);
6863 return -1;
6864 }
6865
6866 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
6867 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
6868 if (callingTokenId != tokenID) {
6869 HILOG_ERROR("SetMissionContinueState not self, not enabled. Mission id: %{public}d, state: %{public}d",
6870 missionId, state);
6871 return -1;
6872 }
6873
6874 auto userId = abilityRecord->GetOwnerMissionUserId();
6875 auto missionListManager = GetListManagerByUserId(userId);
6876 if (!missionListManager) {
6877 HILOG_ERROR("failed to find mission list manager. Mission id: %{public}d, state: %{public}d",
6878 missionId, state);
6879 return -1;
6880 }
6881
6882 auto setResult = missionListManager->SetMissionContinueState(token, missionId, state);
6883 if (setResult != ERR_OK) {
6884 HILOG_ERROR("missionListManager set failed, result: %{public}d, mission id: %{public}d, state: %{public}d",
6885 setResult, missionId, state);
6886 return setResult;
6887 }
6888
6889 DistributedClient dmsClient;
6890 auto result = dmsClient.SetMissionContinueState(missionId, state);
6891 if (result != ERR_OK) {
6892 HILOG_ERROR("Notify DMS client failed, result: %{public}d. Mission id: %{public}d, state: %{public}d",
6893 result, missionId, state);
6894 }
6895
6896 HILOG_DEBUG("SetMissionContinueState end. Mission id: %{public}d, state: %{public}d", missionId, state);
6897 return ERR_OK;
6898 }
6899
6900 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)6901 int AbilityManagerService::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
6902 {
6903 HILOG_DEBUG("%{public}s", __func__);
6904 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6905 if (!abilityRecord) {
6906 HILOG_ERROR("no such ability record");
6907 return -1;
6908 }
6909
6910 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
6911 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
6912 if (callingTokenId != tokenID) {
6913 HILOG_ERROR("SetMissionLabel not self, not enabled");
6914 return -1;
6915 }
6916
6917 auto userId = abilityRecord->GetOwnerMissionUserId();
6918 auto missionListManager = GetListManagerByUserId(userId);
6919 if (!missionListManager) {
6920 HILOG_ERROR("failed to find mission list manager when set mission label.");
6921 return -1;
6922 }
6923
6924 return missionListManager->SetMissionLabel(token, label);
6925 }
6926
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<OHOS::Media::PixelMap> & icon)6927 int AbilityManagerService::SetMissionIcon(const sptr<IRemoteObject> &token,
6928 const std::shared_ptr<OHOS::Media::PixelMap> &icon)
6929 {
6930 HILOG_DEBUG("%{public}s", __func__);
6931 CHECK_CALLER_IS_SYSTEM_APP;
6932 auto abilityRecord = Token::GetAbilityRecordByToken(token);
6933 if (!abilityRecord) {
6934 HILOG_ERROR("no such ability record");
6935 return -1;
6936 }
6937
6938 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
6939 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
6940 if (callingTokenId != tokenID) {
6941 HILOG_ERROR("not self, not enable to set mission icon");
6942 return -1;
6943 }
6944
6945 auto userId = abilityRecord->GetOwnerMissionUserId();
6946 auto missionListManager = GetListManagerByUserId(userId);
6947 if (!missionListManager) {
6948 HILOG_ERROR("failed to find mission list manager.");
6949 return -1;
6950 }
6951
6952 return missionListManager->SetMissionIcon(token, icon);
6953 }
6954
RegisterWindowManagerServiceHandler(const sptr<IWindowManagerServiceHandler> & handler)6955 int AbilityManagerService::RegisterWindowManagerServiceHandler(const sptr<IWindowManagerServiceHandler> &handler)
6956 {
6957 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
6958 auto isGatewayCall = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
6959 if (!isSaCall && !isGatewayCall) {
6960 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
6961 return CHECK_PERMISSION_FAILED;
6962 }
6963 wmsHandler_ = handler;
6964 HILOG_DEBUG("%{public}s: WMS handler registered successfully.", __func__);
6965 return ERR_OK;
6966 }
6967
GetWMSHandler() const6968 sptr<IWindowManagerServiceHandler> AbilityManagerService::GetWMSHandler() const
6969 {
6970 return wmsHandler_;
6971 }
6972
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & abilityToken)6973 void AbilityManagerService::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &abilityToken)
6974 {
6975 std::lock_guard<ffrt::mutex> lock(managersMutex_);
6976 HILOG_INFO("called.");
6977 for (auto& item : missionListManagers_) {
6978 if (item.second) {
6979 item.second->CompleteFirstFrameDrawing(abilityToken);
6980 }
6981 }
6982 HILOG_INFO("end.");
6983 }
6984
ShowPickerDialog(const Want & want,int32_t userId,const sptr<IRemoteObject> & callerToken)6985 int32_t AbilityManagerService::ShowPickerDialog(
6986 const Want& want, int32_t userId, const sptr<IRemoteObject> &callerToken)
6987 {
6988 AAFwk::Want newWant = want;
6989 std::string sharePickerBundleName =
6990 OHOS::system::GetParameter(SHARE_PICKER_DIALOG_BUNDLE_NAME_KEY, SHARE_PICKER_DIALOG_DEFAULY_BUNDLE_NAME);
6991 std::string sharePickerAbilityName =
6992 OHOS::system::GetParameter(SHARE_PICKER_DIALOG_ABILITY_NAME_KEY, SHARE_PICKER_DIALOG_DEFAULY_ABILITY_NAME);
6993 newWant.SetElementName(sharePickerBundleName, sharePickerAbilityName);
6994 newWant.SetParam(TOKEN_KEY, callerToken);
6995 // note: clear actions
6996 newWant.SetAction("");
6997 return IN_PROCESS_CALL(StartAbility(newWant, DEFAULT_INVAL_VALUE, userId));
6998 }
6999
CheckWindowMode(int32_t windowMode,const std::vector<AppExecFwk::SupportWindowMode> & windowModes) const7000 bool AbilityManagerService::CheckWindowMode(int32_t windowMode,
7001 const std::vector<AppExecFwk::SupportWindowMode>& windowModes) const
7002 {
7003 HILOG_INFO("Window mode is %{public}d.", windowMode);
7004 if (windowMode == AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED) {
7005 return true;
7006 }
7007 auto it = windowModeMap.find(windowMode);
7008 if (it != windowModeMap.end()) {
7009 auto bmsWindowMode = it->second;
7010 for (auto mode : windowModes) {
7011 if (mode == bmsWindowMode) {
7012 return true;
7013 }
7014 }
7015 }
7016 return false;
7017 }
7018
PrepareTerminateAbility(const sptr<IRemoteObject> & token,sptr<IPrepareTerminateCallback> & callback)7019 int AbilityManagerService::PrepareTerminateAbility(const sptr<IRemoteObject> &token,
7020 sptr<IPrepareTerminateCallback> &callback)
7021 {
7022 HILOG_DEBUG("call");
7023 if (callback == nullptr) {
7024 HILOG_ERROR("callback is nullptr.");
7025 return ERR_INVALID_VALUE;
7026 }
7027 if (!CheckPrepareTerminateEnable()) {
7028 callback->DoPrepareTerminate();
7029 return ERR_INVALID_VALUE;
7030 }
7031
7032 auto abilityRecord = Token::GetAbilityRecordByToken(token);
7033 if (abilityRecord == nullptr) {
7034 HILOG_ERROR("record is nullptr.");
7035 callback->DoPrepareTerminate();
7036 return ERR_INVALID_VALUE;
7037 }
7038
7039 if (!JudgeSelfCalled(abilityRecord)) {
7040 HILOG_ERROR("Not self call.");
7041 callback->DoPrepareTerminate();
7042 return CHECK_PERMISSION_FAILED;
7043 }
7044
7045 auto type = abilityRecord->GetAbilityInfo().type;
7046 if (type != AppExecFwk::AbilityType::PAGE) {
7047 HILOG_ERROR("Only support PAGE.");
7048 callback->DoPrepareTerminate();
7049 return RESOLVE_CALL_ABILITY_TYPE_ERR;
7050 }
7051
7052 auto timeoutTask = [&callback]() {
7053 callback->DoPrepareTerminate();
7054 };
7055 int prepareTerminateTimeout =
7056 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * PREPARE_TERMINATE_TIMEOUT_MULTIPLE;
7057 if (taskHandler_) {
7058 taskHandler_->SubmitTask(timeoutTask, "PrepareTermiante_" + std::to_string(abilityRecord->GetAbilityRecordId()),
7059 prepareTerminateTimeout);
7060 }
7061
7062 bool res = abilityRecord->PrepareTerminateAbility();
7063 if (!res) {
7064 callback->DoPrepareTerminate();
7065 }
7066 taskHandler_->CancelTask("PrepareTermiante_" + std::to_string(abilityRecord->GetAbilityRecordId()));
7067 return ERR_OK;
7068 }
7069
HandleFocused(const sptr<OHOS::Rosen::FocusChangeInfo> & focusChangeInfo)7070 void AbilityManagerService::HandleFocused(const sptr<OHOS::Rosen::FocusChangeInfo> &focusChangeInfo)
7071 {
7072 HILOG_INFO("handle focused event");
7073 if (!currentMissionListManager_) {
7074 HILOG_ERROR("current mission manager is null");
7075 return;
7076 }
7077
7078 int32_t missionId = GetMissionIdByAbilityToken(focusChangeInfo->abilityToken_);
7079 currentMissionListManager_->NotifyMissionFocused(missionId);
7080 }
7081
HandleUnfocused(const sptr<OHOS::Rosen::FocusChangeInfo> & focusChangeInfo)7082 void AbilityManagerService::HandleUnfocused(const sptr<OHOS::Rosen::FocusChangeInfo> &focusChangeInfo)
7083 {
7084 HILOG_INFO("handle unfocused event");
7085 if (!currentMissionListManager_) {
7086 HILOG_ERROR("current mission manager is null");
7087 return;
7088 }
7089
7090 int32_t missionId = GetMissionIdByAbilityToken(focusChangeInfo->abilityToken_);
7091 currentMissionListManager_->NotifyMissionUnfocused(missionId);
7092 }
7093
InitFocusListener()7094 void AbilityManagerService::InitFocusListener()
7095 {
7096 HILOG_INFO("Init ability focus listener");
7097 if (focusListener_) {
7098 return;
7099 }
7100
7101 focusListener_ = new WindowFocusChangedListener(shared_from_this(), taskHandler_);
7102 auto registerTask = [innerService = shared_from_this()]() {
7103 if (innerService) {
7104 HILOG_INFO("RegisterFocusListener task");
7105 innerService->RegisterFocusListener();
7106 }
7107 };
7108 if (taskHandler_) {
7109 taskHandler_->SubmitTask(registerTask, "RegisterFocusListenerTask", REGISTER_FOCUS_DELAY);
7110 }
7111 }
7112
RegisterFocusListener()7113 void AbilityManagerService::RegisterFocusListener()
7114 {
7115 HILOG_INFO("Register focus listener");
7116 if (!focusListener_) {
7117 HILOG_ERROR("no listener obj");
7118 return;
7119 }
7120 Rosen::WindowManager::GetInstance().RegisterFocusChangedListener(focusListener_);
7121 HILOG_INFO("Register focus listener success");
7122 }
7123
InitPrepareTerminateConfig()7124 void AbilityManagerService::InitPrepareTerminateConfig()
7125 {
7126 char value[PREPARE_TERMINATE_ENABLE_SIZE] = "false";
7127 int retSysParam = GetParameter(PREPARE_TERMINATE_ENABLE_PARAMETER, "false", value, PREPARE_TERMINATE_ENABLE_SIZE);
7128 HILOG_INFO("CheckPrepareTerminateEnable, %{public}s value is %{public}s.", PREPARE_TERMINATE_ENABLE_PARAMETER,
7129 value);
7130 if (retSysParam > 0 && !std::strcmp(value, "true")) {
7131 isPrepareTerminateEnable_ = true;
7132 }
7133 }
7134 #endif
7135
CheckCallServicePermission(const AbilityRequest & abilityRequest)7136 int AbilityManagerService::CheckCallServicePermission(const AbilityRequest &abilityRequest)
7137 {
7138 if (abilityRequest.abilityInfo.isStageBasedModel) {
7139 auto extensionType = abilityRequest.abilityInfo.extensionAbilityType;
7140 HILOG_INFO("extensionType is %{public}d.", static_cast<int>(extensionType));
7141 if (extensionType == AppExecFwk::ExtensionAbilityType::SERVICE ||
7142 extensionType == AppExecFwk::ExtensionAbilityType::DATASHARE) {
7143 return CheckCallServiceExtensionPermission(abilityRequest);
7144 } else {
7145 return CheckCallOtherExtensionPermission(abilityRequest);
7146 }
7147 } else {
7148 return CheckCallServiceAbilityPermission(abilityRequest);
7149 }
7150 }
7151
CheckCallDataAbilityPermission(AbilityRequest & abilityRequest,bool isShell,bool isSACall)7152 int AbilityManagerService::CheckCallDataAbilityPermission(AbilityRequest &abilityRequest, bool isShell, bool isSACall)
7153 {
7154 abilityRequest.appInfo = abilityRequest.abilityInfo.applicationInfo;
7155 abilityRequest.uid = abilityRequest.appInfo.uid;
7156 if (abilityRequest.appInfo.name.empty() || abilityRequest.appInfo.bundleName.empty()) {
7157 HILOG_ERROR("Invalid app info for data ability acquiring.");
7158 return ERR_INVALID_VALUE;
7159 }
7160 if (abilityRequest.abilityInfo.type != AppExecFwk::AbilityType::DATA) {
7161 HILOG_ERROR("BMS query result is not a data ability.");
7162 return ERR_WRONG_INTERFACE_CALL;
7163 }
7164
7165 AAFwk::PermissionVerification::VerificationInfo verificationInfo = CreateVerificationInfo(abilityRequest,
7166 true, isShell, isSACall);
7167 if (isShell) {
7168 verificationInfo.isBackgroundCall = true;
7169 }
7170 if (!isShell && IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall, true) != ERR_OK) {
7171 return ERR_INVALID_VALUE;
7172 }
7173 int result = AAFwk::PermissionVerification::GetInstance()->CheckCallDataAbilityPermission(verificationInfo,
7174 isShell);
7175 if (result != ERR_OK) {
7176 HILOG_ERROR("Do not have permission to start DataAbility");
7177 return result;
7178 }
7179
7180 return ERR_OK;
7181 }
7182
CreateVerificationInfo(const AbilityRequest & abilityRequest,bool isData,bool isShell,bool isSA)7183 AAFwk::PermissionVerification::VerificationInfo AbilityManagerService::CreateVerificationInfo(
7184 const AbilityRequest &abilityRequest, bool isData, bool isShell, bool isSA)
7185 {
7186 AAFwk::PermissionVerification::VerificationInfo verificationInfo;
7187 verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
7188 verificationInfo.visible = IsAbilityVisible(abilityRequest);
7189 verificationInfo.withContinuousTask = IsBackgroundTaskUid(IPCSkeleton::GetCallingUid());
7190 HILOG_DEBUG("Call ServiceAbility or DataAbility, target bundleName: %{public}s.",
7191 abilityRequest.appInfo.bundleName.c_str());
7192 if (whiteListassociatedWakeUpFlag_ &&
7193 WHITE_LIST_ASS_WAKEUP_SET.find(abilityRequest.appInfo.bundleName) != WHITE_LIST_ASS_WAKEUP_SET.end()) {
7194 HILOG_DEBUG("Call ServiceAbility or DataAbility, target bundle in white-list, allow associatedWakeUp.");
7195 verificationInfo.associatedWakeUp = true;
7196 } else {
7197 verificationInfo.associatedWakeUp = abilityRequest.appInfo.associatedWakeUp;
7198 }
7199 if (!isData) {
7200 isSA = AAFwk::PermissionVerification::GetInstance()->IsSACall();
7201 isShell = AAFwk::PermissionVerification::GetInstance()->IsShellCall();
7202 }
7203 if (isSA || isShell) {
7204 return verificationInfo;
7205 }
7206 std::shared_ptr<AbilityRecord> callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
7207 if (callerAbility) {
7208 verificationInfo.apiTargetVersion = callerAbility->GetApplicationInfo().apiTargetVersion;
7209 }
7210
7211 return verificationInfo;
7212 }
7213
CheckCallServiceExtensionPermission(const AbilityRequest & abilityRequest)7214 int AbilityManagerService::CheckCallServiceExtensionPermission(const AbilityRequest &abilityRequest)
7215 {
7216 HILOG_INFO("CheckCallServiceExtensionPermission begin");
7217
7218 AAFwk::PermissionVerification::VerificationInfo verificationInfo;
7219 verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
7220 verificationInfo.visible = IsAbilityVisible(abilityRequest);
7221 verificationInfo.withContinuousTask = IsBackgroundTaskUid(IPCSkeleton::GetCallingUid());
7222 verificationInfo.isBackgroundCall = false;
7223 int result = AAFwk::PermissionVerification::GetInstance()->CheckCallServiceExtensionPermission(verificationInfo);
7224 if (result != ERR_OK) {
7225 HILOG_ERROR("Do not have permission to start ServiceExtension or DataShareExtension");
7226 }
7227 return result;
7228 }
7229
CheckCallOtherExtensionPermission(const AbilityRequest & abilityRequest)7230 int AbilityManagerService::CheckCallOtherExtensionPermission(const AbilityRequest &abilityRequest)
7231 {
7232 HILOG_INFO("Call");
7233 if (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
7234 AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
7235 return ERR_OK;
7236 }
7237
7238 auto extensionType = abilityRequest.abilityInfo.extensionAbilityType;
7239 HILOG_DEBUG("OtherExtension type: %{public}d.", static_cast<int32_t>(extensionType));
7240 if (extensionType == AppExecFwk::ExtensionAbilityType::WINDOW) {
7241 return ERR_OK;
7242 }
7243 if (AAFwk::UIExtensionUtils::IsUIExtension(extensionType)) {
7244 return ERR_OK;
7245 }
7246 const std::string fileAccessPermission = "ohos.permission.FILE_ACCESS_MANAGER";
7247 if (extensionType == AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION &&
7248 AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(fileAccessPermission)) {
7249 HILOG_DEBUG("Temporary, FILEACCESS_EXTENSION use serviceExtension start-up rule.");
7250 return CheckCallServiceExtensionPermission(abilityRequest);
7251 }
7252
7253 HILOG_ERROR("Not SA, can not start other Extension");
7254 return CHECK_PERMISSION_FAILED;
7255 }
7256
7257
CheckCallServiceAbilityPermission(const AbilityRequest & abilityRequest)7258 int AbilityManagerService::CheckCallServiceAbilityPermission(const AbilityRequest &abilityRequest)
7259 {
7260 HILOG_INFO("Call");
7261 AAFwk::PermissionVerification::VerificationInfo verificationInfo = CreateVerificationInfo(abilityRequest);
7262 if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
7263 return ERR_INVALID_VALUE;
7264 }
7265
7266 int result = AAFwk::PermissionVerification::GetInstance()->CheckCallServiceAbilityPermission(verificationInfo);
7267 if (result != ERR_OK) {
7268 HILOG_ERROR("Do not have permission to start ServiceAbility");
7269 }
7270 return result;
7271 }
7272
CheckCallAbilityPermission(const AbilityRequest & abilityRequest)7273 int AbilityManagerService::CheckCallAbilityPermission(const AbilityRequest &abilityRequest)
7274 {
7275 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
7276 HILOG_DEBUG("Call");
7277
7278 AAFwk::PermissionVerification::VerificationInfo verificationInfo;
7279 verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
7280 verificationInfo.visible = IsAbilityVisible(abilityRequest);
7281 verificationInfo.withContinuousTask = IsBackgroundTaskUid(IPCSkeleton::GetCallingUid());
7282 if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
7283 return ERR_INVALID_VALUE;
7284 }
7285
7286 int result = AAFwk::PermissionVerification::GetInstance()->CheckCallAbilityPermission(verificationInfo);
7287 if (result != ERR_OK) {
7288 HILOG_ERROR("Do not have permission to start PageAbility(FA) or Ability(Stage)");
7289 }
7290 return result;
7291 }
7292
CheckStartByCallPermission(const AbilityRequest & abilityRequest)7293 int AbilityManagerService::CheckStartByCallPermission(const AbilityRequest &abilityRequest)
7294 {
7295 HILOG_INFO("Call");
7296 // check whether the target ability is page type and not specified mode.
7297 if (abilityRequest.abilityInfo.type != AppExecFwk::AbilityType::PAGE ||
7298 abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
7299 HILOG_ERROR("Called ability is not common ability.");
7300 return RESOLVE_CALL_ABILITY_TYPE_ERR;
7301 }
7302
7303 AAFwk::PermissionVerification::VerificationInfo verificationInfo;
7304 verificationInfo.accessTokenId = abilityRequest.appInfo.accessTokenId;
7305 verificationInfo.visible = IsAbilityVisible(abilityRequest);
7306 verificationInfo.withContinuousTask = IsBackgroundTaskUid(IPCSkeleton::GetCallingUid());
7307 if (IsCallFromBackground(abilityRequest, verificationInfo.isBackgroundCall) != ERR_OK) {
7308 return ERR_INVALID_VALUE;
7309 }
7310
7311 if (AAFwk::PermissionVerification::GetInstance()->CheckStartByCallPermission(verificationInfo) != ERR_OK) {
7312 HILOG_ERROR("Do not have permission to StartAbilityByCall.");
7313 return RESOLVE_CALL_NO_PERMISSIONS;
7314 }
7315 HILOG_DEBUG("The caller has permission to resolve the call proxy of common ability.");
7316
7317 return ERR_OK;
7318 }
7319
IsCallFromBackground(const AbilityRequest & abilityRequest,bool & isBackgroundCall,bool isData)7320 int AbilityManagerService::IsCallFromBackground(const AbilityRequest &abilityRequest, bool &isBackgroundCall,
7321 bool isData)
7322 {
7323 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
7324 if (!isData && AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
7325 isBackgroundCall = true;
7326 return ERR_OK;
7327 }
7328
7329 if (!isData && (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
7330 AbilityUtil::IsStartFreeInstall(abilityRequest.want))) {
7331 isBackgroundCall = false;
7332 return ERR_OK;
7333 }
7334
7335 AppExecFwk::RunningProcessInfo processInfo;
7336 std::shared_ptr<AbilityRecord> callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
7337 if (callerAbility) {
7338 if (callerAbility->IsForeground() || callerAbility->GetAbilityForegroundingFlag()) {
7339 isBackgroundCall = false;
7340 return ERR_OK;
7341 }
7342 // CallerAbility is not foreground, so check process state
7343 DelayedSingleton<AppScheduler>::GetInstance()->
7344 GetRunningProcessInfoByToken(callerAbility->GetToken(), processInfo);
7345 } else {
7346 auto callerPid = IPCSkeleton::GetCallingPid();
7347 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByPid(callerPid, processInfo);
7348 if (processInfo.processName_.empty() && !AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
7349 HILOG_DEBUG("Can not find caller application by callerPid: %{private}d.", callerPid);
7350 if (AAFwk::PermissionVerification::GetInstance()->VerifyCallingPermission(
7351 PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND)) {
7352 HILOG_DEBUG("Caller has PERMISSION_START_ABILITIES_FROM_BACKGROUND, PASS.");
7353 isBackgroundCall = false;
7354 return ERR_OK;
7355 }
7356 HILOG_ERROR("Caller does not have PERMISSION_START_ABILITIES_FROM_BACKGROUND, REJECT.");
7357 return ERR_INVALID_VALUE;
7358 }
7359 }
7360
7361 if (IsDelegatorCall(processInfo, abilityRequest)) {
7362 HILOG_DEBUG("The call is from AbilityDelegator, allow background-call.");
7363 isBackgroundCall = false;
7364 return ERR_OK;
7365 }
7366
7367 if (backgroundJudgeFlag_) {
7368 isBackgroundCall = processInfo.state_ != AppExecFwk::AppProcessState::APP_STATE_FOREGROUND &&
7369 !processInfo.isFocused && !processInfo.isAbilityForegrounding;
7370 } else {
7371 isBackgroundCall = !processInfo.isFocused;
7372 if (!processInfo.isFocused && processInfo.state_ == AppExecFwk::AppProcessState::APP_STATE_FOREGROUND) {
7373 // Allow background startup within 1 second after application startup if state is FOREGROUND
7374 int64_t aliveTime = AbilityUtil::SystemTimeMillis() - processInfo.startTimeMillis_;
7375 isBackgroundCall = aliveTime > APP_ALIVE_TIME_MS;
7376 HILOG_DEBUG("Process %{public}s is alive %{public}s ms.",
7377 processInfo.processName_.c_str(), std::to_string(aliveTime).c_str());
7378 }
7379 }
7380 HILOG_DEBUG("backgroundJudgeFlag: %{public}d, isBackgroundCall: %{public}d, callerAppState: %{public}d.",
7381 static_cast<int32_t>(backgroundJudgeFlag_),
7382 static_cast<int32_t>(isBackgroundCall),
7383 static_cast<int32_t>(processInfo.state_));
7384
7385 return ERR_OK;
7386 }
7387
IsTargetPermission(const Want & want) const7388 bool AbilityManagerService::IsTargetPermission(const Want &want) const
7389 {
7390 if (want.GetElement().GetBundleName() == PERMISSIONMGR_BUNDLE_NAME &&
7391 want.GetElement().GetAbilityName() == PERMISSIONMGR_ABILITY_NAME) {
7392 return true;
7393 }
7394
7395 return false;
7396 }
7397
IsDelegatorCall(const AppExecFwk::RunningProcessInfo & processInfo,const AbilityRequest & abilityRequest)7398 inline bool AbilityManagerService::IsDelegatorCall(
7399 const AppExecFwk::RunningProcessInfo &processInfo, const AbilityRequest &abilityRequest)
7400 {
7401 /* To make sure the AbilityDelegator is not counterfeited
7402 * 1. The caller-process must be test-process
7403 * 2. The callerToken must be nullptr
7404 */
7405 if (processInfo.isTestProcess &&
7406 !abilityRequest.callerToken && abilityRequest.want.GetBoolParam(IS_DELEGATOR_CALL, false)) {
7407 return true;
7408 }
7409 return false;
7410 }
7411
IsAbilityVisible(const AbilityRequest & abilityRequest) const7412 bool AbilityManagerService::IsAbilityVisible(const AbilityRequest &abilityRequest) const
7413 {
7414 // TEMP, launcher is allowed to start invisible ability
7415 std::shared_ptr<AbilityRecord> callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
7416 if (callerAbility) {
7417 const std::string bundleName = callerAbility->GetApplicationInfo().bundleName;
7418 HILOG_DEBUG("caller bundleName is %{public}s.", bundleName.c_str());
7419 if (newRuleExceptLauncherSystemUI_ && bundleName == BUNDLE_NAME_LAUNCHER) {
7420 return true;
7421 }
7422 }
7423 return abilityRequest.abilityInfo.visible;
7424 }
7425
CheckNewRuleSwitchState(const std::string & param)7426 bool AbilityManagerService::CheckNewRuleSwitchState(const std::string ¶m)
7427 {
7428 char value[NEW_RULE_VALUE_SIZE] = "false";
7429 int retSysParam = GetParameter(param.c_str(), "false", value, NEW_RULE_VALUE_SIZE);
7430 HILOG_INFO("CheckNewRuleSwitchState, %{public}s value is %{public}s.", param.c_str(), value);
7431 if (retSysParam > 0 && !std::strcmp(value, "true")) {
7432 return true;
7433 }
7434 return false;
7435 }
7436
GetStartUpNewRuleFlag() const7437 bool AbilityManagerService::GetStartUpNewRuleFlag() const
7438 {
7439 return startUpNewRule_;
7440 }
7441
CallRequestDone(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & callStub)7442 void AbilityManagerService::CallRequestDone(const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &callStub)
7443 {
7444 {
7445 std::lock_guard<ffrt::mutex> autoLock(abilityTokenLock_);
7446 callStubTokenMap_[callStub] = token;
7447 }
7448 auto abilityRecord = Token::GetAbilityRecordByToken(token);
7449 CHECK_POINTER(abilityRecord);
7450 if (!JudgeSelfCalled(abilityRecord)) {
7451 return;
7452 }
7453
7454 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
7455 uiAbilityLifecycleManager_->CallRequestDone(abilityRecord, callStub);
7456 return;
7457 }
7458
7459 if (!currentMissionListManager_) {
7460 HILOG_ERROR("currentMissionListManager_ is null.");
7461 return;
7462 }
7463 currentMissionListManager_->CallRequestDone(abilityRecord, callStub);
7464 }
7465
GetAbilityTokenByCalleeObj(const sptr<IRemoteObject> & callStub,sptr<IRemoteObject> & token)7466 void AbilityManagerService::GetAbilityTokenByCalleeObj(const sptr<IRemoteObject> &callStub, sptr<IRemoteObject> &token)
7467 {
7468 std::lock_guard<ffrt::mutex> autoLock(abilityTokenLock_);
7469 auto it = callStubTokenMap_.find(callStub);
7470 if (it == callStubTokenMap_.end()) {
7471 token = nullptr;
7472 return;
7473 }
7474 token = callStubTokenMap_[callStub];
7475 }
7476
AddStartControlParam(Want & want,const sptr<IRemoteObject> & callerToken)7477 int AbilityManagerService::AddStartControlParam(Want &want, const sptr<IRemoteObject> &callerToken)
7478 {
7479 if (AAFwk::PermissionVerification::GetInstance()->IsSACall() ||
7480 AAFwk::PermissionVerification::GetInstance()->IsShellCall()) {
7481 return ERR_OK;
7482 }
7483 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
7484 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
7485 int32_t apiVersion = abilityRecord->GetApplicationInfo().apiTargetVersion;
7486 want.SetParam(DMS_API_VERSION, apiVersion);
7487 bool isCallerBackground = true;
7488 AppExecFwk::RunningProcessInfo processInfo;
7489 DelayedSingleton<AppScheduler>::GetInstance()->
7490 GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
7491 if (backgroundJudgeFlag_) {
7492 isCallerBackground = processInfo.state_ != AppExecFwk::AppProcessState::APP_STATE_FOREGROUND;
7493 } else {
7494 isCallerBackground = !processInfo.isFocused;
7495 }
7496 want.SetParam(DMS_IS_CALLER_BACKGROUND, isCallerBackground);
7497 return ERR_OK;
7498 }
7499
CheckDlpForExtension(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t userId,EventInfo & eventInfo,const EventName & eventName)7500 int AbilityManagerService::CheckDlpForExtension(
7501 const Want &want, const sptr<IRemoteObject> &callerToken,
7502 int32_t userId, EventInfo &eventInfo, const EventName &eventName)
7503 {
7504 if (!DlpUtils::OtherAppsAccessDlpCheck(callerToken, want) ||
7505 VerifyAccountPermission(userId) == CHECK_PERMISSION_FAILED ||
7506 !DlpUtils::DlpAccessOtherAppsCheck(callerToken, want)) {
7507 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
7508 eventInfo.errCode = CHECK_PERMISSION_FAILED;
7509 EventReport::SendExtensionEvent(eventName, HiSysEventType::FAULT, eventInfo);
7510 return CHECK_PERMISSION_FAILED;
7511 }
7512 return ERR_OK;
7513 }
7514
JudgeSelfCalled(const std::shared_ptr<AbilityRecord> & abilityRecord)7515 bool AbilityManagerService::JudgeSelfCalled(const std::shared_ptr<AbilityRecord> &abilityRecord)
7516 {
7517 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
7518 if (isSaCall) {
7519 return true;
7520 }
7521
7522 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
7523 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
7524 if (callingTokenId != tokenID && !AAFwk::PermissionVerification::GetInstance()->IsGatewayCall()) {
7525 HILOG_ERROR("Is not self, not enabled");
7526 return false;
7527 }
7528
7529 return true;
7530 }
7531
SetComponentInterception(const sptr<AppExecFwk::IComponentInterception> & componentInterception)7532 int AbilityManagerService::SetComponentInterception(
7533 const sptr<AppExecFwk::IComponentInterception> &componentInterception)
7534 {
7535 HILOG_DEBUG("%{public}s", __func__);
7536 auto isPerm = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
7537 if (!isPerm) {
7538 HILOG_ERROR("%{public}s: Permission verification failed", __func__);
7539 return CHECK_PERMISSION_FAILED;
7540 }
7541
7542 std::lock_guard<ffrt::mutex> guard(globalLock_);
7543 componentInterception_ = componentInterception;
7544 HILOG_DEBUG("%{public}s, end", __func__);
7545 return ERR_OK;
7546 }
7547
IsComponentInterceptionStart(const Want & want,ComponentRequest & componentRequest,AbilityRequest & request)7548 bool AbilityManagerService::IsComponentInterceptionStart(const Want &want, ComponentRequest &componentRequest,
7549 AbilityRequest &request)
7550 {
7551 if (componentInterception_ != nullptr) {
7552 Want newWant = want;
7553 int32_t type = static_cast<int32_t>(request.abilityInfo.type);
7554 newWant.SetParam("abilityType", type);
7555 int32_t launchMode = static_cast<int32_t>(request.abilityInfo.launchMode);
7556 newWant.SetParam("launchMode", launchMode);
7557 int32_t callType = static_cast<int32_t>(request.callType);
7558 newWant.SetParam("callType", callType);
7559 if (callType == AbilityCallType::CALL_REQUEST_TYPE) {
7560 newWant.SetParam("abilityConnectionObj", request.connect->AsObject());
7561 }
7562 int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
7563 newWant.SetParam("accessTokenId", tokenId);
7564
7565 HILOG_DEBUG("%{public}s", __func__);
7566 sptr<Want> extraParam = new (std::nothrow) Want();
7567 bool isStart = componentInterception_->AllowComponentStart(newWant, componentRequest.callerToken,
7568 componentRequest.requestCode, componentRequest.componentStatus, extraParam);
7569 componentRequest.requestResult = extraParam->GetIntParam("requestResult", 0);
7570 UpdateAbilityRequestInfo(extraParam, request);
7571 if (!isStart) {
7572 HILOG_INFO("not finishing start component because interception, requestResult: %{public}d",
7573 componentRequest.requestResult);
7574 return false;
7575 }
7576 }
7577 return true;
7578 }
7579
CheckProxyComponent(const Want & want,const int result)7580 bool AbilityManagerService::CheckProxyComponent(const Want &want, const int result)
7581 {
7582 // do proxy component while the deviceId is not empty
7583 return ((!want.GetElement().GetDeviceID().empty()) || (result != ERR_OK));
7584 }
7585
IsReleaseCallInterception(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element,int & result)7586 bool AbilityManagerService::IsReleaseCallInterception(const sptr<IAbilityConnection> &connect,
7587 const AppExecFwk::ElementName &element, int &result)
7588 {
7589 if (componentInterception_ == nullptr) {
7590 return false;
7591 }
7592 HILOG_DEBUG("%{public}s", __func__);
7593 sptr<Want> extraParam = new (std::nothrow) Want();
7594 bool isInterception = componentInterception_->ReleaseCallInterception(connect->AsObject(), element, extraParam);
7595 result = extraParam->GetIntParam("requestResult", 0);
7596 return isInterception;
7597 }
7598
NotifyHandleAbilityStateChange(const sptr<IRemoteObject> & abilityToken,int opCode)7599 void AbilityManagerService::NotifyHandleAbilityStateChange(const sptr<IRemoteObject> &abilityToken, int opCode)
7600 {
7601 if (componentInterception_ != nullptr) {
7602 componentInterception_->NotifyHandleAbilityStateChange(abilityToken, opCode);
7603 }
7604 }
7605
initComponentRequest(const sptr<IRemoteObject> & callerToken,const int requestCode,const int componentStatus)7606 ComponentRequest AbilityManagerService::initComponentRequest(const sptr<IRemoteObject> &callerToken,
7607 const int requestCode, const int componentStatus)
7608 {
7609 ComponentRequest componentRequest;
7610 componentRequest.callerToken = callerToken;
7611 componentRequest.requestCode = requestCode;
7612 componentRequest.componentStatus = componentStatus;
7613 return componentRequest;
7614 }
7615
UpdateAbilityRequestInfo(const sptr<Want> & want,AbilityRequest & request)7616 void AbilityManagerService::UpdateAbilityRequestInfo(const sptr<Want> &want, AbilityRequest &request)
7617 {
7618 if (want == nullptr) {
7619 return;
7620 }
7621 sptr<IRemoteObject> tempCallBack = want->GetRemoteObject(Want::PARAM_RESV_ABILITY_INFO_CALLBACK);
7622 if (tempCallBack == nullptr) {
7623 return;
7624 }
7625 int32_t procCode = want->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
7626 if (procCode != 0) {
7627 request.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
7628 }
7629 int32_t tokenCode = want->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
7630 if (tokenCode != 0) {
7631 request.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
7632 }
7633 request.abilityInfoCallback = tempCallBack;
7634 }
7635
SendResultToAbilityByToken(const Want & want,const sptr<IRemoteObject> & abilityToken,int32_t requestCode,int32_t resultCode,int32_t userId)7636 int32_t AbilityManagerService::SendResultToAbilityByToken(const Want &want, const sptr<IRemoteObject> &abilityToken,
7637 int32_t requestCode, int32_t resultCode, int32_t userId)
7638 {
7639 HILOG_DEBUG("%{public}s, requestCode: %{public}d, resultCode: %{public}d", __func__, requestCode, resultCode);
7640 auto isGatewayCall = AAFwk::PermissionVerification::GetInstance()->IsGatewayCall();
7641 if (!isGatewayCall) {
7642 HILOG_ERROR("%{public}s, Permission verification failed", __func__);
7643 return CHECK_PERMISSION_FAILED;
7644 }
7645 std::shared_ptr<AbilityRecord> abilityRecord = Token::GetAbilityRecordByToken(abilityToken);
7646 if (abilityRecord == nullptr) {
7647 HILOG_ERROR("%{public}s, abilityRecord is null", __func__);
7648 return ERR_INVALID_VALUE;
7649 }
7650 abilityRecord->SetResult(std::make_shared<AbilityResult>(requestCode, resultCode, want));
7651 abilityRecord->SendResult(0, 0);
7652 return ERR_OK;
7653 }
7654
GetFocusAbility()7655 std::shared_ptr<AbilityRecord> AbilityManagerService::GetFocusAbility()
7656 {
7657 #ifdef SUPPORT_GRAPHICS
7658 sptr<IRemoteObject> token;
7659 if (!wmsHandler_) {
7660 HILOG_ERROR("wmsHandler_ is nullptr.");
7661 return nullptr;
7662 }
7663
7664 wmsHandler_->GetFocusWindow(token);
7665 if (!token) {
7666 HILOG_ERROR("token is nullptr");
7667 return nullptr;
7668 }
7669
7670 auto abilityRecord = Token::GetAbilityRecordByToken(token);
7671 if (!abilityRecord) {
7672 HILOG_ERROR("abilityRecord is nullptr.");
7673 }
7674 return abilityRecord;
7675 #endif
7676
7677 return nullptr;
7678 }
7679
CheckUIExtensionIsFocused(uint32_t uiExtensionTokenId,bool & isFocused)7680 int AbilityManagerService::CheckUIExtensionIsFocused(uint32_t uiExtensionTokenId, bool& isFocused)
7681 {
7682 sptr<IRemoteObject> token;
7683 auto ret = GetTopAbility(token);
7684 if (ret != ERR_OK) {
7685 HILOG_ERROR("GetTopAbility failed");
7686 return ret;
7687 }
7688
7689 bool focused = false;
7690 int32_t userId = GetValidUserId(DEFAULT_INVAL_VALUE);
7691 auto connectManager = GetConnectManagerByUserId(userId);
7692 if (connectManager) {
7693 focused = connectManager->IsUIExtensionFocused(uiExtensionTokenId, token)
7694 || connectManager->IsWindowExtensionFocused(uiExtensionTokenId, token);
7695 } else {
7696 HILOG_WARN("connectManager is nullptr, userId: %{public}d", userId);
7697 }
7698 if (!focused && userId != U0_USER_ID) {
7699 HILOG_DEBUG("Check connectManager in user0");
7700 connectManager = GetConnectManagerByUserId(U0_USER_ID);
7701 if (connectManager) {
7702 focused = connectManager->IsUIExtensionFocused(uiExtensionTokenId, token)
7703 || connectManager->IsWindowExtensionFocused(uiExtensionTokenId, token);
7704 } else {
7705 HILOG_WARN("connectManager is nullptr, userId: 0");
7706 }
7707 }
7708 isFocused = focused;
7709 HILOG_DEBUG("isFocused: %{public}d", isFocused);
7710 return ERR_OK;
7711 }
7712
AddFreeInstallObserver(const sptr<AbilityRuntime::IFreeInstallObserver> & observer)7713 int AbilityManagerService::AddFreeInstallObserver(const sptr<AbilityRuntime::IFreeInstallObserver> &observer)
7714 {
7715 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
7716 if (freeInstallManager_ == nullptr) {
7717 HILOG_ERROR("freeInstallManager_ is nullptr.");
7718 return ERR_INVALID_VALUE;
7719 }
7720 return freeInstallManager_->AddFreeInstallObserver(observer);
7721 }
7722
IsValidMissionIds(const std::vector<int32_t> & missionIds,std::vector<MissionVaildResult> & results)7723 int32_t AbilityManagerService::IsValidMissionIds(
7724 const std::vector<int32_t> &missionIds, std::vector<MissionVaildResult> &results)
7725 {
7726 auto userId = IPCSkeleton::GetCallingUid() / BASE_USER_RANGE;
7727 auto missionlistMgr = GetListManagerByUserId(userId);
7728 if (missionlistMgr == nullptr) {
7729 HILOG_ERROR("missionlistMgr is nullptr.");
7730 return ERR_INVALID_VALUE;
7731 }
7732
7733 return missionlistMgr->IsValidMissionIds(missionIds, results);
7734 }
7735
VerifyPermission(const std::string & permission,int pid,int uid)7736 int AbilityManagerService::VerifyPermission(const std::string &permission, int pid, int uid)
7737 {
7738 HILOG_INFO("permission=%{public}s, pid=%{public}d, uid=%{public}d",
7739 permission.c_str(),
7740 pid,
7741 uid);
7742 if (permission.empty()) {
7743 HILOG_ERROR("VerifyPermission permission invalid");
7744 return CHECK_PERMISSION_FAILED;
7745 }
7746
7747 auto bms = GetBundleManager();
7748 CHECK_POINTER_AND_RETURN(bms, ERR_INVALID_VALUE);
7749
7750 std::string bundleName;
7751 if (IN_PROCESS_CALL(bms->GetNameForUid(uid, bundleName)) != ERR_OK) {
7752 HILOG_ERROR("VerifyPermission failed to get bundle name by uid");
7753 return CHECK_PERMISSION_FAILED;
7754 }
7755
7756 int account = -1;
7757 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, account);
7758 AppExecFwk::ApplicationInfo appInfo;
7759 if (!IN_PROCESS_CALL(bms->GetApplicationInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT,
7760 account, appInfo))) {
7761 HILOG_ERROR("VerifyPermission failed to get application info");
7762 return CHECK_PERMISSION_FAILED;
7763 }
7764
7765 int32_t ret = Security::AccessToken::AccessTokenKit::VerifyAccessToken(appInfo.accessTokenId, permission);
7766 if (ret != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
7767 HILOG_ERROR("VerifyPermission %{public}d: PERMISSION_DENIED", appInfo.accessTokenId);
7768 return CHECK_PERMISSION_FAILED;
7769 }
7770
7771 return ERR_OK;
7772 }
7773
AcquireShareData(const int32_t & missionId,const sptr<IAcquireShareDataCallback> & shareData)7774 int32_t AbilityManagerService::AcquireShareData(
7775 const int32_t &missionId, const sptr<IAcquireShareDataCallback> &shareData)
7776 {
7777 HILOG_DEBUG("missionId is %{public}d.", missionId);
7778 CHECK_CALLER_IS_SYSTEM_APP;
7779 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
7780 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
7781 abilityRecord = uiAbilityLifecycleManager_->GetAbilityRecordsById(missionId);
7782 } else {
7783 if (!currentMissionListManager_) {
7784 HILOG_ERROR("currentMissionListManager_ is null.");
7785 return ERR_INVALID_VALUE;
7786 }
7787 std::shared_ptr<Mission> mission = currentMissionListManager_->GetMissionById(missionId);
7788 if (!mission) {
7789 HILOG_ERROR("mission is null.");
7790 return ERR_INVALID_VALUE;
7791 }
7792 abilityRecord = mission->GetAbilityRecord();
7793 }
7794 if (!abilityRecord) {
7795 HILOG_ERROR("abilityRecord is null.");
7796 return ERR_INVALID_VALUE;
7797 }
7798 uniqueId_ = (uniqueId_ == INT_MAX) ? 0 : (uniqueId_ + 1);
7799 std::pair<int64_t, const sptr<IAcquireShareDataCallback>> shareDataPair =
7800 std::make_pair(abilityRecord->GetAbilityRecordId(), shareData);
7801 iAcquireShareDataMap_.emplace(uniqueId_, shareDataPair);
7802 abilityRecord->ShareData(uniqueId_);
7803 return ERR_OK;
7804 }
7805
ShareDataDone(const sptr<IRemoteObject> & token,const int32_t & resultCode,const int32_t & uniqueId,WantParams & wantParam)7806 int32_t AbilityManagerService::ShareDataDone(
7807 const sptr<IRemoteObject> &token, const int32_t &resultCode, const int32_t &uniqueId, WantParams &wantParam)
7808 {
7809 HILOG_INFO("resultCode:%{public}d, uniqueId:%{public}d.", resultCode, uniqueId);
7810 if (!VerificationAllToken(token)) {
7811 return ERR_INVALID_VALUE;
7812 }
7813 auto abilityRecord = Token::GetAbilityRecordByToken(token);
7814 CHECK_POINTER_AND_RETURN_LOG(abilityRecord, ERR_INVALID_VALUE, "ability record is nullptr.");
7815 if (!JudgeSelfCalled(abilityRecord)) {
7816 return CHECK_PERMISSION_FAILED;
7817 }
7818 CHECK_POINTER_AND_RETURN_LOG(eventHandler_, ERR_INVALID_VALUE, "fail to get abilityEventHandler.");
7819 eventHandler_->RemoveEvent(SHAREDATA_TIMEOUT_MSG, uniqueId);
7820 return GetShareDataPairAndReturnData(abilityRecord, resultCode, uniqueId, wantParam);
7821 }
7822
NotifySaveAsResult(const Want & want,int resultCode,int requestCode)7823 int32_t AbilityManagerService::NotifySaveAsResult(const Want &want, int resultCode, int requestCode)
7824 {
7825 HILOG_DEBUG("requestCode is %{public}d.", requestCode);
7826
7827 //caller check
7828 if (!CheckCallerIsDlpManager(GetBundleManager())) {
7829 HILOG_WARN("caller check failed");
7830 return ERR_INVALID_CALLER;
7831 }
7832
7833 for (const auto &item : startAbilityChain_) {
7834 if (item.second->GetHandlerName() == StartAbilitySandboxSavefile::handlerName_) {
7835 auto savefileHandler = (StartAbilitySandboxSavefile*)(item.second.get());
7836 savefileHandler->HandleResult(want, resultCode, requestCode);
7837 break;
7838 }
7839 }
7840 return ERR_OK;
7841 }
7842
RecordAppExitReasonAtUpgrade(const AppExecFwk::BundleInfo & bundleInfo)7843 void AbilityManagerService::RecordAppExitReasonAtUpgrade(const AppExecFwk::BundleInfo &bundleInfo)
7844 {
7845 if (bundleInfo.abilityInfos.empty()) {
7846 HILOG_ERROR("abilityInfos is empty.");
7847 return;
7848 }
7849
7850 std::vector<std::string> abilityList;
7851 for (auto abilityInfo : bundleInfo.abilityInfos) {
7852 if (!abilityInfo.name.empty()) {
7853 abilityList.push_back(abilityInfo.name);
7854 }
7855 }
7856
7857 if (!abilityList.empty()) {
7858 DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->SetAppExitReason(
7859 bundleInfo.name, abilityList, REASON_UPGRADE);
7860 }
7861 }
7862
SetRootSceneSession(const sptr<IRemoteObject> & rootSceneSession)7863 void AbilityManagerService::SetRootSceneSession(const sptr<IRemoteObject> &rootSceneSession)
7864 {
7865 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
7866 HILOG_ERROR("Not sceneboard called, not allowed.");
7867 return;
7868 }
7869 uiAbilityLifecycleManager_->SetRootSceneSession(rootSceneSession);
7870 }
7871
CallUIAbilityBySCB(const sptr<SessionInfo> & sessionInfo)7872 void AbilityManagerService::CallUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo)
7873 {
7874 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
7875 HILOG_ERROR("Not sceneboard called, not allowed.");
7876 return;
7877 }
7878 uiAbilityLifecycleManager_->CallUIAbilityBySCB(sessionInfo);
7879 }
7880
SetSessionManagerService(const sptr<IRemoteObject> & sessionManagerService)7881 int32_t AbilityManagerService::SetSessionManagerService(const sptr<IRemoteObject> &sessionManagerService)
7882 {
7883 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
7884 HILOG_ERROR("Not sceneboard called, not allowed.");
7885 return ERR_WRONG_INTERFACE_CALL;
7886 }
7887
7888 HILOG_INFO("Call SetSessionManagerService of WMS.");
7889 auto ret = Rosen::MockSessionManagerService::GetInstance().SetSessionManagerService(sessionManagerService);
7890 if (ret) {
7891 HILOG_DEBUG("Call SetSessionManagerService of WMS.");
7892 return ERR_OK;
7893 }
7894 HILOG_ERROR("SMS SetSessionManagerService return false.");
7895 return ERR_OK;
7896 }
7897
CheckPrepareTerminateEnable()7898 bool AbilityManagerService::CheckPrepareTerminateEnable()
7899 {
7900 if (!isPrepareTerminateEnable_) {
7901 HILOG_DEBUG("Only support PC.");
7902 return false;
7903 }
7904 if (!AAFwk::PermissionVerification::GetInstance()->VerifyPrepareTerminatePermission()) {
7905 HILOG_DEBUG("failed, please apply permission ohos.permission.PREPARE_APP_TERMINATE");
7906 return false;
7907 }
7908 return true;
7909 }
7910
StartSpecifiedAbilityBySCB(const Want & want)7911 void AbilityManagerService::StartSpecifiedAbilityBySCB(const Want &want)
7912 {
7913 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
7914 HILOG_ERROR("Not sceneboard called, not allowed.");
7915 return;
7916 }
7917 int32_t userId = GetUserId();
7918 uiAbilityLifecycleManager_->StartSpecifiedAbilityBySCB(want, userId);
7919 }
7920
RegisterIAbilityManagerCollaborator(int32_t type,const sptr<IAbilityManagerCollaborator> & impl)7921 int32_t AbilityManagerService::RegisterIAbilityManagerCollaborator(
7922 int32_t type, const sptr<IAbilityManagerCollaborator> &impl)
7923 {
7924 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
7925 auto callingUid = IPCSkeleton::GetCallingUid();
7926 if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID)) {
7927 HILOG_ERROR("The interface only support for broker");
7928 return CHECK_PERMISSION_FAILED;
7929 }
7930 if (!CheckCollaboratorType(type)) {
7931 HILOG_ERROR("collaborator register failed, invalid type.");
7932 return ERR_INVALID_VALUE;
7933 }
7934 {
7935 std::lock_guard<ffrt::mutex> autoLock(collaboratorMapLock_);
7936 collaboratorMap_[type] = impl;
7937 }
7938 return ERR_OK;
7939 }
7940
UnregisterIAbilityManagerCollaborator(int32_t type)7941 int32_t AbilityManagerService::UnregisterIAbilityManagerCollaborator(int32_t type)
7942 {
7943 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
7944 auto callingUid = IPCSkeleton::GetCallingUid();
7945 if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID)) {
7946 HILOG_ERROR("The interface only support for broker");
7947 return CHECK_PERMISSION_FAILED;
7948 }
7949 if (!CheckCollaboratorType(type)) {
7950 HILOG_ERROR("collaborator unregister failed, invalid type.");
7951 return ERR_INVALID_VALUE;
7952 }
7953 {
7954 std::lock_guard<ffrt::mutex> autoLock(collaboratorMapLock_);
7955 collaboratorMap_.erase(type);
7956 }
7957 return ERR_OK;
7958 }
7959
MoveMissionToBackground(int32_t missionId)7960 int32_t AbilityManagerService::MoveMissionToBackground(int32_t missionId)
7961 {
7962 HILOG_INFO("call");
7963 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
7964 auto callingUid = IPCSkeleton::GetCallingUid();
7965 if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID)) {
7966 HILOG_ERROR("The interface only support for broker");
7967 return CHECK_PERMISSION_FAILED;
7968 }
7969 if (!currentMissionListManager_) {
7970 HILOG_ERROR("currentMissionListManager_ is null.");
7971 return ERR_INVALID_VALUE;
7972 }
7973
7974 return currentMissionListManager_->MoveMissionToBackground(missionId);
7975 }
7976
TerminateMission(int32_t missionId)7977 int32_t AbilityManagerService::TerminateMission(int32_t missionId)
7978 {
7979 HILOG_INFO("call");
7980 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
7981 auto callingUid = IPCSkeleton::GetCallingUid();
7982 if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID)) {
7983 HILOG_ERROR("The interface only support for broker");
7984 return CHECK_PERMISSION_FAILED;
7985 }
7986 if (!currentMissionListManager_) {
7987 HILOG_ERROR("currentMissionListManager_ is null.");
7988 return ERR_INVALID_VALUE;
7989 }
7990
7991 return currentMissionListManager_->TerminateMission(missionId);
7992 }
7993
GetCollaborator(int32_t type)7994 sptr<IAbilityManagerCollaborator> AbilityManagerService::GetCollaborator(int32_t type)
7995 {
7996 if (!CheckCollaboratorType(type)) {
7997 HILOG_ERROR("collaborator: CheckCollaboratorType failed");
7998 return nullptr;
7999 }
8000 {
8001 std::lock_guard<ffrt::mutex> autoLock(collaboratorMapLock_);
8002 auto it = collaboratorMap_.find(type);
8003 if (it != collaboratorMap_.end()) {
8004 return it->second;
8005 }
8006 }
8007 return nullptr;
8008 }
8009
CheckCollaboratorType(int32_t type)8010 bool AbilityManagerService::CheckCollaboratorType(int32_t type)
8011 {
8012 if (type != CollaboratorType::RESERVE_TYPE && type != CollaboratorType::OTHERS_TYPE) {
8013 HILOG_ERROR("type is invalid");
8014 return false;
8015 }
8016 return true;
8017 }
8018
GetConnectManagerAndUIExtensionBySessionInfo(const sptr<SessionInfo> & sessionInfo,std::shared_ptr<AbilityConnectManager> & connectManager,std::shared_ptr<AbilityRecord> & targetAbility)8019 void AbilityManagerService::GetConnectManagerAndUIExtensionBySessionInfo(const sptr<SessionInfo> &sessionInfo,
8020 std::shared_ptr<AbilityConnectManager> &connectManager, std::shared_ptr<AbilityRecord> &targetAbility)
8021 {
8022 targetAbility = nullptr;
8023 int32_t userId = GetValidUserId(DEFAULT_INVAL_VALUE);
8024 HILOG_DEBUG("userId=%{public}d", userId);
8025 connectManager = GetConnectManagerByUserId(userId);
8026 if (connectManager) {
8027 targetAbility = connectManager->GetUIExtensioBySessionInfo(sessionInfo);
8028 } else {
8029 HILOG_WARN("connectManager is nullptr, userId: %{public}d", userId);
8030 }
8031 if (targetAbility == nullptr && userId != U0_USER_ID) {
8032 HILOG_DEBUG("try to find UIExtension in user0");
8033 connectManager = GetConnectManagerByUserId(U0_USER_ID);
8034 if (connectManager) {
8035 targetAbility = connectManager->GetUIExtensioBySessionInfo(sessionInfo);
8036 } else {
8037 HILOG_WARN("connectManager is nullptr, userId: 0");
8038 }
8039 }
8040 }
8041
PrepareTerminateAbilityBySCB(const sptr<SessionInfo> & sessionInfo,bool & isTerminate)8042 int AbilityManagerService::PrepareTerminateAbilityBySCB(const sptr<SessionInfo> &sessionInfo, bool &isTerminate)
8043 {
8044 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
8045 HILOG_DEBUG("Call.");
8046 if (sessionInfo == nullptr || sessionInfo->sessionToken == nullptr) {
8047 HILOG_ERROR("sessionInfo is nullptr");
8048 return ERR_INVALID_VALUE;
8049 }
8050
8051 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
8052 HILOG_ERROR("Not sceneboard called, not allowed.");
8053 return ERR_WRONG_INTERFACE_CALL;
8054 }
8055
8056 if (!uiAbilityLifecycleManager_) {
8057 HILOG_ERROR("failed, uiAbilityLifecycleManager is nullptr");
8058 return ERR_INVALID_VALUE;
8059 }
8060
8061 auto abilityRecord = uiAbilityLifecycleManager_->GetUIAbilityRecordBySessionInfo(sessionInfo);
8062 isTerminate = uiAbilityLifecycleManager_->PrepareTerminateAbility(abilityRecord);
8063
8064 return ERR_OK;
8065 }
8066
RegisterSessionHandler(const sptr<IRemoteObject> & object)8067 int AbilityManagerService::RegisterSessionHandler(const sptr<IRemoteObject> &object)
8068 {
8069 HILOG_INFO("call");
8070 CHECK_POINTER_AND_RETURN(uiAbilityLifecycleManager_, ERR_NO_INIT);
8071 if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) {
8072 HILOG_ERROR("Not sceneboard called, not allowed.");
8073 return ERR_WRONG_INTERFACE_CALL;
8074 }
8075 sptr<ISessionHandler> handler = iface_cast<ISessionHandler>(object);
8076 uiAbilityLifecycleManager_->SetSessionHandler(handler);
8077 return ERR_OK;
8078 }
8079
CheckSenderWantInfo(int32_t callerUid,const WantSenderInfo & wantSenderInfo)8080 bool AbilityManagerService::CheckSenderWantInfo(int32_t callerUid, const WantSenderInfo &wantSenderInfo)
8081 {
8082 if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
8083 auto bms = GetBundleManager();
8084 CHECK_POINTER_AND_RETURN(bms, false);
8085
8086 std::string bundleName;
8087 if (IN_PROCESS_CALL(bms->GetNameForUid(callerUid, bundleName)) != ERR_OK) {
8088 HILOG_ERROR("Get Bundle Name failed.");
8089 return false;
8090 }
8091 if (wantSenderInfo.bundleName != bundleName) {
8092 HILOG_ERROR("wantSender bundleName check failed");
8093 return false;
8094 }
8095 }
8096 return true;
8097 }
8098 } // namespace AAFwk
8099 } // namespace OHOS
8100