12f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 22f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones# Use of this source code is governed by a BSD-style license that can be 32f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones# found in the LICENSE file. 42f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 52f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jonesimport os 6e6c44b98a58561d1b2cbed1ff6131e37d1938499Darren Krahn 72f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jonesfrom autotest_lib.client.bin import test, utils 82f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jonesfrom autotest_lib.client.common_lib import error 92f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jonesfrom autotest_lib.client.cros import cryptohome 102f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 112f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jonesclass platform_CryptohomeNonDirs(test.test): 122f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones version = 1 132f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones cryptohome_proxy = None 142f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 152f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones def require_mount_fail(self, user): 162f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones if self.cryptohome_proxy.mount(user, 'test', create=True): 172f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones raise error.TestFail('Mount failed for %s' % user) 182f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 1984e01732630c89544aff2aa9bb416a4a01107071Elly Jones def replace(self, src, dest): 2084e01732630c89544aff2aa9bb416a4a01107071Elly Jones """Replaces dest with src. 2184e01732630c89544aff2aa9bb416a4a01107071Elly Jones 2284e01732630c89544aff2aa9bb416a4a01107071Elly Jones Replaces the dirent at dest with the dirent at src, deleting dest first 2384e01732630c89544aff2aa9bb416a4a01107071Elly Jones if necessary. This is distinguished from os.rename() or shutil.move() by 2484e01732630c89544aff2aa9bb416a4a01107071Elly Jones the fact that it works even if dest is a non-directory dirent. 2584e01732630c89544aff2aa9bb416a4a01107071Elly Jones """ 2684e01732630c89544aff2aa9bb416a4a01107071Elly Jones if os.path.exists(dest): 2784e01732630c89544aff2aa9bb416a4a01107071Elly Jones os.remove(dest) 2884e01732630c89544aff2aa9bb416a4a01107071Elly Jones os.rename(src, dest) 2984e01732630c89544aff2aa9bb416a4a01107071Elly Jones 302f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones def run_once(self): 31eec5e8617cb6faa8bbc7eac5c87f98e4223ceaa7Darren Krahn self.cryptohome_proxy = cryptohome.CryptohomeProxy() 322f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 332f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones # Leaf element of user path is non-dir. 342f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones user = utils.random_username() 352f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones path = cryptohome.user_path(user) 362f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones utils.open_write_close(path, '') 372f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones try: 382f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones self.require_mount_fail(user) 392f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones finally: 402f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones os.remove(path) 412f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 422f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones # Leaf element of system path is non-dir. 432f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones user = utils.random_username() 442f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones path = cryptohome.system_path(user) 452f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones os.symlink('/etc', path) 462f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones try: 472f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones self.require_mount_fail(user) 482f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones finally: 492f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones os.remove(path) 502f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 512f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones # Non-leaf element of user path is non-dir. 522f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones user = utils.random_username() 532f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones path = cryptohome.user_path(user) 542f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones parent_path = os.path.dirname(path) 5584e01732630c89544aff2aa9bb416a4a01107071Elly Jones os.rename(parent_path, parent_path + '.old') 562f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones try: 5784e01732630c89544aff2aa9bb416a4a01107071Elly Jones utils.open_write_close(parent_path, '') 582f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones self.require_mount_fail(user) 592f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones finally: 6084e01732630c89544aff2aa9bb416a4a01107071Elly Jones # We can't just rely on the rename() to blow away the file - 6184e01732630c89544aff2aa9bb416a4a01107071Elly Jones # rename() will refuse to rename directories to non-directory names. 6284e01732630c89544aff2aa9bb416a4a01107071Elly Jones self.replace(parent_path + '.old', parent_path) 632f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones 642f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones # Non-leaf element of system path is non-dir. 652f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones user = utils.random_username() 662f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones path = cryptohome.system_path(user) 672f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones parent_path = os.path.dirname(path) 6884e01732630c89544aff2aa9bb416a4a01107071Elly Jones os.rename(parent_path, parent_path + '.old') 692f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones try: 7084e01732630c89544aff2aa9bb416a4a01107071Elly Jones utils.open_write_close(parent_path, '') 712f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones self.require_mount_fail(user) 722f0ebba3c2ac427cee397bfe45ef7d58f64911aaElly Jones finally: 7384e01732630c89544aff2aa9bb416a4a01107071Elly Jones self.replace(parent_path + '.old', parent_path) 74