1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "user_controller.h"
17 
18 #include "ability_manager_service.h"
19 #include "hilog_tag_wrapper.h"
20 #include "mock_session_manager_service.h"
21 #include "os_account_manager_wrapper.h"
22 #include "scene_board_judgement.h"
23 
24 namespace OHOS {
25 namespace AAFwk {
26 using namespace OHOS::AppExecFwk;
27 namespace {
28 const int64_t USER_SWITCH_TIMEOUT = 3 * 1000; // 3s
29 }
30 
UserItem(int32_t id)31 UserItem::UserItem(int32_t id) : userId_(id)
32 {}
33 
~UserItem()34 UserItem::~UserItem() {}
35 
GetUserId()36 int32_t UserItem::GetUserId()
37 {
38     return userId_;
39 }
40 
SetState(const UserState &state)41 void UserItem::SetState(const UserState &state)
42 {
43     if (curState_ == state) {
44         return;
45     }
46     lastState_ = curState_;
47     curState_ = state;
48 }
49 
GetState()50 UserState UserItem::GetState()
51 {
52     return curState_;
53 }
54 
UserController()55 UserController::UserController()
56 {
57 }
58 
~UserController()59 UserController::~UserController()
60 {
61 }
62 
Init()63 void UserController::Init()
64 {
65     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
66     if (!handler) {
67         return;
68     }
69 
70     if (eventHandler_) {
71         return;
72     }
73     eventHandler_ = std::make_shared<UserEventHandler>(handler, shared_from_this());
74 }
75 
ClearAbilityUserItems(int32_t userId)76 void UserController::ClearAbilityUserItems(int32_t userId)
77 {
78     std::lock_guard<ffrt::mutex> guard(userLock_);
79     if (userItems_.count(userId)) {
80         userItems_.erase(userId);
81     }
82 }
83 
StartUser(int32_t userId, sptr<IUserCallback> callback, bool isAppRecovery)84 void UserController::StartUser(int32_t userId, sptr<IUserCallback> callback, bool isAppRecovery)
85 {
86     if (userId < 0 || userId == USER_ID_NO_HEAD) {
87         TAG_LOGE(AAFwkTag::ABILITYMGR, "StartUserId invalid:%{public}d", userId);
88         callback->OnStartUserDone(userId, INVALID_USERID_VALUE);
89         return;
90     }
91 
92     if (IsCurrentUser(userId)) {
93         TAG_LOGW(AAFwkTag::ABILITYMGR, "StartUser current:%{public}d", userId);
94         callback->OnStartUserDone(userId, ERR_OK);
95         return;
96     }
97 
98     auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
99     if (!appScheduler) {
100         TAG_LOGE(AAFwkTag::ABILITYMGR, "null appScheduler");
101         return;
102     }
103     appScheduler->SetEnableStartProcessFlagByUserId(userId, true);
104 
105     if (!IsExistOsAccount(userId)) {
106         TAG_LOGE(AAFwkTag::ABILITYMGR, "null StartUser account:%{public}d", userId);
107         callback->OnStartUserDone(userId, INVALID_USERID_VALUE);
108         return;
109     }
110 
111     if (GetCurrentUserId() != USER_ID_NO_HEAD && !Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
112         // start freezing screen
113         SetFreezingNewUserId(userId);
114         DelayedSingleton<AbilityManagerService>::GetInstance()->StartFreezingScreen();
115     }
116 
117     auto oldUserId = GetCurrentUserId();
118     auto userItem = GetOrCreateUserItem(userId);
119     auto state = userItem->GetState();
120     if (state == STATE_STOPPING || state == STATE_SHUTDOWN) {
121         TAG_LOGE(AAFwkTag::ABILITYMGR, "StartUser user stop, userId:%{public}d", userId);
122         callback->OnStartUserDone(userId, ERR_DEAD_OBJECT);
123         return;
124     }
125 
126     SetCurrentUserId(userId);
127     // notify wms switching now
128 
129     bool needStart = false;
130     if (state == STATE_BOOTING) {
131         needStart = true;
132         // send user start msg.
133         SendSystemUserStart(userId);
134     }
135 
136     SendSystemUserCurrent(oldUserId, userId);
137     SendReportUserSwitch(oldUserId, userId, userItem);
138     SendUserSwitchTimeout(oldUserId, userId, userItem);
139 
140     if (needStart) {
141         BroadcastUserStarted(userId);
142     }
143 
144     UserBootDone(userItem);
145     MoveUserToForeground(oldUserId, userId, callback, isAppRecovery);
146 }
147 
StopUser(int32_t userId)148 int32_t UserController::StopUser(int32_t userId)
149 {
150     if (userId < 0 || userId == USER_ID_NO_HEAD || userId == USER_ID_DEFAULT) {
151         TAG_LOGE(AAFwkTag::ABILITYMGR, "userId invalid:%{public}d", userId);
152         return -1;
153     }
154 
155     if (IsCurrentUser(userId)) {
156         TAG_LOGW(AAFwkTag::ABILITYMGR, "user current:%{public}d", userId);
157         return 0;
158     }
159 
160     if (!IsExistOsAccount(userId)) {
161         TAG_LOGE(AAFwkTag::ABILITYMGR, "null account:%{public}d", userId);
162         return -1;
163     }
164 
165     BroadcastUserStopping(userId);
166 
167     auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
168     if (!appScheduler) {
169         TAG_LOGE(AAFwkTag::ABILITYMGR, "null appScheduler");
170         return -1;
171     }
172     appScheduler->KillProcessesByUserId(userId);
173 
174     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
175     if (!abilityManagerService) {
176         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityManagerService null");
177         return -1;
178     }
179 
180     if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
181         auto missionListWrap = abilityManagerService->GetMissionListWrap();
182         if (!missionListWrap) {
183             TAG_LOGE(AAFwkTag::ABILITYMGR, "missionListWrap null");
184             return -1;
185         }
186         missionListWrap->RemoveUserDir(userId);
187     }
188 
189     abilityManagerService->ClearUserData(userId);
190 
191     BroadcastUserStopped(userId);
192     return 0;
193 }
194 
LogoutUser(int32_t userId)195 int32_t UserController::LogoutUser(int32_t userId)
196 {
197     if (userId < 0 || userId == USER_ID_NO_HEAD) {
198         TAG_LOGE(AAFwkTag::ABILITYMGR, "userId invalid:%{public}d", userId);
199         return INVALID_USERID_VALUE;
200     }
201     if (!IsExistOsAccount(userId)) {
202         TAG_LOGE(AAFwkTag::ABILITYMGR, "null account:%{public}d", userId);
203         return INVALID_USERID_VALUE;
204     }
205     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
206     if (!abilityManagerService) {
207         TAG_LOGE(AAFwkTag::ABILITYMGR, "null abilityManagerService");
208         return -1;
209     }
210     abilityManagerService->RemoveLauncherDeathRecipient(userId);
211     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
212         TAG_LOGI(AAFwkTag::ABILITYMGR, "SceneBoard exit normally.");
213         Rosen::MockSessionManagerService::GetInstance().NotifyNotKillService();
214     }
215     auto appScheduler = DelayedSingleton<AppScheduler>::GetInstance();
216     if (!appScheduler) {
217         TAG_LOGE(AAFwkTag::ABILITYMGR, "null appScheduler");
218         return INVALID_USERID_VALUE;
219     }
220     abilityManagerService->ClearUserData(userId);
221     appScheduler->SetEnableStartProcessFlagByUserId(userId, false);
222     if (IsCurrentUser(userId)) {
223         SetCurrentUserId(0);
224     }
225     appScheduler->KillProcessesByUserId(userId);
226     ClearAbilityUserItems(userId);
227     return 0;
228 }
229 
GetCurrentUserId()230 int32_t UserController::GetCurrentUserId()
231 {
232     std::lock_guard<ffrt::mutex> guard(userLock_);
233     return currentUserId_;
234 }
235 
GetUserItem(int32_t userId)236 std::shared_ptr<UserItem> UserController::GetUserItem(int32_t userId)
237 {
238     std::lock_guard<ffrt::mutex> guard(userLock_);
239     auto it = userItems_.find(userId);
240     if (it != userItems_.end()) {
241         return it->second;
242     }
243 
244     return nullptr;
245 }
246 
IsCurrentUser(int32_t userId)247 bool UserController::IsCurrentUser(int32_t userId)
248 {
249     int32_t oldUserId = GetCurrentUserId();
250     if (oldUserId == userId) {
251         auto userItem = GetUserItem(userId);
252         if (userItem) {
253             TAG_LOGW(AAFwkTag::ABILITYMGR, "IsCurrentUserId current:%{public}d", userId);
254             return true;
255         }
256     }
257     return false;
258 }
259 
IsExistOsAccount(int32_t userId)260 bool UserController::IsExistOsAccount(int32_t userId)
261 {
262     bool isExist = false;
263     auto errCode = DelayedSingleton<OsAccountManagerWrapper>::GetInstance()->IsOsAccountExists(userId, isExist);
264     return (errCode == 0) && isExist;
265 }
266 
GetOrCreateUserItem(int32_t userId)267 std::shared_ptr<UserItem> UserController::GetOrCreateUserItem(int32_t userId)
268 {
269     std::lock_guard<ffrt::mutex> guard(userLock_);
270     auto it = userItems_.find(userId);
271     if (it != userItems_.end()) {
272         return it->second;
273     }
274 
275     auto userItem = std::make_shared<UserItem>(userId);
276     userItems_.emplace(userId, userItem);
277     return userItem;
278 }
279 
SetCurrentUserId(int32_t userId)280 void UserController::SetCurrentUserId(int32_t userId)
281 {
282     std::lock_guard<ffrt::mutex> guard(userLock_);
283     currentUserId_ = userId;
284     TAG_LOGD(AAFwkTag::ABILITYMGR, "set current userId: %{public}d", userId);
285     DelayedSingleton<AppScheduler>::GetInstance()->SetCurrentUserId(userId);
286 }
287 
MoveUserToForeground(int32_t oldUserId, int32_t newUserId, sptr<IUserCallback> callback, bool isAppRecovery)288 void UserController::MoveUserToForeground(int32_t oldUserId, int32_t newUserId, sptr<IUserCallback> callback,
289     bool isAppRecovery)
290 {
291     auto manager = DelayedSingleton<AbilityManagerService>::GetInstance();
292     if (!manager) {
293         return;
294     }
295     manager->SwitchToUser(oldUserId, newUserId, callback, isAppRecovery);
296     BroadcastUserBackground(oldUserId);
297     BroadcastUserForeground(newUserId);
298 }
299 
UserBootDone(std::shared_ptr<UserItem> &item)300 void UserController::UserBootDone(std::shared_ptr<UserItem> &item)
301 {
302     if (!item) {
303         return;
304     }
305     int32_t userId = item->GetUserId();
306 
307     std::lock_guard<ffrt::mutex> guard(userLock_);
308     auto it = userItems_.find(userId);
309     if (it != userItems_.end()) {
310         return;
311     }
312 
313     if (item != it->second) {
314         return;
315     }
316     item->SetState(UserState::STATE_STARTED);
317     auto manager = DelayedSingleton<AbilityManagerService>::GetInstance();
318     if (!manager) {
319         return;
320     }
321     manager->UserStarted(userId);
322 }
323 
BroadcastUserStarted(int32_t userId)324 void UserController::BroadcastUserStarted(int32_t userId)
325 {
326     // broadcast event user start.
327 }
328 
BroadcastUserBackground(int32_t userId)329 void UserController::BroadcastUserBackground(int32_t userId)
330 {
331     // broadcast event user switch to bg.
332 }
333 
BroadcastUserForeground(int32_t userId)334 void UserController::BroadcastUserForeground(int32_t userId)
335 {
336     // broadcast event user switch to fg.
337 }
338 
BroadcastUserStopping(int32_t userId)339 void UserController::BroadcastUserStopping(int32_t userId)
340 {
341 }
342 
BroadcastUserStopped(int32_t userId)343 void UserController::BroadcastUserStopped(int32_t userId)
344 {
345 }
346 
SendSystemUserStart(int32_t userId)347 void UserController::SendSystemUserStart(int32_t userId)
348 {
349     auto handler = eventHandler_;
350     if (!handler) {
351         return;
352     }
353 
354     auto eventData = std::make_shared<UserEvent>();
355     eventData->newUserId = userId;
356     handler->SendEvent(EventWrap(UserEventHandler::EVENT_SYSTEM_USER_START, eventData));
357 }
358 
ProcessEvent(const EventWrap &event)359 void UserController::ProcessEvent(const EventWrap &event)
360 {
361     auto eventId = event.GetEventId();
362     auto eventData = static_cast<UserEvent*>(event.GetEventData().get());
363     if (!eventData) {
364         TAG_LOGD(AAFwkTag::ABILITYMGR, "no event data, event id: %{public}u.", eventId);
365         return;
366     }
367 
368     TAG_LOGD(AAFwkTag::ABILITYMGR, "Event id obtained: %{public}u.", eventId);
369     switch (eventId) {
370         case UserEventHandler::EVENT_SYSTEM_USER_START: {
371             HandleSystemUserStart(eventData->newUserId);
372             break;
373         }
374         case UserEventHandler::EVENT_SYSTEM_USER_CURRENT: {
375             HandleSystemUserCurrent(eventData->oldUserId, eventData->newUserId);
376             break;
377         }
378         case UserEventHandler::EVENT_REPORT_USER_SWITCH: {
379             HandleReportUserSwitch(eventData->oldUserId, eventData->newUserId, eventData->userItem);
380             break;
381         }
382         case UserEventHandler::EVENT_CONTINUE_USER_SWITCH: {
383             HandleContinueUserSwitch(eventData->oldUserId, eventData->newUserId, eventData->userItem);
384             break;
385         }
386         case UserEventHandler::EVENT_USER_SWITCH_TIMEOUT: {
387             HandleUserSwitchTimeout(eventData->oldUserId, eventData->newUserId, eventData->userItem);
388             break;
389         }
390         case UserEventHandler::EVENT_REPORT_USER_SWITCH_DONE: {
391             HandleUserSwitchDone(eventData->newUserId);
392             break;
393         }
394         default: {
395             TAG_LOGW(AAFwkTag::ABILITYMGR, "Unsupported  event.");
396             break;
397         }
398     }
399 }
400 
SendSystemUserCurrent(int32_t oldUserId, int32_t newUserId)401 void UserController::SendSystemUserCurrent(int32_t oldUserId, int32_t newUserId)
402 {
403     auto handler = eventHandler_;
404     if (!handler) {
405         return;
406     }
407 
408     auto eventData = std::make_shared<UserEvent>();
409     eventData->oldUserId = oldUserId;
410     eventData->newUserId = newUserId;
411     handler->SendEvent(EventWrap(UserEventHandler::EVENT_SYSTEM_USER_CURRENT, eventData));
412 }
413 
SendReportUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)414 void UserController::SendReportUserSwitch(int32_t oldUserId, int32_t newUserId,
415     std::shared_ptr<UserItem> &usrItem)
416 {
417     auto handler = eventHandler_;
418     if (!handler) {
419         return;
420     }
421 
422     auto eventData = std::make_shared<UserEvent>();
423     eventData->oldUserId = oldUserId;
424     eventData->newUserId = newUserId;
425     eventData->userItem = usrItem;
426     handler->SendEvent(EventWrap(UserEventHandler::EVENT_REPORT_USER_SWITCH, eventData));
427 }
428 
SendUserSwitchTimeout(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)429 void UserController::SendUserSwitchTimeout(int32_t oldUserId, int32_t newUserId,
430     std::shared_ptr<UserItem> &usrItem)
431 {
432     auto handler = eventHandler_;
433     if (!handler) {
434         return;
435     }
436 
437     auto eventData = std::make_shared<UserEvent>();
438     eventData->oldUserId = oldUserId;
439     eventData->newUserId = newUserId;
440     eventData->userItem = usrItem;
441     handler->SendEvent(EventWrap(UserEventHandler::EVENT_USER_SWITCH_TIMEOUT,
442         eventData), USER_SWITCH_TIMEOUT);
443 }
444 
SendContinueUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)445 void UserController::SendContinueUserSwitch(int32_t oldUserId, int32_t newUserId,
446     std::shared_ptr<UserItem> &usrItem)
447 {
448     auto handler = eventHandler_;
449     if (!handler) {
450         return;
451     }
452 
453     auto eventData = std::make_shared<UserEvent>();
454     eventData->oldUserId = oldUserId;
455     eventData->newUserId = newUserId;
456     eventData->userItem = usrItem;
457     handler->SendEvent(EventWrap(UserEventHandler::EVENT_CONTINUE_USER_SWITCH, eventData));
458 }
459 
SendUserSwitchDone(int32_t userId)460 void UserController::SendUserSwitchDone(int32_t userId)
461 {
462     auto handler = eventHandler_;
463     if (!handler) {
464         return;
465     }
466 
467     auto eventData = std::make_shared<UserEvent>();
468     eventData->newUserId = userId;
469     handler->SendEvent(EventWrap(UserEventHandler::EVENT_REPORT_USER_SWITCH_DONE,
470         eventData));
471 }
472 
HandleSystemUserStart(int32_t userId)473 void UserController::HandleSystemUserStart(int32_t userId)
474 {
475     // notify system mgr user start.
476 }
477 
HandleSystemUserCurrent(int32_t oldUserId, int32_t newUserId)478 void UserController::HandleSystemUserCurrent(int32_t oldUserId, int32_t newUserId)
479 {
480     // notify system mgr user switch to new.
481 }
482 
HandleReportUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)483 void UserController::HandleReportUserSwitch(int32_t oldUserId, int32_t newUserId,
484     std::shared_ptr<UserItem> &usrItem)
485 {
486     // notify user switch observers, not support yet.
487 }
488 
HandleUserSwitchTimeout(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)489 void UserController::HandleUserSwitchTimeout(int32_t oldUserId, int32_t newUserId,
490     std::shared_ptr<UserItem> &usrItem)
491 {
492     // other observers
493     SendContinueUserSwitch(oldUserId, newUserId, usrItem);
494 }
495 
HandleContinueUserSwitch(int32_t oldUserId, int32_t newUserId, std::shared_ptr<UserItem> &usrItem)496 void UserController::HandleContinueUserSwitch(int32_t oldUserId, int32_t newUserId,
497     std::shared_ptr<UserItem> &usrItem)
498 {
499     auto manager = DelayedSingleton<AbilityManagerService>::GetInstance();
500     if (manager && !Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
501         manager->StopFreezingScreen();
502     }
503     SendUserSwitchDone(newUserId);
504 }
505 
HandleUserSwitchDone(int32_t userId)506 void UserController::HandleUserSwitchDone(int32_t userId)
507 {
508     // notify wms switching done.
509     // notify user switch observers.
510 }
511 
GetFreezingNewUserId() const512 int32_t UserController::GetFreezingNewUserId() const
513 {
514     return freezingNewUserId_;
515 }
516 
SetFreezingNewUserId(int32_t userId)517 void UserController::SetFreezingNewUserId(int32_t userId)
518 {
519     freezingNewUserId_ = userId;
520 }
521 }
522 }
523