| # Lint as: python2, python3 |
| # Copyright 2021 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from dbus.mainloop.glib import DBusGMainLoop |
| from gi.repository import GObject |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.cros import cryptohome |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome, session_manager |
| |
| LCE_KEY = 'low_entropy_credentials_supported' |
| |
| |
| class login_LoginPin(test.test): |
| """Sets up a PIN for user and then logs in using the pin.""" |
| version = 1 |
| |
| def run_once(self, username, password, pin, setup_pin=True, |
| login_pin=True): |
| """Test body.""" |
| key_policies = cryptohome.get_supported_key_policies() |
| if LCE_KEY not in key_policies or not key_policies[LCE_KEY]: |
| raise error.TestNAError( |
| 'Skip test: No hardware support for PIN login') |
| |
| username = chrome.NormalizeEmail(username) |
| if setup_pin: |
| with chrome.Chrome(username=username, password=password) as cr: |
| if not cryptohome.is_vault_mounted(username): |
| raise error.TestFail( |
| 'Expected to find a mounted vault for %s' % |
| username) |
| |
| tab = cr.browser.tabs.New() |
| tab.Navigate('chrome://os-settings/osPrivacy/lockScreen') |
| |
| tab.WaitForDocumentReadyStateToBeComplete() |
| setup_pin = ''' |
| const getAuthToken = new Promise((resolve, reject) => { |
| chrome.quickUnlockPrivate.getAuthToken('%s', function(auth_token) { resolve(auth_token.token); }) |
| }); |
| function setModes(token) { |
| return new Promise((resolve, reject) => { |
| chrome.quickUnlockPrivate.setModes(token, [chrome.quickUnlockPrivate.QuickUnlockMode.PIN], ['%s'], resolve); |
| }) |
| } |
| function canAuthenticatePin() { |
| return new Promise((resolve, reject) => { |
| chrome.quickUnlockPrivate.canAuthenticatePin(resolve); |
| }) |
| } |
| |
| getAuthToken.then(setModes).then(canAuthenticatePin); |
| ''' % (password, pin) |
| pin_set = tab.EvaluateJavaScript(setup_pin, promise=True) |
| if not pin_set: |
| raise error.TestFail('Failed to setup a pin') |
| |
| if login_pin: |
| DBusGMainLoop(set_as_default=True) |
| listener = session_manager.SessionSignalListener( |
| GObject.MainLoop()) |
| listener.listen_for_session_state_change('started') |
| with chrome.Chrome(auto_login=False, |
| clear_enterprise_policy=False, |
| dont_override_profile=True, |
| extra_browser_args=[ |
| '--skip-force-online-signin-for-testing' |
| ]) as cr: |
| oobe = cr.browser.oobe |
| oobe.WaitForJavaScriptCondition( |
| "typeof Oobe == 'function' && " |
| "typeof OobeAPI == 'object' && " |
| "Oobe.readyForTesting", |
| timeout=20) |
| oobe.ExecuteJavaScript("OobeAPI.loginWithPin('%s','%s')" % |
| (username, pin)) |
| listener.wait_for_signals(desc='Session started.', timeout=20) |