Better registration username error messages; close #4077

This commit is contained in:
Greg Finley 2018-03-03 13:01:58 -08:00
parent ef9329027e
commit 56a299d8e1
5 changed files with 24 additions and 8 deletions

View file

@ -630,8 +630,9 @@ val `boardSize` = new Translated("boardSize", Site)
val `pieceSet` = new Translated("pieceSet", Site)
val `embedInYourWebsite` = new Translated("embedInYourWebsite", Site)
val `usernameAlreadyUsed` = new Translated("usernameAlreadyUsed", Site)
val `usernameInvalid` = new Translated("usernameInvalid", Site)
val `usernameStartNoNumber` = new Translated("usernameStartNoNumber", Site)
val `usernamePrefixInvalid` = new Translated("usernamePrefixInvalid", Site)
val `usernameSuffixInvalid` = new Translated("usernameSuffixInvalid", Site)
val `usernameCharsInvalid` = new Translated("usernameCharsInvalid", Site)
val `usernameUnacceptable` = new Translated("usernameUnacceptable", Site)
val `directlySupportLichess` = new Translated("directlySupportLichess", Site)
val `playChessInStyle` = new Translated("playChessInStyle", Site)

View file

@ -37,8 +37,16 @@ final class DataForm(
Constraints minLength 2,
Constraints maxLength 20,
Constraints.pattern(
regex = User.newUsernameRegex,
error = "usernameInvalid"
regex = User.newUsernamePrefix,
error = "usernamePrefixInvalid"
),
Constraints.pattern(
regex = User.newUsernameSuffix,
error = "usernameSuffixInvalid"
),
Constraints.pattern(
regex = User.newUsernameChars,
error = "usernameCharsInvalid"
)
).verifying("usernameUnacceptable", u => !LameName.username(u))
.verifying("usernameAlreadyUsed", u => !UserRepo.nameExists(u).awaitSeconds(4))

View file

@ -148,9 +148,15 @@ object User {
// what existing usernames are like
val historicalUsernameRegex = """(?i)[a-z0-9][\w-]*[a-z0-9]""".r
// what new usernames should be like
// what new usernames should be like -- now split into further parts for clearer error messages
val newUsernameRegex = """(?i)[a-z][\w-]*[a-z0-9]""".r
val newUsernamePrefix = """(?i)[a-z].*""".r
val newUsernameSuffix = """(?i).*[a-z0-9]""".r
val newUsernameChars = """(?i)[\w-]*""".r
def couldBeUsername(str: User.ID) = historicalUsernameRegex.pattern.matcher(str).matches
def normalize(username: String) = username.toLowerCase

View file

@ -5,7 +5,7 @@ import org.specs2.mutable.Specification
class UserTest extends Specification {
def canSignup(str: User.ID) =
User.newUsernameRegex.pattern.matcher(str).matches
User.newUsernamePrefix.pattern.matcher(str).matches && User.newUsernameSuffix.pattern.matcher(str).matches && User.newUsernameChars.pattern.matcher(str).matches
"username regex" in {
import User.couldBeUsername

View file

@ -752,8 +752,9 @@ in %3$s</string>
<string name="pieceSet">Piece set</string>
<string name="embedInYourWebsite">Embed in your website</string>
<string name="usernameAlreadyUsed">This username is already in use, please try another one.</string>
<string name="usernameInvalid">Invalid username. Please use only letters, numbers, underscore and dash.</string>
<string name="usernameStartNoNumber">The username must not start with a number.</string>
<string name="usernamePrefixInvalid">The username must start with a letter.</string>
<string name="usernameSuffixInvalid">The username must end with a letter or a number.</string>
<string name="usernameCharsInvalid">The username must only contain letters, numbers, underscores, and hyphens.</string>
<string name="usernameUnacceptable">This username is not acceptable.</string>
<string name="directlySupportLichess">Directly support Lichess</string>
<string name="playChessInStyle">Play chess in style</string>