diff --git a/enzevalos_iphone/TravelHandler.swift b/enzevalos_iphone/TravelHandler.swift index d4ad387d8bb6630c557d0719010391fe26ebedc6..dacc5e8c80eb2d00d9a579e90cdb42b5b89c3ccd 100644 --- a/enzevalos_iphone/TravelHandler.swift +++ b/enzevalos_iphone/TravelHandler.swift @@ -209,7 +209,7 @@ public class TravelHandler { if let adr = DataHandler.handler.findMailAddress(adr: c), adr.hasKey, let primaryKey = adr.primaryKey { contactsWithKey.append(c) keyIDs[c] = primaryKey.keyID - keys[c] = pgp.exportKey(id: primaryKey.keyID, isSecretkey: false, autocrypt: false) + keys[c] = encodeKeys(relatedTo: primaryKey) } } let traveler = Traveler(contacts: contactsWithKey, keys: keys, backupAddress: backupAddress, backupKey: backupKey, canSecurelyBackup: canSecurelyBackup) @@ -229,6 +229,40 @@ public class TravelHandler { return password } + private func encodeKeys(relatedTo key: PersistentKey) -> String { + var keys: [String] = [] + let pgp = SwiftPGP() + for relatedKey in key.relatedKeys { + if let exportedKey = pgp.exportKey(id: relatedKey.keyID, isSecretkey: false, autocrypt: false) { + keys.append(exportedKey) + } + } + if let data = try? JSONEncoder().encode(keys) { + return String(data: data, encoding: .utf8) ?? "" + } + return "" + } + + private func compareKeys(keysFromTraveler: String, storedPrimaryKey: PersistentKey) -> Bool { + if let data = keysFromTraveler.data(using: .utf8), let checkedKeys = try? JSONDecoder().decode([String].self, from: data) { + var storedKeys: [String] = [] + let pgp = SwiftPGP() + for relatedKey in storedPrimaryKey.relatedKeys { + if let exportedKey = pgp.exportKey(id: relatedKey.keyID, isSecretkey: false, autocrypt: false) { + storedKeys.append(exportedKey) + } + } + for storedKey in storedKeys { + if !checkedKeys.contains(storedKey) { + return false + } + return true + } + } + + return false + } + /*throw different Errors: * all mails could not be sent * some mails could not be sent @@ -249,7 +283,7 @@ public class TravelHandler { var keyIDs: [String: String] = [:] let pgp = SwiftPGP() for c in traveler.contacts { - if let adr = DataHandler.handler.findMailAddress(adr: c), adr.hasKey, let primaryKey = adr.primaryKey, pgp.exportKey(id: primaryKey.keyID, isSecretkey: false, autocrypt: false) == travelerKeys[c] { + if let adr = DataHandler.handler.findMailAddress(adr: c), adr.hasKey, let primaryKey = adr.primaryKey, let travelerKey = travelerKeys[c], compareKeys(keysFromTraveler: travelerKey, storedPrimaryKey: primaryKey){ keyIDs[c] = primaryKey.keyID } else { throw TravelError.corruptData