diff --git a/enzevalos_iphone.xcodeproj/project.pbxproj b/enzevalos_iphone.xcodeproj/project.pbxproj index 7e9f5b164e08a8ce8f76a27f9d4db09cca0d5076..87fd74571f2dd08f3447b087d0d7d46389a59cdc 100644 --- a/enzevalos_iphone.xcodeproj/project.pbxproj +++ b/enzevalos_iphone.xcodeproj/project.pbxproj @@ -330,6 +330,7 @@ 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 */; }; + A1C62E9A2018F716000E5273 /* OnboardingValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C62E992018F716000E5273 /* OnboardingValueState.swift */; }; A1D5076F1E80257A00B68B38 /* KeyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1D5076E1E80257A00B68B38 /* KeyViewController.swift */; }; A1E2324C1F0FA13F00DC9D40 /* FolderListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E2324B1F0FA13F00DC9D40 /* FolderListViewController.swift */; }; A1E2324E1F0FA41A00DC9D40 /* FolderListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E2324D1F0FA41A00DC9D40 /* FolderListCell.swift */; }; @@ -637,6 +638,7 @@ 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; 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>"; }; + A1C62E992018F716000E5273 /* OnboardingValueState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingValueState.swift; sourceTree = "<group>"; }; A1D5076E1E80257A00B68B38 /* KeyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyViewController.swift; sourceTree = "<group>"; }; A1E2324B1F0FA13F00DC9D40 /* FolderListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderListViewController.swift; sourceTree = "<group>"; }; A1E2324D1F0FA41A00DC9D40 /* FolderListCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderListCell.swift; sourceTree = "<group>"; }; @@ -1199,6 +1201,7 @@ A1F2A5681E85586300320275 /* Providers.swift */, A1083A531E8BFEA6003666B7 /* Onboarding.swift */, A102AA891EDDB4E80024B457 /* videoOnboarding2.m4v */, + A1C62E992018F716000E5273 /* OnboardingValueState.swift */, ); name = onboarding; sourceTree = "<group>"; @@ -2102,6 +2105,7 @@ A1EB05881D956879008659C1 /* AddressHandler.swift in Sources */, 472F39701E14F75C009260FB /* DataHandler.swift in Sources */, 471BC9191F960B7C00D64416 /* PGPSignatureSubpacketHeader.m in Sources */, + A1C62E9A2018F716000E5273 /* OnboardingValueState.swift in Sources */, 471BC9321F960B7C00D64416 /* NSData+PGPUtils.m in Sources */, A1EB05901D956923008659C1 /* ReadViewController.swift in Sources */, 471BC9171F960B7C00D64416 /* PGPSignatureSubpacket.m in Sources */, diff --git a/enzevalos_iphone/AppDelegate.swift b/enzevalos_iphone/AppDelegate.swift index 89684b46dc47f314d83efc58ff4787fab9059c40..2396e2cbf56281f9beb0b105dc99f2ce02990025 100644 --- a/enzevalos_iphone/AppDelegate.swift +++ b/enzevalos_iphone/AppDelegate.swift @@ -64,8 +64,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func credentialCheck() { self.window?.rootViewController = Onboarding.checkConfigView() - Onboarding.setValues() - if !Onboarding.checkConfig(self.credentialsFailed, work: self.credentialsWork) { + if Onboarding.setValues() != OnboardingValueState.fine { + credentialsFailed() + return + } + else if !Onboarding.checkConfig(self.credentialsFailed, work: self.credentialsWork) { self.window?.rootViewController = Onboarding.detailOnboarding(self.credentialCheck) return } @@ -73,7 +76,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func credentialsFailed() { Onboarding.credentialFails += 1 - if Onboarding.credentialFails >= 3 { + if Onboarding.credentialFails >= 2 { Onboarding.manualSet = true self.window?.rootViewController = Onboarding.detailOnboarding(self.credentialCheck) } else { diff --git a/enzevalos_iphone/MailHandler.swift b/enzevalos_iphone/MailHandler.swift index 6356a2183e2d10bfea247aa0274e0496b8bfc3f9..c7e513a347cbb93ca307e69a6231760edfc561b8 100644 --- a/enzevalos_iphone/MailHandler.swift +++ b/enzevalos_iphone/MailHandler.swift @@ -258,133 +258,134 @@ class MailHandler { //logMail should be false, if called from Logger, otherwise func send(_ toEntrys: [String], ccEntrys: [String], bccEntrys: [String], subject: String, message: String, sendEncryptedIfPossible: Bool = true, callback: @escaping (Error?) -> Void, loggingMail: Bool = false) { - let useraddr = (UserManager.loadUserValue(Attribute.userAddr) as! String) - let session = createSMTPSession() - let builder = MCOMessageBuilder() + if let useraddr = (UserManager.loadUserValue(Attribute.userAddr) as? String) { + let session = createSMTPSession() + let builder = MCOMessageBuilder() - createHeader(builder, toEntrys: toEntrys, ccEntrys: ccEntrys, bccEntrys: bccEntrys, subject: subject) + createHeader(builder, toEntrys: toEntrys, ccEntrys: ccEntrys, bccEntrys: bccEntrys, subject: subject) - var allRec: [String] = [] - allRec.append(contentsOf: toEntrys) - allRec.append(contentsOf: ccEntrys) - allRec.append(contentsOf: bccEntrys) + var allRec: [String] = [] + allRec.append(contentsOf: toEntrys) + allRec.append(contentsOf: ccEntrys) + allRec.append(contentsOf: bccEntrys) - let fromLogging: Mail_Address = DataHandler.handler.getMailAddress(useraddr, temporary: false) as! Mail_Address - var toLogging: [Mail_Address] = [] - var ccLogging: [Mail_Address] = [] - var bccLogging: [Mail_Address] = [] + let fromLogging: Mail_Address = DataHandler.handler.getMailAddress(useraddr, temporary: false) as! Mail_Address + var toLogging: [Mail_Address] = [] + var ccLogging: [Mail_Address] = [] + var bccLogging: [Mail_Address] = [] - for entry in toEntrys { - toLogging.append(DataHandler.handler.getMailAddress(entry, temporary: false) as! Mail_Address) - } - for entry in ccEntrys { - ccLogging.append(DataHandler.handler.getMailAddress(entry, temporary: false) as! Mail_Address) - } - for entry in bccEntrys { - bccLogging.append(DataHandler.handler.getMailAddress(entry, temporary: false) as! Mail_Address) - } + for entry in toEntrys { + toLogging.append(DataHandler.handler.getMailAddress(entry, temporary: false) as! Mail_Address) + } + for entry in ccEntrys { + ccLogging.append(DataHandler.handler.getMailAddress(entry, temporary: false) as! Mail_Address) + } + for entry in bccEntrys { + bccLogging.append(DataHandler.handler.getMailAddress(entry, temporary: false) as! Mail_Address) + } - let ordered = orderReceiver(receiver: allRec, sendEncryptedIfPossible: sendEncryptedIfPossible) + let ordered = orderReceiver(receiver: allRec, sendEncryptedIfPossible: sendEncryptedIfPossible) - let userID = MCOAddress(displayName: useraddr, mailbox: useraddr) - let sk = DataHandler.handler.prefSecretKey() + let userID = MCOAddress(displayName: useraddr, mailbox: useraddr) + let sk = DataHandler.handler.prefSecretKey() - var sendData: Data - var sendOperation: MCOSMTPSendOperation - let pgp = SwiftPGP() + var sendData: Data + var sendOperation: MCOSMTPSendOperation + let pgp = SwiftPGP() - if let encPGP = ordered[CryptoScheme.PGP], ordered[CryptoScheme.PGP]?.count > 0 { - var keyIDs = addKeys(adrs: encPGP) - //added own public key here, so we can decrypt our own message to read it in sent-folder - keyIDs.append(sk.keyID!) + if let encPGP = ordered[CryptoScheme.PGP], ordered[CryptoScheme.PGP]?.count > 0 { + var keyIDs = addKeys(adrs: encPGP) + //added own public key here, so we can decrypt our own message to read it in sent-folder + keyIDs.append(sk.keyID!) - /* - Attach own public key - */ - var missingOwnPublic = false - for id in keyIDs{ - if let key = DataHandler.handler.findKey(keyID: id){ - if !key.sentOwnPublicKey{ - missingOwnPublic = true - key.sentOwnPublicKey = true + /* + Attach own public key + */ + var missingOwnPublic = false + for id in keyIDs{ + if let key = DataHandler.handler.findKey(keyID: id){ + if !key.sentOwnPublicKey{ + missingOwnPublic = true + key.sentOwnPublicKey = true + } } } - } - var msg = message - if missingOwnPublic{ - if let myPK = pgp.exportKey(id: sk.keyID!, isSecretkey: false, autocrypt: false){ - msg = msg + "\n" + myPK + var msg = message + if missingOwnPublic{ + if let myPK = pgp.exportKey(id: sk.keyID!, isSecretkey: false, autocrypt: false){ + msg = msg + "\n" + myPK + } } - } - /* ######## */ + /* ######## */ - let cryptoObject = pgp.encrypt(plaintext: "\n" + msg, ids: keyIDs, myId:sk.keyID!) - if let encData = cryptoObject.chiphertext{ - sendData = encData - Logger.queue.async(flags: .barrier) { - if Logger.logging && !loggingMail { - let secureAddrsInString = encPGP.map{$0.mailbox} - var secureAddresses: [Mail_Address] = [] - for addr in toLogging { - for sec in secureAddrsInString { - if addr.address == sec { - secureAddresses.append(addr) + let cryptoObject = pgp.encrypt(plaintext: "\n" + msg, ids: keyIDs, myId:sk.keyID!) + if let encData = cryptoObject.chiphertext{ + sendData = encData + Logger.queue.async(flags: .barrier) { + if Logger.logging && !loggingMail { + let secureAddrsInString = encPGP.map{$0.mailbox} + var secureAddresses: [Mail_Address] = [] + for addr in toLogging { + for sec in secureAddrsInString { + if addr.address == sec { + secureAddresses.append(addr) + } } } - } - for addr in ccLogging { - for sec in secureAddrsInString { - if addr.address == sec { - secureAddresses.append(addr) + for addr in ccLogging { + for sec in secureAddrsInString { + if addr.address == sec { + secureAddresses.append(addr) + } } } - } - for addr in bccLogging { - for sec in secureAddrsInString { - if addr.address == sec { - secureAddresses.append(addr) + for addr in bccLogging { + for sec in secureAddrsInString { + if addr.address == sec { + secureAddresses.append(addr) + } } } + Logger.log(sent: fromLogging, to: toLogging, cc: ccLogging, bcc: bccLogging, subject: subject, bodyLength: (String(data: cryptoObject.chiphertext!, encoding: String.Encoding.utf8) ?? "").count, isEncrypted: true, decryptedBodyLength: ("\n"+message).count, decryptedWithOldPrivateKey: false, isSigned: true, isCorrectlySigned: true, signingKeyID: sk.keyID!, myKeyID: sk.keyID!, secureAddresses: secureAddresses, encryptedForKeyIDs: keyIDs) } - Logger.log(sent: fromLogging, to: toLogging, cc: ccLogging, bcc: bccLogging, subject: subject, bodyLength: (String(data: cryptoObject.chiphertext!, encoding: String.Encoding.utf8) ?? "").count, isEncrypted: true, decryptedBodyLength: ("\n"+message).count, decryptedWithOldPrivateKey: false, isSigned: true, isCorrectlySigned: true, signingKeyID: sk.keyID!, myKeyID: sk.keyID!, secureAddresses: secureAddresses, encryptedForKeyIDs: keyIDs) } - } - builder.textBody = "Dies ist verschlüsselt!" - sendOperation = session.sendOperation(with: builder.openPGPEncryptedMessageData(withEncryptedData: sendData), from: userID, recipients: encPGP) - //TODO handle different callbacks + builder.textBody = "Dies ist verschlüsselt!" + sendOperation = session.sendOperation(with: builder.openPGPEncryptedMessageData(withEncryptedData: sendData), from: userID, recipients: encPGP) + //TODO handle different callbacks - sendOperation.start(callback) - if (ordered[CryptoScheme.UNKNOWN] == nil || ordered[CryptoScheme.UNKNOWN]!.count == 0) && !loggingMail { - createSendCopy(sendData: builder.openPGPEncryptedMessageData(withEncryptedData: sendData)) - } - if Logger.logging && loggingMail { - createLoggingSendCopy(sendData: builder.openPGPEncryptedMessageData(withEncryptedData: sendData)) - } + sendOperation.start(callback) + if (ordered[CryptoScheme.UNKNOWN] == nil || ordered[CryptoScheme.UNKNOWN]!.count == 0) && !loggingMail { + createSendCopy(sendData: builder.openPGPEncryptedMessageData(withEncryptedData: sendData)) + } + if Logger.logging && loggingMail { + createLoggingSendCopy(sendData: builder.openPGPEncryptedMessageData(withEncryptedData: sendData)) + } - builder.textBody = message - } else { - //TODO do it better - callback(NSError(domain: NSCocoaErrorDomain, code: NSPropertyListReadCorruptError, userInfo: nil)) + builder.textBody = message + } else { + //TODO do it better + callback(NSError(domain: NSCocoaErrorDomain, code: NSPropertyListReadCorruptError, userInfo: nil)) + } } - } - if let unenc = ordered[CryptoScheme.UNKNOWN], !loggingMail { - if unenc.count > 0 { - builder.textBody = message - sendData = builder.data() - sendOperation = session.sendOperation(with: sendData, from: userID, recipients: unenc) - //TODO handle different callbacks - //TODO add logging call here for the case the full email is unencrypted - if unenc.count == allRec.count && !loggingMail { - Logger.queue.async(flags: .barrier) { - Logger.log(sent: fromLogging, to: toLogging, cc: ccLogging, bcc: bccLogging, subject: subject, bodyLength: ("\n"+message).count, isEncrypted: false, decryptedBodyLength: ("\n"+message).count, decryptedWithOldPrivateKey: false, isSigned: false, isCorrectlySigned: false, signingKeyID: "", myKeyID: "", secureAddresses: [], encryptedForKeyIDs: []) + if let unenc = ordered[CryptoScheme.UNKNOWN], !loggingMail { + if unenc.count > 0 { + builder.textBody = message + sendData = builder.data() + sendOperation = session.sendOperation(with: sendData, from: userID, recipients: unenc) + //TODO handle different callbacks + //TODO add logging call here for the case the full email is unencrypted + if unenc.count == allRec.count && !loggingMail { + Logger.queue.async(flags: .barrier) { + Logger.log(sent: fromLogging, to: toLogging, cc: ccLogging, bcc: bccLogging, subject: subject, bodyLength: ("\n"+message).count, isEncrypted: false, decryptedBodyLength: ("\n"+message).count, decryptedWithOldPrivateKey: false, isSigned: false, isCorrectlySigned: false, signingKeyID: "", myKeyID: "", secureAddresses: [], encryptedForKeyIDs: []) + } + } + sendOperation.start(callback) + if !loggingMail { + createSendCopy(sendData: sendData) } - } - sendOperation.start(callback) - if !loggingMail { - createSendCopy(sendData: sendData) } } } diff --git a/enzevalos_iphone/Onboarding.swift b/enzevalos_iphone/Onboarding.swift index 8ebf72ed7892007c8a1c3bf07a463e5cb45480d7..ac096ba917ec8c5abd46f6dc76db3427852a4857 100644 --- a/enzevalos_iphone/Onboarding.swift +++ b/enzevalos_iphone/Onboarding.swift @@ -485,7 +485,7 @@ class Onboarding: NSObject { fail() } - static func setValues() { + static func setValues() -> OnboardingValueState { if let mailAddress = mailaddress.text?.lowercased().trimmingCharacters(in: .whitespacesAndNewlines), !manualSet && mailAddress != "" { let guessedUserName = mailAddress.components(separatedBy: "@")[0] @@ -502,49 +502,18 @@ class Onboarding: NSObject { else if mailAddress.contains("@aol.com") || mailAddress.contains("@games.com") || mailAddress.contains("@love.com") { UserManager.storeUserValue(mailAddress as AnyObject?, attribute: Attribute.userName) } - setServerValues(mailaddress: mailAddress) UserManager.storeUserValue(mailAddress as AnyObject?, attribute: Attribute.userAddr) - } - else{ //TODO: REMOVE BEFORE STUDY + //TODO: REMOVE BEFORE STUDY loadTestAcc() - return - } - if let pw = password.text, pw != "" { - UserManager.storeUserValue(pw as AnyObject?, attribute: Attribute.userPW) + return setServerValues(mailaddress: mailAddress) } - if manualSet { // TODO: @Jakob was ist manualSet und kann das weg? - if let mailAddress = mailaddress.text?.lowercased().trimmingCharacters(in: .whitespacesAndNewlines) { - switch mailAddress { - case "ullimuelle@web.de": - UserManager.storeUserValue("Ulli Müller" as AnyObject, attribute: Attribute.accountname) - case "bob2005@web.de": - UserManager.storeUserValue("Bob" as AnyObject, attribute: Attribute.accountname) - case "nchr@enzevalos.de": - UserManager.storeUserValue("NC Human Resources" as AnyObject, attribute: Attribute.accountname) - case "ncpayroll@enzevalos.de": - UserManager.storeUserValue("NC Payroll" as AnyObject, attribute: Attribute.accountname) - case "idsolutions@enzevalos.de": - UserManager.storeUserValue("Identity Solutions" as AnyObject, attribute: Attribute.accountname) - default: break - } - } - UserManager.storeUserValue(imapServer.text as AnyObject?, attribute: Attribute.imapHostname) - UserManager.storeUserValue(Int(imapPort.text!) as AnyObject?, attribute: Attribute.imapPort) - UserManager.storeUserValue(smtpServer.text as AnyObject?, attribute: Attribute.smtpHostname) - UserManager.storeUserValue(Int(smtpPort.text!) as AnyObject?, attribute: Attribute.smtpPort) - UserManager.storeUserValue(mailaddress.text as AnyObject?, attribute: Attribute.userAddr) - 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(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) + else{ + setDefaultValues() + return OnboardingValueState.empty } - } - static func setServerValues(mailaddress: String) { + static func setServerValues(mailaddress: String) -> OnboardingValueState { let manager = MCOMailProvidersManager.shared()! let path = Bundle.main.path(forResource: "providers", ofType: "json") manager.registerProviders(withFilename: path) @@ -643,11 +612,25 @@ class Onboarding: NSObject { if let archive = provider.allMailFolderPath() { UserManager.storeUserValue(archive as AnyObject?, attribute: Attribute.archiveFolderPath) } - + return OnboardingValueState.fine + } + else { + setDefaultValues() + return OnboardingValueState.noJson } } - + static func setDefaultValues() { + UserManager.storeUserValue("imap.example.de" as AnyObject?, attribute: Attribute.imapHostname) + UserManager.storeUserValue(MCOConnectionType.TLS.rawValue as AnyObject?, attribute: Attribute.imapConnectionType) + UserManager.storeUserValue(993 as AnyObject?, attribute: Attribute.imapPort) + UserManager.storeUserValue(MCOAuthType.saslPlain.rawValue as AnyObject?, attribute: Attribute.imapAuthType) + UserManager.storeUserValue("smtp.example.de" as AnyObject?, attribute: Attribute.smtpHostname) + UserManager.storeUserValue(MCOConnectionType.startTLS.rawValue as AnyObject?, attribute: Attribute.smtpConnectionType) + UserManager.storeUserValue(587 as AnyObject?, attribute: Attribute.smtpPort) + UserManager.storeUserValue(MCOAuthType.saslPlain.rawValue as AnyObject?, attribute: Attribute.smtpAuthType) + } + static func iterateEnum<T: Hashable>(_: T.Type) -> AnyIterator<T> { var i = 0 return AnyIterator { diff --git a/enzevalos_iphone/OnboardingValueState.swift b/enzevalos_iphone/OnboardingValueState.swift new file mode 100644 index 0000000000000000000000000000000000000000..b54fcb11e2a4087301d49495c43558fc58d91996 --- /dev/null +++ b/enzevalos_iphone/OnboardingValueState.swift @@ -0,0 +1,13 @@ +// +// OnboardingValueState.swift +// enzevalos_iphone +// +// Created by jakobsbode on 24.01.18. +// Copyright © 2018 fu-berlin. All rights reserved. +// + +import Foundation + +enum OnboardingValueState { + case empty, noJson, fine +}