diff --git a/enzevalos_iphone/ContactExtension.swift b/enzevalos_iphone/ContactExtension.swift index 3b7654639cb59caf57c300e6e5d446cbc2a32b6f..5095a8aa5d4f5872f6438e3b31b3b47434e8f671 100644 --- a/enzevalos_iphone/ContactExtension.swift +++ b/enzevalos_iphone/ContactExtension.swift @@ -70,42 +70,5 @@ extension CNContact { return UIColor(hue: CGFloat(hash) / CGFloat(653), saturation: 1, brightness: 0.75, alpha: 1) } - func hasKey() -> Bool { - let handler = KeyHandler.getHandler() - for mail in self.emailAddresses { - if handler.addrHasKey(mail.value as! String) { - return true - } - } - return false - } - - //TODO check expiration date - //TODO add ability to choose different keys - func getKey() -> KeyWrapper? { - let handler = KeyHandler.getHandler() - for mail in self.emailAddresses { - if handler.addrHasKey(mail.value as! String) { - return handler.getKeyByAddr(mail.value as! String) - } - } - return nil - } - func getKey(mailaddress: String) -> KeyWrapper? { - let mail = mailaddress.lowercaseString - let handler = KeyHandler.getHandler() - return handler.getKeyByAddr(mail) - } - - //TODO fertigmachen - func addKey(key: PGPKey, mailaddress: String){ - let handler = KeyHandler.getHandler() - //handler.addKeyForMailaddress(mailaddress, key: key) - } - - func addPGPKey(key: KeyWrapper, mailaddress: String){ - let handler = KeyHandler.getHandler() - handler.addKeyForMailaddress(mailaddress, keyWrapper: key) - } } diff --git a/enzevalos_iphone/EnzevalosContact.swift b/enzevalos_iphone/EnzevalosContact.swift index 6562090d1c77b0f560f5f62587fdcc914d913a0c..8d9d4283ae122e72b1ef7857d1b8572b6abc5534 100644 --- a/enzevalos_iphone/EnzevalosContact.swift +++ b/enzevalos_iphone/EnzevalosContact.swift @@ -11,28 +11,65 @@ import Contacts class EnzevalosContact: Comparable { let contact: CNContact - let isSecure: Bool + internal var isSecure: Bool{ + get { + return self.key != nil + } + } var mails: [Mail] { didSet { self.mails.sortInPlace() } } + var mail_address : String var isVerified: Bool { - didSet { - if !isSecure { // only secure mails can be verified - isVerified = false + get { + if self.isSecure { + return self.key!.verified + } + return false + } + set(v){ + if !self.isSecure { + //self.isVerified = false + return + } else { + //in key verified setzen + self.key!.verified = v } } } - init(contact: CNContact, mails: [Mail], isSecure: Bool) { + var key : KeyWrapper? { + get { + return KeyHandler.getHandler().getKeyByAddr(mail_address) + } + set(k) { + if k == nil { + KeyHandler.getHandler().reset(mail_address) + } + if k!.address == mail_address { + KeyHandler.getHandler().addKeyForMailaddress(mail_address, keyWrapper: k!, completion: nil) + } + } + } + + init(contact: CNContact, mails: [Mail], mail_address: String) { self.contact = contact self.mails = mails.sort() - self.isSecure = isSecure - - self.isVerified = false + self.mail_address = mail_address + + //self.isSecure = KeyHandler.getHandler().addrHasKey(mail_address) } + + //TODO check expiration date + //TODO fertigmachen + func addPGPKey(key: PGPKey, completion: ((success: Bool) -> Void)?){ + let handler = KeyHandler.getHandler() + handler.addKeyForMailaddress(mail_address, key: key, completion: completion) + } + } func ==(lhs: EnzevalosContact, rhs: EnzevalosContact) -> Bool { diff --git a/enzevalos_iphone/InitViewController.swift b/enzevalos_iphone/InitViewController.swift index a7a66464a3ad11a10df48106e0bb24e9d6479839..49e61856bd3d52ac35dbd3b337b54bf54c10011b 100644 --- a/enzevalos_iphone/InitViewController.swift +++ b/enzevalos_iphone/InitViewController.swift @@ -17,6 +17,7 @@ class InitViewController : UIViewController { } func getDefaultSettings(){ + //let manager2 = MCOMailProvidersManager. let manager = MCOMailProvidersManager.init() //sharedManager() print(manager) let path = NSBundle.mainBundle().pathForResource("providers", ofType: "json") diff --git a/enzevalos_iphone/KeyHandler.swift b/enzevalos_iphone/KeyHandler.swift index f8dfbbf8172b4697a8bebf73f727a91e10f45cb8..0abdbcefd9456d58689e1f5616fe187b005c8533 100644 --- a/enzevalos_iphone/KeyHandler.swift +++ b/enzevalos_iphone/KeyHandler.swift @@ -27,6 +27,23 @@ class KeyHandler { return KeyHandler.handler! } + static func addressInKey(address: String, key: PGPKey) -> Bool { + for user in key.users { + if user.userID != nil { + var mail: String = user.userID! + if user.userID!.containsString("<") { + mail = String(mail.characters.split("<")[1]) + } + mail = mail.stringByReplacingOccurrencesOfString(">", withString: "") + mail = mail.lowercaseString + if address.lowercaseString == mail { + return true + } + } + } + return false + } + /*return the latest key added to the handler*/ func getKeyByAddr(addr: String) -> KeyWrapper? { let mail = addr.lowercaseString @@ -53,40 +70,32 @@ class KeyHandler { } */ - //Only for internal use; DO NOT CALL - func updateKeyForAddrs(keyWrapper: KeyWrapper, addr: [String]){ - //key.key.primaryKeyPacket.bodyData -// for mail in key.addresses { -// if let index = kchain.myObjectForKey(mail+"-index").integerValue{ -// if index >= 1 { -// kchain.mySetObject(key, forKey: mail+"-"+String(index)) -// kchain.writeToKeychain() -// } -// } -// } - } + //Only for internal use; DO NOT CALL func updateKey(keyWrapper: KeyWrapper){ - /*if let index = kchain.myObjectForKey(keyWrapper.address+"-index").integerValue{ - if index >= 1 { - if let key = kchain.myObjectForKey(keyWrapper.address+"-"+String(index)) { - if (key as! KeyWrapper).key.primaryKeyPacket.bodyData == keyWrapper.key.primaryKeyPacket.bodyData { - kchain.mySetObject(keyWrapper, forKey: keyWrapper.address) - kchain.writeToKeychain() - } - } + + var index : Int16 = 0 + + if (try? keychain.getData(keyWrapper.address+"-index")) != nil { + if let indexData = (try? keychain.getData(keyWrapper.address+"-index"))!{ + indexData.getBytes(&index, length: sizeof(Int16)) } - }*/ + } + if index == 0 { + return + } + + keychain[data: keyWrapper.address+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper) } /*only the PGPKey will be used to compare*/ - func getAddrsByKey(key : KeyWrapper) -> [String] { + /*func getAddrsByKey(key : KeyWrapper) -> [String] { /*let addrs = kchain.myObjectForKey(key.key.primaryKeyPacket.bodyData!) as? [String] if addrs != nil { return addrs! }*/ return [] - } + }*/ /*for now only the last key added to the handler will be shown*/ func getKeysByAddr(addr: String) -> [KeyWrapper] { @@ -106,7 +115,7 @@ class KeyHandler { //TODO add entry with PGPKey as searchKey -done - func addKey(key: PGPKey) { + func addKey(key: PGPKey, completion : ((success: Bool) -> Void)?) { var users : [String]? = [] for user in key.users { if user.userID != nil { @@ -118,6 +127,15 @@ class KeyHandler { mail = mail.lowercaseString users!.append(mail) + let kW = KeyWrapper(key: key, mailaddress: mail) + if kW == nil{ + if completion != nil { + completion!(success: false) + } + return + } + + let keyWrapper = kW! var index : Int16 = 0 if (try? keychain.getData(mail+"-index")) != nil { @@ -125,25 +143,31 @@ class KeyHandler { indexData.getBytes(&index, length: sizeof(Int16)) } } - /*if kchain.myObjectForKey(mail+"-index") != nil && kchain.myObjectForKey(mail+"-index").integerValue >= 1{ - index = kchain.myObjectForKey(mail+"-index").integerValue - }*/ index += 1 keychain[data: mail+"-index"] = NSData(bytes: &index, length: sizeof(Int16))//NSKeyedArchiver.archivedDataWithRootObject(index) - keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(KeyWrapper(key: key, mailaddress: mail)) - //kchain.mySetObject(index, forKey: mail+"-index") - //kchain.mySetObject(KeyWrapper(key: key, mailaddress: mail), forKey: mail+"-"+String(index)) - //kchain.writeToKeychain() + keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper) } } keychain[data: String(key.primaryKeyPacket.bodyData)] = NSKeyedArchiver.archivedDataWithRootObject(users!) + if completion != nil { + completion!(success: true) + } //kchain.mySetObject(users, forKey: key.primaryKeyPacket.bodyData!) //kchain.writeToKeychain() } - func addPrivateKey(key: PGPKey) { + func addPrivateKey(key: PGPKey, completion : ((success: Bool) -> Void)?) { let mail = (UserManager.loadUserValue(Attribute.UserAddr) as! String).lowercaseString + let kW = KeyWrapper(key: key, mailaddress: mail) + if kW == nil { + if completion != nil { + completion!(success: false) + } + return + } + let keyWrapper = kW! + var index : Int16 = 0 if (try? keychain.getData(mail+"-private-index")) != nil { @@ -158,7 +182,11 @@ class KeyHandler { index += 1 keychain[data: mail+"-private-index"] = NSData(bytes: &index, length: sizeof(Int16)) - keychain[data: mail+"-private-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(KeyWrapper(key: key, mailaddress: mail)) + keychain[data: mail+"-private-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper) + + if completion != nil { + completion!(success: true) + } } func getPrivateKey() -> KeyWrapper? { @@ -214,26 +242,59 @@ class KeyHandler { } } - //TODO convert to use of keychain instead of kchain - func addKeyForMailaddress(address: String, keyWrapper: KeyWrapper) { - /*let mail = address.lowercaseString - var index = 0 - if kchain.myObjectForKey(mail+"-index") != nil && kchain.myObjectForKey(mail+"-index").integerValue >= 1{ - index = kchain.myObjectForKey(mail+"-index").integerValue + + func addKeyForMailaddress(address: String, key: PGPKey, completion : ((success: Bool) -> Void)?){ + let mail: String = address.lowercaseString + + //prüfen, ob adresse in Key steht + let kW = KeyWrapper(key: key, mailaddress: mail) + + if kW == nil { + if completion != nil { + completion!(success: false) + } + return + } + let keyWrapper = kW! + + var index : Int16 = 0 + + if (try? keychain.getData(mail+"-index")) != nil { + if let indexData = (try? keychain.getData(mail+"-index"))!{ + indexData.getBytes(&index, length: sizeof(Int16)) + } } + index += 1 + keychain[data: mail+"-index"] = NSData(bytes: &index, length: sizeof(Int16)) + keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper) + //keychain[data: String(key.primaryKeyPacket.bodyData)] = NSKeyedArchiver.archivedDataWithRootObject([mail]) + } + + func addKeyForMailaddress(address: String, keyWrapper: KeyWrapper, completion : ((success: Bool) -> Void)?){ + let mail: String = address.lowercaseString - var addrsByKey : [String]? = [] - addrsByKey = kchain.myObjectForKey(keyWrapper.key.primaryKeyPacket.bodyData!) as? [String] - if addrsByKey == nil { - addrsByKey = Optional([mail]) + //prüfen, ob adresse in Key steht + + if keyWrapper.address == mail { + if completion != nil { + completion!(success: false) + } + return } + var index : Int16 = 0 - kchain.mySetObject(index, forKey: mail+"-index") - kchain.mySetObject(keyWrapper, forKey: mail+"-"+String(index)) - kchain.mySetObject(addrsByKey, forKey: keyWrapper.key.primaryKeyPacket.bodyData!) - kchain.writeToKeychain()*/ + if (try? keychain.getData(mail+"-index")) != nil { + if let indexData = (try? keychain.getData(mail+"-index"))!{ + indexData.getBytes(&index, length: sizeof(Int16)) + } + } + + index += 1 + keychain[data: mail+"-index"] = NSData(bytes: &index, length: sizeof(Int16)) + keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper) + //keychain[data: String(key.primaryKeyPacket.bodyData)] = NSKeyedArchiver.archivedDataWithRootObject([mail]) } func addrHasKey(address: String) -> Bool { diff --git a/enzevalos_iphone/KeyWrapper.swift b/enzevalos_iphone/KeyWrapper.swift index 531fed54d298f2d883e2977e999acd18b1b15217..35fb314a1c50a7f3d7fa14dce07b00e8f231d43b 100644 --- a/enzevalos_iphone/KeyWrapper.swift +++ b/enzevalos_iphone/KeyWrapper.swift @@ -47,32 +47,19 @@ class KeyWrapper : NSObject { handler.updateKey(self) } } - let address: String /*[String]{ - set (newAddrs) { - let handler = KeyHandler.createHandler() - //oldKey = self.copy() - - /*for addr in newAddrs { - if handler.getKeyByMailaddress(addr) != nil && { - - } - }*/ - //let handler = KeyHandler.createHandler() - handler.updateKey(self) - } - get { - return self.addresses - } - }*/ + let address: String let timestamp: NSDate - init(key: PGPKey, mailaddress: String){ + init?(key: PGPKey, mailaddress: String){ + if !KeyHandler.addressInKey(mailaddress, key: key) { + return nil + } self.key = key //self.oldKey = nil revoked = false trustlevel = 0 verified = false - self.address = mailaddress + self.address = mailaddress.lowercaseString self.timestamp = NSDate.init() /*let handler = KeyHandler.createHandler() diff --git a/enzevalos_iphone/MailHandler.swift b/enzevalos_iphone/MailHandler.swift index dc19aec9e14041faaca8dd252c7f332db896b05b..10f799f82fa600b960971530a551882785d89285 100644 --- a/enzevalos_iphone/MailHandler.swift +++ b/enzevalos_iphone/MailHandler.swift @@ -315,23 +315,6 @@ class MailHandler { } } /*Jakob prototypeänderung anfang*/ - /*ursprünglicher Code : - - let mail = Mail(uid: message.uid, sender: header.from, receivers: rec, cc: cc, time: header.date, received: true, subject: header.subject, body: body, isEncrypted: false, isVerified: false, trouble: false, isUnread: !messageRead, flags: message.flags) - - */ - - /*CryptoHandler.getHandler().pgp.keys.append((KeyHandler.createHandler().getPrivateKey()?.key)!) - - let content = try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil) - print(content) - - var signed : ObjCBool = false - var valid : ObjCBool = false - var integrityProtected : ObjCBool = false - - print(try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: KeyHandler.createHandler().getKeyByAddr(header.from.mailbox)?.key, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))*/ - var enc = false let ver = false @@ -344,56 +327,9 @@ class MailHandler { enc = true } - /*if enc { - if !CryptoHandler.getHandler().pgp.keys.contains((KeyHandler.createHandler().getPrivateKey()?.key)!) { - CryptoHandler.getHandler().pgp.keys.append((KeyHandler.createHandler().getPrivateKey()?.key)!) - } - do { - var signed : ObjCBool = false - var valid : ObjCBool = false - var integrityProtected : ObjCBool = false - - //verifyWithPublicKey: KeyHandler.createHandler().getKeyByAddr(header.from.mailbox)?.key - if (try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected) as NSData?) != nil && ((try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))! as NSData?) != nil{ - - decBody = String(data: (try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))! as NSData, encoding: NSUTF8StringEncoding) - //print(String(data: (try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected), encoding: NSUTF8StringEncoding))) - } - //print(try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected)) - //let content = try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil) - //print(content) - } catch _ { - - troub = true - print("error while decrypting") - } - }*/ //now done in the MailObject itself - - /*if header.subject != nil { - if header.subject == "Schlüssel" { - enc = true - } - if header.subject == "Re: Prüfung"{ - enc = true - troub = true - } - if header.subject == "Test4" { - ver = true - enc = true - } - if header.subject == "Multiple"{ - enc = true - } - if header.subject == "Noch ein Test"{ - enc = true - ver = true - } - if header.subject == "jetzt du"{ - enc = true - } - }*/ let mail = Mail(uid: message.uid, sender: header.from, receivers: rec, cc: cc, time: header.date, received: true, subject: header.subject, body: body, decryptedBody: decBody, isEncrypted: enc, isVerified: ver, trouble: troub, isUnread: !messageRead, flags: message.flags) mail.decryptIfPossible() + /*Jakob prototypeänderung Ende*/ self.delegate?.addNewMail(mail) diff --git a/enzevalos_iphone/MailObject.swift b/enzevalos_iphone/MailObject.swift index 49510a0c989a0400abd44d051a1282cb12853e60..63b12d36ceedd8f1d6a8fba7f363368ba70768d9 100644 --- a/enzevalos_iphone/MailObject.swift +++ b/enzevalos_iphone/MailObject.swift @@ -39,7 +39,7 @@ class Mail: Comparable { var isSecure: Bool { get { - return isVerified && isEncrypted && !trouble + return isVerified && isEncrypted && !unableToDecrypt && !trouble } }