1# Lint as: python2, python3 2# Copyright 2021 The Chromium OS Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6from dbus.mainloop.glib import DBusGMainLoop 7from gi.repository import GObject 8 9from autotest_lib.client.bin import test 10from autotest_lib.client.cros import cryptohome 11from autotest_lib.client.common_lib import error, lsbrelease_utils 12from autotest_lib.client.common_lib.cros import chrome, session_manager 13 14class login_LoginPin(test.test): 15 """Sets up a PIN for user and then logs in using the pin.""" 16 version = 1 17 18 def run_once(self, 19 username='autotest', 20 password='password', 21 pin='123456789', 22 setup_pin=True, 23 login_pin=True): 24 """Test body.""" 25 if not cryptohome.is_low_entropy_credentials_supported(): 26 if lsbrelease_utils.get_current_board() == 'hatch': 27 # Fail on a board where LEC must work so bisection could be run. 28 raise error.TestFail( 29 'low entropy credentials must be ' + 30 'supported on hatch, are the cryptohome utils wrong?') 31 raise error.TestNAError( 32 'Skip test: No hardware support for PIN login') 33 34 username = chrome.NormalizeEmail(username) 35 if setup_pin: 36 with chrome.Chrome(username=username, password=password) as cr: 37 if not cryptohome.is_vault_mounted(username): 38 raise error.TestFail( 39 'Expected to find a mounted vault for %s' % 40 username) 41 42 tab = cr.browser.tabs.New() 43 tab.Navigate('chrome://os-settings/osPrivacy/lockScreen') 44 45 tab.WaitForDocumentReadyStateToBeComplete() 46 setup_pin = ''' 47 const getAuthToken = new Promise((resolve, reject) => { 48 chrome.quickUnlockPrivate.getAuthToken('%s', function(auth_token) { resolve(auth_token.token); }) 49 }); 50 function setModes(token) { 51 return new Promise((resolve, reject) => { 52 chrome.quickUnlockPrivate.setModes(token, [chrome.quickUnlockPrivate.QuickUnlockMode.PIN], ['%s'], resolve); 53 }) 54 } 55 function canAuthenticatePin() { 56 return new Promise((resolve, reject) => { 57 chrome.quickUnlockPrivate.canAuthenticatePin(resolve); 58 }) 59 } 60 61 getAuthToken.then(setModes).then(canAuthenticatePin); 62 ''' % (password, pin) 63 pin_set = tab.EvaluateJavaScript(setup_pin, promise=True) 64 if not pin_set: 65 raise error.TestFail('Failed to setup a pin') 66 67 if login_pin: 68 DBusGMainLoop(set_as_default=True) 69 listener = session_manager.SessionSignalListener( 70 GObject.MainLoop()) 71 listener.listen_for_session_state_change('started') 72 with chrome.Chrome(auto_login=False, 73 clear_enterprise_policy=False, 74 dont_override_profile=True, 75 extra_browser_args=[ 76 '--skip-force-online-signin-for-testing' 77 ]) as cr: 78 oobe = cr.browser.oobe 79 oobe.WaitForJavaScriptCondition( 80 "typeof Oobe == 'function' && " 81 "typeof OobeAPI == 'object' && " 82 "Oobe.readyForTesting", 83 timeout=20) 84 oobe.ExecuteJavaScript("OobeAPI.loginWithPin('%s','%s')" % 85 (username, pin)) 86 listener.wait_for_signals(desc='Session started.', timeout=20) 87