From 3a0e6fa3f6cbccf8f2d6340559e6aab2d128ab62 Mon Sep 17 00:00:00 2001 From: Danny Moesch Date: Sun, 11 Mar 2018 13:01:46 +0100 Subject: [PATCH] Consider OTP tokens as possible lines in password files --- passKit/Models/Password.swift | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/passKit/Models/Password.swift b/passKit/Models/Password.swift index c23de5a..d610e84 100644 --- a/passKit/Models/Password.swift +++ b/passKit/Models/Password.swift @@ -87,7 +87,7 @@ public class Password { additions.removeAll() // split the plain text - let plainTextSplit = self.plainText.split(maxSplits: 1, omittingEmptySubsequences: false) { + let plainTextSplit = self.plainText.split(omittingEmptySubsequences: true) { $0 == "\n" || $0 == "\r\n" }.map(String.init) @@ -95,16 +95,25 @@ public class Password { password = plainTextSplit.first ?? "" // get remaining lines - let additionalFields = plainTextSplit.last ?? "" - + let additionalLines = plainTextSplit[1...] + + // separate normal lines (no otp tokens) + let normalAdditionalLines = additionalLines.filter { + !$0.hasPrefix(Password.OTPAUTH_URL_START) + }.joined(separator: "\n") + // try to interpret the text format as YAML first do { - try getAdditionalFields(fromYaml: additionalFields) + try getAdditionalFields(fromYaml: normalAdditionalLines) } catch { - getAdditionalFields(fromPlainText: additionalFields) + getAdditionalFields(fromPlainText: normalAdditionalLines) } + // get and append otp tokens + let otpAdditionalLines = additionalLines.filter { $0.hasPrefix(Password.OTPAUTH_URL_START) } + otpAdditionalLines.forEach { self.additions.append((Password.OTPAUTH, $0)) } + // check whether the first line looks like an otp entry let (key, value) = Password.getKeyValuePair(from: self.password) if Password.otpKeywords.contains(key ?? "") {