1// Copyright 2015-present 650 Industries. All rights reserved. 2#import <ExpoFileSystem/EXFilePermissionModule.h> 3#import <ExpoModulesCore/EXFileSystemInterface.h> 4 5@interface EXFilePermissionModule () 6 7@property (nonatomic, weak) EXModuleRegistry *moduleRegistry; 8 9@end 10 11@implementation EXFilePermissionModule 12 13EX_REGISTER_MODULE(); 14 15+ (const NSArray<Protocol *> *)exportedInterfaces 16{ 17 return @[@protocol(EXFilePermissionModuleInterface)]; 18} 19 20- (EXFileSystemPermissionFlags)getPathPermissions:(NSString *)path 21{ 22 EXFileSystemPermissionFlags permissionsForInternalDirectories = [self getInternalPathPermissions:path]; 23 if (permissionsForInternalDirectories != EXFileSystemPermissionNone) { 24 return permissionsForInternalDirectories; 25 } else { 26 return [self getExternalPathPermissions:path]; 27 } 28} 29 30- (EXFileSystemPermissionFlags)getInternalPathPermissions:(NSString *)path 31{ 32 id<EXFileSystemInterface> fileSystem = [_moduleRegistry getModuleImplementingProtocol:@protocol(EXFileSystemInterface)]; 33 NSArray<NSString *> *scopedDirs = @[fileSystem.cachesDirectory, fileSystem.documentDirectory]; 34 NSString *standardizedPath = [path stringByStandardizingPath]; 35 for (NSString *scopedDirectory in scopedDirs) { 36 if ([standardizedPath hasPrefix:[scopedDirectory stringByAppendingString:@"/"]] || 37 [standardizedPath isEqualToString:scopedDirectory]) { 38 return EXFileSystemPermissionRead | EXFileSystemPermissionWrite; 39 } 40 } 41 42 NSString *bundleDirectory = fileSystem.bundleDirectory; 43 if (bundleDirectory != nil && [path hasPrefix:[bundleDirectory stringByAppendingString:@"/"]]) { 44 return EXFileSystemPermissionRead; 45 } 46 47 return EXFileSystemPermissionNone; 48} 49 50- (EXFileSystemPermissionFlags)getExternalPathPermissions:(NSString *)path 51{ 52 EXFileSystemPermissionFlags filePermissions = EXFileSystemPermissionNone; 53 if ([[NSFileManager defaultManager] isReadableFileAtPath:path]) { 54 filePermissions |= EXFileSystemPermissionRead; 55 } 56 57 if ([[NSFileManager defaultManager] isWritableFileAtPath:path]) { 58 filePermissions |= EXFileSystemPermissionWrite; 59 } 60 61 return filePermissions; 62} 63 64- (void)setModuleRegistry:(EXModuleRegistry *)moduleRegistry { 65 _moduleRegistry = moduleRegistry; 66} 67 68@end 69