diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2023-04-14 13:01:13 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2023-04-14 13:01:13 +0200 |
| commit | 09ca3b13667b4ea6562d5520aa47913d8b60ceb2 (patch) | |
| tree | 8f39522b19d8e9d833c5869c2981117b7dbe2f4e | |
| parent | 07865e0a5ccb08fab631878443a3fdd519e6f710 (diff) | |
| parent | bb9335ec2c5380bee7193eab8f1f13319028fed2 (diff) | |
| download | mullvadvpn-09ca3b13667b4ea6562d5520aa47913d8b60ceb2.tar.xz mullvadvpn-09ca3b13667b4ea6562d5520aa47913d8b60ceb2.zip | |
Merge branch 'non-allowed-characters-in-the-login-text-ios-85'
| -rw-r--r-- | ios/MullvadVPN/View controllers/Login/AccountTokenInput.swift | 10 | ||||
| -rw-r--r-- | ios/MullvadVPNTests/AccountTokenInputTests.swift | 30 |
2 files changed, 38 insertions, 2 deletions
diff --git a/ios/MullvadVPN/View controllers/Login/AccountTokenInput.swift b/ios/MullvadVPN/View controllers/Login/AccountTokenInput.swift index cccc5a1a75..1fef51a479 100644 --- a/ios/MullvadVPN/View controllers/Login/AccountTokenInput.swift +++ b/ios/MullvadVPN/View controllers/Login/AccountTokenInput.swift @@ -149,7 +149,13 @@ extension AccountTokenInput: UITextFieldDelegate, UITextPasteDelegate { replacementString string: String ) -> Bool { let emptySelection = textField.selectedTextRange?.isEmpty ?? false - let stringRange = Range(range, in: formattedString)! + + // Certain characters such as a backtick can pass through the textField, and appear as an empty string, with a + // range outside of the boundaries of the `formattedString`. Such characters are ignored. + guard let stringRange = Range(range, in: formattedString) else { + updateTextField(textField, notifyDelegate: true) + return false + } replaceCharacters( in: stringRange, @@ -177,7 +183,7 @@ extension AccountTokenInput: UITextFieldDelegate, UITextPasteDelegate { let length = textField.offset(from: textRange.start, to: textRange.end) let nsRange = NSRange(location: location, length: length) - let stringRange = Range(nsRange, in: formattedString)! + guard let stringRange = Range(nsRange, in: formattedString) else { return textRange } replaceCharacters( in: stringRange, diff --git a/ios/MullvadVPNTests/AccountTokenInputTests.swift b/ios/MullvadVPNTests/AccountTokenInputTests.swift index 29f232feb3..82a09e1285 100644 --- a/ios/MullvadVPNTests/AccountTokenInputTests.swift +++ b/ios/MullvadVPNTests/AccountTokenInputTests.swift @@ -90,6 +90,36 @@ class AccountTokenInputTests: XCTestCase { XCTAssertEqual(input.formattedString, "1234 0000") XCTAssertEqual(input.caretPosition, 9) } + + func testInvalidCharactersReplacesTextFieldTextWithFormattedString() { + let input = AccountTokenInput(string: kSampleToken) + let invalidRange = NSRange(location: kSampleToken.count + 1, length: 0) + let textField = UITextField() + + _ = input.textField(textField, shouldChangeCharactersIn: invalidRange, replacementString: "´") + + XCTAssertEqual(textField.text, input.formattedString) + } + + func testDeleteCharacterOutsideOfTokenBoundaryDoesNotDeleteAnything() { + let input = AccountTokenInput(string: kSampleToken) + let invalidRange = NSRange(location: kSampleToken.count + 1, length: 1) + let textField = UITextField() + + _ = input.textField(textField, shouldChangeCharactersIn: invalidRange, replacementString: "") + + XCTAssertEqual(textField.text, input.formattedString) + } + + func testDeleteLastCharacter() { + let input = AccountTokenInput(string: kSampleToken) + let lastCharacterRange = NSRange(location: kSampleToken.count, length: 1) + let textField = UITextField() + + _ = input.textField(textField, shouldChangeCharactersIn: lastCharacterRange, replacementString: "") + + XCTAssertEqual(textField.text, "1234 567") + } } private extension String { |
