From 71cb9a02c0253c78c83dc3135fbef663911e5c88 Mon Sep 17 00:00:00 2001 From: yishilin14 Date: Fri, 3 Mar 2017 10:49:32 +0800 Subject: [PATCH] Polish class Password --- pass/Models/Password.swift | 69 +++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/pass/Models/Password.swift b/pass/Models/Password.swift index 869248c..3ae0096 100644 --- a/pass/Models/Password.swift +++ b/pass/Models/Password.swift @@ -23,18 +23,15 @@ class Password { var changed = false init(name: String, plainText: String) { + self.name = name + self.plainText = plainText + + // get password and additional fields let plainTextSplit = plainText.characters.split(maxSplits: 1, omittingEmptySubsequences: false) { $0 == "\n" || $0 == "\r\n" - }.map(String.init) - let password = plainTextSplit[0] - let additionFieldsArray = Password.getAdditionFields(from: plainTextSplit[1]) - self.name = name - self.password = password - self.plainText = plainText - for additionField in additionFieldsArray { - self.additions[additionField.title] = additionField.content - self.additionKeys.append(additionField.title) - } + }.map(String.init) + self.password = plainTextSplit[0] + (self.additions, self.additionKeys) = Password.getAdditionFields(from: plainTextSplit[1]) } func getUsername() -> String? { @@ -45,45 +42,55 @@ class Password { return getAdditionValue(withKey: "URL") ?? getAdditionValue(withKey: "url") ?? getAdditionValue(withKey: "Url") } - static func getAdditionFields(from additionFieldsPlainText: String) -> [AdditionField]{ - var additionFieldsArray = [AdditionField]() + // return a key-value pair from the line + // key might be nil, if there is no ":" in the line + static func getKeyValuePair(from line: String) -> (key: String?, value: String) { + let items = line.characters.split(separator: ":", maxSplits: 1, omittingEmptySubsequences: true).map(String.init) + var key : String? + var value = "" + if items.count == 1 { + value = items[0] + } else if items.count == 2 { + key = items[0] + value = items[1].trimmingCharacters(in: .whitespaces) + } + return (key, value) + } + + static func getAdditionFields(from additionFieldsPlainText: String) -> ([String: String], [String]){ + var additions = [String: String]() + var additionKeys = [String]() var unknownIndex = 0 additionFieldsPlainText.enumerateLines() { line, _ in if line == "" { return } - let items = line.characters.split(separator: ":", maxSplits: 1, omittingEmptySubsequences: true).map(String.init) - var key = "" - var value = "" - if items.count == 1 { + var (key, value) = getKeyValuePair(from: line) + if key == nil { unknownIndex += 1 key = "unknown \(unknownIndex)" - value = items[0] - } else if items.count == 2 { - key = items[0] - value = items[1].trimmingCharacters(in: .whitespaces) } - additionFieldsArray.append(AdditionField(title: key, content: value)) + additions[key!] = value + additionKeys.append(key!) } - return additionFieldsArray + + return (additions, additionKeys) } func updatePassword(name: String, plainText: String) { self.name = name if self.plainText != plainText { + self.name = name + self.plainText = plainText + + // get password and additional fields let plainTextSplit = plainText.characters.split(maxSplits: 1, omittingEmptySubsequences: false) { $0 == "\n" || $0 == "\r\n" }.map(String.init) - let password = plainTextSplit[0] - let additionFieldsArray = Password.getAdditionFields(from: plainTextSplit[1]) - self.password = password - self.additions = [String: String]() - self.additionKeys = [] - for additionField in additionFieldsArray { - self.additions[additionField.title] = additionField.content - self.additionKeys.append(additionField.title) - } + self.password = plainTextSplit[0] + (self.additions, self.additionKeys) = Password.getAdditionFields(from: plainTextSplit[1]) + changed = true } }