1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // 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/ui/webui/settings/browser_lifetime_handler.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "build/build_config.h"
10 #include "chrome/browser/lifetime/application_lifetime.h"
11
12 #if defined(OS_CHROMEOS)
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/browser_process_platform_part.h"
15 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
16 #include "chrome/browser/chromeos/tpm_firmware_update.h"
17 #include "chrome/common/pref_names.h"
18 #include "components/prefs/pref_service.h"
19 #include "components/user_manager/user_manager.h"
20 #endif // defined(OS_CHROMEOS)
21
22 namespace settings {
23
24 namespace {
25
26 #if defined(OS_CHROMEOS)
27 // Triggers a TPM firmware update using the least destructive mode from
28 // |available_modes|.
TriggerTPMFirmwareUpdate(const std::set<chromeos::tpm_firmware_update::Mode> & available_modes)29 void TriggerTPMFirmwareUpdate(
30 const std::set<chromeos::tpm_firmware_update::Mode>& available_modes) {
31 using chromeos::tpm_firmware_update::Mode;
32
33 // Decide which update mode to use.
34 for (Mode mode :
35 {Mode::kPreserveDeviceState, Mode::kPowerwash, Mode::kCleanup}) {
36 if (available_modes.count(mode) == 0) {
37 continue;
38 }
39
40 // Save a TPM firmware update request in local state, which
41 // will trigger the reset screen to appear on reboot.
42 PrefService* prefs = g_browser_process->local_state();
43 prefs->SetBoolean(prefs::kFactoryResetRequested, true);
44 prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode,
45 static_cast<int>(mode));
46 prefs->CommitPendingWrite();
47 chrome::AttemptRelaunch();
48 return;
49 }
50 }
51 #endif // defined(OS_CHROMEOS)
52
53 } // namespace
54
BrowserLifetimeHandler()55 BrowserLifetimeHandler::BrowserLifetimeHandler() {}
56
~BrowserLifetimeHandler()57 BrowserLifetimeHandler::~BrowserLifetimeHandler() {}
58
RegisterMessages()59 void BrowserLifetimeHandler::RegisterMessages() {
60 web_ui()->RegisterMessageCallback(
61 "restart", base::BindRepeating(&BrowserLifetimeHandler::HandleRestart,
62 base::Unretained(this)));
63 web_ui()->RegisterMessageCallback(
64 "relaunch", base::BindRepeating(&BrowserLifetimeHandler::HandleRelaunch,
65 base::Unretained(this)));
66 #if defined(OS_CHROMEOS)
67 web_ui()->RegisterMessageCallback(
68 "signOutAndRestart",
69 base::BindRepeating(&BrowserLifetimeHandler::HandleSignOutAndRestart,
70 base::Unretained(this)));
71 web_ui()->RegisterMessageCallback(
72 "factoryReset",
73 base::BindRepeating(&BrowserLifetimeHandler::HandleFactoryReset,
74 base::Unretained(this)));
75 #endif // defined(OS_CHROMEOS)
76 }
77
HandleRestart(const base::ListValue * args)78 void BrowserLifetimeHandler::HandleRestart(
79 const base::ListValue* args) {
80 chrome::AttemptRestart();
81 }
82
HandleRelaunch(const base::ListValue * args)83 void BrowserLifetimeHandler::HandleRelaunch(
84 const base::ListValue* args) {
85 chrome::AttemptRelaunch();
86 }
87
88 #if defined(OS_CHROMEOS)
HandleSignOutAndRestart(const base::ListValue * args)89 void BrowserLifetimeHandler::HandleSignOutAndRestart(
90 const base::ListValue* args) {
91 chrome::AttemptUserExit();
92 }
93
HandleFactoryReset(const base::ListValue * args)94 void BrowserLifetimeHandler::HandleFactoryReset(
95 const base::ListValue* args) {
96 base::Value::ConstListView args_list = args->GetList();
97 CHECK_EQ(1U, args_list.size());
98 bool tpm_firmware_update_requested = args_list[0].GetBool();
99
100 if (tpm_firmware_update_requested) {
101 chromeos::tpm_firmware_update::GetAvailableUpdateModes(
102 base::BindOnce(&TriggerTPMFirmwareUpdate), base::TimeDelta());
103 return;
104 }
105
106 // TODO(crbug.com/891905): Centralize powerwash restriction checks.
107 policy::BrowserPolicyConnectorChromeOS* connector =
108 g_browser_process->platform_part()->browser_policy_connector_chromeos();
109 bool allow_powerwash =
110 !connector->IsEnterpriseManaged() &&
111 !user_manager::UserManager::Get()->IsLoggedInAsGuest() &&
112 !user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser() &&
113 !user_manager::UserManager::Get()->IsLoggedInAsChildUser();
114
115 if (!allow_powerwash)
116 return;
117
118 PrefService* prefs = g_browser_process->local_state();
119 prefs->SetBoolean(prefs::kFactoryResetRequested, true);
120 prefs->CommitPendingWrite();
121
122 // Perform sign out. Current chrome process will then terminate, new one will
123 // be launched (as if it was a restart).
124 chrome::AttemptRelaunch();
125 }
126 #endif // defined(OS_CHROMEOS)
127
128 } // namespace settings
129