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