diff --git a/SignalServiceKit/src/Util/OWSFileSystem.h b/SignalServiceKit/src/Util/OWSFileSystem.h index d81d94fb3..db6643c11 100644 --- a/SignalServiceKit/src/Util/OWSFileSystem.h +++ b/SignalServiceKit/src/Util/OWSFileSystem.h @@ -9,6 +9,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; + (BOOL)protectFileOrFolderAtPath:(NSString *)path; ++ (BOOL)protectRecursiveContentsAtPath:(NSString *)path; + (NSString *)appDocumentDirectoryPath; @@ -36,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN + (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension; + (nullable NSNumber *)fileSizeOfPath:(NSString *)filePath; ++ (void)logAttributesOfItemAtPathRecursively:(NSString *)path; @end diff --git a/SignalServiceKit/src/Util/OWSFileSystem.m b/SignalServiceKit/src/Util/OWSFileSystem.m index bdb49465b..8b9eccb65 100644 --- a/SignalServiceKit/src/Util/OWSFileSystem.m +++ b/SignalServiceKit/src/Util/OWSFileSystem.m @@ -9,8 +9,34 @@ NS_ASSUME_NONNULL_BEGIN @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 { + DDLogVerbose(@"%@ protecting file at path: %@", self.logTag, path); if (![NSFileManager.defaultManager fileExistsAtPath:path]) { return NO; } @@ -32,6 +58,33 @@ NS_ASSUME_NONNULL_BEGIN return YES; } ++ (void)logAttributesOfItemAtPath:(NSString *)path +{ + NSDictionary *_Nullable attributes = [self attributesOfItemAtPath:path]; + DDLogDebug(@"%@ path: %@ has attributes: %@", self.logTag, path, attributes); +} + ++ (nullable NSDictionary *)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 { NSFileManager *fileManager = [NSFileManager defaultManager]; @@ -93,6 +146,9 @@ NS_ASSUME_NONNULL_BEGIN oldFilePath, newFilePath, fabs([startDate timeIntervalSinceNow])); + + // Ensure all files moved have the proper data protection class. + [self protectRecursiveContentsAtPath:newFilePath]; } + (BOOL)ensureDirectoryExists:(NSString *)dirPath