aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2014-08-15 11:58:54 -0700
committerAdam Soltys <[email protected]>2014-08-15 11:58:54 -0700
commit41387a388a1786354ab4b1f8d6c3a264958bcbeb (patch)
treea1911ed6e7aa8a846aeb1b3035b42b87e6f13049
parent2f7453a30daaa68a024ec70588ea50aa53368dcc (diff)
downloadcoinos-server-41387a388a1786354ab4b1f8d6c3a264958bcbeb.tar.gz
coinos-server-41387a388a1786354ab4b1f8d6c3a264958bcbeb.zip
Validate registration form
-rw-r--r--public/js/check_email.js4
-rw-r--r--public/js/register.coffee51
-rw-r--r--public/js/score_password.js28
-rw-r--r--views/users/new.html2
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>