Index: chrome/browser/chromeos/system/device_disabling_manager.cc |
diff --git a/chrome/browser/chromeos/system/device_disabling_manager.cc b/chrome/browser/chromeos/system/device_disabling_manager.cc |
index ae2410ee1c461950a33f36db34264e34702d9c83..59a3807d4469672ea76b089e75bd87557b7ec77a 100644 |
--- a/chrome/browser/chromeos/system/device_disabling_manager.cc |
+++ b/chrome/browser/chromeos/system/device_disabling_manager.cc |
@@ -10,25 +10,84 @@ |
#include "base/prefs/pref_service.h" |
#include "base/values.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/browser_process_platform_part.h" |
+#include "chrome/browser/chromeos/login/existing_user_controller.h" |
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h" |
#include "chrome/browser/chromeos/policy/server_backed_device_state.h" |
#include "chrome/common/pref_names.h" |
#include "chromeos/chromeos_switches.h" |
+#include "chromeos/settings/cros_settings_names.h" |
+#include "chromeos/settings/cros_settings_provider.h" |
#include "components/policy/core/common/cloud/cloud_policy_constants.h" |
+#include "components/user_manager/user_manager.h" |
namespace chromeos { |
namespace system { |
+DeviceDisablingManager::Observer::~Observer() { |
+} |
+ |
+DeviceDisablingManager::Delegate::~Delegate() { |
+} |
+ |
DeviceDisablingManager::DeviceDisablingManager( |
- policy::BrowserPolicyConnectorChromeOS* browser_policy_connector) |
- : browser_policy_connector_(browser_policy_connector), |
+ Delegate* delegate, |
+ CrosSettings* cros_settings, |
+ user_manager::UserManager* user_manager) |
+ : delegate_(delegate), |
+ browser_policy_connector_(g_browser_process->platform_part()-> |
+ browser_policy_connector_chromeos()), |
+ cros_settings_(cros_settings), |
+ user_manager_(user_manager), |
+ device_disabled_(false), |
weak_factory_(this) { |
+ CHECK(delegate_); |
+ Init(); |
} |
DeviceDisablingManager::~DeviceDisablingManager() { |
} |
+void DeviceDisablingManager::AddObserver(Observer* observer) { |
+ observers_.AddObserver(observer); |
+} |
+ |
+void DeviceDisablingManager::RemoveObserver(Observer* observer) { |
+ observers_.RemoveObserver(observer); |
+} |
+ |
+void DeviceDisablingManager::Init() { |
+ if (CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisableDeviceDisabling)) { |
+ // If device disabling is turned off by flags, do not start monitoring cros |
+ // settings. |
+ return; |
+ } |
+ |
+ device_disabled_subscription_ = cros_settings_->AddSettingsObserver( |
+ kDeviceDisabled, |
+ base::Bind(&DeviceDisablingManager::UpdateFromCrosSettings, |
+ weak_factory_.GetWeakPtr())); |
+ disabled_message_subscription_ = cros_settings_->AddSettingsObserver( |
+ kDeviceDisabledMessage, |
+ base::Bind(&DeviceDisablingManager::UpdateFromCrosSettings, |
+ weak_factory_.GetWeakPtr())); |
+ |
+ UpdateFromCrosSettings(); |
+} |
+ |
+void DeviceDisablingManager::CacheDisabledMessageAndNotify( |
+ const std::string& disabled_message) { |
+ if (disabled_message == disabled_message_) |
+ return; |
+ |
+ disabled_message_ = disabled_message; |
+ FOR_EACH_OBSERVER(Observer, |
+ observers_, |
+ OnDisabledMessageChanged(disabled_message_)); |
+} |
+ |
void DeviceDisablingManager::CheckWhetherDeviceDisabledDuringOOBE( |
const DeviceDisabledCheckCallback& callback) { |
if (policy::GetRestoreMode() != policy::RESTORE_MODE_DISABLED || |
@@ -68,16 +127,88 @@ void DeviceDisablingManager::CheckWhetherDeviceDisabledDuringOOBE( |
// off by flag and the device is still unowned, we honor the information in |
// local state and consider the device disabled. |
- // Cache the disabled message. |
- disabled_message_.clear(); |
+ // Update the disabled message. |
+ std::string disabled_message; |
g_browser_process->local_state()->GetDictionary( |
prefs::kServerBackedDeviceState)->GetString( |
policy::kDeviceStateDisabledMessage, |
- &disabled_message_); |
+ &disabled_message); |
+ CacheDisabledMessageAndNotify(disabled_message); |
// Indicate that the device is disabled. |
callback.Run(true); |
} |
+// static |
+bool DeviceDisablingManager::HonorDeviceDisablingDuringNormalOperation() { |
+ // Device disabling should be honored when the device is enterprise managed |
+ // and device disabling has not been turned off by flag. |
+ return g_browser_process->platform_part()-> |
+ browser_policy_connector_chromeos()->IsEnterpriseManaged() && |
+ !CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisableDeviceDisabling); |
+} |
+ |
+void DeviceDisablingManager::UpdateFromCrosSettings() { |
+ if (cros_settings_->PrepareTrustedValues(base::Bind( |
+ &DeviceDisablingManager::UpdateFromCrosSettings, |
+ weak_factory_.GetWeakPtr())) != CrosSettingsProvider::TRUSTED) { |
+ // If the cros settings are not trusted yet, request to be called back |
+ // later. |
+ return; |
+ } |
+ |
+ if (!HonorDeviceDisablingDuringNormalOperation()) { |
+ // If the device is not enterprise managed or device disabling has been |
+ // turned of by flag, device disabling is not available. |
+ return; |
+ } |
+ |
+ bool device_disabled = false; |
+ if (!cros_settings_->GetBoolean(kDeviceDisabled, &device_disabled) || |
+ !device_disabled) { |
+ if (!device_disabled_) { |
+ // If the device was not disabled and has not been disabled, there is |
+ // nothing to do. |
+ return; |
+ } |
+ device_disabled_ = false; |
+ |
+ // The device was disabled and has been re-enabled. Normal function should |
+ // be resumed. Since the device disabled screen abruptly interrupts the |
+ // regular login screen flows, Chrome should be restarted to return to a |
+ // well-defined state. |
+ delegate_->RestartToLoginScreen(); |
+ return; |
+ } |
+ |
+ // Update the disabled message. |
+ std::string disabled_message; |
+ cros_settings_->GetString(kDeviceDisabledMessage, &disabled_message); |
+ CacheDisabledMessageAndNotify(disabled_message); |
+ |
+ if (device_disabled_) { |
+ // If the device was disabled already, updating the disabled message is the |
+ // only action required. |
+ return; |
+ } |
+ device_disabled_ = true; |
+ |
+ const ExistingUserController* existing_user_controller = |
+ ExistingUserController::current_controller(); |
+ if (user_manager_->GetActiveUser() || |
+ (existing_user_controller && |
+ existing_user_controller->IsSigninInProgress())) { |
+ // If a session or a login is in progress, restart Chrome and return to the |
+ // login screen. Chrome will show the device disabled screen after the |
+ // restart. |
+ delegate_->RestartToLoginScreen(); |
+ return; |
+ } |
+ |
+ // If no session or login is in progress, show the device disabled screen. |
+ delegate_->ShowDeviceDisabledScreen(); |
+} |
+ |
} // namespace system |
} // namespace chromeos |