| Index: base/file_util_unittest.cc
|
| diff --git a/base/file_util_unittest.cc b/base/file_util_unittest.cc
|
| index 55f2039e4519d23183898a8b7bda990f1860ba6a..11ddc03a5ac3931959fd68eb2173594f33d49fe9 100644
|
| --- a/base/file_util_unittest.cc
|
| +++ b/base/file_util_unittest.cc
|
| @@ -111,24 +111,6 @@ bool DeleteReparsePoint(HANDLE source) {
|
| #endif
|
|
|
| #if defined(OS_POSIX)
|
| -// Provide a simple way to change the permissions bits on |path| in tests.
|
| -// ASSERT failures will return, but not stop the test. Caller should wrap
|
| -// calls to this function in ASSERT_NO_FATAL_FAILURE().
|
| -void ChangePosixFilePermissions(const FilePath& path,
|
| - mode_t mode_bits_to_set,
|
| - mode_t mode_bits_to_clear) {
|
| - ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear)
|
| - << "Can't set and clear the same bits.";
|
| -
|
| - struct stat stat_buf;
|
| - ASSERT_EQ(0, stat(path.value().c_str(), &stat_buf));
|
| -
|
| - mode_t updated_mode_bits = stat_buf.st_mode;
|
| - updated_mode_bits |= mode_bits_to_set;
|
| - updated_mode_bits &= ~mode_bits_to_clear;
|
| -
|
| - ASSERT_EQ(0, chmod(path.value().c_str(), updated_mode_bits));
|
| -}
|
| #endif // defined(OS_POSIX)
|
|
|
| const wchar_t bogus_content[] = L"I'm cannon fodder.";
|
| @@ -667,7 +649,6 @@ TEST_F(FileUtilTest, CreateAndReadSymlinks) {
|
| ASSERT_FALSE(file_util::ReadSymbolicLink(missing, &result));
|
| }
|
|
|
| -
|
| // The following test of NormalizeFilePath() require that we create a symlink.
|
| // This can not be done on Windows before Vista. On Vista, creating a symlink
|
| // requires privilege "SeCreateSymbolicLinkPrivilege".
|
| @@ -784,6 +765,150 @@ TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) {
|
| // Make sure the symbolic link is deleted
|
| EXPECT_FALSE(file_util::IsLink(file_link));
|
| }
|
| +
|
| +TEST_F(FileUtilTest, ChangeFilePermissionsAndRead) {
|
| + // Create a file path
|
| + FilePath file_name = temp_dir_.path().Append(FPL("Test Readable File.txt"));
|
| + EXPECT_FALSE(file_util::PathExists(file_name));
|
| +
|
| + char buffer[32] = "hello";
|
| + std::string data(buffer);
|
| +
|
| + // Write file
|
| + EXPECT_EQ(static_cast<int>(data.length()),
|
| + file_util::WriteFile(file_name, data.c_str(), data.length()));
|
| + EXPECT_TRUE(file_util::PathExists(file_name));
|
| +
|
| + // Meke sure the file is readable
|
| + int32 mode;
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| + EXPECT_EQ(file_util::FILE_PERMISSION_READ_BY_USER,
|
| + mode & file_util::FILE_PERMISSION_READ_BY_USER);
|
| +
|
| + // Get rid of the read permission
|
| + EXPECT_TRUE(file_util::SetPosixFilePermissions(file_name, 0u));
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| + EXPECT_EQ(0, mode & file_util::FILE_PERMISSION_READ_BY_USER);
|
| + // Make sure the file can't be read
|
| + EXPECT_EQ(-1, file_util::ReadFile(file_name, buffer, sizeof(buffer)));
|
| +
|
| + // Give the read permission
|
| + EXPECT_TRUE(file_util::SetPosixFilePermissions(
|
| + file_name,
|
| + file_util::FILE_PERMISSION_READ_BY_USER));
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| + EXPECT_EQ(file_util::FILE_PERMISSION_READ_BY_USER,
|
| + mode & file_util::FILE_PERMISSION_READ_BY_USER);
|
| + // Make sure the file can be read
|
| + EXPECT_EQ(static_cast<int>(data.length()),
|
| + file_util::ReadFile(file_name, buffer, sizeof(buffer)));
|
| +
|
| + // Delete the file
|
| + EXPECT_TRUE(file_util::Delete(file_name, false));
|
| + EXPECT_FALSE(file_util::PathExists(file_name));
|
| +}
|
| +
|
| +TEST_F(FileUtilTest, ChangeFilePermissionsAndWrite) {
|
| + // Create a file path
|
| + FilePath file_name = temp_dir_.path().Append(FPL("Test Readable File.txt"));
|
| + EXPECT_FALSE(file_util::PathExists(file_name));
|
| +
|
| + char buffer[32] = "hello";
|
| + std::string data(buffer);
|
| +
|
| + // Write file
|
| + EXPECT_EQ(static_cast<int>(data.length()),
|
| + file_util::WriteFile(file_name, data.c_str(), data.length()));
|
| + EXPECT_TRUE(file_util::PathExists(file_name));
|
| +
|
| + // Meke sure the file is writable
|
| + int mode;
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| + EXPECT_EQ(file_util::FILE_PERMISSION_WRITE_BY_USER,
|
| + mode & file_util::FILE_PERMISSION_WRITE_BY_USER);
|
| + EXPECT_TRUE(file_util::PathIsWritable(file_name));
|
| +
|
| + // Get rid of the write permission
|
| + EXPECT_TRUE(file_util::SetPosixFilePermissions(file_name, 0u));
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| + EXPECT_EQ(0, mode & file_util::FILE_PERMISSION_WRITE_BY_USER);
|
| + // Make sure the file can't be write
|
| + EXPECT_EQ(-1,
|
| + file_util::WriteFile(file_name, data.c_str(), data.length()));
|
| + EXPECT_FALSE(file_util::PathIsWritable(file_name));
|
| +
|
| + // Give read permission
|
| + EXPECT_TRUE(file_util::SetPosixFilePermissions(
|
| + file_name,
|
| + file_util::FILE_PERMISSION_WRITE_BY_USER));
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| + EXPECT_EQ(file_util::FILE_PERMISSION_WRITE_BY_USER,
|
| + mode & file_util::FILE_PERMISSION_WRITE_BY_USER);
|
| + // Make sure the file can be write
|
| + EXPECT_EQ(static_cast<int>(data.length()),
|
| + file_util::WriteFile(file_name, data.c_str(), data.length()));
|
| + EXPECT_TRUE(file_util::PathIsWritable(file_name));
|
| +
|
| + // Delete the file
|
| + EXPECT_TRUE(file_util::Delete(file_name, false));
|
| + EXPECT_FALSE(file_util::PathExists(file_name));
|
| +}
|
| +
|
| +TEST_F(FileUtilTest, ChangeDirectoryPermissionsAndEnumerate) {
|
| + // Create a directory path
|
| + FilePath subdir_path =
|
| + temp_dir_.path().Append(FPL("PermissionTest1"));
|
| + file_util::CreateDirectory(subdir_path);
|
| + ASSERT_TRUE(file_util::PathExists(subdir_path));
|
| +
|
| + // Create a dummy file to enumerate
|
| + FilePath file_name = subdir_path.Append(FPL("Test Readable File.txt"));
|
| + EXPECT_FALSE(file_util::PathExists(file_name));
|
| + char buffer[32] = "hello";
|
| + std::string data(buffer);
|
| + EXPECT_EQ(static_cast<int>(data.length()),
|
| + file_util::WriteFile(file_name, data.c_str(), data.length()));
|
| + EXPECT_TRUE(file_util::PathExists(file_name));
|
| +
|
| + // Meke sure the file is the all permissions
|
| + int mode;
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode));
|
| + EXPECT_EQ(file_util::FILE_PERMISSION_USER_MASK,
|
| + mode & file_util::FILE_PERMISSION_USER_MASK);
|
| +
|
| + // Get rid of the permissions from the directory
|
| + EXPECT_TRUE(file_util::SetPosixFilePermissions(subdir_path, 0u));
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode));
|
| + EXPECT_EQ(0, mode & file_util::FILE_PERMISSION_USER_MASK);
|
| +
|
| + // Make sure the file in the directory can't be enumerated.
|
| + file_util::FileEnumerator f1(subdir_path, true,
|
| + file_util::FileEnumerator::FILES);
|
| + EXPECT_TRUE(file_util::PathExists(subdir_path));
|
| + FindResultCollector c1(f1);
|
| + EXPECT_EQ(c1.size(), 0);
|
| + EXPECT_FALSE(file_util::GetPosixFilePermissions(file_name, &mode));
|
| +
|
| + // Give the permissions to the directory
|
| + EXPECT_TRUE(file_util::SetPosixFilePermissions(
|
| + subdir_path,
|
| + file_util::FILE_PERMISSION_USER_MASK));
|
| + EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode));
|
| + EXPECT_EQ(file_util::FILE_PERMISSION_USER_MASK,
|
| + mode & file_util::FILE_PERMISSION_USER_MASK);
|
| +
|
| + // Make sure the file in the directory can be enumerated.
|
| + file_util::FileEnumerator f2(subdir_path, true,
|
| + file_util::FileEnumerator::FILES);
|
| + FindResultCollector c2(f2);
|
| + EXPECT_TRUE(c2.HasFile(file_name));
|
| + EXPECT_EQ(c2.size(), 1);
|
| +
|
| + // Delete the file
|
| + EXPECT_TRUE(file_util::Delete(subdir_path, true));
|
| + EXPECT_FALSE(file_util::PathExists(subdir_path));
|
| +}
|
| +
|
| #endif // defined(OS_POSIX)
|
|
|
| #if defined(OS_WIN)
|
| @@ -1997,17 +2122,20 @@ class VerifyPathControlledByUserTest : public FileUtilTest {
|
| // of permissions to be different from what we expect, explicitly
|
| // set permissions on the directories we create.
|
| // Make all files and directories non-world-writable.
|
| - mode_t enabled_permissions =
|
| - S_IRWXU | // User can read, write, traverse
|
| - S_IRWXG; // Group can read, write, traverse
|
| - mode_t disabled_permissions =
|
| - S_IRWXO; // Other users can't read, write, traverse.
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(
|
| +
|
| + // Users and group can read, write, traverse
|
| + int enabled_permissions =
|
| + file_util::FILE_PERMISSION_USER_MASK |
|
| + file_util::FILE_PERMISSION_GROUP_MASK;
|
| + // Other users can't read, write, traverse
|
| + int disabled_permissions =
|
| + file_util::FILE_PERMISSION_OTHERS_MASK;
|
| +
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(
|
| base_dir_, enabled_permissions, disabled_permissions));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(
|
| sub_dir_, enabled_permissions, disabled_permissions));
|
| }
|
|
|
| @@ -2088,12 +2216,12 @@ TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) {
|
| uid_t bad_uid = uid_ + 1;
|
|
|
| // Make all files and directories non-world-writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util:: ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
|
|
|
| // We control these paths.
|
| EXPECT_TRUE(
|
| @@ -2131,12 +2259,12 @@ TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) {
|
|
|
| TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) {
|
| // Make all files and directories writable only by their owner.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP));
|
|
|
| // Any group is okay because the path is not group-writable.
|
| EXPECT_TRUE(
|
| @@ -2174,12 +2302,12 @@ TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) {
|
|
|
|
|
| // Make all files and directories writable by their group.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(text_file_, S_IWGRP, 0u));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(text_file_, S_IWGRP, 0u));
|
|
|
| // Now |ok_gids_| works, but |bad_gids_| fails.
|
| EXPECT_TRUE(
|
| @@ -2224,12 +2352,12 @@ TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) {
|
|
|
| TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
| // Make all files and directories non-world-writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
|
|
|
| // Initialy, we control all parts of the path.
|
| EXPECT_TRUE(
|
| @@ -2243,8 +2371,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
| sub_dir_, text_file_, uid_, ok_gids_));
|
|
|
| // Make base_dir_ world-writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u));
|
| EXPECT_FALSE(
|
| file_util::VerifyPathControlledByUser(
|
| base_dir_, sub_dir_, uid_, ok_gids_));
|
| @@ -2256,8 +2384,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
| sub_dir_, text_file_, uid_, ok_gids_));
|
|
|
| // Make sub_dir_ world writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u));
|
| EXPECT_FALSE(
|
| file_util::VerifyPathControlledByUser(
|
| base_dir_, sub_dir_, uid_, ok_gids_));
|
| @@ -2269,8 +2397,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
| sub_dir_, text_file_, uid_, ok_gids_));
|
|
|
| // Make text_file_ world writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(text_file_, S_IWOTH, 0u));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(text_file_, S_IWOTH, 0u));
|
| EXPECT_FALSE(
|
| file_util::VerifyPathControlledByUser(
|
| base_dir_, sub_dir_, uid_, ok_gids_));
|
| @@ -2282,8 +2410,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
| sub_dir_, text_file_, uid_, ok_gids_));
|
|
|
| // Make sub_dir_ non-world writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
|
| EXPECT_FALSE(
|
| file_util::VerifyPathControlledByUser(
|
| base_dir_, sub_dir_, uid_, ok_gids_));
|
| @@ -2295,8 +2423,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
| sub_dir_, text_file_, uid_, ok_gids_));
|
|
|
| // Make base_dir_ non-world-writable.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
|
| EXPECT_TRUE(
|
| file_util::VerifyPathControlledByUser(
|
| base_dir_, sub_dir_, uid_, ok_gids_));
|
| @@ -2309,8 +2437,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
|
|
|
| // Back to the initial state: Nothing is writable, so every path
|
| // should pass.
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
|
| + ASSERT_TRUE(
|
| + file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
|
| EXPECT_TRUE(
|
| file_util::VerifyPathControlledByUser(
|
| base_dir_, sub_dir_, uid_, ok_gids_));
|
|
|