Skip to content

Commit

Permalink
Simplified pin result + deployment fix (wultra#43)
Browse files Browse the repository at this point in the history
  • Loading branch information
kober32 committed Oct 3, 2022
1 parent ed3d8eb commit 854e748
Show file tree
Hide file tree
Showing 22 changed files with 528 additions and 228 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,21 @@ class PassMeterInstrumentedTest {
@Test
fun testPinIssues() {
val frequent = PasswordTester.getInstance().testPin("1111")
assertTrue(frequent.contains(PinTestResult.FREQUENTLY_USED))
assertTrue(frequent.issues.contains(PinTestIssue.FREQUENTLY_USED))
val pattern = PasswordTester.getInstance().testPin("1357")
assertTrue(pattern.contains(PinTestResult.HAS_PATTERN))
assertTrue(pattern.issues.contains(PinTestIssue.HAS_PATTERN))
val date = PasswordTester.getInstance().testPin("1990")
assertTrue(date.contains(PinTestResult.POSSIBLY_DATE))
assertTrue(date.issues.contains(PinTestIssue.POSSIBLY_DATE))
val unique = PasswordTester.getInstance().testPin("1112")
assertTrue(unique.contains(PinTestResult.NOT_UNIQUE))
assertTrue(unique.issues.contains(PinTestIssue.NOT_UNIQUE))
val repeating = PasswordTester.getInstance().testPin("1111")
assertTrue(repeating.contains(PinTestResult.REPEATING_CHARACTERS))
assertTrue(repeating.issues.contains(PinTestIssue.REPEATING_CHARACTERS))
}

@Test
fun testOKPin() {
val pin = PasswordTester.getInstance().testPin("9562")
assertTrue(pin.isEmpty())
val result = PasswordTester.getInstance().testPin("9562")
assertTrue(result.issues.isEmpty())
}

@Test
Expand All @@ -56,11 +56,11 @@ class PassMeterInstrumentedTest {
val noDates = arrayOf("1313", "0028", "1287", "9752", "151590", "001297", "41121987")

for (date in dates) {
assertTrue(date, PasswordTester.getInstance().testPin(date).contains(PinTestResult.POSSIBLY_DATE))
assertTrue(date, PasswordTester.getInstance().testPin(date).issues.contains(PinTestIssue.POSSIBLY_DATE))
}

for (nodate in noDates) {
assertTrue(nodate, PasswordTester.getInstance().testPin(nodate).contains(PinTestResult.POSSIBLY_DATE) == false)
assertTrue(nodate, PasswordTester.getInstance().testPin(nodate).issues.contains(PinTestIssue.POSSIBLY_DATE) == false)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,35 +98,28 @@ class MainActivity : AppCompatActivity() {
try {

val result = PasswordTester.getInstance().testPin(pin)
warnUser = result.shouldWarnUserAboutWeakPin()

if (result.isEmpty()) {
if (result.issues.isEmpty()) {
text = "Good PIN 👍"
} else {
if (result.contains(PinTestResult.FREQUENTLY_USED)) {
if (result.issues.contains(PinTestIssue.FREQUENTLY_USED)) {
text += "- frequently used\n"
}
if (result.contains(PinTestResult.NOT_UNIQUE)) {
if (result.issues.contains(PinTestIssue.NOT_UNIQUE)) {
text += "- not enough unique characters\n"
}
if (result.contains(PinTestResult.HAS_PATTERN)) {
if (result.issues.contains(PinTestIssue.HAS_PATTERN)) {
text += "- repeating pattern\n"
}
if (result.contains(PinTestResult.POSSIBLY_DATE)) {
if (result.issues.contains(PinTestIssue.POSSIBLY_DATE)) {
text += "- could be a date\n"
}
if (result.contains(PinTestResult.REPEATING_CHARACTERS)) {
if (result.issues.contains(PinTestIssue.REPEATING_CHARACTERS)) {
text += "- too much repeating characters\n"
}
}

warnUser = if (pin.length == 4) {
result.contains(PinTestResult.FREQUENTLY_USED) || result.contains(PinTestResult.NOT_UNIQUE)
} else if (pin.length <= 6) {
result.contains(PinTestResult.FREQUENTLY_USED) || result.contains(PinTestResult.NOT_UNIQUE) || result.contains(PinTestResult.REPEATING_CHARACTERS)
} else {
result.contains(PinTestResult.FREQUENTLY_USED) || result.contains(PinTestResult.NOT_UNIQUE) || result.contains(PinTestResult.REPEATING_CHARACTERS) || result.contains(PinTestResult.HAS_PATTERN)
}

} catch (e: WrongPinException) {
text = "PIN format error"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,45 +114,35 @@ class ViewController: UIViewController {
text = "PIN has to be at least 4 characters long"

} else if isPin(pin) {

let result = PasswordTester.shared.testPin(pin)
warnUser = result.shouldWarnUserAboutWeakPin

if result.isEmpty {
if result.issues.isEmpty {
text += "Good pin 👍"
} else {
if result.contains(.frequentlyUsed) {
if result.issues.contains(.frequentlyUsed) {
text += "- frequently used\n"
}
if result.contains(.notUnique) {
if result.issues.contains(.notUnique) {
text += "- not enough unique characters\n"
}
if result.contains(.patternFound) {
if result.issues.contains(.patternFound) {
text += "- repeating pattern\n"
}
if result.contains(.possiblyDate) {
if result.issues.contains(.possiblyDate) {
text += "- could be a date\n"
}
if result.contains(.repeatingCharacters) {
if result.issues.contains(.repeatingCharacters) {
text += "- too much repeating characters\n"
}
if result.contains(.pinFormatError) {
if result.issues.contains(.pinFormatError) {
text = "- format error!"
}
}

// We want to warn the user only in some cases. Otherwise, we could eliminate too much pin codes and that could be anoying

if pin.count == 4 {
warnUser = result.contains(.frequentlyUsed) || result.contains(.notUnique)
} else if pin.count <= 6 {
warnUser = result.contains(.frequentlyUsed) || result.contains(.notUnique) || result.contains(.repeatingCharacters)
} else {
warnUser = result.contains(.frequentlyUsed) || result.contains(.notUnique) || result.contains(.repeatingCharacters) || result.contains(.patternFound)
}

} else {

text = "Not a PIN"

}

runOnMain {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,37 +38,37 @@ class PassMeterExampleTests: XCTestCase {

func testWrongInputPin() {
let result = PasswordTester.shared.testPin("asdf")
XCTAssert(result == .pinFormatError)
XCTAssert(result.issues == .pinFormatError)
}

func testPinIssues() {
let frequent = PasswordTester.shared.testPin("1111")
XCTAssert(frequent.contains(.frequentlyUsed))
XCTAssert(frequent.issues.contains(.frequentlyUsed))
let pattern = PasswordTester.shared.testPin("1357")
XCTAssert(pattern.contains(.patternFound))
XCTAssert(pattern.issues.contains(.patternFound))
let date = PasswordTester.shared.testPin("1990")
XCTAssert(date.contains(.possiblyDate))
XCTAssert(date.issues.contains(.possiblyDate))
let unique = PasswordTester.shared.testPin("1112")
XCTAssert(unique.contains(.notUnique))
XCTAssert(unique.issues.contains(.notUnique))
let repeating = PasswordTester.shared.testPin("1111")
XCTAssert(repeating.contains(.repeatingCharacters))
XCTAssert(repeating.issues.contains(.repeatingCharacters))
}

func testOKPin() {
let pin = PasswordTester.shared.testPin("9562")
XCTAssert(pin.isEmpty)
XCTAssert(pin.issues.isEmpty)
}

func testPinDates() {
let dates = ["0304", "1012", "3101", "1998", "2005", "150990", "241065", "16021998", "03122001"]
let noDates = ["1313", "0028", "1287", "9752", "151590", "001297", "41121987"]

for date in dates {
XCTAssert(PasswordTester.shared.testPin(date).contains(.possiblyDate), date)
XCTAssert(PasswordTester.shared.testPin(date).issues.contains(.possiblyDate), date)
}

for nodate in noDates {
XCTAssert(PasswordTester.shared.testPin(nodate).contains(.possiblyDate) == false, nodate)
XCTAssert(PasswordTester.shared.testPin(nodate).issues.contains(.possiblyDate) == false, nodate)
}
}

Expand Down
Loading

0 comments on commit 854e748

Please sign in to comment.