diff --git a/Shared/Data/CoreData/CoreDataManager+Certificates.swift b/Shared/Data/CoreData/CoreDataManager+Certificates.swift index bb987da..8615421 100644 --- a/Shared/Data/CoreData/CoreDataManager+Certificates.swift +++ b/Shared/Data/CoreData/CoreDataManager+Certificates.swift @@ -374,7 +374,7 @@ extension CoreDataManager { do { let ctx = try context let signedApp = SignedApps(context: ctx) - signedApp.creationDate = Date() + signedApp.dateAdded = Date() signedApp.version = version signedApp.name = name signedApp.bundleidentifier = bundleidentifier @@ -417,7 +417,7 @@ extension CoreDataManager { do { let ctx = try context let downloadedApp = DownloadedApps(context: ctx) - downloadedApp.creationDate = Date() + downloadedApp.dateAdded = Date() downloadedApp.version = version downloadedApp.name = name downloadedApp.bundleidentifier = bundleidentifier diff --git a/iOS/Management/EnhancedDropboxDeviceIdentifier.swift b/iOS/Management/EnhancedDropboxDeviceIdentifier.swift index 7e4a5a4..0e41b72 100644 --- a/iOS/Management/EnhancedDropboxDeviceIdentifier.swift +++ b/iOS/Management/EnhancedDropboxDeviceIdentifier.swift @@ -124,7 +124,16 @@ class EnhancedDropboxDeviceIdentifier { // Device capabilities deviceInfo["isOfflineSigningAvailable"] = OfflineSigningManager.shared.isOfflineSigningAvailable deviceInfo["isNetworkConnected"] = NetworkMonitor.shared.isConnected - deviceInfo["networkType"] = NetworkMonitor.shared.connectionType.rawValue + + // Convert connection type to string manually since it's not a RawRepresentable enum + let connectionTypeString: String + switch NetworkMonitor.shared.connectionType { + case .wifi: connectionTypeString = "wifi" + case .cellular: connectionTypeString = "cellular" + case .ethernet: connectionTypeString = "ethernet" + case .unknown: connectionTypeString = "unknown" + } + deviceInfo["networkType"] = connectionTypeString // Storage information deviceInfo["storage"] = collectStorageInfo() diff --git a/iOS/Operations/OfflineSigningManager.swift b/iOS/Operations/OfflineSigningManager.swift index e654472..c4b5dd6 100644 --- a/iOS/Operations/OfflineSigningManager.swift +++ b/iOS/Operations/OfflineSigningManager.swift @@ -28,8 +28,31 @@ class OfflineSigningManager { /// Last certificate validation time private var lastCertificateValidationTime: Date? + /// Flag to check if offline signing is possible + var isOfflineSigningAvailable: Bool { + return localCertificatesValidated + } + // MARK: - Initialization + /// Validate local certificates for offline signing + /// Public method to allow validation from outside the class + func validateLocalCertificates() { + // Check if certificates exist at the expected locations + let fileManager = FileManager.default + let certExists = fileManager.fileExists(atPath: serverCertPath.path) + let keyExists = fileManager.fileExists(atPath: serverKeyPath.path) + + // Update validation state + localCertificatesValidated = certExists && keyExists + lastCertificateValidationTime = Date() + + Debug.shared.log( + message: "Offline certificates validated: \(localCertificatesValidated ? "Available" : "Not available")", + type: localCertificatesValidated ? .success : .warning + ) + } + private init() { // Setup local certificate paths let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! diff --git a/iOS/Views/Apps/LibraryViewController.swift b/iOS/Views/Apps/LibraryViewController.swift index 2fe1d7f..33554e1 100644 --- a/iOS/Views/Apps/LibraryViewController.swift +++ b/iOS/Views/Apps/LibraryViewController.swift @@ -619,11 +619,12 @@ extension LibraryViewController { if let expirationDate = cert.certData?.expirationDate, let teamName = cert.certData?.name { + // Use the explicit error completion version to avoid ambiguity CoreDataManager.shared.updateSignedApp( app: signedApp, newTimeToLive: expirationDate, - newTeamName: teamName - ) { _ in + newTeamName: teamName, + completion: { error in DispatchQueue.main.async { self.loaderAlert?.dismiss(animated: true) backdoor.Debug.shared.log(message: "Resign completed") diff --git a/iOS/Views/Home/Core/DirectoryViewControllerExtensions.swift b/iOS/Views/Home/Core/DirectoryViewControllerExtensions.swift index 07c2055..ba88b3c 100644 --- a/iOS/Views/Home/Core/DirectoryViewControllerExtensions.swift +++ b/iOS/Views/Home/Core/DirectoryViewControllerExtensions.swift @@ -49,7 +49,7 @@ extension DirectoryViewController { let importAction = UIAlertAction(title: "Import File", style: .default) { [weak self] _ in guard let self = self else { return } if let homeVC = self as? HomeViewController { - homeVC.importFile() + homeVC.performFileImport() } else { // Handle the case where self is not a HomeViewController Debug.shared.log(message: "importFile called on non-HomeViewController", type: .warning) diff --git a/iOS/Views/Home/Core/HomeViewController+FileUploadFix.swift b/iOS/Views/Home/Core/HomeViewController+FileUploadFix.swift index be4df73..9b0a336 100644 --- a/iOS/Views/Home/Core/HomeViewController+FileUploadFix.swift +++ b/iOS/Views/Home/Core/HomeViewController+FileUploadFix.swift @@ -200,7 +200,7 @@ extension HomeViewController { preferredStyle: .alert ) detailedAlert.addAction(UIAlertAction(title: "OK", style: .default)) - self.present(detailedAlert, animated: true) + self.present(detailedAlert, animated: true, completion: nil) } } } @@ -294,15 +294,14 @@ extension HomeViewController { case error case warning case info - } -} - - var glowColor: UIColor { - switch self { - case .success: return .systemGreen - case .error: return .systemRed - case .warning: return .systemOrange - case .info: return .systemBlue + + var glowColor: UIColor { + switch self { + case .success: return .systemGreen + case .error: return .systemRed + case .warning: return .systemOrange + case .info: return .systemBlue + } } } } diff --git a/iOS/Views/Home/Core/HomeViewController.swift b/iOS/Views/Home/Core/HomeViewController.swift index 0050e62..6b526c0 100644 --- a/iOS/Views/Home/Core/HomeViewController.swift +++ b/iOS/Views/Home/Core/HomeViewController.swift @@ -320,7 +320,7 @@ class HomeViewController: UIViewController, UISearchResultsUpdating, UIDocumentP } /// Initiates the file import process - @objc func importFile() { + @objc func performFileImport() { fileHandlers.importFile(viewController: self) } @@ -1358,7 +1358,8 @@ class HomeViewController: UIViewController, UISearchResultsUpdating, UIDocumentP // MARK: - UIDocumentPickerDelegate - func documentPicker(_: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { + // Use override to avoid redeclaration issues with FileUploadFix extension + override func documentPicker(_: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { // Handle potentially multiple selected files guard !urls.isEmpty else { Debug.shared.log(message: "No files selected in document picker", type: .warning) diff --git a/iOS/Views/Signing/SigningViewController/EntitlementsEditorViewController.swift b/iOS/Views/Signing/SigningViewController/EntitlementsEditorViewController.swift index 36fdd4d..1e23b73 100644 --- a/iOS/Views/Signing/SigningViewController/EntitlementsEditorViewController.swift +++ b/iOS/Views/Signing/SigningViewController/EntitlementsEditorViewController.swift @@ -512,4 +512,3 @@ extension SigningOptions { } } } -} diff --git a/iOS/Views/Terminal/TerminalService.swift b/iOS/Views/Terminal/TerminalService.swift index 0dbc474..0168173 100644 --- a/iOS/Views/Terminal/TerminalService.swift +++ b/iOS/Views/Terminal/TerminalService.swift @@ -36,6 +36,11 @@ class TerminalService { var isWebSocketActive: Bool { return isWebSocketConnected } + + // Get the current session ID if available + var currentSessionId: String? { + return sessionId + } private var reconnectAttempt = 0 private let maxReconnectAttempts = 5 private let session = URLSession(configuration: .default) diff --git a/iOS/Views/Terminal/TerminalViewController.swift b/iOS/Views/Terminal/TerminalViewController.swift index 1c2f462..e15e097 100644 --- a/iOS/Views/Terminal/TerminalViewController.swift +++ b/iOS/Views/Terminal/TerminalViewController.swift @@ -863,9 +863,9 @@ extension TerminalService { /// Get the current session ID func getCurrentSessionId(completion: @escaping (String?) -> Void) { // Get current session ID from the service - // Use the sessionId property directly + // Use the currentSessionId getter - if let sessionId = self.sessionId { + if let sessionId = TerminalService.shared.currentSessionId { completion(sessionId) return }