diff --git a/passKit/Helpers/AppError.swift b/passKit/Helpers/AppError.swift index 5386ee1..515c18a 100644 --- a/passKit/Helpers/AppError.swift +++ b/passKit/Helpers/AppError.swift @@ -16,6 +16,7 @@ public enum AppError: Error { case GitResetError case PGPPublicKeyNotExistError case WrongPasswordFilename + case YamlLoadError case UnknownError } @@ -36,6 +37,8 @@ extension AppError: LocalizedError { return "PGP public key doesn't exist." case .WrongPasswordFilename: return "Cannot write to the password file." + case .YamlLoadError: + return "Cannot be parsed as a YAML file." case .UnknownError: return "Unknown error." } diff --git a/passKit/Models/Password.swift b/passKit/Models/Password.swift index d610e84..662286d 100644 --- a/passKit/Models/Password.swift +++ b/passKit/Models/Password.swift @@ -126,9 +126,29 @@ public class Password { // construct the otp token self.updateOtpToken() } + + // check whether the file has lines with duplicated field names + private func checkDuplicatedFields(lines: String) -> Bool { + var keys = Set() + var hasDuplicatedFields = false + lines.enumerateLines { (line, stop) -> () in + let (key, _) = Password.getKeyValuePair(from: line) + if let key = key { + if keys.contains(key) { + hasDuplicatedFields = true + stop = true + } + keys.insert(key) + } + } + return hasDuplicatedFields + } private func getAdditionalFields(fromYaml: String) throws { guard !fromYaml.isEmpty else { return } + if checkDuplicatedFields(lines: fromYaml) { + throw AppError.YamlLoadError + } let yamlFile = try Yams.load(yaml: fromYaml) as! [String: Any] additions.append(contentsOf: yamlFile.map { ($0, String(describing: $1)) }) }