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