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