summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2023-04-14 13:01:13 +0200
committerAndrej Mihajlov <and@mullvad.net>2023-04-14 13:01:13 +0200
commit09ca3b13667b4ea6562d5520aa47913d8b60ceb2 (patch)
tree8f39522b19d8e9d833c5869c2981117b7dbe2f4e
parent07865e0a5ccb08fab631878443a3fdd519e6f710 (diff)
parentbb9335ec2c5380bee7193eab8f1f13319028fed2 (diff)
downloadmullvadvpn-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.swift10
-rw-r--r--ios/MullvadVPNTests/AccountTokenInputTests.swift30
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 {