diff --git a/enzevalos_iphone.xcodeproj/project.pbxproj b/enzevalos_iphone.xcodeproj/project.pbxproj index 33b8efeaa60ef07a5a84982a894ff9e4f04ca90b..e773f8170c7782874ea0853af43b3f981653153a 100644 --- a/enzevalos_iphone.xcodeproj/project.pbxproj +++ b/enzevalos_iphone.xcodeproj/project.pbxproj @@ -121,6 +121,7 @@ 47B71AAD2538354A00CA87C6 /* NewOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B71AAA2538354A00CA87C6 /* NewOnboardingView.swift */; }; 47B71AAE2538354A00CA87C6 /* OnboardingIntro.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B71AAB2538354A00CA87C6 /* OnboardingIntro.swift */; }; 47B71AAF2538354A00CA87C6 /* OnboardingValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B71AAC2538354A00CA87C6 /* OnboardingValueState.swift */; }; + 47B71AB325387AC000CA87C6 /* SearchHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B71AB225387AC000CA87C6 /* SearchHelper.swift */; }; 47C09C76243B3395007F74A2 /* SmallContactListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C09C75243B3395007F74A2 /* SmallContactListView.swift */; }; 47C112C22531D72E00621A07 /* PublicKeyRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C112C12531D72E00621A07 /* PublicKeyRecord.swift */; }; 47C112C62531DBDD00621A07 /* SecretKeyRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C112C52531DBDD00621A07 /* SecretKeyRecord.swift */; }; @@ -188,7 +189,6 @@ A1123E6A1DA682850069551C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1123E6C1DA682850069551C /* Localizable.strings */; }; A114E4321FACB23000E40243 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A114E4311FACB23000E40243 /* StringExtension.swift */; }; A13526791D955BDF00D3BFE1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A13526781D955BDF00D3BFE1 /* AppDelegate.swift */; }; - A13526861D955BDF00D3BFE1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A13526841D955BDF00D3BFE1 /* LaunchScreen.storyboard */; }; A15D215B223BE5F4003E0CE0 /* TempAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15D215A223BE5F4003E0CE0 /* TempAttachment.swift */; }; A15D215D223BE614003E0CE0 /* attachment.eml in Resources */ = {isa = PBXBuildFile; fileRef = A15D215C223BE614003E0CE0 /* attachment.eml */; }; A15D215F223BE6E4003E0CE0 /* MailTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15D215E223BE6E4003E0CE0 /* MailTest.swift */; }; @@ -471,6 +471,7 @@ 47B71AAA2538354A00CA87C6 /* NewOnboardingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewOnboardingView.swift; sourceTree = "<group>"; }; 47B71AAB2538354A00CA87C6 /* OnboardingIntro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingIntro.swift; sourceTree = "<group>"; }; 47B71AAC2538354A00CA87C6 /* OnboardingValueState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingValueState.swift; sourceTree = "<group>"; }; + 47B71AB225387AC000CA87C6 /* SearchHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchHelper.swift; sourceTree = "<group>"; }; 47C09C75243B3395007F74A2 /* SmallContactListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmallContactListView.swift; sourceTree = "<group>"; }; 47C112C12531D72E00621A07 /* PublicKeyRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublicKeyRecord.swift; sourceTree = "<group>"; }; 47C112C52531DBDD00621A07 /* SecretKeyRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretKeyRecord.swift; sourceTree = "<group>"; }; @@ -566,8 +567,6 @@ A1EB057B1D956838008659C1 /* MailHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailHandler.swift; sourceTree = "<group>"; }; A1EB05871D956879008659C1 /* AddressHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressHandler.swift; sourceTree = "<group>"; }; A1EB05A31D956E32008659C1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; - A1F992301DA7D22D0073BF1B /* de */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = de; path = de.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; - A1F992321DA7D2360073BF1B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; A5E303D624110F6400310264 /* smime-helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "smime-helpers.h"; sourceTree = "<group>"; }; A5E303D724110F6400310264 /* smime-helpers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "smime-helpers.c"; sourceTree = "<group>"; }; AA686D4FC9B86445A0C87F0F /* Pods-enzevalos_iphone.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone.release.xcconfig"; sourceTree = "<group>"; }; @@ -1037,6 +1036,7 @@ 47B91AC11EC0C1FB000AE3EE /* data */ = { isa = PBXGroup; children = ( + 47B71AB225387AC000CA87C6 /* SearchHelper.swift */, A15D215A223BE5F4003E0CE0 /* TempAttachment.swift */, 472F39921E279792009260FB /* protocols */, A114E4311FACB23000E40243 /* StringExtension.swift */, @@ -1296,7 +1296,6 @@ A198270D1D9A8ABC0027F65C /* enzevalos_iphone-Bridging-Header.h */, 4790114A228997620057AB04 /* StyleKits */, A1123E6C1DA682850069551C /* Localizable.strings */, - A13526841D955BDF00D3BFE1 /* LaunchScreen.storyboard */, A1EB05A31D956E32008659C1 /* Assets.xcassets */, 476142091E082F9C00FD5E4F /* Settings.bundle */, A1BE3FF81E9664660040114B /* InfoPlist.strings */, @@ -1433,7 +1432,7 @@ A13526721D955BDF00D3BFE1 /* Frameworks */, A13526731D955BDF00D3BFE1 /* Resources */, 47F867DB2052B33C00AA832F /* CopyFiles */, - 47F867E52052B4B500AA832F /* ShellScript */, + 47F867E52052B4B500AA832F /* Run Script */, 3992B0CB6412E8526773B814 /* [CP] Embed Pods Frameworks */, ); buildRules = ( @@ -1565,7 +1564,6 @@ A1BE3FF61E9664660040114B /* InfoPlist.strings in Resources */, 3E6B07DE2011246500E49609 /* invitationText.html in Resources */, 0ECEA0FB240E7DB1007DC71E /* mykey.pem in Resources */, - A13526861D955BDF00D3BFE1 /* LaunchScreen.storyboard in Resources */, 47CD5AAA2012368D00E771A1 /* logging_pk.asc in Resources */, A1EB05A41D956E32008659C1 /* Assets.xcassets in Resources */, 4756DE0E20402F8E00452288 /* invitationTextCensor.html in Resources */, @@ -1695,13 +1693,14 @@ shellPath = /bin/sh; shellScript = "# Define output file. Change \"${PROJECT_DIR}/${PROJECT_NAME}Tests\" to your test's root source folder, if it's not the default name.\nOUTPUT_FILE=\"${PROJECT_DIR}/${PROJECT_NAME}Tests/GeneratedMocks.swift\"\necho \"Generated Mocks File = ${OUTPUT_FILE}\"\n\n# Define input directory. Change \"${PROJECT_DIR}/${PROJECT_NAME}\" to your project's root source folder, if it's not the default name.\nINPUT_DIR=\"${PROJECT_DIR}/${PROJECT_NAME}\"\necho \"Mocks Input Directory = ${INPUT_DIR}\"\n\n# Generate mock files, include as many input files as you'd like to create mocks for.\n\"${PODS_ROOT}/Cuckoo/run\" generate --testable \"${PROJECT_NAME}\" \\\n--output \"${OUTPUT_FILE}\" \\\n\"${INPUT_DIR}/AuthenticationModel.swift\" \\\n\"${INPUT_DIR}/AuthenticationViewModel.swift\" \n# ... and so forth, the last line should never end with a backslash\n\n# After running once, locate `GeneratedMocks.swift` and drag it into your Xcode test target group.\n"; }; - 47F867E52052B4B500AA832F /* ShellScript */ = { + 47F867E52052B4B500AA832F /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 8; files = ( ); inputPaths = ( ); + name = "Run Script"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 1; @@ -1793,6 +1792,7 @@ 47EABF272423BFDD00774A93 /* AuthenticationScreen.swift in Sources */, 4764069A2416B54D00C7D426 /* MailView.swift in Sources */, 476406952416B54D00C7D426 /* KeyRecordRow.swift in Sources */, + 47B71AB325387AC000CA87C6 /* SearchHelper.swift in Sources */, 47EABF3024240BD300774A93 /* AccountSetupView.swift in Sources */, 47C822602437A143005BCE73 /* CornerRounder.swift in Sources */, 4775D7AC243F18BC0052F2CC /* SecurityBriefingView.swift in Sources */, @@ -1942,15 +1942,6 @@ name = Localizable.strings; sourceTree = "<group>"; }; - A13526841D955BDF00D3BFE1 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - A1F992301DA7D22D0073BF1B /* de */, - A1F992321DA7D2360073BF1B /* en */, - ); - name = LaunchScreen.storyboard; - sourceTree = "<group>"; - }; A1BE3FF81E9664660040114B /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( diff --git a/enzevalos_iphone/AddressHandler.swift b/enzevalos_iphone/AddressHandler.swift index dc7c79007173b4c269359b0efa9b288a345bdbcc..299c8a61a88bdd91a654495e5fa012b58a2886eb 100644 --- a/enzevalos_iphone/AddressHandler.swift +++ b/enzevalos_iphone/AddressHandler.swift @@ -24,7 +24,7 @@ import UIKit.UIImage class AddressHandler { static var addresses: [String] = [] - +/* static var freqAlgorithm: ([String]) -> [(UIImage, String, String, UIImage?, UIColor)] = { (inserted: [String]) -> [(UIImage, String, String, UIImage?, UIColor)] in var cons: [(UIImage, String, String, UIImage?, UIColor)] = [] @@ -79,7 +79,7 @@ class AddressHandler { return list } -/* TODO +// TODO static var freqAlgorithm2: ([String]) -> [(UIImage, String, String, UIImage?, UIColor)] = { (inserted: [String]) -> [(UIImage, String, String, UIImage?, UIColor)] in diff --git a/enzevalos_iphone/AppDelegate.swift b/enzevalos_iphone/AppDelegate.swift index 396ee1794c27a751a7947899a5c49b58c530b28a..bf602e463a6024d628a52219018a9c458b46e05b 100644 --- a/enzevalos_iphone/AppDelegate.swift +++ b/enzevalos_iphone/AppDelegate.swift @@ -120,7 +120,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func credentialsWork() { - self.window?.rootViewController = Onboarding.contactView(self.requestForAccess) + //TODO self.window?.rootViewController = Onboarding.contactView(self.requestForAccess) } func contactCheck(_ accessGranted: Bool) { @@ -149,14 +149,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { print("Delete All data") //TODO What about the keychain? }) - Onboarding.credentials = nil - Onboarding.credentialFails = 0 - Onboarding.manualSet = false + + // Start screen Onboarding! UserManager.resetUserValues() self.window = UIWindow(frame: UIScreen.main.bounds) - //self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("onboarding") - self.window?.rootViewController = Onboarding.onboarding() self.window?.makeKeyAndVisible() UserDefaults.standard.set(false, forKey: "launchedBefore") UserDefaults.standard.set(false, forKey: "reset") @@ -199,9 +196,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } */ func onboardingDone() { - Logger.log(onboardingState: .Finish, duration: 0) + //Logger.log(onboardingState: .Finish, duration: 0) UserDefaults.standard.set(true, forKey: "launchedBefore") - self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() + //self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() presentInboxViewController() } @@ -220,18 +217,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - if let vc = self.window?.rootViewController { - if let inboxController = vc as? InboxViewController { - inboxController.loadData() - } - else { - for x in vc.children { - if let inboxController = x as? InboxViewController { - inboxController.loadData() - } - } - } - } + presentInboxViewController() } @@ -245,7 +231,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { if let con = window?.rootViewController { ItunesKeyHandling.simpleImportSecretKey(con: con) } - DataHandler.handler.startToSendMore() + //TODO DataHandler.handler.startToSendMore() } } @@ -256,7 +242,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. Logger.log(terminateApp: Void()) - DataHandler.handler.terminate() + //TODO DataHandler.handler.terminate() } @@ -287,11 +273,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func requestForNotifications(){ if #available(iOS 10.0, *) { UNUserNotificationCenter.current().requestAuthorization(options: [ .badge], completionHandler: {didAllow, error in - self.setupKeys() + // self.setupKeys() }) } else { // TODO: Fallback on earlier versions - self.setupKeys() + //self.setupKeys() } } @@ -337,7 +323,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return } - func presentReadViewController(mail: PersistentMail) { + func presentReadViewController(mail: MailRecord) { //presentSwiftUIReadView() guard let vc = self.window?.rootViewController as? UINavigationController else { fatalError("No rootViewController!") @@ -441,7 +427,7 @@ extension AppDelegate { //Network check Timer.scheduledTimer(withTimeInterval: TimeInterval(5), repeats: true, block: ({(t: Timer) -> () in if self.currentReachabilityStatus != .notReachable { t.invalidate() - DataHandler.handler.startToSendMore() + //TODO DataHandler.handler.startToSendMore() } })) } else { diff --git a/enzevalos_iphone/AuthenticationViewModel.swift b/enzevalos_iphone/AuthenticationViewModel.swift index fb17e551c5ea787ce185a2b57f46ac600cb50b80..99908069fc7d6bd8ac07e7e393e6ef2abee3ad21 100644 --- a/enzevalos_iphone/AuthenticationViewModel.swift +++ b/enzevalos_iphone/AuthenticationViewModel.swift @@ -63,7 +63,7 @@ class AuthenticationViewModel : ObservableObject { print("No view controller!") return } - Logger.log(onboardingState: .GoogleLogIn, duration: 0) + //TODO Logger.log(onboardingState: .GoogleLogIn, duration: 0) EmailHelper.singleton().doEmailLoginIfRequired(onVC: vc, completionBlock: { guard let userEmail = EmailHelper.singleton().authorization?.userEmail, EmailHelper.singleton().authorization?.canAuthorize() ?? false else { diff --git a/enzevalos_iphone/BadgeProgressView.swift b/enzevalos_iphone/BadgeProgressView.swift index 575f1c3441ad0f7fd299fd479b512728d97ef02e..8319670aa184f0c2723ce8da61df1923f6a6d971 100644 --- a/enzevalos_iphone/BadgeProgressView.swift +++ b/enzevalos_iphone/BadgeProgressView.swift @@ -67,6 +67,6 @@ struct Quest: View { struct BadgeProgressView_Previews: PreviewProvider { static var previews: some View { - BadgeProgressView(badge: Badge(type: .MailMaster, description: NSLocalizedString("Mailmaster", comment:"Mailmaster badge" ), imageOn: "verschluesseltOn", imageOff: "verschluesseltOff", isActive: true)) + BadgeProgressView(badge: Badge(description: NSLocalizedString("Mailmaster", comment:"Mailmaster badge" ), imageOn: "verschluesseltOn", imageOff: "verschluesseltOff", isActive: true)) } } diff --git a/enzevalos_iphone/DebugSettings.swift b/enzevalos_iphone/DebugSettings.swift index 1aa2ea20ae945cde5c8501d32b71b43081e0b644..64156b55670d133bd652b24c971d5d67efe44359 100644 --- a/enzevalos_iphone/DebugSettings.swift +++ b/enzevalos_iphone/DebugSettings.swift @@ -21,7 +21,7 @@ import Foundation private let pgp = SwiftPGP() -private let datahandler = DataHandler.handler +private let datahandler = PersitentDataProvider.dataProvider let SUPPORT_MAIL_ADR = "letterbox@inf.fu-berlin.de" @@ -32,7 +32,7 @@ func setupStudyPublicKeys() { let support_pk = "support_pk" let keys = ["noreply@bitcoin.de": "bitcoinde", "letterbox@zedat.fu-berlin.de": support_pk, "letterbox-hilfe@inf.fu-berlin.de": support_pk, "enzevalos@inf.fu-berlin.de": support_pk, SUPPORT_MAIL_ADR: support_pk, LOGGING_MAIL_ADR: logging_pk] importPublicKeyDic(keys: keys, type: "asc") - datahandler.save(during: "init study keys") + //TODO datahandler.save(during: "init study keys") } @@ -55,7 +55,7 @@ func importSecretKey(file: String, type: String){ if let path = Bundle.main.path(forResource: file, ofType: type){ let ids = try! pgp.importKeysFromFile(file: path, pw: nil) for id in ids { - _ = datahandler.newSecretKey(keyID: id, addPk: true) + //TODO _ = datahandler.newSecretKey(keyID: id, addPk: true) } } } @@ -71,7 +71,7 @@ private func importPublicKey(file: String, type: String, adr: String) { do { let ids = try pgp.importKeysFromFile(file: path, pw: nil) for id in ids { - _ = datahandler.newPublicKey(keyID: id, cryptoType: CryptoScheme.PGP, adr: adr, autocrypt: false, transferType: nil) + //TODO _ = datahandler.newPublicKey(keyID: id, cryptoType: CryptoScheme.PGP, adr: adr, autocrypt: false, transferType: nil) } } catch _ { diff --git a/enzevalos_iphone/FeedbackButtonHelper.swift b/enzevalos_iphone/FeedbackButtonHelper.swift index 25bf01a6480b06ab27cb7dbe7f48d8a1808ffd40..54e4df265c1da00dc5b01959d3a8c33a12b9112f 100644 --- a/enzevalos_iphone/FeedbackButtonHelper.swift +++ b/enzevalos_iphone/FeedbackButtonHelper.swift @@ -26,12 +26,13 @@ class FeedbackButtonHelper { let subject = String(format: NSLocalizedString("Feedback.Mail.Subject", comment: "Feedback"), view.rawValue) let body = String(format: NSLocalizedString("Feedback.Mail.Body", comment: ""), view.rawValue) let mail = EphemeralMail(to: NSSet(object: receiver), subject: subject, body: String(format: body, StudySettings.studyID)) + /* if let navi = navigationController, let sendController = FeedbackButtonHelper.createSendViewController(navigationController: navi) { sendController.prefilledMail = mail sendController.isFeedback = true - } + }*/ } - + /* TODO private static func createSendViewController(navigationController: UINavigationController) -> SendViewController? { let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main) if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "SendViewController") as? SendViewController { @@ -39,5 +40,5 @@ class FeedbackButtonHelper { return viewController } return nil - } + } */ } diff --git a/enzevalos_iphone/ItunesHandler.swift b/enzevalos_iphone/ItunesHandler.swift index 7e5aec52a941b8dcdc4464b967d08fb0092b7167..088f02947aa772a88b80d5569f13b3c09ad87397 100644 --- a/enzevalos_iphone/ItunesHandler.swift +++ b/enzevalos_iphone/ItunesHandler.swift @@ -12,9 +12,9 @@ class ItunesKeyHandling { static func simpleImportSecretKey(con: UIViewController) { var sks = iTunesKeyHandler.storedKeys.filter{$0.isSecret} // filter known secret keys - sks = sks.filter{DataHandler.handler.prefSecretKey()?.keyID != $0.keyID} - let knownIds = DataHandler.handler.findSecretKeys().map{$0.keyID} - sks = sks.filter{!knownIds.contains($0.keyID)} + // TODO sks = sks.filter{DataHandler.handler.prefSecretKey()?.keyID != $0.keyID} + //let knownIds = DataHandler.handler.findSecretKeys().map{$0.keyID} + //sks = sks.filter{!knownIds.contains($0.keyID)} // Import only keys with our mail addr. sks = sks.filter{ if let useradr = UserManager.loadUserValue(Attribute.userAddr) as? String { @@ -35,9 +35,9 @@ class ItunesKeyHandling { func extractSecretKeys(withKnownKeys: Bool) -> [TempKey] { var newSecretKeys = storedKeys.filter{$0.isSecret} if !withKnownKeys { - var knownIDs = DataHandler.handler.findSecretKeys().map{$0.keyID} - knownIDs = knownIDs.filter{return !($0 == "")} - newSecretKeys = newSecretKeys.filter{!knownIDs.contains($0.keyID)} + //TODO var knownIDs = DataHandler.handler.findSecretKeys().map{$0.keyID} + //knownIDs = knownIDs.filter{return !($0 == "")} + //newSecretKeys = newSecretKeys.filter{!knownIDs.contains($0.keyID)} } return newSecretKeys } @@ -45,9 +45,9 @@ class ItunesKeyHandling { func extractPublicKeys(withKnownKeys: Bool) -> [TempKey] { var newPublicKeys = storedKeys.filter{!$0.isSecret} if !withKnownKeys { - var knownIDs = DataHandler.handler.findPublicKeys().map{$0.keyID} - knownIDs = knownIDs.filter{return !($0 == "")} - newPublicKeys = newPublicKeys.filter{!knownIDs.contains($0.keyID)} + //TODO var knownIDs = DataHandler.handler.findPublicKeys().map{$0.keyID} + // knownIDs = knownIDs.filter{return !($0 == "")} + // newPublicKeys = newPublicKeys.filter{!knownIDs.contains($0.keyID)} } return newPublicKeys } @@ -96,7 +96,7 @@ class ItunesKeyHandling { func importPublicKeys() -> [String]{ var publicKeys = storedKeys.filter{!$0.isSecret} - publicKeys = publicKeys.filter{DataHandler.handler.findKey(keyID: $0.keyID) == nil} + //TODO publicKeys = publicKeys.filter{DataHandler.handler.findKey(keyID: $0.keyID) == nil} let keyIds = pgp.store(tempKeys: publicKeys) //TODO: Store in Datahandler -> in tempKey? return keyIds @@ -144,14 +144,14 @@ class MinimalImportUI { if let pw = secretKeyPasswordField?.text { if secretKey.testPassword(guess: pw) { let keyIDs = SwiftPGP.init().store(tempKeys: [secretKey]) - _ = DataHandler.handler.newSecretKeys(keyIds: keyIDs, addPKs: true) + //TODO _ = DataHandler.handler.newSecretKeys(keyIds: keyIDs, addPKs: true) } else { importSecretKeyDialog(first: false) } } else { let keyIDs = SwiftPGP.init().store(tempKeys: [secretKey]) - _ = DataHandler.handler.newSecretKeys(keyIds: keyIDs, addPKs: true) + //TODO _ = DataHandler.handler.newSecretKeys(keyIds: keyIDs, addPKs: true) } } } diff --git a/enzevalos_iphone/LoggerDetail.swift b/enzevalos_iphone/LoggerDetail.swift index 9555cb9be3dbbbe060c0e40a8b9ce0fc75498189..08a36f25b8f2550e0e925d9b4864abbd33329b70 100644 --- a/enzevalos_iphone/LoggerDetail.swift +++ b/enzevalos_iphone/LoggerDetail.swift @@ -142,7 +142,7 @@ class LoggerDetail { saveToDisk(json: dictToJSON(fields: event)) sendCheck() } - +/* static func log(contactViewOpen keyRecord: KeyRecord?, otherRecords: [KeyRecord]?, isUser: Bool) { if !logging { return @@ -169,32 +169,9 @@ class LoggerDetail { saveToDisk(json: dictToJSON(fields: event)) sendCheck() } + - static func log(badgeCaseViewOpen badges: [Badges]) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.badgeCaseViewOpen.rawValue - - var achievedBadges: [String] = [] - var missingBadges: [String] = [] - - for badge in badges { - if badge.isAchieved() { - achievedBadges.append(badge.displayName) - } else { - missingBadges.append(badge.displayName) - } - } - - event["achievedBadges"] = achievedBadges - event["missingBadges"] = missingBadges - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } + static func log(contactViewClose keyRecord: KeyRecord?, otherRecords: [KeyRecord]?, isUser: Bool) { if !logging { @@ -222,6 +199,7 @@ class LoggerDetail { saveToDisk(json: dictToJSON(fields: event)) sendCheck() } + */ static func log(keyViewOpen keyID: String) { if !logging { @@ -293,53 +271,7 @@ class LoggerDetail { sendCheck() } - static func log(importPrivateKeyPopupOpen mail: PersistentMail?) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.importPrivateKeyPopupOpen.rawValue - if let mail = mail { - event = extract(from: mail, event: event) - } - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(importPrivateKeyPopupClose mail: PersistentMail?, doImport: Bool) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.importPrivateKeyPopupClose.rawValue - event["doImport"] = doImport - if let mail = mail { - event = extract(from: mail, event: event) - } - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(importPrivateKey mail: PersistentMail?, success: Bool) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.importPrivateKey.rawValue - event["success"] = success - if let mail = mail { - event = extract(from: mail, event: event) - } - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - + static func log(sendViewOpen mail: EphemeralMail?) { if !logging { return @@ -370,76 +302,8 @@ class LoggerDetail { sendCheck() } - static func log(createDraft to: [Mail_Address?], cc: [Mail_Address?], bcc: [Mail_Address?], subject: String, bodyLength: Int, isEncrypted: Bool, isSigned: Bool, myKeyID: String) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.createDraft.rawValue - - - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(sent from: Mail_Address, to: [Mail_Address], cc: [Mail_Address], bcc: [Mail_Address], subject: String, bodyLength: Int, isEncrypted: Bool, decryptedBodyLength: Int, decryptedWithOldPrivateKey: Bool = false, isSigned: Bool, isCorrectlySigned: Bool = true, signingKeyID: String, myKeyID: String, secureAddresses: [Mail_Address] = [], encryptedForKeyIDs: [String] = [], inviteMailContent: String?, invitationMail: Bool) { - - if !logging { - return - } - - var event = plainLogDict() - - event["type"] = LoggingEventType.mailSent.rawValue - event["from"] = LoggerDetail.resolve(mailAddress: from) - event["to"] = LoggerDetail.resolve(mailAddresses: to) - event["cc"] = LoggerDetail.resolve(mailAddresses: cc) - event["bcc"] = LoggerDetail.resolve(mailAddresses: bcc) - event["communicationState"] = LoggerDetail.communicationState(subject: subject) - event["specialMail"] = LoggerDetail.specialMail(subject: subject) - event["bodyLength"] = bodyLength - event["isEncrypted"] = isEncrypted - event["decryptedBodyLength"] = decryptedBodyLength - event["decryptedWithOldPrivateKey"] = decryptedWithOldPrivateKey - event["isSigned"] = isSigned - event["isCorrectlySigned"] = isCorrectlySigned - event["signingKeyID"] = LoggerDetail.resolve(keyID: signingKeyID) - event["myKeyID"] = LoggerDetail.resolve(keyID: myKeyID) - event["secureAddresses"] = LoggerDetail.resolve(mailAddresses: secureAddresses) //means the addresses, which received a secure mail - event["encryptedForKeyIDs"] = LoggerDetail.resolve(keyIDs: encryptedForKeyIDs) - if let content = inviteMailContent { - event["inviteMailContent"] = content - } - - saveToDisk(json: dictToJSON(fields: event)) - if invitationMail { - sendLog() - } - else { - sendCheck() - } - } - - static func log(readViewOpen mail: PersistentMail, message: String, draft: Bool = false) { - if !logging { - return - } - - var event = plainLogDict() - - event["type"] = LoggingEventType.readViewOpen.rawValue - event = extract(from: mail, event: event) - event["messagePresented"] = message - event["draft"] = draft - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - static func log(readViewClose message: String, draft: Bool = false) { if !logging { return @@ -455,20 +319,7 @@ class LoggerDetail { sendCheck() } - static func log(received mail: PersistentMail) { - if !logging { - return - } - - var event = plainLogDict() - - event["type"] = LoggingEventType.mailReceived.rawValue - event = extract(from: mail, event: event) - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - + static func log(bitcoinMail gotIt: Bool) { if !logging { return @@ -482,128 +333,6 @@ class LoggerDetail { sendCheck() } - - static func log(delete mail: PersistentMail, toTrash: Bool) { - if !logging { - return - } - - var event = plainLogDict() - if toTrash { - event["type"] = LoggingEventType.mailDeletedToTrash.rawValue - } else { - event["type"] = LoggingEventType.mailDeletedPersistent.rawValue - } - // event = extract(from: mail, event: event) - event["operation"] = "DeleteMail" - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(archive mail: PersistentMail) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.mailArchived.rawValue - event = extract(from: mail, event: event) - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(open indicatorButton: String, mail: PersistentMail?) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.indicatorButtonOpen.rawValue - event["indicatorButton"] = indicatorButton - if let mail = mail { - event["view"] = "readView" - event = extract(from: mail, event: event) - } else { - event["view"] = "sendView" - } - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(close indicatorButton: String, mail: PersistentMail?, action: String) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.indicatorButtonClose.rawValue - event["indicatorButton"] = indicatorButton - if let mail = mail { - event["view"] = "readView" - event = extract(from: mail, event: event) - } else { - event["view"] = "sendView" - } - event["action"] = action - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(showBroken mail: PersistentMail?) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.showBrokenMail.rawValue - event["view"] = "readView" - if let mail = mail { - event = extract(from: mail, event: event) - } - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(reactTo mail: PersistentMail?) { - if !logging { - return - } - - var event = plainLogDict() - event["type"] = LoggingEventType.reactButtonTapped.rawValue - if let mail = mail { - event = extract(from: mail, event: event) - } - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - - static func log(discover publicKeyID: String, mailAddress: Mail_Address, importChannel: String, knownPrivateKey: Bool, knownBefore: Bool) { //add reference to mail here? - if !logging { - return - } - - var event = plainLogDict() - if !knownBefore { - event["type"] = LoggingEventType.pubKeyDiscoveryNewKey.rawValue - } else { - event["type"] = LoggingEventType.pubKeyDiscoveryKnownKey.rawValue - } - event["keyID"] = LoggerDetail.resolve(keyID: publicKeyID) - event["mailAddress"] = LoggerDetail.resolve(mail_address: mailAddress) - event["knownPrivateKey"] = knownPrivateKey //Do we have a private key for it? - event["importChannel"] = importChannel - - saveToDisk(json: dictToJSON(fields: event)) - sendCheck() - } - static func log(backgroundFetch newMails: UInt32, duration: Double) { if !logging { return @@ -664,21 +393,19 @@ class LoggerDetail { sendCheck() } - static fileprivate func extract(from mail: PersistentMail, event: [String: Any]) -> [String: Any] { + static fileprivate func extract(from mail: MailRecord, event: [String: Any]) -> [String: Any] { var event = event - event["from"] = LoggerDetail.resolve(mailAddress: mail.from) - event["to"] = LoggerDetail.resolve(mailAddresses: mail.to) - event["cc"] = LoggerDetail.resolve(mailAddresses: mail.cc ?? NSSet()) - event["bcc"] = LoggerDetail.resolve(mailAddresses: mail.bcc ?? NSSet()) + event["from"] = LoggerDetail.resolve(mailAddress: mail.fromAddress as! MailAddress) + event["to"] = LoggerDetail.resolve(mailAddresses: mail.tos) + event["cc"] = LoggerDetail.resolve(mailAddresses: mail.ccs) + event["bcc"] = LoggerDetail.resolve(mailAddresses: mail.bccs) event["communicationState"] = LoggerDetail.communicationState(subject: mail.subject ?? "") event["specialMail"] = LoggerDetail.specialMail(subject: mail.subject ?? "") - event["timeInHeader"] = mail.date.description + event["timeInHeader"] = mail.date?.description event["bodyLength"] = (mail.body)?.count - event["isEncrypted"] = mail.isEncrypted - event["decryptedBodyLength"] = (mail.decryptedBody ?? "").count - event["decryptedWithOldPrivateKey"] = mail.decryptedWithOldPrivateKey - event["isSigned"] = mail.isSigned - event["isCorrectlySigned"] = mail.isCorrectlySigned + event["encState"] = mail.encryptionState.rawValue + event["decryptedBodyLength"] = (mail.body ?? "").count + event["signatureState"] = mail.signedState.rawValue event["x-Mailer"] = mail.xMailer //TODO: //event["signingKeyID"] = Logger.resolve(keyID: signingKeyID) @@ -690,7 +417,7 @@ class LoggerDetail { //event["encryptedForKeyIDs"] = Logger.resolve(keyIDs: encryptedForKeyIDs) event["trouble"] = mail.trouble - event["folder"] = LoggerDetail.resolve(folder: mail.folder) + // event["folder"] = LoggerDetail.resolve(folder: mail.folder) return event } @@ -749,7 +476,7 @@ class LoggerDetail { } //takes backendFolderPath - static func resolve(folder: Folder) -> String { + static func resolve(folder: FolderRecord) -> String { let folderPath = folder.path if folderPath == UserManager.backendSentFolderPath { return "sent" @@ -766,31 +493,23 @@ class LoggerDetail { if folderPath == UserManager.backendArchiveFolderPath { return "archive" } - return folder.pseudonym + return folder.path ?? ""//TODO } //get an pseudonym for a mailAddress static func resolve(mailAddress: MailAddress) -> String { - if let addr = mailAddress as? Mail_Address { - return resolve(mail_address: addr) - } else if mailAddress is CNMailAddressExtension { - return "CNMailAddress" + if mailAddress.isUser { + return "self" } - return "unknownMailAddressType" + return mailAddress.mailAddress//TODO .pseudonym } - static func resolve(mail_address: Mail_Address) -> String { - if mail_address.isUser { - return "self" - } - return mail_address.pseudonym - } static func resolve(mailAddresses: NSSet) -> [String] { var result: [String] = [] for addr in mailAddresses { - if let addr = addr as? Mail_Address { - result.append(resolve(mail_address: addr)) + if let addr = addr as? MailAddress { + result.append(resolve(mailAddress: addr)) } else if addr is CNMailAddressExtension { result.append("CNMailAddress") } else { @@ -800,38 +519,25 @@ class LoggerDetail { return result } - static func resolve(mailAddresses: [Mail_Address]) -> [String] { - var result: [String] = [] - for addr in mailAddresses { - result.append(resolve(mail_address: addr)) - } - return result - } - static func resolve(mailAddresses: [MailAddress]) -> [String] { var result: [String] = [] for addr in mailAddresses { - if let addr = addr as? Mail_Address { - result.append(resolve(mail_address: addr)) - } else if addr is CNMailAddressExtension { - result.append("CNMailAddress") - } else { - result.append("unknownMailAddressType") - } + result.append(resolve(mailAddress: addr)) } return result } + //get an pseudonym for a keyID static func resolve(keyID: String) -> String { - if let key = DataHandler.handler.findKey(keyID: keyID) { + /*if let key = DataHandler.handler.findKey(keyID: keyID) { return key.pseudonym - } + }*/ return "noKeyID" } - static func resolve(key: PersistentKey) -> String { - return key.pseudonym + static func resolve(key: PublicKeyRecord) -> String { + return key.fingerprint ?? "" //TODO } static func resolve(keyIDs: [String]) -> [String] { diff --git a/enzevalos_iphone/MailComparison.swift b/enzevalos_iphone/MailComparison.swift index b221bb319c57f101c8b932d50a8590b1c3b39816..724bf6c0b940d8cbc1861da574a48b548c838e30 100644 --- a/enzevalos_iphone/MailComparison.swift +++ b/enzevalos_iphone/MailComparison.swift @@ -9,22 +9,25 @@ import Foundation import CoreData -private let datahandler = DataHandler.handler +//TODO private let datahandler = DataHandler.handler public enum ResultCompareSenderToContacts { case isContact, isSender, OnlyIdentity, Unknown } + +//TODO: Move to Mail Address? extension String { /** compares the given mail address to the persistant mails and returns the number of matches ***/ - private func countMatches(_ mailAddr: String, _ inboxMails: [PersistentMail]) -> Int { + private func countMatches(_ mailAddr: String, _ inboxMails: [MailRecord]) -> Int { var senders: [String] = [] for sender in inboxMails{ - let sender: String = sender.from.mailAddress - senders.append(sender) + if let sender: String = sender.fromAddress?.email { + senders.append(sender) + } } var numberOfFoundMatches = 0 for addr in senders{ @@ -38,15 +41,16 @@ extension String { /** returns a mail address, wich has the same identity as the given one but a different domain ***/ - private func getIdentityWithDifferentDomain(_ mailAdd: String, inboxMails: [PersistentMail]) -> String{ + private func getIdentityWithDifferentDomain(_ mailAdd: String, inboxMails: [MailRecord]) -> String{ let senderIdentity = mailAdd.getLocalMailIdentity() var senderDomain = mailAdd.splitAddress() senderDomain.removeFirst() var senders: [String] = [] for sender in inboxMails{ - let sender: String = sender.from.mailAddress - senders.append(sender) + if let sender: String = sender.fromAddress?.email { + senders.append(sender) + } } var foundMatch = "" for addr in senders{ @@ -66,12 +70,12 @@ extension String { ***/ public func compareSenderToContacts() -> ResultCompareSenderToContacts { // Case 1: Is the address of the sender known through previous mails? - let inboxMails = datahandler.getAllPersistentMails() + let inboxMails = [MailRecord]()//datahandler.getAllPersistentMails() if countMatches(self, inboxMails) >= 2{ return ResultCompareSenderToContacts.isSender } // Case 2: Is the address of the sender in the address book? - let enzContacts = datahandler.getContacts() + let enzContacts = [AddressRecord]()// datahandler.getContacts() for contact in enzContacts { let contMailAddr = contact.cnContact?.getMailAddresses() if contMailAddr != nil{ diff --git a/enzevalos_iphone/MailHandler.swift b/enzevalos_iphone/MailHandler.swift index 179dc93b464b71427138dc6981c2ba8b0458c734..6c140faa5767dadc094dc60c7f23d2704a1f4789 100644 --- a/enzevalos_iphone/MailHandler.swift +++ b/enzevalos_iphone/MailHandler.swift @@ -513,7 +513,7 @@ class MailHandler { } } - private func loadMessagesFromServer(_ uids: MCOIndexSet, folderPath: String, maxLoad: Int = MailHandler.MAXMAILS, record: KeyRecord?, completionCallback: @escaping ((_ error: MailServerConnectionError?) -> ())) { + private func loadMessagesFromServer(_ uids: MCOIndexSet, folderPath: String, maxLoad: Int = MailHandler.MAXMAILS, completionCallback: @escaping ((_ error: MailServerConnectionError?) -> ())) { guard IMAPSession != nil else { completionCallback(MailServerConnectionError.NoData) return @@ -530,7 +530,7 @@ class MailHandler { fetchOperation.start{[unowned self] (err, msg, vanished) -> Void in guard err == nil else { let connerror = MailServerConnectionError.findErrorCode(error: err!) - self.errorhandling(error: connerror, originalCall: {self.loadMessagesFromServer(uids, folderPath: folderPath, maxLoad: maxLoad, record: record, completionCallback: completionCallback)}, completionCallback: completionCallback) + self.errorhandling(error: connerror, originalCall: {self.loadMessagesFromServer(uids, folderPath: folderPath, maxLoad: maxLoad, completionCallback: completionCallback)}, completionCallback: completionCallback) return } var calledMails = 0 @@ -542,13 +542,13 @@ class MailHandler { op?.start {[unowned self] err, data in guard err == nil else { let connerror = MailServerConnectionError.findErrorCode(error: err!) - self.errorhandling(error: connerror, originalCall: {self.loadMessagesFromServer(uids, folderPath: folderPath, maxLoad: maxLoad, record: record, completionCallback: completionCallback)}, completionCallback: completionCallback) + self.errorhandling(error: connerror, originalCall: {self.loadMessagesFromServer(uids, folderPath: folderPath, maxLoad: maxLoad, completionCallback: completionCallback)}, completionCallback: completionCallback) return } if let parser = data { let id = UInt64(message.uid) let incomingMail = IncomingMail(rawData: parser, uID: id, folderPath: folderPath, flags: message.flags) - _ = incomingMail.store(keyRecord: record) + //TODO _ = incomingMail.store(keyRecord: record) } dispatchGroup.leave() } @@ -561,7 +561,7 @@ class MailHandler { self.IMAPSession?.disconnectOperation().start({[unowned self] err2 in guard err2 == nil else { let connerror = MailServerConnectionError.findErrorCode(error: err2!) - self.errorhandling(error: connerror, originalCall: {self.loadMessagesFromServer(uids, folderPath: folderPath, maxLoad: maxLoad, record: record, completionCallback: completionCallback)}, completionCallback: completionCallback) + self.errorhandling(error: connerror, originalCall: {self.loadMessagesFromServer(uids, folderPath: folderPath, maxLoad: maxLoad, completionCallback: completionCallback)}, completionCallback: completionCallback) return } }) @@ -571,7 +571,7 @@ class MailHandler { } } - +/* TODO func move(mails: [MailRecord], from: String, to: String, folderCreated: Bool = false) { guard IMAPSession != nil else { return @@ -642,7 +642,7 @@ class MailHandler { } } - +*/ func allFolders(_ completion: @escaping (Error?, [Any]?) -> Void) { guard IMAPSession != nil else { completion(MailServerConnectionError.NoData, nil) @@ -671,7 +671,7 @@ class MailHandler { for message in msgs { toFetchIDs.add(UInt64(message.uid)) } - self.loadMessagesFromServer(toFetchIDs, folderPath: folderPath, maxLoad: 50, record: nil, completionCallback: completionCallback) + self.loadMessagesFromServer(toFetchIDs, folderPath: folderPath ?? "", maxLoad: 50, completionCallback: completionCallback) } else { completionCallback(nil) } @@ -692,10 +692,10 @@ class MailHandler { return } folder.lastUpdate = Date() - if folder.mailsOfFolder.count > 0 { + if folder.mailsInFolder?.count ?? 0 > 0 { self.loadMailsByNum(folder: folder, completionCallback: completionCallback, multipleMails: false) } else { - if folder.path == UserManager.backendInboxFolderPath || folder.path.lowercased() == "INBOX".lowercased() { + if folder.path == UserManager.backendInboxFolderPath || folder.path?.lowercased() == "INBOX".lowercased() { self.initInbox(inbox: folder, completionCallback: completionCallback) } else { self.initFolder(folder: folder, completionCallback: completionCallback) @@ -731,18 +731,19 @@ class MailHandler { range = MCORange(location: UInt64(lastMinElem), length: UInt64(MailHandler.MAXMAILS)) requestIds.add(range) requestIds.remove(knownIds) - if folder.minID > UInt64(lastMinElem) { - folder.minID = UInt64(lastMinElem) + if UInt64(truncating: folder.minUID ?? 0) > UInt64(lastMinElem) { + folder.minUID = NSDecimalNumber(value: UInt64(lastMinElem)) } } if lastMinElem < MailHandler.MAXMAILS { range = MCORange(location: UInt64(1), length: UInt64(MailHandler.MAXMAILS)) requestIds.add(range) - folder.minID = 1 + folder.minUID = 1 } if multipleMails { - var (start, overflow) = folder.minID.subtractingReportingOverflow(UInt64(MailHandler.MAXMAILS)) - if overflow && folder.minID > 1 { + var min = UInt64(folder.minUID ?? 0) + var (start, overflow) = min.subtractingReportingOverflow(UInt64(MailHandler.MAXMAILS)) + if overflow && min > 1 { // 1 < folder.min < MailHandler.MAXMAILs -> start with uid = 1 start = 1 overflow = false @@ -750,7 +751,7 @@ class MailHandler { if !overflow { range = MCORange(location: start, length: UInt64(MailHandler.MAXMAILS)) requestIds.add(range) - folder.minID = start + folder.minUID = NSDecimalNumber(value: start) } } @@ -774,7 +775,7 @@ class MailHandler { } if let status = status, let ids = MCOIndexSet(range: MCORange(location: 0, length: UInt64(status.uidNext))) { let newIds = self.calculateIndicies(indicies: ids, folder: folder, multipleMails: multipleMails) - self.loadMessagesFromServer(newIds, folderPath: path, record: nil, completionCallback: completionCallback) + //TODO self.loadMessagesFromServer(newIds, folderPath: path, record: nil, completionCallback: completionCallback) } } } @@ -786,7 +787,7 @@ class MailHandler { completionCallback(MailServerConnectionError.NoData) return } - if let mails = folder.mails, mails.count > 0 { + if let mails = folder.mailsInFolder, mails.count > 0 { loadMailsByNum(folder: folder, completionCallback: completionCallback, multipleMails: true) } else { initFolder(folder: folder, completionCallback: completionCallback) @@ -810,8 +811,8 @@ class MailHandler { } if let ids = uids { folder.lastUpdate = Date() - ids.remove(folder.uids) - self.loadMessagesFromServer(ids, folderPath: folderPath, maxLoad: maxLoad, record: nil, completionCallback: completionCallback) + //TODO ids.remove(folder.uids) + // self.loadMessagesFromServer(ids, folderPath: folderPath, maxLoad: maxLoad, record: nil, completionCallback: completionCallback) } else { completionCallback(nil) } diff --git a/enzevalos_iphone/OutgoingMail.swift b/enzevalos_iphone/OutgoingMail.swift index 975fd61e95268bf4c3005969a19f9a3876c3df41..0bbe5f9ce6990156914069b535ace23a006aaf4c 100644 --- a/enzevalos_iphone/OutgoingMail.swift +++ b/enzevalos_iphone/OutgoingMail.swift @@ -132,9 +132,10 @@ class OutgoingMail { bccEntrys = OutgoingMail.mapToMCOAddresses(addr: mail.bccs) subject = mail.subject != nil ? mail.subject!: "" textContent = mail.body - //TODO htmlContent = mail.decryptedBody //TODO FIX HERE + htmlContent = mail.body //.decryptedBody //TODO FIX HERE textparts = 0 //TODO FIX HERE //sendEncryptedIfPossible = mail.isEncrypted //TODO FIX HERE + sendEncryptedIfPossible = mail.encryptionState != .UnableToDecrypt self.orderReceivers() self.mail = mail //self.loggingMail = mail.isCorrectlySigned //TODO FIX HERE diff --git a/enzevalos_iphone/PLists/enzevalos-Info.plist b/enzevalos_iphone/PLists/enzevalos-Info.plist index dc2c11754b298e22486597dac723fcc186581312..a3aa25accbf1a86fccd45791502033d1bace6832 100644 --- a/enzevalos_iphone/PLists/enzevalos-Info.plist +++ b/enzevalos_iphone/PLists/enzevalos-Info.plist @@ -86,8 +86,6 @@ <true/> <key>UILaunchStoryboardName</key> <string>LaunchScreen</string> - <key>UIMainStoryboardFile</key> - <string>Main</string> <key>UIRequiredDeviceCapabilities</key> <array> <string>armv7</string> diff --git a/enzevalos_iphone/SearchHelper.swift b/enzevalos_iphone/SearchHelper.swift new file mode 100644 index 0000000000000000000000000000000000000000..b6bffdc347dc16b1eb19dce08035fb3bdf18c4f4 --- /dev/null +++ b/enzevalos_iphone/SearchHelper.swift @@ -0,0 +1,60 @@ +// +// SearchHelper.swift +// enzevalos_iphone +// +// Created by lazarog98 on 26.02.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation + +/** + A collection of helper methods that are used for the different search bars + */ + +/** + Function to be used to find mails that contain the search terms. All terms (separated by spaces) need to be contained in the search text. + - parameters: + - content: The String that will be searched + - searchText: Search terms (space-separated) that will be searched for +*/ +func containsSearchTerms ( content : String?, searchText: String) -> Bool +{ + guard searchText.count > 0 else { + ///Case empty search + return true + } + guard let content = content else { + //Case Mail has no body/subject + return false + } + + var longterms : [String] = [] + var terms : [String] = [] + //Break String into substrings separated by quoatation marks + longterms = searchText.components(separatedBy: "\"") + var i = 0 + //even elements will be outside the quotation marks and need to be separated again + while (i < longterms.count) + { + if i % 2 == 0 + { + terms.append(contentsOf: longterms[i].lowercased().components(separatedBy: " ")) + } + else + { + terms.append(longterms[i].lowercased()) + } + i+=1 + } + + var found = true + for t in terms + { + if !(t == "") + { + found = found && content.lowercased().contains(t) + } + } + return found +} diff --git a/enzevalos_iphone/StudySettings.swift b/enzevalos_iphone/StudySettings.swift index 90babfd7c6fb36052accd549cceffeaa474f72be..b417f735761336da5db68978e2232bbebbbafffd 100644 --- a/enzevalos_iphone/StudySettings.swift +++ b/enzevalos_iphone/StudySettings.swift @@ -77,7 +77,7 @@ class StudySettings { let keychain = Keychain(service: "Enzevalos/Study") keychain["bitcoin"] = "true" UserDefaults.standard.set(true, forKey: "bitcoin") - Logger.log(bitcoinMail: true) + //TODO Logger.log(bitcoinMail: true) } } } diff --git a/enzevalos_iphone/SwiftPGP.swift b/enzevalos_iphone/SwiftPGP.swift index fdb750554d55bd7dd5b1ca5860fa71a67b601a23..939179a917519c1e1cb27a9ec50f9b9406b7b2d9 100644 --- a/enzevalos_iphone/SwiftPGP.swift +++ b/enzevalos_iphone/SwiftPGP.swift @@ -501,14 +501,14 @@ class SwiftPGP: Encryption { func decrypt(data: Data, attachedSignature: Data? = nil, decKeyIDs: [String], signatureIDs: [String], fromAddr: String) -> CryptoObject{ - let prefKey = DataHandler.handler.prefSecretKey() + let prefKey: SecretKeyRecord? = nil// DataHandler.handler.prefSecretKey() var plaindata: Data? = nil var plaintext: String? = nil var sigState = SignatureState.NoSignature var encState = EncryptionState.UnableToDecrypt var sigKeyID: String? = nil var signedAdr = [String]() - let prefID = prefKey?.keyID + let prefID = prefKey?.fingerprint var keyring = Keyring() var validDecryptionIDs: [String] = [] @@ -614,8 +614,7 @@ class SwiftPGP: Encryption { var encState = EncryptionState.UnableToDecrypt var plaindata: Data? = nil let key: [Key] = keyAsKeyList(keyID: keyID) - let datahandler = DataHandler.handler - let mailList = datahandler.getAllNotDecryptedPersistentMail() + let mailList = [MailRecord]() //TODO datahandler.getAllNotDecryptedPersistentMail() for mail in mailList { // Change data guard let data = mail.body?.data(using: .utf8) else { @@ -625,10 +624,9 @@ class SwiftPGP: Encryption { (plaindata, encState) = decryptMessage(data: data, keys: key, encForCurrentSK: true) if let plaindata = plaindata, encState == EncryptionState.ValidedEncryptedWithCurrentKey || encState == EncryptionState.ValidEncryptedWithOldKey { // Update database - mail.isEncrypted = true - mail.unableToDecrypt = false + //TODO mail.encryptionState = encState mail.body = String.init(data: plaindata, encoding: .utf8) - datahandler.save(during: "decryption of older mails") + //TODO datahandler.save(during: "decryption of older mails") } } } @@ -665,20 +663,21 @@ class SwiftPGP: Encryption { func findNotSignedMailForPublicKey(keyID: String) { var sigState = SignatureState.NoPublicKey let key: [Key] = keyAsKeyList(keyID: keyID) - let datahandler = DataHandler.handler - let mailList = datahandler.getAllNotSignedPersistentMail() - for mail in mailList { - // Change data - guard let data = mail.body?.data(using: .utf8) else { - return - } - // Try to verify mail signature - sigState = verifySignature(data: data, attachedSignature: mail.attachedSignature, keys: key) - if sigState == SignatureState.ValidSignature { - // Update database - mail.isSigned = true - mail.isCorrectlySigned = true - datahandler.save(during: "verifying of older mails") + let datahandler = PersitentDataProvider.dataProvider + if let mailList = datahandler.fetchedMailResultsController.fetchedObjects { //TODO look for not verified signed mails. + for mail in mailList { + // Change data + guard let data = mail.body?.data(using: .utf8) else { + return + } + // Try to verify mail signature + sigState = verifySignature(data: data, attachedSignature:mail.body?.toBase64(), keys: key) // TODO mail.attachedSignature + if sigState == SignatureState.ValidSignature { + // TODO Update database + // mail.isSigned = true + //mail.isCorrectlySigned = true + //datahandler.save(during: "verifying of older mails") + } } } } diff --git a/enzevalos_iphone/SwiftUI/Data/DisplayProtocols.swift b/enzevalos_iphone/SwiftUI/Data/DisplayProtocols.swift index 7e03ea49a2ebc2fe949c42986396f9dac669a6dc..d677d60ee10461f82dc52e5a6479e7661d69e6f7 100644 --- a/enzevalos_iphone/SwiftUI/Data/DisplayProtocols.swift +++ b/enzevalos_iphone/SwiftUI/Data/DisplayProtocols.swift @@ -95,7 +95,7 @@ protocol DisplayMail { var bccs: [C] { get } var routingStops: [Landmark] { get } - var date: Date { get } + var date: Date? { get } var isRead: Bool {get set} var folderType: FolderType { get } diff --git a/enzevalos_iphone/SwiftUI/Data/SimulatorData.swift b/enzevalos_iphone/SwiftUI/Data/SimulatorData.swift index dfdd1c9705f59a493f40cd0ede0501d675567aba..7dc05e89ed83b0b14686642db30f8e41fabed909 100644 --- a/enzevalos_iphone/SwiftUI/Data/SimulatorData.swift +++ b/enzevalos_iphone/SwiftUI/Data/SimulatorData.swift @@ -147,7 +147,7 @@ struct PseuoMail: DisplayMail { var isRead: Bool = false - var date = Date() + var date: Date? = Date() var subject: String? = "Hello World" var subjectWithFlag: String? = "Hello World" diff --git a/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift b/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift index df12d3661c82e1f554e7355ee38448d9df73f41e..86785fed0ce2c998023bf71de1d7f54a45b3f20a 100644 --- a/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift +++ b/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift @@ -10,9 +10,9 @@ import SwiftUI struct Inbox: View { @Environment(\.managedObjectContext) var managedObjectContext - @FetchRequest(fetchRequest: KeyRecord.allRecordsFetchRequest(in: Folder.inbox)) var keyrecords: FetchedResults<KeyRecord> + @FetchRequest(fetchRequest: MailRecord.allMailsFetchRequest(in: MailHandler.INBOX)) var keyrecords: FetchedResults<MailRecord> - @ObservedObject var folder = Folder.inbox + //@ObservedObject var folder = Folder.inbox @State var updating = false @State var showUser = false @@ -20,7 +20,7 @@ struct Inbox: View { @State var searchField = 0 @State var searchNow = false - let coord: InboxCoordinator + let coord: InboxCoordinator<MailRecord, AddressRecord> var body: some View { VStack{ @@ -48,7 +48,8 @@ struct Inbox: View { private var mailList: some View { List (self.keyrecords.filter(filterKeyRecord), id: \.self){ record in - KeyRecordRow(keyrecord: record) + //KeyRecordRow(keyrecord: record) + MailView(mail: record) } .resignKeyboardOnDragGesture() // hide keyboard when dragging } @@ -61,7 +62,7 @@ struct Inbox: View { private var idButton: some View { Button(action: { - self.coord.pushRecordView(record: self.userRecord) + // self.coord.pushRecordView(record: self.userRecord) }, label: { Text(NSLocalizedString("KeyID", comment: "id")) }) @@ -76,7 +77,7 @@ struct Inbox: View { private var lastUpdate: some View { var text = NSLocalizedString("Updating", comment: "updating...") if !updating { - if let last = Folder.inbox.lastUpdate { + if let last = Date() as? Date {// TODO Folder.inbox.lastUpdate { let dateFormatter = DateFormatter() dateFormatter.locale = Locale.current dateFormatter.timeStyle = .medium @@ -92,7 +93,7 @@ struct Inbox: View { }) } - + /* var userRecord: KeyRecord { get { let keyID = UserManager.loadUserValue(Attribute.prefSecretKeyID) as? String @@ -100,33 +101,34 @@ struct Inbox: View { return DataHandler.handler.getKeyRecord(addr: addr, keyID: keyID) } } + */ func updateMails() { guard !updating else { return } - AppDelegate.getAppDelegate().mailHandler.updateFolder(folder: Folder.inbox, completionCallback: {_ in + /*AppDelegate.getAppDelegate().mailHandler.updateFolder(folder: Folder.inbox, completionCallback: {_ in self.updating = false - }) + })*/ updating = true } - func filterKeyRecord(keyRecord: KeyRecord) -> Bool { + func filterKeyRecord(keyRecord: MailRecord) -> Bool { let searchType = SearchType.findType(i: searchField) if self.searchText.isEmpty || self.searchText == NSLocalizedString("Searchbar.Title", comment: "Search") { return true } let query = self.searchText.lowercased() - if (searchType == .All || searchType == .Sender) && containsSearchTerms(content: keyRecord.name, searchText: query){ + if (searchType == .All || searchType == .Sender) && (containsSearchTerms(content: keyRecord.sender.displayname, searchText: query) || containsSearchTerms(content: keyRecord.sender.email, searchText: query)) { return true } else if (searchType == .All || searchType == .Sender) && keyRecord.addresses.filter({containsSearchTerms(content: $0.mailAddress, searchText: query)}).count > 0 { return true } - else if (searchType == .All || searchType == .Subject) && keyRecord.mails.filter({containsSearchTerms(content: $0.subject, searchText: query)}).count > 0 { + else if (searchType == .All || searchType == .Subject) && containsSearchTerms(content: keyRecord.subject, searchText: query){ return true } - else if (searchType == .All || searchType == .Body) && keyRecord.mails.filter({containsSearchTerms(content: $0.body, searchText: query)}).count > 0 { + else if (searchType == .All || searchType == .Body) && containsSearchTerms(content: keyRecord.body, searchText: query){ return true } return false diff --git a/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift b/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift index 8054fa0c6e7c48dba317e595746cf83a17249660..c9e089c9068fc8e8ad6a4fc95c7351204781f9fe 100644 --- a/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift +++ b/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift @@ -63,9 +63,10 @@ class InboxCoordinator <M: MailRecord, C: DisplayContact> { readCoord.pushReadView(mail: mail) } else { let vc = mainStoryboard.instantiateViewController(withIdentifier: ViewID.ReadView.rawValue) + /* if let vc = vc as? ReadViewController { vc.mail = mail - } + }*/ root.isToolbarHidden = false root.pushViewController(vc, animated: true) } @@ -74,18 +75,18 @@ class InboxCoordinator <M: MailRecord, C: DisplayContact> { // TODO FIX!!! Was ist ein Record? Key oder address? func pushRecordView(record: C){ let vc = mainStoryboard.instantiateViewController(withIdentifier: ViewID.KeyRecordView.rawValue) - if let vc = vc as? ContactViewController { + /*if let vc = vc as? ContactViewController { vc.keyRecord = record - } + }*/ root.isToolbarHidden = false root.pushViewController(vc, animated: true) } func pushComposeView() { let vc = mainStoryboard.instantiateViewController(identifier: ViewID.ComposeView.rawValue) - if let vc = vc as? SendViewController { + /*if let vc = vc as? SendViewController { vc.wasPushed = true - } + }*/ root.isToolbarHidden = true root.pushViewController(vc, animated: true) } @@ -93,9 +94,9 @@ class InboxCoordinator <M: MailRecord, C: DisplayContact> { // TODO FIX!!! Was ist ein Record? Key oder address? func pushMailListView(record: C) { let vc = mainStoryboard.instantiateViewController(identifier: ViewID.MailListView.rawValue) - if let vc = vc as? ListViewController { + /*if let vc = vc as? ListViewController { vc.contact = record - } + }*/ root.isToolbarHidden = true root.pushViewController(vc, animated: true) } diff --git a/enzevalos_iphone/SwiftUI/Read/ReadViewCoordinator.swift b/enzevalos_iphone/SwiftUI/Read/ReadViewCoordinator.swift index 339f3cf2e8aa77bd1bab9478dd000ce68a55ea4d..f4d7dab481c9a6c219102c77ca7e65388070d48a 100644 --- a/enzevalos_iphone/SwiftUI/Read/ReadViewCoordinator.swift +++ b/enzevalos_iphone/SwiftUI/Read/ReadViewCoordinator.swift @@ -89,19 +89,21 @@ class ReadViewCoordinator <M: DisplayMail, C: DisplayContact> { if let subject = subject, let body = body, let responseType = responseType { prefilledMail = EphemeralMail(to: NSSet.init(array: to), cc: NSSet.init(array: cc), bcc: NSSet.init(array: bcc), date: Date(), subject: responseType.addPrefix(subject: subject), body: body, uid: 0, predecessor: nil) } - if let vc = vc as? SendViewController { + /* + TODOif let vc = vc as? SendViewController { vc.wasPushed = true vc.prefilledMail = prefilledMail - } + }*/ root.isToolbarHidden = false root.pushViewController(vc, animated: true) } func pushContactView(contact: C) { let vc = mainStoryboard.instantiateViewController(withIdentifier: ViewID.KeyRecordView.rawValue) + /* if let vc = vc as? ContactViewController { vc.keyRecord = contact - } + }*/ root.isToolbarHidden = false root.pushViewController(vc, animated: true) } @@ -112,11 +114,8 @@ class ReadViewCoordinator <M: DisplayMail, C: DisplayContact> { } /// AskUserToImportSK, ImportSK, ImportPK, MoreInformation, ExportSK, OK, IgnoreWarning, SendPK - func ignoreMail <M: DisplayMail> (mail: M) { - guard let m = mail.persistentMail else { - return - } - delete(mail: m) + func ignoreMail(mail: M) { + delete(mail: mail) } func invitePerson <M: DisplayMail> (mail: M) { let body = String(format: NSLocalizedString("inviteText", comment: "Body for the invitation mail"),StudySettings.studyID) @@ -161,7 +160,7 @@ class ReadViewCoordinator <M: DisplayMail, C: DisplayContact> { time.dateStyle = .short time.timeStyle = .short time.locale = Locale.current - body.append(" " + NSLocalizedString("sent at", comment: "describing when the mail was send") + " " + time.string(from: mail.date)) + body.append(" " + NSLocalizedString("sent at", comment: "describing when the mail was send") + " " + time.string(from: mail.date ?? Date())) body.append("\n" + NSLocalizedString("To", comment: "describing adressee") + ": ") for addr in mail.tos { body.append("\(addr.addr), ") diff --git a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift index 9b5a3eabb5c4ead9f6334ba3a180bccccf79b8a8..351368e3a8c13967c60a57a872d5b7bd955fc448 100644 --- a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift +++ b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift @@ -162,11 +162,11 @@ struct SenderViewMain <M: DisplayMail>: View { } private func goToContact(contact: DisplayContact) { - guard let con = contact.keyRecord else { + /* guard let con = contact.keyRecord else { print("No record...") return } - AppDelegate.getAppDelegate().readViewCoordinator?.pushContactView(contact: con) + AppDelegate.getAppDelegate().readViewCoordinator?.pushContactView(contact: con) */ } } diff --git a/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift b/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift index 3fe0d949a1bdd4f7b740665c4215d5025a7fcd0f..f897d155128cbb38171c444f114f890e3dd694cd 100644 --- a/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift +++ b/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift @@ -26,7 +26,7 @@ struct MailView <M: DisplayMail>: View { .frame(minWidth: 10, maxWidth: 200, alignment: .leading) .lineLimit(1) Spacer() - Text(mail.date.dateToString) + Text(mail.date?.dateToString ?? Date().dateToString) .font(.footnote) } } @@ -48,3 +48,15 @@ struct MailView <M: DisplayMail>: View { } + +struct MailView_Previews: PreviewProvider { + static let simulator = Simulators<MailView<PseuoMail>>() + static let deviceNames: [String] = [ + "iPhone SE", + "iPhone 11 Pro Max" + ] + + static var previews: some View { + simulator.previews(view: MailView(mail: DummyData.SecureMail))//DummyData.SecureMail)) + } +} diff --git a/enzevalos_iphone/SwiftUI/SupportingViews/SwiftUI to UIKit/SelectableTextView.swift b/enzevalos_iphone/SwiftUI/SupportingViews/SwiftUI to UIKit/SelectableTextView.swift index f8f8f7b645191532f77f1e376fee3cc35b0fd7e1..c07b29f9293f8f04e02ad4035e7100cdcbde4f9f 100644 --- a/enzevalos_iphone/SwiftUI/SupportingViews/SwiftUI to UIKit/SelectableTextView.swift +++ b/enzevalos_iphone/SwiftUI/SupportingViews/SwiftUI to UIKit/SelectableTextView.swift @@ -13,8 +13,8 @@ class TextViewDelegate:NSObject, UITextViewDelegate { func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { if url.scheme == "mailto" { if let coord = AppDelegate.getAppDelegate().readViewCoordinator { - let to = DataHandler.handler.getMailAddress(url.absoluteString.replacingOccurrences(of: "mailto:", with: ""), temporary: true) - coord.pushComposeView(to: [to], cc: [], bcc: [], subject: "", body: "", responseType: .Reply) + let to = [MailAddress] () //DataHandler.handler.getMailAddress(url.absoluteString.replacingOccurrences(of: "mailto:", with: ""), temporary: true) + coord.pushComposeView(to: to, cc: [], bcc: [], subject: "", body: "", responseType: .Reply) } return false } diff --git a/enzevalos_iphone/TempAttachment.swift b/enzevalos_iphone/TempAttachment.swift index 9b8acbdd57692027c3f31cfa1a1ca0c9d3e181e7..3950136341686edce8167d26057555b768a6d3b4 100644 --- a/enzevalos_iphone/TempAttachment.swift +++ b/enzevalos_iphone/TempAttachment.swift @@ -62,7 +62,7 @@ class TempAttachment: Hashable { return lhs.name == rhs.name && lhs.mimeType == rhs.mimeType } - func equal(at: Attachment) -> Bool { + func equal(at: AttachmentRecord) -> Bool { if let n = at.name, let t = at.mimeType { return name == n && mimeType == MIMETYPE.init(rawValue: t) } diff --git a/enzevalos_iphone/TempKey.swift b/enzevalos_iphone/TempKey.swift index f1bb6b0d3afd562b9a3f77bb9d366617ecfdfbe0..90b146aa593150a88ca2ca570e28c5ae70fff9c9 100644 --- a/enzevalos_iphone/TempKey.swift +++ b/enzevalos_iphone/TempKey.swift @@ -117,6 +117,10 @@ class TempKey: DisplayKey { } extension SecretKeyRecord: DisplayKey { + var keyID: String { + return fingerprint ?? "" + } + var importDate: Date { if let date = self.importedDate { return date as Date @@ -137,6 +141,10 @@ extension SecretKeyRecord: DisplayKey { } extension PublicKeyRecord: DisplayKey { + var keyID: String { + return fingerprint ?? "" + } + var importDate: Date { if let date = self.discoveryDate { return date diff --git a/enzevalos_iphone/de.lproj/LaunchScreen.storyboard b/enzevalos_iphone/de.lproj/LaunchScreen.storyboard deleted file mode 100644 index 2e4cb45d92bb8ef43483a908f5acea4ef1cdd1cb..0000000000000000000000000000000000000000 --- a/enzevalos_iphone/de.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> - <dependencies> - <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/> - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> - </dependencies> - <scenes> - <!--View Controller--> - <scene sceneID="EHf-IW-A2E"> - <objects> - <viewController id="01J-lp-oVM" sceneMemberID="viewController"> - <layoutGuides> - <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/> - <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/> - </layoutGuides> - <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> - <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> - </view> - </viewController> - <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> - </objects> - <point key="canvasLocation" x="53" y="375"/> - </scene> - </scenes> -</document> diff --git a/enzevalos_iphone/en.lproj/LaunchScreen.storyboard b/enzevalos_iphone/en.lproj/LaunchScreen.storyboard deleted file mode 100644 index 2e4cb45d92bb8ef43483a908f5acea4ef1cdd1cb..0000000000000000000000000000000000000000 --- a/enzevalos_iphone/en.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> - <dependencies> - <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/> - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> - </dependencies> - <scenes> - <!--View Controller--> - <scene sceneID="EHf-IW-A2E"> - <objects> - <viewController id="01J-lp-oVM" sceneMemberID="viewController"> - <layoutGuides> - <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/> - <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/> - </layoutGuides> - <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> - <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> - </view> - </viewController> - <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> - </objects> - <point key="canvasLocation" x="53" y="375"/> - </scene> - </scenes> -</document> diff --git a/enzevalos_iphone/mail/IncomingMail.swift b/enzevalos_iphone/mail/IncomingMail.swift index 12fc5c6d1ff3e91dc2c480dc3d1e85d3bbd07364..f039ccfe3da9a8d97f0f8dc54d2fbd889a08e20a 100644 --- a/enzevalos_iphone/mail/IncomingMail.swift +++ b/enzevalos_iphone/mail/IncomingMail.swift @@ -147,11 +147,12 @@ class IncomingMail { keyIds.append(contentsOf: newAutocrypPublicKeys) keyIds.append(contentsOf: newPublicKeys) if let fromAdr = from?.mailbox{ + /* TODO if let adr = DataHandler.handler.findMailAddress(adr: fromAdr) { for k in adr.publicKeys { keyIds.append(k.keyID) } - } + }*/ } return keyIds } @@ -183,7 +184,7 @@ class IncomingMail { private var body: String = "" private var encryptedBody: String? private var secretKeys: [String] = [] - private var relaedSecrectKey: SecretKey? = nil + private var relatedSecrectKey: SecretKeyRecord? = nil private var newPublicKeys: [String] = [] private var newAutocrypPublicKeys: [String] = [] private var newSecretKeyIDs: [String]? = [] @@ -205,19 +206,21 @@ class IncomingMail { } var decryptionKeyIDs: [String] { get { - let secretkeys = DataHandler.handler.findSecretKeys() + let secretkeys = [SecretKeyRecord]() //TODO DataHandler.handler.findSecretKeys() var decIds = [String]() for sk in secretkeys { - decIds.append(sk.keyID) + if let id = sk.fingerprint { + decIds.append(id) + } } return decIds } } var primaryDecryptionKeyID: String? { - if let sk = DataHandler.handler.prefSecretKey() { + /* TODOif let sk = DataHandler.handler.prefSecretKey() { return sk.keyID - } + }*/ return nil } @@ -276,6 +279,7 @@ class IncomingMail { return m } + /* TODO func store(keyRecord: KeyRecord?) -> PersistentMail? { let sk = secretKeys.first //TODO FIX: may import more secret keys? let mail = DataHandler.handler.createMail(uID, sender: from, receivers: rec, cc: cc, time: date, received: true, subject: subject, body: body, readableAttachments: readableAttachments, flags: flags, record: keyRecord, autocrypt: autocrypt, decryptedData: cryptoObj, folderPath: folderPath, secretKey: sk, references: references, mailagent: userAgent, messageID: msgID, encryptedBody: encryptedBody, storeEncrypted: storeEncrypted, attachedSignature: attachedSignature) @@ -323,6 +327,7 @@ class IncomingMail { } return mail } + */ private func parseBody() { var isEncrypted = false @@ -335,11 +340,7 @@ class IncomingMail { if let cryptoObject = cryptoObj, cryptoObject.encryptionState == .ValidedEncryptedWithCurrentKey || cryptoObject.encryptionState == .ValidEncryptedWithOldKey { readableAttachments = parseUserReadableAttachments(parser: msgParser, sentEncrypted: true) - repealAttachments = readableAttachments.filter({$0.mimeType == .travelRepeal}) useAttachments = readableAttachments.filter({$0.mimeType == .travelUse}) - callForRepealMail = repealAttachments.count > 0 - callForUseMail = !callForRepealMail && useAttachments.count > 0 - travelMail = callForRepealMail || callForUseMail } readableAttachments=parseUserReadableAttachments(parser: msgParser) diff --git a/enzevalos_iphone/persistentData/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents b/enzevalos_iphone/persistentData/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents index 8248d51ba153eb870a0af7a81909b2c73508671d..eb871de9b077117cacd489d0e84f7b696f61146f 100644 --- a/enzevalos_iphone/persistentData/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents +++ b/enzevalos_iphone/persistentData/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents @@ -52,6 +52,7 @@ <attribute name="messageID" attributeType="String"/> <attribute name="signatureStateInt" attributeType="Integer 16" minValueString="-1" maxValueString="2" defaultValueString="0" usesScalarValueType="YES"/> <attribute name="subject" attributeType="String"/> + <attribute name="uID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/> <attribute name="xMailer" optional="YES" attributeType="String"/> <relationship name="attachedAutocryptPublicKey" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="PublicKeyRecord" inverseName="sendWithAutocryptHeader" inverseEntity="PublicKeyRecord"/> <relationship name="attachedPublicKeys" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="PublicKeyRecord" inverseName="sendWithMail" inverseEntity="PublicKeyRecord"/> @@ -96,7 +97,7 @@ <element name="AddressRecord" positionX="-36" positionY="27" width="128" height="163"/> <element name="AttachmentRecord" positionX="0" positionY="144" width="128" height="133"/> <element name="FolderRecord" positionX="27" positionY="135" width="128" height="193"/> - <element name="MailRecord" positionX="-54" positionY="-9" width="128" height="28"/> + <element name="MailRecord" positionX="-54" positionY="-9" width="128" height="343"/> <element name="PublicKeyRecord" positionX="9" positionY="63" width="128" height="223"/> <element name="SecretKeyRecord" positionX="-9" positionY="63" width="128" height="118"/> </elements> diff --git a/enzevalos_iphone/persistentData/FolderRecord.swift b/enzevalos_iphone/persistentData/FolderRecord.swift index 4a9dd1384fb74b7b1b6db842993b6440ac32135b..0162b6fcfc527effc719307dba0c00627ede7370 100644 --- a/enzevalos_iphone/persistentData/FolderRecord.swift +++ b/enzevalos_iphone/persistentData/FolderRecord.swift @@ -32,4 +32,14 @@ extension FolderRecord { } path = properties.path } + + var uids: MCOIndexSet { + get { + let indexSet = MCOIndexSet() + if let set = self.mailsInFolder, set.count > 0, let mails = set.allObjects as? [MailRecord] { + // TODO mails.forEach{indexSet.add($0.uID)} + } + return indexSet + } + } } diff --git a/enzevalos_iphone/persistentData/MailRecord.swift b/enzevalos_iphone/persistentData/MailRecord.swift index 39249a3b9e8ee6f9662ddc14cfe1cadd2c73d3f6..e0fd1cb1ee13d12f351174fdc7a85eb32892cfb4 100644 --- a/enzevalos_iphone/persistentData/MailRecord.swift +++ b/enzevalos_iphone/persistentData/MailRecord.swift @@ -18,7 +18,11 @@ self.keyDiscoveryDate = mail?.from.contact?.firstSecureMailReceived isNewPubKey -> First mail with a new public key + add attached Signature? */ + +import CoreData + extension MailRecord { static let entityName = "MailRecord" @@ -66,23 +70,40 @@ extension MailRecord { } return [] } - - // TODO: Change Flag! - var isRead: Bool { + + var messageFlag: MCOMessageFlag { get { - let mcoflag = MCOMessageFlag.init(rawValue: Int(flag)) - let value = mcoflag.contains(MCOMessageFlag.seen) - return value + return MCOMessageFlag.init(rawValue: Int(flag)) } } - var messageFlag: MCOMessageFlag { - get { - return MCOMessageFlag.init(rawValue: Int(flag)) + /** + Just a short part of the body. Can be used for a preview. + In case of trouble there is no preview. + */ + var shortBodyString: String? { + guard self.signatureState == .InvalidSignature || self.encryptionState == .UnableToDecrypt else { + return nil + } + guard var body = body else { + return nil + } + + + body = body.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + if body.count > 50 { + body = String(body[..<body.index(body.startIndex, offsetBy: 50)]) } + let messageArray = body.components(separatedBy: "\n") + return messageArray.joined(separator: " ") + } +} + +extension MailRecord: DisplayMail { - var subjectWithFlag: String { + + var subjectWithFlag: String? { let subj: String var returnString: String = "" if let subject = self.subject { @@ -105,30 +126,25 @@ extension MailRecord { return "\(returnString)\(subj)" } - /** - Just a short part of the body. Can be used for a preview. - In case of trouble there is no preview. - */ - var shortBodyString: String? { - guard self.signatureState == .InvalidSignature || self.encryptionState == .UnableToDecrypt else { - return nil - } - guard var body = body else { - return nil + + var isRead: Bool { + get { + let mcoflag = MCOMessageFlag.init(rawValue: Int(flag)) + let value = mcoflag.contains(MCOMessageFlag.seen) + return value } - - - body = body.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) - if body.count > 50 { - body = String(body[..<body.index(body.startIndex, offsetBy: 50)]) + set { + var mcoflag = MCOMessageFlag.init(rawValue: Int(flag)) + mcoflag = mcoflag.update(with: .seen) ?? mcoflag + self.flag = Int16(mcoflag.rawValue) + } - let messageArray = body.components(separatedBy: "\n") - return messageArray.joined(separator: " ") - } -} - -extension MailRecord: DisplayMail { + + var encState: EncryptionState { + return encryptionState + } + typealias C = AddressRecord var sender: C { @@ -198,6 +214,27 @@ extension MailRecord: DisplayMail { return true } } - - } + +extension MailRecord { + static func allMailsFetchRequest(in folderpath: String) -> NSFetchRequest<MailRecord> { + let request: NSFetchRequest<MailRecord> = NSFetchRequest<MailRecord>(entityName: MailRecord.entityName) + request.predicate = NSPredicate(format: "iFnolder.path == %@", folderpath) + request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)] + return request + } + + static func allRecordsFetchRequest(in folderPath: String, query: String) -> NSFetchRequest<MailRecord> { + let request = MailRecord.allMailsFetchRequest(in: folderPath) + if !query.isEmpty { + let name = NSPredicate(format: "name CONTAINS %@", query) + if let prePredicates = request.predicate { + request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [prePredicates, name]) + } else { + request.predicate = name + } + } + return request + } +} + diff --git a/enzevalos_iphone/persistentData/PersistentDataProvider.swift b/enzevalos_iphone/persistentData/PersistentDataProvider.swift index 498ca2de77afc31240878b6b0180041059260f5b..54f0ea014e97e891495f76925428d8e48bacdf3a 100644 --- a/enzevalos_iphone/persistentData/PersistentDataProvider.swift +++ b/enzevalos_iphone/persistentData/PersistentDataProvider.swift @@ -29,7 +29,7 @@ Reload mails for record loadMailsForRecord(contact!, folderPath: UserManager.bac find public or secret keys find address by name find folder by name - + //TODO look for not verified signed mails. */ class PersitentDataProvider { static let dataProvider = PersitentDataProvider()