Home | History | Annotate | Download | only in login_OwnershipApi
      1 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging, os, tempfile
      6 from dbus.mainloop.glib import DBusGMainLoop
      7 
      8 from autotest_lib.client.bin import test, utils
      9 from autotest_lib.client.common_lib import autotemp, error
     10 from autotest_lib.client.common_lib.cros import policy, session_manager
     11 from autotest_lib.client.cros import cros_ui, cryptohome, ownership
     12 
     13 
     14 class login_OwnershipApi(test.test):
     15     """Tests to ensure that the Ownership API works for a local device owner.
     16     """
     17     version = 1
     18 
     19     _tempdir = None
     20 
     21     def setup(self):
     22         os.chdir(self.srcdir)
     23         utils.make('OUT_DIR=.')
     24 
     25 
     26     def initialize(self):
     27         super(login_OwnershipApi, self).initialize()
     28         self._bus_loop = DBusGMainLoop(set_as_default=True)
     29 
     30         # Clear existing ownership and inject known keys.
     31         cros_ui.stop()
     32         ownership.clear_ownership_files_no_restart()
     33 
     34         # Make device already owned by ownership.TESTUSER.
     35         cryptohome.mount_vault(ownership.TESTUSER,
     36                                ownership.TESTPASS,
     37                                create=True)
     38         ownership.use_known_ownerkeys(ownership.TESTUSER)
     39 
     40         self._tempdir = autotemp.tempdir(unique_id=self.__class__.__name__)
     41         cros_ui.start()
     42 
     43 
     44     def __generate_temp_filename(self, dir):
     45         """Generate a guaranteed-unique filename in dir."""
     46         just_for_name = tempfile.NamedTemporaryFile(dir=dir, delete=True)
     47         basename = just_for_name.name
     48         just_for_name.close()  # deletes file.
     49         return basename
     50 
     51 
     52     def run_once(self):
     53         pkey = ownership.known_privkey()
     54         pubkey = ownership.known_pubkey()
     55         sm = session_manager.connect(self._bus_loop)
     56         sm.StartSession(ownership.TESTUSER, '')
     57 
     58         poldata = policy.build_policy_data(self.srcdir,
     59                                            owner=ownership.TESTUSER,
     60                                            guests=False,
     61                                            new_users=True,
     62                                            roaming=True,
     63                                            whitelist=(ownership.TESTUSER,
     64                                                       'a (at] b.c'))
     65 
     66         policy_string = policy.generate_policy(self.srcdir,
     67                                                pkey,
     68                                                pubkey,
     69                                                poldata)
     70         policy.push_policy_and_verify(policy_string, sm)
     71         retrieved_policy = policy.get_policy(sm)
     72         if retrieved_policy is None: raise error.TestFail('Policy not found')
     73         policy.compare_policy_response(self.srcdir,
     74                                        retrieved_policy,
     75                                        owner=ownership.TESTUSER,
     76                                        guests=False,
     77                                        new_users=True,
     78                                        roaming=True,
     79                                        whitelist=(ownership.TESTUSER, 'a (at] b.c'))
     80         try:
     81             # Sanity check against an incorrect policy
     82             policy.compare_policy_response(self.srcdir,
     83                                            retrieved_policy,
     84                                            owner=ownership.TESTUSER,
     85                                            guests=True,
     86                                            whitelist=(ownership.TESTUSER,
     87                                                       'a (at] b.c'))
     88         except ownership.OwnershipError:
     89             pass
     90         else:
     91             raise error.TestFail('Did not detect bad policy')
     92 
     93         try:
     94             sm.StopSession('')
     95         except error.TestError as e:
     96             logging.error(str(e))
     97             raise error.TestFail('Could not stop session for owner')
     98 
     99 
    100     def cleanup(self):
    101         if self._tempdir: self._tempdir.clean()
    102         # Best effort to bounce the UI, which may be up or down.
    103         cros_ui.stop(allow_fail=True)
    104         cryptohome.unmount_vault(ownership.TESTUSER)
    105         cryptohome.remove_vault(ownership.TESTUSER)
    106         cros_ui.start(allow_fail=True, wait_for_login_prompt=False)
    107         super(login_OwnershipApi, self).cleanup()
    108