blob: 47fdcb4a67d1c466d9dbefdb43e3ebe924128d95 [file] [log] [blame]
Ivan Ĺ andrkbd3fd842018-11-08 20:28:521// Copyright 2018 The Chromium Authors. All rights reserved.
Ivan Sandrk61c9e432018-06-27 16:48:422// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/system/user_removal_manager.h"
6
7#include <utility>
8
9#include "base/bind.h"
10#include "base/callback.h"
11#include "base/location.h"
Lei Zhang9f5b91a2018-08-28 19:24:1212#include "base/no_destructor.h"
Ivan Sandrk61c9e432018-06-27 16:48:4213#include "base/task_runner.h"
14#include "base/threading/sequenced_task_runner_handle.h"
15#include "base/time/time.h"
16#include "chrome/browser/browser_process.h"
17#include "chrome/browser/lifetime/application_lifetime.h"
18#include "chrome/common/pref_names.h"
19#include "components/prefs/persistent_pref_store.h"
20#include "components/prefs/pref_service.h"
21#include "components/user_manager/user.h"
22#include "components/user_manager/user_manager.h"
23
24namespace chromeos {
25namespace user_removal_manager {
26
27namespace {
28
29// The time that InitiateUserRemoval waits on the passed callback to do a log
30// out, otherwise it does the log out itself.
31constexpr base::TimeDelta kFailsafeTimerTimeout =
32 base::TimeDelta::FromSeconds(60);
33
34// Override for the LogOut function inside of tests.
Lei Zhang9f5b91a2018-08-28 19:24:1235base::OnceClosure& GetLogOutOverrideCallbackForTest() {
36 static base::NoDestructor<base::OnceClosure> callback;
37 return *callback;
38}
Ivan Sandrk61c9e432018-06-27 16:48:4239
40} // namespace
41
42bool RemoveUsersIfNeeded() {
43 PrefService* local_state = g_browser_process->local_state();
44 const bool should_remove_users =
45 local_state->GetBoolean(prefs::kRemoveUsersRemoteCommand);
46 if (!should_remove_users)
47 return false;
48
49 local_state->SetBoolean(prefs::kRemoveUsersRemoteCommand, false);
50
51 user_manager::UserManager* user_manager = user_manager::UserManager::Get();
52 // Make a copy of the list since we'll be removing users (and the list would
53 // change underneath us if we used a reference).
54 const user_manager::UserList user_list = user_manager->GetUsers();
55
56 for (user_manager::User* user : user_list)
57 user_manager->RemoveUser(user->GetAccountId(), nullptr);
58
59 return true;
60}
61
62void LogOut() {
Lei Zhang9f5b91a2018-08-28 19:24:1263 auto& log_out_override_callback = GetLogOutOverrideCallbackForTest();
64 if (log_out_override_callback) {
65 std::move(log_out_override_callback).Run();
Ivan Sandrk61c9e432018-06-27 16:48:4266 return;
67 }
68 chrome::AttemptUserExit();
69}
70
71void OverrideLogOutForTesting(base::OnceClosure callback) {
Lei Zhang9f5b91a2018-08-28 19:24:1272 auto& log_out_override_callback = GetLogOutOverrideCallbackForTest();
73 log_out_override_callback = std::move(callback);
Ivan Sandrk61c9e432018-06-27 16:48:4274}
75
76void InitiateUserRemoval(base::OnceClosure on_pref_persisted_callback) {
77 PrefService* local_state = g_browser_process->local_state();
78 local_state->SetBoolean(prefs::kRemoveUsersRemoteCommand, true);
79
80 local_state->CommitPendingWrite(base::BindOnce(
81 [](base::OnceClosure on_pref_persisted_callback) {
82 // Start the failsafe timer.
83 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
84 FROM_HERE, base::BindOnce(&LogOut), kFailsafeTimerTimeout);
85
Lei Zhang9f5b91a2018-08-28 19:24:1286 if (on_pref_persisted_callback)
Ivan Sandrk61c9e432018-06-27 16:48:4287 std::move(on_pref_persisted_callback).Run();
88 },
89 std::move(on_pref_persisted_callback)));
90}
91
92} // namespace user_removal_manager
93} // namespace chromeos