diff options
author | mrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-26 02:56:34 +0000 |
---|---|---|
committer | mrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-26 02:56:34 +0000 |
commit | 22e0af9993d8e6cdf6385f0b900889e93690e874 (patch) | |
tree | 799a24c93431d8fc877f7f9056e039e880ece895 /base/mac | |
parent | b5fe7445305caf288e1e58ea944a10ead8fccc3c (diff) | |
download | chromium_src-22e0af9993d8e6cdf6385f0b900889e93690e874.zip chromium_src-22e0af9993d8e6cdf6385f0b900889e93690e874.tar.gz chromium_src-22e0af9993d8e6cdf6385f0b900889e93690e874.tar.bz2 |
Non-path Time Machine Exclusions
Enable setting of file exclusion for non-admin/non-root users. We no longer support setting exclusion-by-path.
Enhanced error reporting in SetFileBackupExclusion.
Change exclusion calls for History and Thumbnail databases.
Made MacUtilTest.TestExcludeFileFromBackups more robust.
BUG=74053
TEST=Updated base_unittests's MacUtilTest.TestExcludeFileFromBackups.
Review URL: http://codereview.chromium.org/7069021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86778 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/mac')
-rw-r--r-- | base/mac/mac_util.h | 4 | ||||
-rw-r--r-- | base/mac/mac_util.mm | 57 | ||||
-rw-r--r-- | base/mac/mac_util_unittest.mm | 39 |
3 files changed, 43 insertions, 57 deletions
diff --git a/base/mac/mac_util.h b/base/mac/mac_util.h index 1bd936d..808716c 100644 --- a/base/mac/mac_util.h +++ b/base/mac/mac_util.h @@ -77,8 +77,8 @@ bool ShouldWindowsMiniaturizeOnDoubleClick(); // Activates the process with the given PID. void ActivateProcess(pid_t pid); -// Set the Time Machine exclusion property for the given file. -bool SetFileBackupExclusion(const FilePath& file_path, bool exclude); +// Excludes the file given by |file_path| from being backed up by Time Machine. +bool SetFileBackupExclusion(const FilePath& file_path); // Sets the process name as displayed in Activity Monitor to process_name. void SetProcessName(CFStringRef process_name); diff --git a/base/mac/mac_util.mm b/base/mac/mac_util.mm index dc34a8e..16b3341 100644 --- a/base/mac/mac_util.mm +++ b/base/mac/mac_util.mm @@ -8,6 +8,7 @@ #include "base/file_path.h" #include "base/logging.h" +#include "base/mac/foundation_util.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/scoped_nsobject.h" #include "base/sys_string_conversions.h" @@ -238,47 +239,29 @@ void ActivateProcess(pid_t pid) { } } -bool SetFileBackupExclusion(const FilePath& file_path, bool exclude) { +bool SetFileBackupExclusion(const FilePath& file_path) { NSString* filePath = [NSString stringWithUTF8String:file_path.value().c_str()]; - - // If being asked to exclude something in a tmp directory, just lie and say it - // was done. TimeMachine will already ignore tmp directories. This keeps the - // temporary profiles used by unittests from being added to the exclude list. - // Otherwise, as /Library/Preferences/com.apple.TimeMachine.plist grows the - // bots slow down due to reading/writing all the temporary profiles used over - // time. - - NSString* tmpDir = NSTemporaryDirectory(); - // Make sure the temp dir is terminated with a slash - if (tmpDir && ![tmpDir hasSuffix:@"/"]) - tmpDir = [tmpDir stringByAppendingString:@"/"]; - // '/var' is a link to '/private/var', make sure to check both forms. - NSString* privateTmpDir = nil; - if ([tmpDir hasPrefix:@"/var/"]) - privateTmpDir = [@"/private" stringByAppendingString:tmpDir]; - - if ((tmpDir && [filePath hasPrefix:tmpDir]) || - (privateTmpDir && [filePath hasPrefix:privateTmpDir]) || - [filePath hasPrefix:@"/tmp/"] || - [filePath hasPrefix:@"/var/tmp/"] || - [filePath hasPrefix:@"/private/tmp/"] || - [filePath hasPrefix:@"/private/var/tmp/"]) { - return true; - } - NSURL* url = [NSURL fileURLWithPath:filePath]; - // Note that we always set CSBackupSetItemExcluded's excludeByPath param - // to true. This prevents a problem with toggling the setting: if the file - // is excluded with excludeByPath set to true then excludeByPath must - // also be true when un-excluding the file, otherwise the un-excluding - // will be ignored. - bool success = - CSBackupSetItemExcluded((CFURLRef)url, exclude, true) == noErr; - if (!success) + // Do a pre-emptive unexclude by-path since by-path exclusions may have been + // performed on this file in the past. + CSBackupSetItemExcluded(base::mac::NSToCFCast(url), FALSE, TRUE); + // When excludeByPath is true the application must be running with root + // privileges (admin for 10.6 and earlier) but the URL does not have to + // already exist. When excludeByPath is false the URL must already exist but + // can be used in non-root (or admin as above) mode. We use false so that + // non-root (or admin) users don't get their TimeMachine drive filled up with + // unnecessary backups. + OSStatus os_err = + CSBackupSetItemExcluded(base::mac::NSToCFCast(url), TRUE, FALSE); + if (os_err != noErr) { LOG(WARNING) << "Failed to set backup exclusion for file '" - << file_path.value().c_str() << "'. Continuing."; - return success; + << file_path.value().c_str() << "' with error " + << os_err << " (" << GetMacOSStatusErrorString(os_err) + << ": " << GetMacOSStatusCommentString(os_err) + << "). Continuing."; + } + return os_err == noErr; } void SetProcessName(CFStringRef process_name) { diff --git a/base/mac/mac_util_unittest.mm b/base/mac/mac_util_unittest.mm index b4f9268..92a6001 100644 --- a/base/mac/mac_util_unittest.mm +++ b/base/mac/mac_util_unittest.mm @@ -8,8 +8,10 @@ #include "base/file_path.h" #include "base/file_util.h" +#include "base/mac/foundation_util.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/scoped_nsobject.h" +#include "base/scoped_temp_dir.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" @@ -95,26 +97,27 @@ TEST_F(MacUtilTest, TestGetAppBundlePath) { } TEST_F(MacUtilTest, TestExcludeFileFromBackups) { - NSString* homeDirectory = NSHomeDirectory(); - NSString* dummyFilePath = - [homeDirectory stringByAppendingPathComponent:@"DummyFile"]; - const char* dummy_file_path = [dummyFilePath fileSystemRepresentation]; - ASSERT_TRUE(dummy_file_path); - FilePath file_path(dummy_file_path); - // It is not actually necessary to have a physical file in order to - // set its exclusion property. - NSURL* fileURL = [NSURL URLWithString:dummyFilePath]; - // Reset the exclusion in case it was set previously. - SetFileBackupExclusion(file_path, false); - Boolean excludeByPath; + // The file must already exist in order to set its exclusion property. + ScopedTempDir temp_dir_; + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + FilePath dummy_file_path = temp_dir_.path().Append("DummyFile"); + const char dummy_data[] = "All your base are belong to us!"; + // Dump something real into the file. + ASSERT_EQ(static_cast<int>(arraysize(dummy_data)), + file_util::WriteFile(dummy_file_path, dummy_data, arraysize(dummy_data))); + NSString* fileURLString = + [NSString stringWithUTF8String:dummy_file_path.value().c_str()]; + NSURL* fileURL = [NSURL URLWithString:fileURLString]; // Initial state should be non-excluded. - EXPECT_FALSE(CSBackupIsItemExcluded((CFURLRef)fileURL, &excludeByPath)); + EXPECT_FALSE(CSBackupIsItemExcluded(base::mac::NSToCFCast(fileURL), NULL)); // Exclude the file. - EXPECT_TRUE(SetFileBackupExclusion(file_path, true)); - EXPECT_TRUE(CSBackupIsItemExcluded((CFURLRef)fileURL, &excludeByPath)); - // Un-exclude the file. - EXPECT_TRUE(SetFileBackupExclusion(file_path, false)); - EXPECT_FALSE(CSBackupIsItemExcluded((CFURLRef)fileURL, &excludeByPath)); + EXPECT_TRUE(SetFileBackupExclusion(dummy_file_path)); + // SetFileBackupExclusion never excludes by path. + Boolean excluded_by_path = FALSE; + Boolean excluded = + CSBackupIsItemExcluded(base::mac::NSToCFCast(fileURL), &excluded_by_path); + EXPECT_TRUE(excluded); + EXPECT_FALSE(excluded_by_path); } TEST_F(MacUtilTest, TestGetValueFromDictionary) { |