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 |