• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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