diff options
| author | Adam Soltys <[email protected]> | 2014-08-15 11:58:54 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2014-08-15 11:58:54 -0700 |
| commit | 41387a388a1786354ab4b1f8d6c3a264958bcbeb (patch) | |
| tree | a1911ed6e7aa8a846aeb1b3035b42b87e6f13049 | |
| parent | 2f7453a30daaa68a024ec70588ea50aa53368dcc (diff) | |
| download | coinos-server-41387a388a1786354ab4b1f8d6c3a264958bcbeb.tar.gz coinos-server-41387a388a1786354ab4b1f8d6c3a264958bcbeb.zip | |
Validate registration form
| -rw-r--r-- | public/js/check_email.js | 4 | ||||
| -rw-r--r-- | public/js/register.coffee | 51 | ||||
| -rw-r--r-- | public/js/score_password.js | 28 | ||||
| -rw-r--r-- | views/users/new.html | 2 |
4 files changed, 84 insertions, 1 deletions
diff --git a/public/js/check_email.js b/public/js/check_email.js new file mode 100644 index 00000000..402b93af --- /dev/null +++ b/public/js/check_email.js @@ -0,0 +1,4 @@ +function validateEmail(email) { + var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(email); +} diff --git a/public/js/register.coffee b/public/js/register.coffee index 57c399e5..a7285424 100644 --- a/public/js/register.coffee +++ b/public/js/register.coffee @@ -1,5 +1,56 @@ #= require js/jquery-1.8.2.min.js +#= require js/jquery-ui.min.js +#= require js/score_password.js +#= require js/check_email.js $(-> $('#username').focus() + + $('#username').blur(-> + $(this).parent().next('.alert').remove() + + if /^[a-z]+$/.test($(this).val()) and $(this).val().length > 2 + $(this).parent().removeClass('has-error') + else + $(this).parent().addClass('has-error') + $(this).parent().after('<div class="alert alert-danger">Username must be lowecase and have at least 3 characters</div>') + ) + + $('#password').blur(-> + $('#confirm').blur() + $(this).parent().next('.alert').remove() + score = scorePassword($(this).val()) + + if score > 40 + $(this).parent().removeClass('has-error') + else + $(this).parent().addClass('has-error') + $(this).parent().after('<div class="alert alert-danger">Weak password</div>') + ) + + $('#confirm').blur(-> + $(this).parent().next('.alert').remove() + + if $('#password').val() == $('#confirm').val() + $('#confirm').parent().removeClass('has-error') + else + $('#confirm').parent().addClass('has-error') + $('#confirm').parent().after('<div class="alert alert-danger">Passwords don\'t match</div>') + ) + + $('#email').blur(-> + $(this).parent().next('.alert').remove() + if validateEmail($(this).val()) + $(this).parent().removeClass('has-error') + else + $(this).parent().addClass('has-error') + $(this).parent().after('<div class="alert alert-danger">Invalid email</div>') + ) + + $('#register').submit(-> + $('.form-control').blur() + if $('.has-error').length > 0 + $('.has-error').effect('shake', 500) + return false + ) ) diff --git a/public/js/score_password.js b/public/js/score_password.js new file mode 100644 index 00000000..a28001fa --- /dev/null +++ b/public/js/score_password.js @@ -0,0 +1,28 @@ +function scorePassword(pass) { + var score = 0; + if (!pass) + return score; + + // award every unique letter until 5 repetitions + var letters = new Object(); + for (var i=0; i<pass.length; i++) { + letters[pass[i]] = (letters[pass[i]] || 0) + 1; + score += 5.0 / letters[pass[i]]; + } + + // bonus points for mixing it up + var variations = { + digits: /\d/.test(pass), + lower: /[a-z]/.test(pass), + upper: /[A-Z]/.test(pass), + nonWords: /\W/.test(pass), + } + + variationCount = 0; + for (var check in variations) { + variationCount += (variations[check] == true) ? 1 : 0; + } + score += (variationCount - 1) * 10; + + return parseInt(score); +} diff --git a/views/users/new.html b/views/users/new.html index 4786b489..fc9c5a21 100644 --- a/views/users/new.html +++ b/views/users/new.html @@ -25,7 +25,7 @@ <div class="form-group"> <label for="email">Email:</label> - <input type="email" id="email" name="email" class="form-control" /> + <input type="text" id="email" name="email" class="form-control" /> </div> <input class="btn btn-primary" type="submit" value="Register" /> </form> |
