// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview * Subpage of settings-multidevice-feature for managing the Smart Lock feature. */ cr.exportPath('settings'); cr.define('settings', function() { /** * The state of the preference controlling Smart Lock's ability to sign-in the * user. * @enum {string} */ SignInEnabledState = { ENABLED: 'enabled', DISABLED: 'disabled', }; /** @const {string} */ SmartLockSignInEnabledPrefName = 'proximity_auth.is_chromeos_login_enabled'; return { SignInEnabledState: SignInEnabledState, SmartLockSignInEnabledPrefName: SmartLockSignInEnabledPrefName, }; }); Polymer({ is: 'settings-multidevice-smartlock-subpage', behaviors: [ MultiDeviceFeatureBehavior, WebUIListenerBehavior, ], properties: { /** @type {?SettingsRoutes} */ routes: { type: Object, value: settings.routes, }, /** * True if Smart Lock is enabled. * @private */ smartLockEnabled_: { type: Boolean, computed: 'computeIsSmartLockEnabled_(pageContentData)', }, /** * Whether Smart Lock may be used to sign-in the user (as opposed to only * being able to unlock the user's screen). * @private {!settings.SignInEnabledState} */ smartLockSignInEnabled_: { type: Object, value: settings.SignInEnabledState.DISABLED, }, /** * True if the user is allowed to enable Smart Lock sign-in. * @private */ smartLockSignInAllowed_: { type: Boolean, value: true, }, /** @private */ showPasswordPromptDialog_: { type: Boolean, value: false, }, /** * Authentication token provided by password-prompt-dialog. * @private {string} */ authToken_: { type: String, value: '', }, }, /** @private {?settings.MultiDeviceBrowserProxy} */ browserProxy_: null, /** @override */ ready: function() { this.browserProxy_ = settings.MultiDeviceBrowserProxyImpl.getInstance(); this.addWebUIListener( 'smart-lock-signin-enabled-changed', this.updateSmartLockSignInEnabled_.bind(this)); this.addWebUIListener( 'smart-lock-signin-allowed-changed', this.updateSmartLockSignInAllowed_.bind(this)); this.browserProxy_.getSmartLockSignInEnabled().then(enabled => { this.updateSmartLockSignInEnabled_(enabled); }); this.browserProxy_.getSmartLockSignInAllowed().then(allowed => { this.updateSmartLockSignInAllowed_(allowed); }); }, /** * Returns true if Smart Lock is an enabled feature. * @return {boolean} * @private */ computeIsSmartLockEnabled_: function() { return !!this.pageContentData && this.getFeatureState(settings.MultiDeviceFeature.SMART_LOCK) == settings.MultiDeviceFeatureState.ENABLED_BY_USER; }, /** * Updates the state of the Smart Lock 'sign-in enabled' toggle. * @private */ updateSmartLockSignInEnabled_: function(enabled) { this.smartLockSignInEnabled_ = enabled ? settings.SignInEnabledState.ENABLED : settings.SignInEnabledState.DISABLED; }, /** * Updates the Smart Lock 'sign-in enabled' toggle such that disallowing * sign-in disables the toggle. * @private */ updateSmartLockSignInAllowed_: function(allowed) { this.smartLockSignInAllowed_ = allowed; }, /** @private */ openPasswordPromptDialog_: function() { this.showPasswordPromptDialog_ = true; }, /** * Sets the Smart Lock 'sign-in enabled' pref based on the value of the * radio group representing the pref. * @private */ onSmartLockSignInEnabledChanged_: function() { const radioGroup = this.$$('cr-radio-group'); const enabled = radioGroup.selected == settings.SignInEnabledState.ENABLED; if (!enabled) { // No authentication check is required to disable. this.browserProxy_.setSmartLockSignInEnabled(false /* enabled */); return; } // Toggle the enabled state back to disabled, as authentication may not // succeed. The toggle state updates automatically by the pref listener. radioGroup.selected = settings.SignInEnabledState.DISABLED; this.openPasswordPromptDialog_(); }, /** * Updates the state of the password dialog controller flag when the UI * element closes. * @private */ onEnableSignInDialogClose_: function() { this.showPasswordPromptDialog_ = false; // If |this.authToken_| is set when the dialog has been closed, this means // that the user entered the correct password into the dialog when // attempting to enable SignIn with Smart Lock. if (this.authToken_ !== '') { this.browserProxy_.setSmartLockSignInEnabled( true /* enabled */, this.authToken_); } // Always require password entry if re-enabling SignIn with Smart Lock. this.authToken_ = ''; }, });