| OLD | NEW |
| (Empty) |
| 1 # Copyright (c) 2012 The Chromium 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 | |
| 6 import os | |
| 7 import sys | |
| 8 | |
| 9 import pyauto_functional # Must come before pyauto (and thus, policy_base). | |
| 10 import policy_base | |
| 11 | |
| 12 sys.path.append('/usr/local') # Required to import autotest libs. | |
| 13 from autotest.cros import constants | |
| 14 from autotest.cros import cryptohome | |
| 15 | |
| 16 | |
| 17 class ChromeosEphemeral(policy_base.PolicyTestBase): | |
| 18 """Tests a policy that makes users ephemeral. | |
| 19 | |
| 20 When this policy is enabled, no persistent information in the form of | |
| 21 cryptohome shadow directories or local state prefs should be created for | |
| 22 users. Additionally, any persistent information previously accumulated should | |
| 23 be cleared when a user first logs in after enabling the policy.""" | |
| 24 | |
| 25 _usernames = ('alice@example.com', 'bob@example.com') | |
| 26 | |
| 27 def _SetEphemeralUsersEnabled(self, enabled): | |
| 28 """Sets the ephemeral users device policy. | |
| 29 | |
| 30 The show_user_names policy is set to False to ensure that even if the local | |
| 31 state is not being automatically cleared, the login screen never shows user | |
| 32 pods. This is required by the Login browser automation call. | |
| 33 """ | |
| 34 self.SetDevicePolicy({'ephemeral_users_enabled': enabled, | |
| 35 'show_user_names': False}) | |
| 36 | |
| 37 def _DoesVaultDirectoryExist(self, user_index): | |
| 38 user_hash = cryptohome.get_user_hash(self._usernames[user_index]) | |
| 39 return os.path.exists(os.path.join(constants.SHADOW_ROOT, user_hash)) | |
| 40 | |
| 41 def _AssertLocalStatePrefsSet(self, user_indexes): | |
| 42 expected = sorted([self._usernames[index] for index in user_indexes]) | |
| 43 # The OAuthTokenStatus pref is populated asynchronously. Checking whether it | |
| 44 # is set would lead to an ugly race. | |
| 45 for pref in ['LoggedInUsers', 'UserImages', 'UserDisplayEmail', ]: | |
| 46 actual = sorted(self.GetLocalStatePrefsInfo().Prefs(pref)) | |
| 47 self.assertEqual(actual, expected, | |
| 48 msg='Expected to find prefs in local state for users.') | |
| 49 | |
| 50 def _AssertLocalStatePrefsEmpty(self): | |
| 51 for pref in ['LoggedInUsers', | |
| 52 'UserImages', | |
| 53 'UserDisplayEmail', | |
| 54 'OAuthTokenStatus']: | |
| 55 self.assertFalse(self.GetLocalStatePrefsInfo().Prefs(pref), | |
| 56 msg='Expected to not find prefs in local state for any user.') | |
| 57 | |
| 58 def _AssertVaultDirectoryExists(self, user_index): | |
| 59 self.assertTrue(self._DoesVaultDirectoryExist(user_index=user_index), | |
| 60 msg='Expected vault shadow directory to exist.') | |
| 61 | |
| 62 def _AssertVaultDirectoryDoesNotExist(self, user_index): | |
| 63 self.assertFalse(self._DoesVaultDirectoryExist(user_index=user_index), | |
| 64 msg='Expected vault shadow directory to not exist.') | |
| 65 | |
| 66 def _AssertVaultMounted(self, user_index, ephemeral): | |
| 67 if ephemeral: | |
| 68 device_regex = constants.CRYPTOHOME_DEV_REGEX_REGULAR_USER_EPHEMERAL | |
| 69 fs_regex = constants.CRYPTOHOME_FS_REGEX_TMPFS | |
| 70 else: | |
| 71 device_regex = constants.CRYPTOHOME_DEV_REGEX_REGULAR_USER_SHADOW | |
| 72 fs_regex = constants.CRYPTOHOME_FS_REGEX_ANY | |
| 73 self.assertTrue( | |
| 74 cryptohome.is_vault_mounted(device_regex=device_regex, | |
| 75 fs_regex=fs_regex, | |
| 76 user=self._usernames[user_index], | |
| 77 allow_fail=True), | |
| 78 msg='Expected vault backed by %s to be mounted.' % | |
| 79 'tmpfs' if ephemeral else 'shadow directory') | |
| 80 | |
| 81 def _AssertNoVaultMounted(self): | |
| 82 self.assertFalse(cryptohome.is_vault_mounted(allow_fail=True), | |
| 83 msg='Did not expect any vault to be mounted.') | |
| 84 | |
| 85 def Login(self, user_index): | |
| 86 """Convenience method to login to the usr at the given index.""" | |
| 87 self.assertFalse(self.GetLoginInfo()['is_logged_in'], | |
| 88 msg='Expected to be logged out.') | |
| 89 policy_base.PolicyTestBase.Login(self, | |
| 90 self._usernames[user_index], | |
| 91 'dummy_password') | |
| 92 self.assertTrue(self.GetLoginInfo()['is_logged_in'], | |
| 93 msg='Expected to be logged in.') | |
| 94 | |
| 95 def testEnablingBeforeSession(self): | |
| 96 """Checks that a new session can be made ephemeral.""" | |
| 97 self.PrepareToWaitForLoginFormReload() | |
| 98 self._SetEphemeralUsersEnabled(True) | |
| 99 self.WaitForLoginFormReload() | |
| 100 | |
| 101 self.Login(user_index=0) | |
| 102 self._AssertLocalStatePrefsEmpty() | |
| 103 self._AssertVaultMounted(user_index=0, ephemeral=True) | |
| 104 self.Logout() | |
| 105 | |
| 106 self._AssertLocalStatePrefsEmpty() | |
| 107 self._AssertNoVaultMounted() | |
| 108 self._AssertVaultDirectoryDoesNotExist(user_index=0) | |
| 109 | |
| 110 def testEnablingDuringSession(self): | |
| 111 """Checks that an existing non-ephemeral session is not made ephemeral.""" | |
| 112 self.PrepareToWaitForLoginFormReload() | |
| 113 self._SetEphemeralUsersEnabled(False) | |
| 114 self.WaitForLoginFormReload() | |
| 115 | |
| 116 self.Login(user_index=0) | |
| 117 self._AssertLocalStatePrefsSet(user_indexes=[0]) | |
| 118 self._AssertVaultMounted(user_index=0, ephemeral=False) | |
| 119 self._SetEphemeralUsersEnabled(True) | |
| 120 self._AssertLocalStatePrefsSet(user_indexes=[0]) | |
| 121 self._AssertVaultMounted(user_index=0, ephemeral=False) | |
| 122 self.Logout() | |
| 123 | |
| 124 self._AssertLocalStatePrefsEmpty() | |
| 125 self._AssertNoVaultMounted() | |
| 126 self._AssertVaultDirectoryDoesNotExist(user_index=0) | |
| 127 | |
| 128 def testDisablingDuringSession(self): | |
| 129 """Checks that an existing ephemeral session is not made non-ephemeral.""" | |
| 130 self.PrepareToWaitForLoginFormReload() | |
| 131 self._SetEphemeralUsersEnabled(True) | |
| 132 self.WaitForLoginFormReload() | |
| 133 | |
| 134 self.Login(user_index=0) | |
| 135 self._AssertVaultMounted(user_index=0, ephemeral=True) | |
| 136 self._SetEphemeralUsersEnabled(False) | |
| 137 self._AssertVaultMounted(user_index=0, ephemeral=True) | |
| 138 self.Logout() | |
| 139 | |
| 140 self._AssertLocalStatePrefsEmpty() | |
| 141 self._AssertNoVaultMounted() | |
| 142 self._AssertVaultDirectoryDoesNotExist(user_index=0) | |
| 143 | |
| 144 def testEnablingEphemeralUsersCleansUp(self): | |
| 145 """Checks that persistent information is cleared.""" | |
| 146 self.PrepareToWaitForLoginFormReload() | |
| 147 self._SetEphemeralUsersEnabled(False) | |
| 148 self.WaitForLoginFormReload() | |
| 149 | |
| 150 self.Login(user_index=0) | |
| 151 self.Logout() | |
| 152 self._AssertLocalStatePrefsSet(user_indexes=[0]) | |
| 153 | |
| 154 self.Login(user_index=1) | |
| 155 self.Logout() | |
| 156 self._AssertLocalStatePrefsSet(user_indexes=[0, 1]) | |
| 157 | |
| 158 self._AssertVaultDirectoryExists(user_index=0) | |
| 159 self._AssertVaultDirectoryExists(user_index=1) | |
| 160 | |
| 161 self._SetEphemeralUsersEnabled(True) | |
| 162 | |
| 163 self.Login(user_index=0) | |
| 164 self._AssertVaultMounted(user_index=0, ephemeral=True) | |
| 165 self.Logout() | |
| 166 | |
| 167 self._AssertVaultDirectoryDoesNotExist(user_index=0) | |
| 168 self._AssertVaultDirectoryDoesNotExist(user_index=1) | |
| 169 | |
| 170 | |
| 171 if __name__ == '__main__': | |
| 172 pyauto_functional.Main() | |
| OLD | NEW |