Skip to content

Commit

Permalink
Merge pull request #6736 from vector-im/feature/adm/non-ascii-username
Browse files Browse the repository at this point in the history
Fixes crash when entering non ascii username during account creation
  • Loading branch information
ouchadam authored Aug 9, 2022
2 parents 7e7b98a + 9a97e0b commit 58d47df
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 19 deletions.
1 change: 1 addition & 0 deletions changelog.d/6735.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixes crash when entering non ascii characters during account creation
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@ fun Throwable.isUsernameInUse() = this is Failure.ServerError &&
error.code == MatrixError.M_USER_IN_USE

fun Throwable.isInvalidUsername() = this is Failure.ServerError &&
error.code == MatrixError.M_INVALID_USERNAME
(error.code == MatrixError.M_INVALID_USERNAME || usernameContainsNonAsciiCharacters())

private fun Failure.ServerError.usernameContainsNonAsciiCharacters() = error.code == MatrixError.M_UNKNOWN &&
error.message == "Query parameter \'username\' must be ascii"

fun Throwable.isInvalidPassword() = this is Failure.ServerError &&
error.code == MatrixError.M_FORBIDDEN &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,25 +193,32 @@ class OnboardingViewModel @AssistedInject constructor(
}

private suspend fun checkUserNameAvailability(userName: String) {
when (val result = registrationWizard.registrationAvailable(userName)) {
RegistrationAvailability.Available -> {
setState {
copy(
registrationState = RegistrationState(
isUserNameAvailable = true,
selectedMatrixId = when {
userName.isMatrixId() -> userName
else -> "@$userName:${selectedHomeserver.userFacingUrl.toReducedUrl()}"
},
)
)
}
}
runCatching { registrationWizard.registrationAvailable(userName) }.fold(
onSuccess = { result ->
when (result) {
RegistrationAvailability.Available -> {
setState {
copy(
registrationState = RegistrationState(
isUserNameAvailable = true,
selectedMatrixId = when {
userName.isMatrixId() -> userName
else -> "@$userName:${selectedHomeserver.userFacingUrl.toReducedUrl()}"
},
)
)
}
}

is RegistrationAvailability.NotAvailable -> {
_viewEvents.post(OnboardingViewEvents.Failure(result.failure))
}
}
is RegistrationAvailability.NotAvailable -> {
_viewEvents.post(OnboardingViewEvents.Failure(result.failure))
}
}
},
onFailure = {
_viewEvents.post(OnboardingViewEvents.Failure(it))
}
)
}

private fun withAction(action: OnboardingAction, block: (OnboardingAction) -> Unit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,20 @@ class OnboardingViewModelTest {
.finish()
}

@Test
fun `given available username throws, when a register username is entered, then emits error`() = runTest {
viewModelWith(initialRegistrationState(A_HOMESERVER_URL))
fakeAuthenticationService.givenRegistrationWizard(FakeRegistrationWizard().also { it.givenUserNameIsAvailableThrows(A_USERNAME, AN_ERROR) })
val test = viewModel.test()

viewModel.handle(OnboardingAction.UserNameEnteredAction.Registration(A_USERNAME))

test
.assertStates(initialState)
.assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
.finish()
}

@Test
fun `given available username, when a register username is entered, then emits available registration state`() = runTest {
viewModelWith(initialRegistrationState(A_HOMESERVER_URL))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ class FakeRegistrationWizard : RegistrationWizard by mockk(relaxed = false) {
coEvery { registrationAvailable(userName) } returns RegistrationAvailability.Available
}

fun givenUserNameIsAvailableThrows(userName: String, cause: Throwable) {
coEvery { registrationAvailable(userName) } throws cause
}

fun givenUserNameIsUnavailable(userName: String, failure: Failure.ServerError) {
coEvery { registrationAvailable(userName) } returns RegistrationAvailability.NotAvailable(failure)
}
Expand Down

0 comments on commit 58d47df

Please sign in to comment.