summaryrefslogtreecommitdiffstats
path: root/base/mac
diff options
context:
space:
mode:
authormrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-26 02:56:34 +0000
committermrossetti@chromium.org <mrossetti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-26 02:56:34 +0000
commit22e0af9993d8e6cdf6385f0b900889e93690e874 (patch)
tree799a24c93431d8fc877f7f9056e039e880ece895 /base/mac
parentb5fe7445305caf288e1e58ea944a10ead8fccc3c (diff)
downloadchromium_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.h4
-rw-r--r--base/mac/mac_util.mm57
-rw-r--r--base/mac/mac_util_unittest.mm39
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) {