mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			103 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			103 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2024 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import Foundation
 | |
| 
 | |
| public enum FileSystem {
 | |
|     /// **Note:** The max file size is 10,000,000 bytes (rather than 10MiB which would be `(10 * 1024 * 1024)`), 10,000,000
 | |
|     /// exactly will be fine but a single byte more will result in an error
 | |
|     public static let maxFileSize = 10_000_000
 | |
|     
 | |
|     /// The Objective-C `OWSFileSystem` needs to be able to generate a temporary directory but we don't want to spend the time
 | |
|     /// to add Objective-C support to `Dependencies` since the goal is to refactor everything to Swift so this value should only be
 | |
|     /// assigned by the `AppContext` class when it gets initialised
 | |
|     internal static var temporaryDirectory: Atomic<String?> = Atomic(nil)
 | |
|     
 | |
|     public static var cachesDirectoryPath: String {
 | |
|         return NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
 | |
|     }
 | |
|     
 | |
|     public static func ensureDirectoryExists(
 | |
|         at path: String,
 | |
|         fileProtectionType: FileProtectionType = .completeUntilFirstUserAuthentication,
 | |
|         using dependencies: Dependencies = Dependencies()
 | |
|     ) throws {
 | |
|         var isDirectory: ObjCBool = false
 | |
|         
 | |
|         if !FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) {
 | |
|             try FileManager.default.createDirectory(
 | |
|                 atPath: path,
 | |
|                 withIntermediateDirectories: true,
 | |
|                 attributes: nil
 | |
|             )
 | |
|         }
 | |
|         
 | |
|         try protectFileOrFolder(at: path, fileProtectionType: fileProtectionType, using: dependencies)
 | |
|     }
 | |
|     
 | |
|     public static func protectFileOrFolder(
 | |
|         at path: String,
 | |
|         fileProtectionType: FileProtectionType = .completeUntilFirstUserAuthentication,
 | |
|         using dependencies: Dependencies = Dependencies()
 | |
|     ) throws {
 | |
|         guard FileManager.default.fileExists(atPath: path) else { return }
 | |
|         
 | |
|         try FileManager.default.setAttributes(
 | |
|             [.protectionKey: fileProtectionType],
 | |
|             ofItemAtPath: path
 | |
|         )
 | |
|         
 | |
|         var resourcesUrl: URL = URL(fileURLWithPath: path)
 | |
|         var resourceAttrs: URLResourceValues = URLResourceValues()
 | |
|         resourceAttrs.isExcludedFromBackup = true
 | |
|         try resourcesUrl.setResourceValues(resourceAttrs)
 | |
|     }
 | |
|     
 | |
|     public static func fileSize(of path: String, using dependencies: Dependencies = Dependencies()) -> UInt64? {
 | |
|         guard let attributes: [FileAttributeKey: Any] = try? FileManager.default.attributesOfItem(atPath: path) else {
 | |
|             return nil
 | |
|         }
 | |
|         
 | |
|         return (attributes[.size] as? UInt64)
 | |
|     }
 | |
|     
 | |
|     public static func temporaryFilePath(fileExtension: String?) -> String {
 | |
|         let temporaryDirectory: String = {
 | |
|             if let temporaryDirectory: String = self.temporaryDirectory.wrappedValue {
 | |
|                 return temporaryDirectory
 | |
|             }
 | |
|             
 | |
|             // Not ideal but fallback to creating a new temp directory
 | |
|             let dirName: String = "ows_temp_\(UUID().uuidString)"   // stringlint:disable
 | |
|             let tempDir: String = URL(fileURLWithPath: NSTemporaryDirectory())
 | |
|                 .appendingPathComponent(dirName)
 | |
|                 .path
 | |
|             try? FileSystem.ensureDirectoryExists(at: tempDir, fileProtectionType: .complete)
 | |
|             
 | |
|             return tempDir
 | |
|         }()
 | |
|         
 | |
|         var tempFileName: String = UUID().uuidString
 | |
|         
 | |
|         if let fileExtension: String = fileExtension, !fileExtension.isEmpty {
 | |
|             tempFileName = "\(tempFileName).\(fileExtension)"
 | |
|         }
 | |
|         
 | |
|         return URL(fileURLWithPath: temporaryDirectory)
 | |
|             .appendingPathComponent(tempFileName)
 | |
|             .path
 | |
|     }
 | |
|     
 | |
|     public static func write(data: Data, toTemporaryFileWithExtension fileExtension: String?) throws -> String? {
 | |
|         let tempFilePath: String = temporaryFilePath(fileExtension: fileExtension)
 | |
|         
 | |
|         try data.write(to: URL(fileURLWithPath: tempFilePath), options: .atomic)
 | |
|         try protectFileOrFolder(at: tempFilePath)
 | |
|         
 | |
|         return tempFilePath
 | |
|     }
 | |
|     
 | |
|     public static func deleteFile(at path: String) throws {
 | |
|         try FileManager.default.removeItem(atPath: path)
 | |
|     }
 | |
| }
 |