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