Fix "lose messages received while in background"

A moved legacy DB has the NSFileProtectionClassComplete, meaning it's
never accessible while the device is locked.

// FREEBIE
pull/1/head
Michael Kirk 8 years ago
parent 4262a83e00
commit b4359b33dd

@ -9,6 +9,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
+ (BOOL)protectFileOrFolderAtPath:(NSString *)path; + (BOOL)protectFileOrFolderAtPath:(NSString *)path;
+ (BOOL)protectRecursiveContentsAtPath:(NSString *)path;
+ (NSString *)appDocumentDirectoryPath; + (NSString *)appDocumentDirectoryPath;
@ -36,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension; + (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension;
+ (nullable NSNumber *)fileSizeOfPath:(NSString *)filePath; + (nullable NSNumber *)fileSizeOfPath:(NSString *)filePath;
+ (void)logAttributesOfItemAtPathRecursively:(NSString *)path;
@end @end

@ -9,8 +9,34 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSFileSystem @implementation OWSFileSystem
+ (BOOL)protectRecursiveContentsAtPath:(NSString *)path
{
BOOL isDirectory;
if (![NSFileManager.defaultManager fileExistsAtPath:path isDirectory:&isDirectory]) {
return NO;
}
if (!isDirectory) {
[self protectFileOrFolderAtPath:path];
}
NSString *dirPath = path;
BOOL success = YES;
NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:dirPath];
for (NSString *relativePath in directoryEnumerator) {
NSString *filePath = [dirPath stringByAppendingPathComponent:relativePath];
DDLogDebug(@"%@ path: %@ had attributes: %@", self.logTag, filePath, directoryEnumerator.fileAttributes);
success = success && [self protectFileOrFolderAtPath:filePath];
}
return success;
}
+ (BOOL)protectFileOrFolderAtPath:(NSString *)path + (BOOL)protectFileOrFolderAtPath:(NSString *)path
{ {
DDLogVerbose(@"%@ protecting file at path: %@", self.logTag, path);
if (![NSFileManager.defaultManager fileExistsAtPath:path]) { if (![NSFileManager.defaultManager fileExistsAtPath:path]) {
return NO; return NO;
} }
@ -32,6 +58,33 @@ NS_ASSUME_NONNULL_BEGIN
return YES; return YES;
} }
+ (void)logAttributesOfItemAtPath:(NSString *)path
{
NSDictionary<NSFileAttributeKey, id> *_Nullable attributes = [self attributesOfItemAtPath:path];
DDLogDebug(@"%@ path: %@ has attributes: %@", self.logTag, path, attributes);
}
+ (nullable NSDictionary<NSFileAttributeKey, id> *)attributesOfItemAtPath:(NSString *)path
{
return [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
}
+ (void)logAttributesOfItemAtPathRecursively:(NSString *)path
{
BOOL isDirectory;
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
OWSAssert(exists);
if (isDirectory) {
NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:(NSString *)path];
for (NSString *path in directoryEnumerator) {
DDLogDebug(@"%@ path: %@ has attributes: %@", self.logTag, path, directoryEnumerator.fileAttributes);
}
} else {
[self logAttributesOfItemAtPath:path];
}
}
+ (NSString *)appDocumentDirectoryPath + (NSString *)appDocumentDirectoryPath
{ {
NSFileManager *fileManager = [NSFileManager defaultManager]; NSFileManager *fileManager = [NSFileManager defaultManager];
@ -93,6 +146,9 @@ NS_ASSUME_NONNULL_BEGIN
oldFilePath, oldFilePath,
newFilePath, newFilePath,
fabs([startDate timeIntervalSinceNow])); fabs([startDate timeIntervalSinceNow]));
// Ensure all files moved have the proper data protection class.
[self protectRecursiveContentsAtPath:newFilePath];
} }
+ (BOOL)ensureDirectoryExists:(NSString *)dirPath + (BOOL)ensureDirectoryExists:(NSString *)dirPath

Loading…
Cancel
Save