diff --git a/README.md b/README.md index acbc52d0ebcc87a4a9cb6e280659d96235fb594c..54dcbc175594c4656fa66d449c06aab9c4987dec 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,4 @@ Please try to adhere to the [Github Swift Style Guide](https://github.com/github (If you want it super specific, there is also the very deep [Ray Wenderlich Guide](https://github.com/raywenderlich/swift-style-guide)) -You can use the [Swimat Plugin](https://github.com/Jintin/Swimat) to do parts of that automatically. - -## Links for conversion from Swift 2 to Swift 3 -- https://www.avanderlee.com/swift/swift-3-conversion-refactoring-project/ \ No newline at end of file +You can use the [Swimat Plugin](https://github.com/Jintin/Swimat) to do parts of that automatically. \ No newline at end of file diff --git a/enzevalos_iphone.xcodeproj/project.pbxproj b/enzevalos_iphone.xcodeproj/project.pbxproj index dc05be71a3bd3af4182e2b2f03af2707ed71d077..11e0be1c6d2d7681165e231234248c892f46e44c 100644 --- a/enzevalos_iphone.xcodeproj/project.pbxproj +++ b/enzevalos_iphone.xcodeproj/project.pbxproj @@ -92,8 +92,6 @@ A1C09FC61DF04D650006B783 /* alice2005-private.gpg in Resources */ = {isa = PBXBuildFile; fileRef = A1C09FC51DF04D650006B783 /* alice2005-private.gpg */; }; A1C3270E1DB907D900CE2ED5 /* TextFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C3270D1DB907D900CE2ED5 /* TextFormatter.swift */; }; A1C3DEEC1E0AB15300EB7D02 /* InitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A11E733B1E019AE3006574DD /* InitViewController.swift */; }; - A1C7FF8F1E895367000D1E92 /* quizer1-public.asc in Resources */ = {isa = PBXBuildFile; fileRef = A1C7FF8E1E895367000D1E92 /* quizer1-public.asc */; }; - A1C7FF911E8955BD000D1E92 /* quizer1-private.asc in Resources */ = {isa = PBXBuildFile; fileRef = A1C7FF901E8955BD000D1E92 /* quizer1-private.asc */; }; A1D5076F1E80257A00B68B38 /* KeyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1D5076E1E80257A00B68B38 /* KeyViewController.swift */; }; A1E81B671DCA296200535F98 /* UIViewResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E81B661DCA296200535F98 /* UIViewResolver.swift */; }; A1EB057A1D956829008659C1 /* ContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05791D956829008659C1 /* ContactCell.swift */; }; @@ -122,6 +120,12 @@ F12041FD1DA409A5002E4940 /* ListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12041FC1DA409A5002E4940 /* ListViewCell.swift */; }; F12060801DA540FE00F6EF37 /* RefreshControlExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F120607F1DA540FE00F6EF37 /* RefreshControlExtension.swift */; }; F12060821DA552FC00F6EF37 /* MailHandlerDelegator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12060811DA552FC00F6EF37 /* MailHandlerDelegator.swift */; }; + F14D189C1ED880680080515D /* nchr-private.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F14D18981ED880680080515D /* nchr-private.gpg */; }; + F14D189D1ED880680080515D /* nchr-public.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F14D18991ED880680080515D /* nchr-public.gpg */; }; + F14D189E1ED880680080515D /* ncpayroll-private.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F14D189A1ED880680080515D /* ncpayroll-private.gpg */; }; + F14D189F1ED880680080515D /* ncpayroll-public.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F14D189B1ED880680080515D /* ncpayroll-public.gpg */; }; + F14D18A21ED8811F0080515D /* ullimuelle-private.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F14D18A01ED8811F0080515D /* ullimuelle-private.gpg */; }; + F14D18A31ED8811F0080515D /* ullimuelle-public.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F14D18A11ED8811F0080515D /* ullimuelle-public.gpg */; }; F189C17F1ED59FEF00BAE9B3 /* idsolutions-private.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F189C17D1ED59FEF00BAE9B3 /* idsolutions-private.gpg */; }; F189C1801ED59FEF00BAE9B3 /* idsolutions-public.gpg in Resources */ = {isa = PBXBuildFile; fileRef = F189C17E1ED59FEF00BAE9B3 /* idsolutions-public.gpg */; }; F18B445E1E7044B70080C041 /* FlipTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = F18B445D1E7044B70080C041 /* FlipTransition.swift */; }; @@ -277,19 +281,17 @@ A16BA2111E0439B6005E29E3 /* providers.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; lineEnding = 0; path = providers.json; sourceTree = "<group>"; }; A172F90C1E4CD37D00F2A136 /* PGPTemporaryDecryptionObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PGPTemporaryDecryptionObject.swift; sourceTree = "<group>"; }; A17A18F61DDCBE530058D934 /* PGPKeyWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PGPKeyWrapper.swift; sourceTree = "<group>"; }; - A17A18F81DDCCF370058D934 /* JakobBode.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = JakobBode.asc; sourceTree = "<group>"; }; + A17A18F81DDCCF370058D934 /* JakobBode.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = JakobBode.asc; path = keys/JakobBode.asc; sourceTree = "<group>"; }; A17BEB371E55E21700403EBE /* PGPTemporaryDecryptionObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PGPTemporaryDecryptionObject.h; sourceTree = "<group>"; }; A17BEB381E55E3DD00403EBE /* PGPTemporaryDecryptionObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PGPTemporaryDecryptionObject.m; sourceTree = "<group>"; }; A17C04831DC6504E00F66EDB /* LogHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogHandler.swift; sourceTree = "<group>"; }; A198270D1D9A8ABC0027F65C /* enzevalos_iphone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "enzevalos_iphone-Bridging-Header.h"; sourceTree = "<group>"; }; - A19C12461DE602FF007F72E7 /* jabo.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = jabo.asc; sourceTree = "<group>"; }; - A1B8C0191DD5D9B10044A358 /* alice2005-2.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "alice2005-2.gpg"; sourceTree = "<group>"; }; + A19C12461DE602FF007F72E7 /* jabo.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = jabo.asc; path = keys/jabo.asc; sourceTree = "<group>"; }; + A1B8C0191DD5D9B10044A358 /* alice2005-2.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "alice2005-2.gpg"; path = "keys/alice2005-2.gpg"; sourceTree = "<group>"; }; A1BE3FF71E9664660040114B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; A1BE3FF91E96646A0040114B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; }; - A1C09FC51DF04D650006B783 /* alice2005-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "alice2005-private.gpg"; sourceTree = "<group>"; }; + A1C09FC51DF04D650006B783 /* alice2005-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "alice2005-private.gpg"; path = "keys/alice2005-private.gpg"; sourceTree = "<group>"; }; A1C3270D1DB907D900CE2ED5 /* TextFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFormatter.swift; sourceTree = "<group>"; }; - A1C7FF8E1E895367000D1E92 /* quizer1-public.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "quizer1-public.asc"; sourceTree = "<group>"; }; - A1C7FF901E8955BD000D1E92 /* quizer1-private.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "quizer1-private.asc"; sourceTree = "<group>"; }; A1D5076E1E80257A00B68B38 /* KeyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyViewController.swift; sourceTree = "<group>"; }; A1E81B661DCA296200535F98 /* UIViewResolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewResolver.swift; sourceTree = "<group>"; }; A1EB05791D956829008659C1 /* ContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactCell.swift; sourceTree = "<group>"; }; @@ -318,7 +320,7 @@ A1F9923A1DA7DD2E0073BF1B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/InboxTableViewCell.xib; sourceTree = "<group>"; }; A1F9923D1DA7DD350073BF1B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InboxTableViewCell.strings; sourceTree = "<group>"; }; A1F9923F1DA7DD370073BF1B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InboxTableViewCell.strings; sourceTree = "<group>"; }; - A1FA3F6B1E78565B0093C0B6 /* alice2005-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "alice2005-public.gpg"; sourceTree = "<group>"; }; + A1FA3F6B1E78565B0093C0B6 /* alice2005-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "alice2005-public.gpg"; path = "keys/alice2005-public.gpg"; sourceTree = "<group>"; }; AE7C40F081DAC9A0A130BE21 /* Pods-enzevalos_iphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone.debug.xcconfig"; path = "../workspace/Pods/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone.debug.xcconfig"; sourceTree = "<group>"; }; C7733DFEFB7E7CFF38EC1665 /* Pods-enzevalos_iphoneTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.release.xcconfig"; path = "../workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.release.xcconfig"; sourceTree = "<group>"; }; C9B9CE43043CF806E1C02FCA /* Pods_enzevalos_iphoneTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_enzevalos_iphoneTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -327,8 +329,14 @@ F12041FC1DA409A5002E4940 /* ListViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewCell.swift; sourceTree = "<group>"; }; F120607F1DA540FE00F6EF37 /* RefreshControlExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshControlExtension.swift; sourceTree = "<group>"; }; F12060811DA552FC00F6EF37 /* MailHandlerDelegator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailHandlerDelegator.swift; sourceTree = "<group>"; }; - F189C17D1ED59FEF00BAE9B3 /* idsolutions-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "idsolutions-private.gpg"; sourceTree = "<group>"; }; - F189C17E1ED59FEF00BAE9B3 /* idsolutions-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "idsolutions-public.gpg"; sourceTree = "<group>"; }; + F14D18981ED880680080515D /* nchr-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "nchr-private.gpg"; path = "keys/nchr-private.gpg"; sourceTree = "<group>"; }; + F14D18991ED880680080515D /* nchr-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "nchr-public.gpg"; path = "keys/nchr-public.gpg"; sourceTree = "<group>"; }; + F14D189A1ED880680080515D /* ncpayroll-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "ncpayroll-private.gpg"; path = "keys/ncpayroll-private.gpg"; sourceTree = "<group>"; }; + F14D189B1ED880680080515D /* ncpayroll-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "ncpayroll-public.gpg"; path = "keys/ncpayroll-public.gpg"; sourceTree = "<group>"; }; + F14D18A01ED8811F0080515D /* ullimuelle-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "ullimuelle-private.gpg"; path = "keys/ullimuelle-private.gpg"; sourceTree = "<group>"; }; + F14D18A11ED8811F0080515D /* ullimuelle-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "ullimuelle-public.gpg"; path = "keys/ullimuelle-public.gpg"; sourceTree = "<group>"; }; + F189C17D1ED59FEF00BAE9B3 /* idsolutions-private.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "idsolutions-private.gpg"; path = "keys/idsolutions-private.gpg"; sourceTree = "<group>"; }; + F189C17E1ED59FEF00BAE9B3 /* idsolutions-public.gpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "idsolutions-public.gpg"; path = "keys/idsolutions-public.gpg"; sourceTree = "<group>"; }; F18B445D1E7044B70080C041 /* FlipTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlipTransition.swift; sourceTree = "<group>"; }; F18B445F1E704C550080C041 /* ReplaceSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplaceSegue.swift; sourceTree = "<group>"; }; F18B44611E73286C0080C041 /* ReadVENDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadVENDelegate.swift; sourceTree = "<group>"; }; @@ -628,15 +636,19 @@ A1C7FF8B1E895316000D1E92 /* keys */ = { isa = PBXGroup; children = ( + F14D18981ED880680080515D /* nchr-private.gpg */, + F14D18991ED880680080515D /* nchr-public.gpg */, + F14D189A1ED880680080515D /* ncpayroll-private.gpg */, + F14D189B1ED880680080515D /* ncpayroll-public.gpg */, F189C17D1ED59FEF00BAE9B3 /* idsolutions-private.gpg */, F189C17E1ED59FEF00BAE9B3 /* idsolutions-public.gpg */, + F14D18A01ED8811F0080515D /* ullimuelle-private.gpg */, + F14D18A11ED8811F0080515D /* ullimuelle-public.gpg */, A1FA3F6B1E78565B0093C0B6 /* alice2005-public.gpg */, A1C09FC51DF04D650006B783 /* alice2005-private.gpg */, A1B8C0191DD5D9B10044A358 /* alice2005-2.gpg */, A17A18F81DDCCF370058D934 /* JakobBode.asc */, A19C12461DE602FF007F72E7 /* jabo.asc */, - A1C7FF901E8955BD000D1E92 /* quizer1-private.asc */, - A1C7FF8E1E895367000D1E92 /* quizer1-public.asc */, ); name = keys; sourceTree = "<group>"; @@ -830,14 +842,18 @@ 4761420A1E082F9C00FD5E4F /* Settings.bundle in Resources */, A19C12471DE602FF007F72E7 /* jabo.asc in Resources */, A16BA2121E0439B6005E29E3 /* providers.json in Resources */, - A1C7FF8F1E895367000D1E92 /* quizer1-public.asc in Resources */, F189C17F1ED59FEF00BAE9B3 /* idsolutions-private.gpg in Resources */, - A1C7FF911E8955BD000D1E92 /* quizer1-private.asc in Resources */, + F14D189D1ED880680080515D /* nchr-public.gpg in Resources */, + F14D189C1ED880680080515D /* nchr-private.gpg in Resources */, F189C1801ED59FEF00BAE9B3 /* idsolutions-public.gpg in Resources */, + F14D189E1ED880680080515D /* ncpayroll-private.gpg in Resources */, A1123E6A1DA682850069551C /* Localizable.strings in Resources */, A1F992291DA7C9100073BF1B /* Main.storyboard in Resources */, + F14D18A21ED8811F0080515D /* ullimuelle-private.gpg in Resources */, + F14D18A31ED8811F0080515D /* ullimuelle-public.gpg in Resources */, A1BE3FF61E9664660040114B /* InfoPlist.strings in Resources */, A17A18F91DDCCF370058D934 /* JakobBode.asc in Resources */, + F14D189F1ED880680080515D /* ncpayroll-public.gpg in Resources */, A1C09FC61DF04D650006B783 /* alice2005-private.gpg in Resources */, A13526861D955BDF00D3BFE1 /* LaunchScreen.storyboard in Resources */, A1EB05A41D956E32008659C1 /* Assets.xcassets in Resources */, diff --git a/enzevalos_iphone/AppDelegate.swift b/enzevalos_iphone/AppDelegate.swift index deee525fdf4fb70d443106ac72f4472039a57d47..b47b9dc081a5f1b983c66cea6813ddab7fd8bc33 100644 --- a/enzevalos_iphone/AppDelegate.swift +++ b/enzevalos_iphone/AppDelegate.swift @@ -78,6 +78,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { if reset == true{ var m = DataHandler.handler.countMails print("Mails: \(m)") + let mailhandler = MailHandler.init() + mailhandler.moveMails(mails: DataHandler.handler.mails, from: "INBOX", to: "ARCHIVE") DataHandler.handler.reset() m = DataHandler.handler.countMails print("Mails: \(m)") diff --git a/enzevalos_iphone/ContactViewController.swift b/enzevalos_iphone/ContactViewController.swift index aeab85858d7910a32506aba5c6467b1e22149c82..11004f618527a4a2e89ace533e16984a5de43957 100644 --- a/enzevalos_iphone/ContactViewController.swift +++ b/enzevalos_iphone/ContactViewController.swift @@ -13,10 +13,12 @@ import ContactsUI class ContactViewController: UIViewController { var keyRecord: KeyRecord? = nil + var hasKey: Bool = false var highlightEmail: String? = nil private var uiContact: CNContact? = nil private var vc: CNContactViewController? = nil fileprivate var otherRecords: [KeyRecord]? = nil + var isUser: Bool = false @IBOutlet weak var tableView: UITableView! @@ -33,7 +35,16 @@ class ContactViewController: UIViewController { self.navigationController?.navigationBar.barTintColor = ThemeManager.defaultColor if let con = keyRecord { - self.title = con.name + hasKey = EnzevalosEncryptionHandler.hasKey(con.ezContact) + + let myAddress = UserManager.loadUserValue(Attribute.userAddr) as! String + if con.addresses.contains(where: { $0.mailAddress.lowercased() == myAddress + }) { + self.title = NSLocalizedString("you", comment: "String decribing this as the account of the user") + isUser = true + } else { + self.title = con.name + } // self.title = CNContactFormatter.stringFromContact(con.ezContact.cnContact, style: .FullName) prepareContactSheet() @@ -190,12 +201,16 @@ extension ContactViewController: UITableViewDataSource { cell.contactImage.layer.cornerRadius = cell.contactImage.frame.height / 2 cell.contactImage.clipsToBounds = true cell.iconImage.image = drawStatusCircle() - if keyRecord!.isVerified { + if isUser { + cell.contactStatus.text = NSLocalizedString("thisIsYou", comment: "This contact is the user") + } else if keyRecord!.isVerified { cell.contactStatus.text = NSLocalizedString("Verified", comment: "Contact is verified") } else if keyRecord!.hasKey { cell.contactStatus.text = NSLocalizedString("notVerified", comment: "Contact is not verified jet") } else if (otherRecords?.filter({ $0.hasKey }).count ?? 0) > 0 { cell.contactStatus.text = NSLocalizedString("otherEncryption", comment: "Contact is using encryption, this is the unsecure collection") + } else if hasKey { + cell.contactStatus.text = NSLocalizedString("hasKeyButNoMail", comment: "We have a key to this contact but haven't received an encrypted mail jet") } else { cell.contactStatus.text = NSLocalizedString("noEncryption", comment: "Contact is not jet using encryption") } @@ -206,6 +221,8 @@ extension ContactViewController: UITableViewDataSource { actionCell.Button.setTitle(NSLocalizedString("verifyNow", comment: "Verify now"), for: UIControlState()) } else if (otherRecords?.filter({ $0.hasKey }).count ?? 0) > 0 { actionCell.Button.setTitle(NSLocalizedString("toEncrypted", comment: "switch to encrypted"), for: UIControlState()) + } else if hasKey { + actionCell.Button.setTitle(NSLocalizedString("verifyNow", comment: "Verify now"), for: UIControlState()) } else { actionCell.Button.setTitle(NSLocalizedString("invite", comment: "Invide contact to use encryption"), for: UIControlState()) } @@ -293,7 +310,7 @@ extension ContactViewController: UITableViewDataSource { if let record = keyRecord { switch section { case 0: - if !record.isVerified { + if !record.isVerified && !isUser { return 2 } case 1: @@ -330,7 +347,7 @@ extension ContactViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { if section == 0 { - return "Mit diesem Kontakt kommunizieren Sie zu 93% verschlüsselt und im Durchschnitt 2,3 x pro Woche." // Nur ein Test +// return "Mit diesem Kontakt kommunizieren Sie zu 93% verschlüsselt und im Durchschnitt 2,3 x pro Woche." // Nur ein Test } return nil } diff --git a/enzevalos_iphone/DataHandler.swift b/enzevalos_iphone/DataHandler.swift index 41147d0312fc9208f93f46fc72e9bcd0ba79ac0f..0b152b0d8861c6d7fbc20158f9c685812d30c7a0 100644 --- a/enzevalos_iphone/DataHandler.swift +++ b/enzevalos_iphone/DataHandler.swift @@ -12,25 +12,25 @@ import Contacts // FIXME: comparison operators with optionals were removed from the Swift Standard Libary. // Consider refactoring the code to use the non-optional operators. fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l < r - case (nil, _?): - return true - default: - return false - } + switch (lhs, rhs) { + case let (l?, r?): + return l < r + case (nil, _?): + return true + default: + return false + } } // FIXME: comparison operators with optionals were removed from the Swift Standard Libary. // Consider refactoring the code to use the non-optional operators. fileprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l > r - default: - return rhs < lhs - } + switch (lhs, rhs) { + case let (l?, r?): + return l > r + default: + return rhs < lhs + } } @@ -40,35 +40,35 @@ fileprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool { class DataHandler { static let handler: DataHandler = DataHandler() - + private var managedObjectContext: NSManagedObjectContext lazy var mails: [PersistentMail] = self.readMails() lazy var contacts: [EnzevalosContact] = self.getContacts() lazy var currentstate: State = self.getCurrentState() - + private let MaxRecords = 50 - private let MaxMailsPerRecord = 10 - + private let MaxMailsPerRecord = 100 + var receiverRecords: [KeyRecord] - - var maxUID:UInt64 { + + var maxUID: UInt64 { get { return currentstate.maxUID } } - - var countMails:Int{ + + var countMails: Int { get { return readMails().count } } - + var countContacts: Int { get { return getContacts().count } } - + func cleanCache() { for m in mails { managedObjectContext.delete(m) @@ -81,10 +81,10 @@ class DataHandler { currentstate.maxUID = 1 save() } - + init() { // This resource is the same name as your xcdatamodeld contained in your project. - guard let modelURL = Bundle.main.url(forResource: "enzevalos_iphone", withExtension:"momd") else { + guard let modelURL = Bundle.main.url(forResource: "enzevalos_iphone", withExtension: "momd") else { fatalError("Error loading model from bundle") } // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. @@ -94,9 +94,9 @@ class DataHandler { let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) self.managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) self.managedObjectContext.persistentStoreCoordinator = psc - + let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) - let docURL = urls[urls.endIndex-1] + let docURL = urls[urls.endIndex - 1] /* The directory the application uses to store the Core Data store file. This code uses a file named "DataModel.sqlite" in the application's documents directory. */ @@ -111,23 +111,23 @@ class DataHandler { managedObjectContext.mergePolicy = NSMergePolicy(merge: NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType); } - + func terminate() { cleanContacts() cleanMails() save() } - - func save(){ - do{ + + func save() { + do { try managedObjectContext.save() - } catch{ + } catch { fatalError("Failure to save context\(error)") } } - - - private func removeAll(entity:String){ + + + private func removeAll(entity: String) { let DelAllReqVar = NSBatchDeleteRequest(fetchRequest: NSFetchRequest<NSFetchRequestResult>(entityName: entity)) do { try managedObjectContext.execute(DelAllReqVar) @@ -136,13 +136,13 @@ class DataHandler { print(error) } } - - - - - func reset(){ + + + + + func reset() { removeAll(entity: "EnzevalosContact") - removeAll(entity:"PersistentMail") + removeAll(entity: "PersistentMail") removeAll(entity: "Mail_Address") removeAll(entity: "State") mails.removeAll() @@ -150,401 +150,401 @@ class DataHandler { receiverRecords.removeAll() currentstate.maxUID = 1 } - + private func cleanContacts() { if countContacts > MaxRecords { - for _ in 0...(countContacts - MaxRecords) { + for _ in 0...(countContacts - MaxRecords) { let c = contacts.last! as EnzevalosContact - if !c.hasKey{ - for m in c.from{ - managedObjectContext.delete(m as NSManagedObject) - if let index = mails.index(of: m) { - mails.remove(at: index) - } + if !c.hasKey { + for m in c.from { + managedObjectContext.delete(m as NSManagedObject) + if let index = mails.index(of: m) { + mails.remove(at: index) } + } contacts.removeLast() managedObjectContext.delete(c) } + } + receiverRecords = getRecords() } - receiverRecords = getRecords() } - } - - private func cleanMails() { - for c in contacts { - while c.from.count > MaxMailsPerRecord { - let last = c.from.last! - print("delete \(last.uid) of \(last.from.mailAddress)") - managedObjectContext.delete(last) - save() - if let index = mails.index(of: last) { + + private func cleanMails() { + for c in contacts { + while c.from.count > MaxMailsPerRecord { + let last = c.from.last! + print("delete \(last.uid) of \(last.from.mailAddress)") + managedObjectContext.delete(last) + save() + if let index = mails.index(of: last) { mails.remove(at: index) + } } } } - } - - - // Save, load, search - - private func find(_ entityName: String, type:String, search: String) -> [AnyObject]?{ - let fReq: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) //FIXME: NSFetchRequestResult richtig hier? - fReq.predicate = NSPredicate(format:"\(type) CONTAINS '\(search)' ") - let result: [AnyObject]? - do { - result = try self.managedObjectContext.fetch(fReq) - } catch _ as NSError { - result = nil - return nil + + + // Save, load, search + + private func find(_ entityName: String, type: String, search: String) -> [AnyObject]? { + let fReq: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) //FIXME: NSFetchRequestResult richtig hier? + fReq.predicate = NSPredicate(format: "\(type) CONTAINS '\(search)' ") + let result: [AnyObject]? + do { + result = try self.managedObjectContext.fetch(fReq) + } catch _ as NSError { + result = nil + return nil + } + return result } - return result - } - - private func findNum (_ entityName: String, type:String, search: UInt64) -> [AnyObject]?{ - let fReq: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) //FIXME: NSFetchRequestResult richtig hier? - fReq.predicate = NSPredicate(format:"\(type) = %D ",search) - let result: [AnyObject]? - do { - result = try self.managedObjectContext.fetch(fReq) - } catch _ as NSError{ - result = nil - return nil + + private func findNum (_ entityName: String, type: String, search: UInt64) -> [AnyObject]? { + let fReq: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) //FIXME: NSFetchRequestResult richtig hier? + fReq.predicate = NSPredicate(format: "\(type) = %D ", search) + let result: [AnyObject]? + do { + result = try self.managedObjectContext.fetch(fReq) + } catch _ as NSError { + result = nil + return nil + } + return result } - return result - } - - private func findAll(_ entityName:String)->[AnyObject]? { - let fReq: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) //FIXME: NSFetchRequestResult richtig hier? - let result: [AnyObject]? - do { - result = try self.managedObjectContext.fetch(fReq) - } catch _ as NSError { - result = nil - return nil + + private func findAll(_ entityName: String) -> [AnyObject]? { + let fReq: NSFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) //FIXME: NSFetchRequestResult richtig hier? + let result: [AnyObject]? + do { + result = try self.managedObjectContext.fetch(fReq) + } catch _ as NSError { + result = nil + return nil + } + return result } - return result - } - - - - // -------- Handle mail addresses --------- - func getMailAddress(_ address: String, temporary: Bool)-> MailAddress { - let search = find("Mail_Address", type: "address", search: address) - if search == nil || search!.count == 0 { - if temporary{ - return CNMailAddressExtension(addr: address as NSString) + + + + // -------- Handle mail addresses --------- + func getMailAddress(_ address: String, temporary: Bool) -> MailAddress { + let search = find("Mail_Address", type: "address", search: address) + if search == nil || search!.count == 0 { + if temporary { + return CNMailAddressExtension(addr: address as NSString) + } + else { + let mail_address = NSEntityDescription.insertNewObject(forEntityName: "Mail_Address", into: managedObjectContext) as! Mail_Address + mail_address.address = address + mail_address.prefer_encryption = false + return mail_address + } } - else{ - let mail_address = NSEntityDescription.insertNewObject(forEntityName: "Mail_Address",into: managedObjectContext) as! Mail_Address - mail_address.address = address - mail_address.prefer_encryption = false - return mail_address + else { + return search![0] as! Mail_Address } } - else { - return search![0] as! Mail_Address + + func getMailAddressesByString(_ addresses: [String], temporary: Bool) -> [MailAddress] { + var mailaddresses = [MailAddress]() + for adr in addresses { + mailaddresses.append(getMailAddress(adr, temporary: temporary)) + } + return mailaddresses } - } - - func getMailAddressesByString(_ addresses: [String], temporary: Bool) -> [MailAddress]{ - var mailaddresses = [MailAddress]() - for adr in addresses{ - mailaddresses.append(getMailAddress(adr, temporary: temporary)) + + func getMailAddressByMCOAddress(_ address: MCOAddress, temporary: Bool) -> MailAddress { + return getMailAddress(address.mailbox!, temporary: temporary) } - return mailaddresses - } - - func getMailAddressByMCOAddress(_ address: MCOAddress, temporary: Bool) -> MailAddress { - return getMailAddress(address.mailbox!, temporary: temporary) - } - - func getMailAddressesByMCOAddresses(_ addresses: [MCOAddress])->[Mail_Address] { - var mailaddresses = [Mail_Address]() - for adr in addresses{ - mailaddresses.append(getMailAddressByMCOAddress(adr, temporary: false) as! Mail_Address) + + func getMailAddressesByMCOAddresses(_ addresses: [MCOAddress]) -> [Mail_Address] { + var mailaddresses = [Mail_Address]() + for adr in addresses { + mailaddresses.append(getMailAddressByMCOAddress(adr, temporary: false) as! Mail_Address) + } + return mailaddresses } - return mailaddresses - } - - - // -------- Start Access to contact(s) -------- - // Find one or a list of enzevalos contacts - // By mail-address via String or MCOAddress - // If no enzevalos contact exists. One is created. - - func getContactByAddress(_ address: String) -> EnzevalosContact { - // Core function - let lowerAdr = address.lowercased() - for c in contacts { - if c.addresses != nil { - for adr in c.addresses!{ - let a = adr as! MailAddress - if a.mailAddress == lowerAdr { - return c + + + // -------- Start Access to contact(s) -------- + // Find one or a list of enzevalos contacts + // By mail-address via String or MCOAddress + // If no enzevalos contact exists. One is created. + + func getContactByAddress(_ address: String) -> EnzevalosContact { + // Core function + let lowerAdr = address.lowercased() + for c in contacts { + if c.addresses != nil { + for adr in c.addresses! { + let a = adr as! MailAddress + if a.mailAddress == lowerAdr { + return c + } } } - } - if let cnContact = c.cnContact { - for adr in cnContact.emailAddresses { - let name = adr.value as String - if name == lowerAdr { - let adr = getMailAddress(lowerAdr, temporary: false) as! Mail_Address - c.addToAddresses(adr) - adr.contact = c - return c + if let cnContact = c.cnContact { + for adr in cnContact.emailAddresses { + let name = adr.value as String + if name == lowerAdr { + let adr = getMailAddress(lowerAdr, temporary: false) as! Mail_Address + c.addToAddresses(adr) + adr.contact = c + return c + } } } } + + let search = find("EnzevalosContact", type: "addresses", search: lowerAdr) + var contact: EnzevalosContact + if search == nil || search!.count == 0 { + contact = NSEntityDescription.insertNewObject(forEntityName: "EnzevalosContact", into: managedObjectContext) as! EnzevalosContact + contact.displayname = lowerAdr + let adr = getMailAddress(lowerAdr, temporary: false)as! Mail_Address + contact.addToAddresses(adr) + adr.contact = contact + contacts.append(contact) + } + else { + contact = search! [0] as! EnzevalosContact + contacts.append(contact) + } + return contact } - - let search = find("EnzevalosContact", type: "addresses", search: lowerAdr) - var contact: EnzevalosContact - if search == nil || search!.count == 0 { - contact = NSEntityDescription.insertNewObject(forEntityName: "EnzevalosContact", into: managedObjectContext) as! EnzevalosContact - contact.displayname = lowerAdr - let adr = getMailAddress(lowerAdr, temporary: false)as! Mail_Address - contact.addToAddresses(adr) - adr.contact = contact - contacts.append(contact) - } - else { - contact = search! [0] as! EnzevalosContact - contacts.append(contact) - } - return contact - } - - - func getContact(_ name: String, address: String, key: String, prefer_enc: Bool) -> EnzevalosContact { - let contact = getContactByAddress(address) - contact.displayname = name - contact.getAddress(address)?.keyID = key - _ = contact.getAddress(address)?.prefer_encryption //TODO IOptimize: look for Mail_Address and than for contact! - return contact - } - - func getContacts(_ receivers: [MCOAddress]) -> [EnzevalosContact] { - var contacts = [EnzevalosContact]() - var contact: EnzevalosContact - for r in receivers{ - contact = getContactByMCOAddress(r) - contacts.append(contact) - } - return contacts - } - - func getContactByMCOAddress(_ address: MCOAddress) -> EnzevalosContact { - let contact = getContactByAddress(address.mailbox!) - if address.displayName != nil { - contact.displayname = address.displayName + + + func getContact(_ name: String, address: String, key: String, prefer_enc: Bool) -> EnzevalosContact { + let contact = getContactByAddress(address) + contact.displayname = name + contact.getAddress(address)?.keyID = key + _ = contact.getAddress(address)?.prefer_encryption //TODO IOptimize: look for Mail_Address and than for contact! + return contact } - return contact - } - // -------- End Access to contact(s) -------- - - - // -------- Start handle to, cc, from addresses -------- - private func handleFromAddress(_ sender: MCOAddress, fromMail: PersistentMail, autocrypt: AutocryptContact?) { - let adr: Mail_Address - let contact = getContactByMCOAddress(sender) - adr = contact.getAddressByMCOAddress(sender)! - if let ac = autocrypt{ - adr.prefEnc = ac.prefer_encryption - adr.encryptionType = ac.type + + func getContacts(_ receivers: [MCOAddress]) -> [EnzevalosContact] { + var contacts = [EnzevalosContact]() + var contact: EnzevalosContact + for r in receivers { + contact = getContactByMCOAddress(r) + contacts.append(contact) + } + return contacts } - fromMail.from = adr - } - - private func handleToAddresses(_ receivers: [MCOAddress], mail: PersistentMail) { - mail.addToTo(NSSet(array: getMailAddressesByMCOAddresses(receivers))) - } - - private func handleCCAddresses(_ cc: [MCOAddress], mail: PersistentMail) { - mail.addToCc(NSSet(array: getMailAddressesByMCOAddresses(cc))) - } - - // TODO: handle BCC - - // -------- End handle to, cc, from addresses -------- - - func createMail(_ uid: UInt64, sender: MCOAddress, receivers: [MCOAddress], cc: [MCOAddress], time: Date, received: Bool, subject: String, body: String, flags: MCOMessageFlag, record: KeyRecord?, autocrypt: AutocryptContact?) /*-> Mail*/ { - - let finding = findNum("PersistentMail", type: "uid", search: uid) - let mail: PersistentMail - - if finding == nil || finding!.count == 0 { - // create new mail object - mail = NSEntityDescription.insertNewObject(forEntityName: "PersistentMail", into: managedObjectContext) as! PersistentMail - - mail.body = body - mail.date = time - mail.subject = subject - - mail.uid = uid - - mail.flag = flags - - mail.isSigned = false - mail.isEncrypted = false - mail.trouble = false - - handleFromAddress(sender, fromMail: mail, autocrypt: autocrypt) - handleToAddresses(receivers, mail: mail) - handleCCAddresses(cc, mail: mail) - - mail.unableToDecrypt = false - mail.decryptIfPossible() + + func getContactByMCOAddress(_ address: MCOAddress) -> EnzevalosContact { + let contact = getContactByAddress(address.mailbox!) + if address.displayName != nil { + contact.displayname = address.displayName + } + return contact } - else { - return //finding![0] as! Mail + // -------- End Access to contact(s) -------- + + + // -------- Start handle to, cc, from addresses -------- + private func handleFromAddress(_ sender: MCOAddress, fromMail: PersistentMail, autocrypt: AutocryptContact?) { + let adr: Mail_Address + let contact = getContactByMCOAddress(sender) + adr = contact.getAddressByMCOAddress(sender)! + if let ac = autocrypt { + adr.prefEnc = ac.prefer_encryption + adr.encryptionType = ac.type + } + fromMail.from = adr } - - save() - if getCurrentState().maxUID < mail.uid { - getCurrentState().maxUID = mail.uid + + private func handleToAddresses(_ receivers: [MCOAddress], mail: PersistentMail) { + mail.addToTo(NSSet(array: getMailAddressesByMCOAddresses(receivers))) } - mails.append(mail) - - var added = false - if let r = record{ - added = r.addNewMail(mail) + + private func handleCCAddresses(_ cc: [MCOAddress], mail: PersistentMail) { + mail.addToCc(NSSet(array: getMailAddressesByMCOAddresses(cc))) } - if !added{ - addToReceiverRecords(mail) + + // TODO: handle BCC + + // -------- End handle to, cc, from addresses -------- + + func createMail(_ uid: UInt64, sender: MCOAddress, receivers: [MCOAddress], cc: [MCOAddress], time: Date, received: Bool, subject: String, body: String, flags: MCOMessageFlag, record: KeyRecord?, autocrypt: AutocryptContact?) /*-> Mail*/ { + + let finding = findNum("PersistentMail", type: "uid", search: uid) + let mail: PersistentMail + + if finding == nil || finding!.count == 0 { + // create new mail object + mail = NSEntityDescription.insertNewObject(forEntityName: "PersistentMail", into: managedObjectContext) as! PersistentMail + + mail.body = body + mail.date = time + mail.subject = subject + + mail.uid = uid + + mail.flag = flags + + mail.isSigned = false + mail.isEncrypted = false + mail.trouble = false + + handleFromAddress(sender, fromMail: mail, autocrypt: autocrypt) + handleToAddresses(receivers, mail: mail) + handleCCAddresses(cc, mail: mail) + + mail.unableToDecrypt = false + mail.decryptIfPossible() + } + else { + return //finding![0] as! Mail + } + + save() + if getCurrentState().maxUID < mail.uid { + getCurrentState().maxUID = mail.uid + } + mails.append(mail) + + var added = false + if let r = record { + added = r.addNewMail(mail) + } + if !added { + addToReceiverRecords(mail) + } + + + //return mail } - - - //return mail - } - private func readMails() -> [PersistentMail] { - var mails = [PersistentMail]() - let result = findAll("PersistentMail") - if result != nil { - for r in result! { - let m = r as! PersistentMail - mails.append(m) - if getCurrentState().maxUID < m.uid { - getCurrentState().maxUID = m.uid + private func readMails() -> [PersistentMail] { + var mails = [PersistentMail]() + let result = findAll("PersistentMail") + if result != nil { + for r in result! { + let m = r as! PersistentMail + mails.append(m) + if getCurrentState().maxUID < m.uid { + getCurrentState().maxUID = m.uid + } + } } + return mails } - } - return mails - } - - private func getAddresses()-> [MailAddress]{ - var adrs = [MailAddress]() - let result = findAll("Mail_Address") - if result != nil { - for r in result! { - let adr = r as! MailAddress - adrs.append(adr) + + private func getAddresses() -> [MailAddress] { + var adrs = [MailAddress]() + let result = findAll("Mail_Address") + if result != nil { + for r in result! { + let adr = r as! MailAddress + adrs.append(adr) + } + } + return adrs + } - } - return adrs - - } - - private func getContacts()->[EnzevalosContact] { - var contacts = [EnzevalosContact]() - let result = findAll("EnzevalosContact") - if result != nil { - for r in result!{ - let c = r as! EnzevalosContact - let ms = c.from - if ms.count > 0 { - contacts.append(c) + + private func getContacts() -> [EnzevalosContact] { + var contacts = [EnzevalosContact]() + let result = findAll("EnzevalosContact") + if result != nil { + for r in result! { + let c = r as! EnzevalosContact + let ms = c.from + if ms.count > 0 { + contacts.append(c) + } + } } + return contacts } - } - return contacts - } - - private func getRecords() -> [KeyRecord] { - var records = [KeyRecord]() - let mails = readMails() - for m in mails { - addToRecords(m,records: &records) - } - for r in records { - r.mails.sort() - } - records.sort() - print("#KeyRecords: \(records.count) ") - print("#Mails: \(mails.count)") - return records - } - - private func addToRecords(_ m: PersistentMail, records: inout [KeyRecord] ){ - - var found = false - for r in records { - if r.addNewMail(m) { - found = true + + private func getRecords() -> [KeyRecord] { + var records = [KeyRecord]() + let mails = readMails() + for m in mails { + addToRecords(m, records: &records) + } + for r in records { + r.mails.sort() + } records.sort() - break + print("#KeyRecords: \(records.count) ") + print("#Mails: \(mails.count)") + return records } - } - if !found { - let r = KeyRecord(mail: m) - mergeRecords(newRecord: r, records: &records) - records.append(r) - records.sort() - } - } - - - private func mergeRecords(newRecord: KeyRecord, records: inout[KeyRecord]){ - var j = 0 - if !newRecord.hasKey{ - return - } - while j < records.count{ - let r = records[j] - if !r.hasKey && r.ezContact == newRecord.ezContact{ - var i = 0 - while i < r.mails.count{ - let mail = r.mails[i] - var remove = false - if mail.from.keyID == newRecord.key{ - remove = newRecord.addNewMail(mail) - if remove{ - r.mails.remove(at: i) - } + + private func addToRecords(_ m: PersistentMail, records: inout [KeyRecord]) { + + var found = false + for r in records { + if r.addNewMail(m) { + found = true + records.sort() + break } - if !remove{ - i = i + 1 + } + if !found { + let r = KeyRecord(mail: m) + mergeRecords(newRecord: r, records: &records) + records.append(r) + records.sort() + } + } + + + private func mergeRecords(newRecord: KeyRecord, records: inout[KeyRecord]) { + var j = 0 + if !newRecord.hasKey { + return + } + while j < records.count { + let r = records[j] + if !r.hasKey && r.ezContact == newRecord.ezContact { + var i = 0 + while i < r.mails.count { + let mail = r.mails[i] + var remove = false + if mail.from.keyID == newRecord.key { + remove = newRecord.addNewMail(mail) + if remove { + r.mails.remove(at: i) + } + } + if !remove { + i = i + 1 + } + } + if r.mails.count == 0 { + records.remove(at: j) + } else { + j = j + 1 + } + } else { + j = j + 1 } } - if r.mails.count == 0{ - records.remove(at: j) - } else{ - j = j + 1 + } + + private func addToReceiverRecords(_ m: PersistentMail) { + addToRecords(m, records: &receiverRecords) + } + + + func getCurrentState() -> State { + let result = findAll("State") + if result != nil && result?.count > 0 { + currentstate = (result?.first as? State)! + } + else { + currentstate = (NSEntityDescription.insertNewObject(forEntityName: "State", into: managedObjectContext) as? State)! + currentstate.currentContacts = contacts.count + currentstate.currentMails = mails.count + currentstate.maxUID = 1 + save() } - } else{ - j = j + 1 + return currentstate } } - } - - private func addToReceiverRecords(_ m: PersistentMail){ - addToRecords(m, records: &receiverRecords) - } - - - func getCurrentState() -> State { - let result = findAll("State") - if result != nil && result?.count > 0 { - currentstate = (result?.first as? State)! - } - else { - currentstate = (NSEntityDescription.insertNewObject(forEntityName: "State", into: managedObjectContext) as? State)! - currentstate.currentContacts = contacts.count - currentstate.currentMails = mails.count - currentstate.maxUID = 1 - save() - } - return currentstate - } -} diff --git a/enzevalos_iphone/MailHandler.swift b/enzevalos_iphone/MailHandler.swift index c93b670bc8d1968f3a0057159636102e39dc1207..616a5657a503dad9630b3f020784adbbf09d641d 100644 --- a/enzevalos_iphone/MailHandler.swift +++ b/enzevalos_iphone/MailHandler.swift @@ -506,4 +506,34 @@ func parseMail(_ error: Error?, parser: MCOMessageParser?, message: MCOIMAPMessa + func moveMails(mails: [PersistentMail], from: String, to: String){ + let uids = MCOIndexSet() + for m in mails{ + uids.add(m.uid) + } + self.setupIMAPSession() + let op = self.IMAPSession.copyMessagesOperation(withFolder: from, uids: uids, destFolder: to) + op?.start{ + (err, vanished) -> Void in + guard err == nil else { + print("Error while fetching inbox: \(err)") + return + } + } + let mark = self.IMAPSession.storeFlagsOperation(withFolder: from, uids: uids, kind: MCOIMAPStoreFlagsRequestKind.add, flags: MCOMessageFlag.deleted) + mark?.start{ err -> Void in + guard err == nil else { + print("Error while fetching inbox: \(err)") + return + } + } + let expunge = self.IMAPSession.expungeOperation(from) + expunge?.start{ + err -> Void in + guard err == nil else { + print("Error while fetching inbox: \(err)") + return + } + } + } } diff --git a/enzevalos_iphone/Onboarding.swift b/enzevalos_iphone/Onboarding.swift index 5266ca418c503738a72d5cb4d2de64af88f98fa7..17335a26a35df5a4279f2a03f51a71ff263f11f5 100644 --- a/enzevalos_iphone/Onboarding.swift +++ b/enzevalos_iphone/Onboarding.swift @@ -46,7 +46,7 @@ class Onboarding: NSObject { static var fail: () -> () = { Void in } static var work: () -> () = { Void in } - + static var credentialFails = 0 static var authenticationRows: [Int: String] = [MCOAuthType.saslLogin.rawValue: "Login", MCOAuthType.saslPlain.rawValue: NSLocalizedString("NormalPassword", comment: ""), MCOAuthType.SASLSRP.rawValue: "SRP", MCOAuthType.SASLCRAMMD5.rawValue: "CRAMMD5", MCOAuthType.SASLDIGESTMD5.rawValue: "DIGESTMD5", MCOAuthType.SASLNTLM.rawValue: "NTLM", MCOAuthType.SASLGSSAPI.rawValue: "GSSAPI", MCOAuthType.saslKerberosV4.rawValue: "KerberosV4"] @@ -176,7 +176,7 @@ class Onboarding: NSObject { //vc?.backgroundImage = postcardBg vc?.shouldFadeTransitions = true //vc?.shouldMaskBackground = false - + let duration = 0.5 intro2.viewWillAppearBlock = { @@ -217,7 +217,7 @@ class Onboarding: NSObject { if self.credentialFails > 0 { //vc!.pageControl.currentPage = (vc?.pageControl.numberOfPages)!-1 } - + return vc! } @@ -538,7 +538,7 @@ class Onboarding: NSObject { UserManager.storeUserValue(password.text! as AnyObject?, attribute: Attribute.userPW) UserManager.storeUserValue(username.text! as AnyObject?, attribute: Attribute.userName) UserManager.storeUserValue(username.text! as AnyObject?, attribute: Attribute.accountname) - UserManager.storeUserValue(keyForValue(transportRows, value: imapTransDataDelegate.pickedValue)[0] as AnyObject?, attribute: Attribute.imapConnectionType) + UserManager.storeUserValue(keyForValue(transportRows, value: imapTransDataDelegate.pickedValue)[0] as AnyObject?, attribute: Attribute.imapConnectionType) //TODO: fatal error: Index out of range when reset button was used UserManager.storeUserValue(keyForValue(authenticationRows, value: imapAuthDataDelegate.pickedValue)[0] as AnyObject?, attribute: Attribute.imapAuthType) UserManager.storeUserValue(keyForValue(transportRows, value: smtpTransDataDelegate.pickedValue)[0] as AnyObject?, attribute: Attribute.smtpConnectionType) UserManager.storeUserValue(keyForValue(authenticationRows, value: smtpAuthDataDelegate.pickedValue)[0] as AnyObject?, attribute: Attribute.smtpAuthType) @@ -712,23 +712,32 @@ class Onboarding: NSObject { } catch _ { } -// path = Bundle.main.path(forResource: "nchr-public", ofType: "gpg") -// pgp = ObjectivePGP.init() -// pgp.importKeys(fromFile: path!, allowDuplicates: false) -// do { -// let data = try pgp.keys[0].export() -// _ = enc?.addKey(data, forMailAddresses: ["nchr@enzevalos.de"]) -// } -// catch _ { } -// -// path = Bundle.main.path(forResource: "ncpayroll-public", ofType: "gpg") -// pgp = ObjectivePGP.init() -// pgp.importKeys(fromFile: path!, allowDuplicates: false) -// do { -// let data = try pgp.keys[0].export() -// _ = enc?.addKey(data, forMailAddresses: ["ncpayroll@enzevalos.de"]) -// } -// catch _ { } + path = Bundle.main.path(forResource: "nchr-public", ofType: "gpg") + pgp = ObjectivePGP.init() + pgp.importKeys(fromFile: path!, allowDuplicates: false) + do { + let data = try pgp.keys[0].export() + _ = enc?.addKey(data, forMailAddresses: ["nchr@enzevalos.de"]) + } + catch _ { } + + path = Bundle.main.path(forResource: "ncpayroll-public", ofType: "gpg") + pgp = ObjectivePGP.init() + pgp.importKeys(fromFile: path!, allowDuplicates: false) + do { + let data = try pgp.keys[0].export() + _ = enc?.addKey(data, forMailAddresses: ["ncpayroll@enzevalos.de"]) + } + catch _ { } + + path = Bundle.main.path(forResource: "ullimuelle-public", ofType: "gpg") + pgp = ObjectivePGP.init() + pgp.importKeys(fromFile: path!, allowDuplicates: false) + do { + let data = try pgp.keys[0].export() + _ = enc?.addKey(data, forMailAddresses: ["ullimuelle@web.de"]) + } + catch _ { } //Import public keys for labstudy END //--------------------------------------- @@ -758,7 +767,6 @@ class Onboarding: NSObject { class TextFieldDelegate: NSObject, UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { - print("hallo") } func textFieldShouldReturn(_ textField: UITextField) -> Bool { @@ -766,10 +774,9 @@ class TextFieldDelegate: NSObject, UITextFieldDelegate { textField.resignFirstResponder() Onboarding.password.becomeFirstResponder() return false - } - else if textField == Onboarding.password { - textField.resignFirstResponder() - return true + } else if textField == Onboarding.password { + textField.resignFirstResponder() + return true } return true } diff --git a/enzevalos_iphone/ReadViewController.swift b/enzevalos_iphone/ReadViewController.swift index 22ca79f010ce59fb04c2ca8b87368eac90f750ec..e09efaec27918659b8d91ab36838ac457e89c410 100644 --- a/enzevalos_iphone/ReadViewController.swift +++ b/enzevalos_iphone/ReadViewController.swift @@ -126,10 +126,8 @@ class ReadViewController: UITableViewController { } override func numberOfSections(in tableView: UITableView) -> Int { - if let mail = mail { - if mail.trouble && mail.showMessage || !mail.trouble && !mail.isSecure && mail.from.contact!.hasKey || mail.isEncrypted && mail.unableToDecrypt { - return 3 - } + if let mail = mail, mail.trouble && mail.showMessage || !mail.trouble && !mail.isSecure && mail.from.contact!.hasKey || mail.isEncrypted && mail.unableToDecrypt, !(UserDefaults.standard.value(forKey: "hideWarnings") as? Bool ?? false) { + return 3 } return 2 @@ -160,7 +158,7 @@ class ReadViewController: UITableViewController { return subjectCell } } - if indexPath.section == 1 { + if indexPath.section == 1 && !(UserDefaults.standard.value(forKey: "hideWarnings") as? Bool ?? false) { if let mail = mail { if mail.trouble { if indexPath.row == 0 { diff --git a/enzevalos_iphone/Settings.bundle/Root.plist b/enzevalos_iphone/Settings.bundle/Root.plist index e2f4350aa39c197260a99703540dcebce43999fd..4bbb13942ecd3b0d4ecfaadad7511443827ff4e8 100644 --- a/enzevalos_iphone/Settings.bundle/Root.plist +++ b/enzevalos_iphone/Settings.bundle/Root.plist @@ -8,6 +8,20 @@ <string></string> <key>PreferenceSpecifiers</key> <array> + <dict> + <key>Type</key> + <string>PSToggleSwitchSpecifier</string> + <key>Title</key> + <string>Hide Warning Messages</string> + <key>Key</key> + <string>hideWarnings</string> + <key>DefaultValue</key> + <false/> + <key>TrueValue</key> + <true/> + <key>FalseValue</key> + <false/> + </dict> <dict> <key>Type</key> <string>PSToggleSwitchSpecifier</string> diff --git a/enzevalos_iphone/de.lproj/Localizable.strings b/enzevalos_iphone/de.lproj/Localizable.strings index 21ca36284b3ff339ed008eec46c915d1076d159a..a8e916cc233d6873441a4b25e29a74140c05d1d9 100644 --- a/enzevalos_iphone/de.lproj/Localizable.strings +++ b/enzevalos_iphone/de.lproj/Localizable.strings @@ -108,6 +108,7 @@ "notVerified" = "Kontakt ist noch nicht verifiziert"; "noEncryption" = "Kontakt nutzt noch keine Verschlüsselung"; "otherEncryption" = "Dies ist die unsichere Ablage dieses Kontakt"; +"hasKeyButNoMail" = "Kontakt nutzt verschlüsselung, hat dir aber noch keine sichere E-Mail gesendet"; "Verified" = "Kontakt ist verifiziert"; "verifyNow" = "Jetzt verifizieren"; "toEncrypted" = "Zur sicheren Ablage"; @@ -134,3 +135,5 @@ "inviteSubject" = "Lass uns unsere E-Mails verschlüsseln!"; "inviteText" = "Hallo!\n\nEs gibt eine neue App die es super einfach macht verschlüsselt über E-Mail zu kommunizieren. Sie heißt Enzevalos und ist kostenlos im App Store zu finden.\n\nEs wäre toll wenn du sie mal ausprobieren würdest!\n\nViele Grüße!"; "noName" = "OHNE NAME"; +"you" = "Deine Ablage"; +"thisIsYou" = "Hier werden E-Mails die du dir selber schickst gesammelt"; diff --git a/enzevalos_iphone/en.lproj/Localizable.strings b/enzevalos_iphone/en.lproj/Localizable.strings index 7353cf2712cd9d2bbf3bf0684bec73944994aba0..3ee832d0b4402c5f3e7f8959b34bed6f49a1ee85 100644 --- a/enzevalos_iphone/en.lproj/Localizable.strings +++ b/enzevalos_iphone/en.lproj/Localizable.strings @@ -107,6 +107,7 @@ "notVerified" = "Contact is not verified jet"; "noEncryption" = "Contact is not jet using encryption"; "otherEncryption" = "This is the unsafe tray with this Contact"; +"hasKeyButNoMail" = "Contact has a key, but you haven't received a safe email jet."; "Verified" = "Contact is verified"; "verifyNow" = "Verify now"; "toEncrypted" = "Switch to secure tray"; @@ -133,3 +134,5 @@ "inviteSubject" = "Lets use secure email!"; "inviteText" = "Hey there!\n\nThere is this new App called Enzevalos which makes it really easy to communicate encrypted over email.\n\nI would love for you to try it!\n\nBest regards!"; "noName" = "NO NAME"; +"you" = "Your Tray"; +"thisIsYou" = "Emails you sent yourself are collected heree"; diff --git a/enzevalos_iphone/JakobBode.asc b/enzevalos_iphone/keys/JakobBode.asc similarity index 100% rename from enzevalos_iphone/JakobBode.asc rename to enzevalos_iphone/keys/JakobBode.asc diff --git a/enzevalos_iphone/alice2005-2.gpg b/enzevalos_iphone/keys/alice2005-2.gpg similarity index 100% rename from enzevalos_iphone/alice2005-2.gpg rename to enzevalos_iphone/keys/alice2005-2.gpg diff --git a/enzevalos_iphone/alice2005-private.gpg b/enzevalos_iphone/keys/alice2005-private.gpg similarity index 100% rename from enzevalos_iphone/alice2005-private.gpg rename to enzevalos_iphone/keys/alice2005-private.gpg diff --git a/enzevalos_iphone/alice2005-public.gpg b/enzevalos_iphone/keys/alice2005-public.gpg similarity index 100% rename from enzevalos_iphone/alice2005-public.gpg rename to enzevalos_iphone/keys/alice2005-public.gpg diff --git a/enzevalos_iphone/idsolutions-private.gpg b/enzevalos_iphone/keys/idsolutions-private.gpg similarity index 100% rename from enzevalos_iphone/idsolutions-private.gpg rename to enzevalos_iphone/keys/idsolutions-private.gpg diff --git a/enzevalos_iphone/idsolutions-public.gpg b/enzevalos_iphone/keys/idsolutions-public.gpg similarity index 100% rename from enzevalos_iphone/idsolutions-public.gpg rename to enzevalos_iphone/keys/idsolutions-public.gpg diff --git a/enzevalos_iphone/jabo.asc b/enzevalos_iphone/keys/jabo.asc similarity index 98% rename from enzevalos_iphone/jabo.asc rename to enzevalos_iphone/keys/jabo.asc index 1a2d672f55e1cb5d3672fc49dbf36a8cb6104ebe..533de1cbb735351da6d291c7d84d1a6575e9892b 100644 --- a/enzevalos_iphone/jabo.asc +++ b/enzevalos_iphone/keys/jabo.asc @@ -1,29 +1,29 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFg1yLQBCADVlA/daw2tosPrG71NVhHXhLunu2G42I0+qKomiBTKrHUTQ8E8 -ZZoRBppHRAE8bIOjvwevif9+k7p7K2lOCp2jgtT6vb7Z+yiuZ1vNGyeT/4DDdKWS -Fh2juCBsysQ7t/iVAUYGAYd/8IL4f4wsa75ZpyqgJkaoKSX3eHELybE567tXxUkX -ckrBF/nYfRB8Q78fszSukCLtpgs+Wmto1pge/sBThmhmKCo7BCUR4JkxKVkE04fq -MDYDzAJzkDwOlxA3BnK35H1MyT7HmS80xZTCSbb8Efmf2iPiV16gqPwVNDceopFN -RAhbhCDXBJthpjWxZ4DCytca9ryfe4IgINSxABEBAAG0G01yLiBqYWJvIDxzcGFt -X2phYm9Ad2ViLmRlPokBNwQTAQgAIQUCWDXItAIbAwULCQgHAgYVCAkKCwIEFgID -AQIeAQIXgAAKCRCw71d5vjFXBJvWB/4qvsiwqkGVMWn5nyOYBGnPCTf964eAkFwc -7UHxrvd1apFmbKMf+Bmp9aKvJDRcq8iuv9BCFL4w1LSOt5kSMvpyq62p/DO8QCh6 -DtIXkzMcY32NAIW8CgXfOZd1zMRsNAPEFfcbRCO2tQFrd3AxcevtQQw+UMf7EgdY -baKnmeMv+eKom3ZyAK6GsxNNo85zLcg3qwWSQYpTdK+Pfom3AM10VYr4N0njec8g -MqN4AEe7h0jicLOjXw2CYoNOFU1T2R4Wvv14fKP/3d7VYpU2ytkCEgBauqgnwQ0M -CQ34gUoReFKyq/gaiyIyZ5bhcOJPr9NGmhR2fIIpSoAhshrZgfS0uQENBFg1yLQB -CAC15O6kPDt6ndI3YFxozFaq+obVXvAMoxH3+Dihfl4dePodRVGlk/89IscefYL7 -tJjlw+2mHriB5TKK9Ci9vOCm2MzQ3Q5SfIpbP9FLuoRLn8MifvFlBBhUE0iAvAql -9O9qj879/L0/5tR8isdnAvo2jqPE26e2BM9YPL2JoW+OYl0BVTVpqW+i9izqjAJH -GIWZu5DCFx06DJ/HiqBLHpWrxiFKFoWc0/UEhd8M6mLiCM92kYY/rEuFwt9ZOFFY -V9Hs4qXnDBAc6/CfXiCntQlbs/6zKFUtFP/BNio7OjDPz/Ai7ws11u60NMCPYINc -H0D/4FHOsvRuIKZm54RJUkK7ABEBAAGJAR8EGAEIAAkFAlg1yLQCGwwACgkQsO9X -eb4xVwQP7wf9EfnMYdgoqPF7NdFsxIKHAux64XGZs5y0UdlTaiVDHTpxQzt47nDY -SrcWkvNFTeprFQXice58ZEJDABN3FLgGCLB/8JZXdNBkadErWPRX9qN0Idau/w+/ -AFPf/cZVygLMifYoR0Q5K8BCbAyS14f28zqA4fSoLh/lVKHpoECOFRxyl20QHLOf -TL186l5tA6+ZHn2RM0hoPnFgKveYTU0cyfZ1htMLihCA+hItEoIUyrZsnc28Aeor -j8ApeY4EL3LVwsqfndPT7Hm6Cn4c3mpnn1NK81y/Rlu3OmvShuOZyFEL5mmpmWhp -pYTbhtrXNSkfEgwVB3du8AcII5aZdWC22w== -=z1AL ------END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFg1yLQBCADVlA/daw2tosPrG71NVhHXhLunu2G42I0+qKomiBTKrHUTQ8E8 +ZZoRBppHRAE8bIOjvwevif9+k7p7K2lOCp2jgtT6vb7Z+yiuZ1vNGyeT/4DDdKWS +Fh2juCBsysQ7t/iVAUYGAYd/8IL4f4wsa75ZpyqgJkaoKSX3eHELybE567tXxUkX +ckrBF/nYfRB8Q78fszSukCLtpgs+Wmto1pge/sBThmhmKCo7BCUR4JkxKVkE04fq +MDYDzAJzkDwOlxA3BnK35H1MyT7HmS80xZTCSbb8Efmf2iPiV16gqPwVNDceopFN +RAhbhCDXBJthpjWxZ4DCytca9ryfe4IgINSxABEBAAG0G01yLiBqYWJvIDxzcGFt +X2phYm9Ad2ViLmRlPokBNwQTAQgAIQUCWDXItAIbAwULCQgHAgYVCAkKCwIEFgID +AQIeAQIXgAAKCRCw71d5vjFXBJvWB/4qvsiwqkGVMWn5nyOYBGnPCTf964eAkFwc +7UHxrvd1apFmbKMf+Bmp9aKvJDRcq8iuv9BCFL4w1LSOt5kSMvpyq62p/DO8QCh6 +DtIXkzMcY32NAIW8CgXfOZd1zMRsNAPEFfcbRCO2tQFrd3AxcevtQQw+UMf7EgdY +baKnmeMv+eKom3ZyAK6GsxNNo85zLcg3qwWSQYpTdK+Pfom3AM10VYr4N0njec8g +MqN4AEe7h0jicLOjXw2CYoNOFU1T2R4Wvv14fKP/3d7VYpU2ytkCEgBauqgnwQ0M +CQ34gUoReFKyq/gaiyIyZ5bhcOJPr9NGmhR2fIIpSoAhshrZgfS0uQENBFg1yLQB +CAC15O6kPDt6ndI3YFxozFaq+obVXvAMoxH3+Dihfl4dePodRVGlk/89IscefYL7 +tJjlw+2mHriB5TKK9Ci9vOCm2MzQ3Q5SfIpbP9FLuoRLn8MifvFlBBhUE0iAvAql +9O9qj879/L0/5tR8isdnAvo2jqPE26e2BM9YPL2JoW+OYl0BVTVpqW+i9izqjAJH +GIWZu5DCFx06DJ/HiqBLHpWrxiFKFoWc0/UEhd8M6mLiCM92kYY/rEuFwt9ZOFFY +V9Hs4qXnDBAc6/CfXiCntQlbs/6zKFUtFP/BNio7OjDPz/Ai7ws11u60NMCPYINc +H0D/4FHOsvRuIKZm54RJUkK7ABEBAAGJAR8EGAEIAAkFAlg1yLQCGwwACgkQsO9X +eb4xVwQP7wf9EfnMYdgoqPF7NdFsxIKHAux64XGZs5y0UdlTaiVDHTpxQzt47nDY +SrcWkvNFTeprFQXice58ZEJDABN3FLgGCLB/8JZXdNBkadErWPRX9qN0Idau/w+/ +AFPf/cZVygLMifYoR0Q5K8BCbAyS14f28zqA4fSoLh/lVKHpoECOFRxyl20QHLOf +TL186l5tA6+ZHn2RM0hoPnFgKveYTU0cyfZ1htMLihCA+hItEoIUyrZsnc28Aeor +j8ApeY4EL3LVwsqfndPT7Hm6Cn4c3mpnn1NK81y/Rlu3OmvShuOZyFEL5mmpmWhp +pYTbhtrXNSkfEgwVB3du8AcII5aZdWC22w== +=z1AL +-----END PGP PUBLIC KEY BLOCK----- diff --git a/enzevalos_iphone/nchr.gpg b/enzevalos_iphone/keys/nchr-private.gpg similarity index 100% rename from enzevalos_iphone/nchr.gpg rename to enzevalos_iphone/keys/nchr-private.gpg diff --git a/enzevalos_iphone/nchrPublic.gpg b/enzevalos_iphone/keys/nchr-public.gpg similarity index 100% rename from enzevalos_iphone/nchrPublic.gpg rename to enzevalos_iphone/keys/nchr-public.gpg diff --git a/enzevalos_iphone/ncPayroll.gpg b/enzevalos_iphone/keys/ncpayroll-private.gpg similarity index 100% rename from enzevalos_iphone/ncPayroll.gpg rename to enzevalos_iphone/keys/ncpayroll-private.gpg diff --git a/enzevalos_iphone/ncPayrollPublic.gpg b/enzevalos_iphone/keys/ncpayroll-public.gpg similarity index 100% rename from enzevalos_iphone/ncPayrollPublic.gpg rename to enzevalos_iphone/keys/ncpayroll-public.gpg diff --git a/ulliMuelle.gpg b/enzevalos_iphone/keys/ullimuelle-private.gpg similarity index 100% rename from ulliMuelle.gpg rename to enzevalos_iphone/keys/ullimuelle-private.gpg diff --git a/ulliMuellePublic.gpg b/enzevalos_iphone/keys/ullimuelle-public.gpg similarity index 100% rename from ulliMuellePublic.gpg rename to enzevalos_iphone/keys/ullimuelle-public.gpg diff --git a/enzevalos_iphone/quizer1-private.asc b/enzevalos_iphone/quizer1-private.asc deleted file mode 100755 index 302ba3167328aae35598a291933574339a8d44de..0000000000000000000000000000000000000000 --- a/enzevalos_iphone/quizer1-private.asc +++ /dev/null @@ -1,105 +0,0 @@ ------BEGIN PGP PRIVATE KEY BLOCK----- - -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 -=bbLY ------END PGP PRIVATE KEY BLOCK----- diff --git a/enzevalos_iphone/quizer1-public.asc b/enzevalos_iphone/quizer1-public.asc deleted file mode 100644 index 80d0c6290b0e9d9c695e38cf541891a3fc218aa5..0000000000000000000000000000000000000000 --- a/enzevalos_iphone/quizer1-public.asc +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -PG8LClRF -=V1Yv ------END PGP PUBLIC KEY BLOCK-----