Commit 14dca266975e9a60508ebace53db49c32120c9e7
Exists in
master
and in
22 other branches
Merge branch 'AI3008-password_security_rating' of https://gitlab.com/unb-gama/no…
…osfero into AI3008-password_security_rating
Showing
3 changed files
with
166 additions
and
1 deletions
Show diff stats
app/views/account/_signup_form.rhtml
| ... | ... | @@ -7,6 +7,8 @@ |
| 7 | 7 | |
| 8 | 8 | <% @profile_data = @person %> |
| 9 | 9 | |
| 10 | +<%= javascript_include_tag('sign_up_password_rate') %> | |
| 11 | + | |
| 10 | 12 | <%= error_messages_for :user, :person, :header_message => _('The account could not be created') %> |
| 11 | 13 | |
| 12 | 14 | <% labelled_form_for :user, @user, :html => { :multipart => true, :id => 'signup-form', :honeypot => true } do |f| %> |
| ... | ... | @@ -52,7 +54,20 @@ |
| 52 | 54 | <div id='signup-password'> |
| 53 | 55 | <%= required f.password_field(:password, :id => 'user_pw') %> |
| 54 | 56 | <%= content_tag(:small,_('Choose a password that you can remember easily. It must have at least 4 characters.'), :id => 'password-balloon') %> |
| 55 | - <div id='fake-check'><p> </p></div> | |
| 57 | + <div id='password-rate'> | |
| 58 | + <p><span class="invalid hidden" id='result-short'> | |
| 59 | + <%=_('Short') %> | |
| 60 | + </span></p> | |
| 61 | + <p><span class="invalid hidden" id='result-bad'> | |
| 62 | + <%=_('Bad') %> | |
| 63 | + </span></p> | |
| 64 | + <p><span class="invalid hidden" id='result-good'> | |
| 65 | + <%=_('Good') %> | |
| 66 | + </span></p> | |
| 67 | + <p><span class="invalid hidden" id='result-strong'> | |
| 68 | + <%=_('Strong') %> | |
| 69 | + </span></p> | |
| 70 | + </div> | |
| 56 | 71 | </div> |
| 57 | 72 | |
| 58 | 73 | <div id='signup-password-confirmation'> |
| ... | ... | @@ -182,4 +197,5 @@ jQuery(function($) { |
| 182 | 197 | else $(this).addClass('validated'); |
| 183 | 198 | }); |
| 184 | 199 | }); |
| 200 | + | |
| 185 | 201 | </script> | ... | ... |
| ... | ... | @@ -0,0 +1,121 @@ |
| 1 | +// This jQuery plugin is written by firas kassem [2007.04.05] and was modified to fit noosfero | |
| 2 | +// Firas Kassem phiras.wordpress.com || phiras at gmail {dot} com | |
| 3 | +// for more information : http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/ | |
| 4 | + | |
| 5 | +var blankPass = -1 | |
| 6 | +var shortPass = 0 | |
| 7 | +var badPass = 1 | |
| 8 | +var goodPass = 2 | |
| 9 | +var strongPass = 3 | |
| 10 | + | |
| 11 | + | |
| 12 | +function passwordStrength(password,username) | |
| 13 | +{ | |
| 14 | + score = 0 | |
| 15 | + | |
| 16 | + if(password.length == 0) return blankPass | |
| 17 | + | |
| 18 | + //password < 4 | |
| 19 | + if (password.length < 4 ) { return shortPass } | |
| 20 | + | |
| 21 | + //password == username | |
| 22 | + if (password.toLowerCase()==username.toLowerCase()) badPass | |
| 23 | + | |
| 24 | + //password length | |
| 25 | + score += password.length * 4 | |
| 26 | + score += ( checkRepetition(1,password).length - password.length ) * 1 | |
| 27 | + score += ( checkRepetition(2,password).length - password.length ) * 1 | |
| 28 | + score += ( checkRepetition(3,password).length - password.length ) * 1 | |
| 29 | + score += ( checkRepetition(4,password).length - password.length ) * 1 | |
| 30 | + | |
| 31 | + //password has 3 numbers | |
| 32 | + if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) score += 5 | |
| 33 | + | |
| 34 | + //password has 2 sybols | |
| 35 | + if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5 | |
| 36 | + | |
| 37 | + //password has Upper and Lower chars | |
| 38 | + if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) score += 10 | |
| 39 | + | |
| 40 | + //password has number and chars | |
| 41 | + if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) score += 15 | |
| 42 | + // | |
| 43 | + //password has number and symbol | |
| 44 | + if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)) score += 15 | |
| 45 | + | |
| 46 | + //password has char and symbol | |
| 47 | + if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)) score += 15 | |
| 48 | + | |
| 49 | + //password is just a nubers or chars | |
| 50 | + if (password.match(/^\w+$/) || password.match(/^\d+$/) ) score -= 10 | |
| 51 | + | |
| 52 | + //verifing 0 < score < 100 | |
| 53 | + if ( score < 0 ) score = 0 | |
| 54 | + if ( score > 100 ) score = 100 | |
| 55 | + | |
| 56 | + if (score < 34 ) return badPass | |
| 57 | + if (score < 68 ) return goodPass | |
| 58 | + return strongPass | |
| 59 | +} | |
| 60 | + | |
| 61 | +function checkRepetition(pLen,str) | |
| 62 | +{ | |
| 63 | + res = "" | |
| 64 | + for ( i=0; i<str.length ; i++ ) | |
| 65 | + { | |
| 66 | + repeated=true | |
| 67 | + for (j=0;j < pLen && (j+i+pLen) < str.length;j++) | |
| 68 | + repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen)) | |
| 69 | + if (j<pLen) repeated=false | |
| 70 | + if (repeated) | |
| 71 | + { | |
| 72 | + i+=pLen-1 | |
| 73 | + repeated=false | |
| 74 | + } | |
| 75 | + else | |
| 76 | + { | |
| 77 | + res+=str.charAt(i) | |
| 78 | + } | |
| 79 | + } | |
| 80 | + return res | |
| 81 | +} | |
| 82 | + | |
| 83 | +jQuery(document).ready(function() { | |
| 84 | + jQuery('#user_pw').keyup(function() | |
| 85 | + { | |
| 86 | + var result = passwordStrength(jQuery('#user_pw').val(),jQuery('#user_login').val()) | |
| 87 | + if(result == blankPass) | |
| 88 | + { | |
| 89 | + showRateField('#result-blank') | |
| 90 | + } else | |
| 91 | + if(result == shortPass) | |
| 92 | + { | |
| 93 | + showRateField('#result-short') | |
| 94 | + } else | |
| 95 | + if( result == badPass ) | |
| 96 | + { | |
| 97 | + showRateField('#result-bad') | |
| 98 | + } else | |
| 99 | + if( result == goodPass ) | |
| 100 | + { | |
| 101 | + showRateField('#result-good') | |
| 102 | + } else | |
| 103 | + if( result == strongPass ) | |
| 104 | + { | |
| 105 | + showRateField('#result-strong') | |
| 106 | + } | |
| 107 | + | |
| 108 | + }) | |
| 109 | +}) | |
| 110 | + | |
| 111 | +function showRateField(validation) | |
| 112 | +{ | |
| 113 | + jQuery('#result-blank').addClass('hidden') | |
| 114 | + jQuery('#result-short').addClass('hidden') | |
| 115 | + jQuery('#result-bad').addClass('hidden') | |
| 116 | + jQuery('#result-good').addClass('hidden') | |
| 117 | + jQuery('#result-strong').addClass('hidden') | |
| 118 | + | |
| 119 | + jQuery(validation).removeClass('hidden') | |
| 120 | + | |
| 121 | +} | |
| 0 | 122 | \ No newline at end of file | ... | ... |
public/stylesheets/application.css
| ... | ... | @@ -6042,6 +6042,7 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img { |
| 6042 | 6042 | |
| 6043 | 6043 | #email-check, |
| 6044 | 6044 | #fake-check, |
| 6045 | +#password-rate, | |
| 6045 | 6046 | #password-check { |
| 6046 | 6047 | margin: -2px 16px -5px 13px; |
| 6047 | 6048 | text-align: right; |
| ... | ... | @@ -6050,10 +6051,20 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img { |
| 6050 | 6051 | |
| 6051 | 6052 | #email-check p, |
| 6052 | 6053 | #fake-check p, |
| 6054 | +#password-rate p, | |
| 6053 | 6055 | #password-check p { |
| 6054 | 6056 | margin: 0; |
| 6055 | 6057 | } |
| 6056 | 6058 | |
| 6059 | +#password-rate { | |
| 6060 | + font-weight:bold; | |
| 6061 | +} | |
| 6062 | + | |
| 6063 | +.hidden { | |
| 6064 | + visibility: hidden; | |
| 6065 | + display: none; | |
| 6066 | +} | |
| 6067 | + | |
| 6057 | 6068 | .available { |
| 6058 | 6069 | color: #88BD00; |
| 6059 | 6070 | } |
| ... | ... | @@ -6067,6 +6078,7 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img { |
| 6067 | 6078 | } |
| 6068 | 6079 | |
| 6069 | 6080 | #email-check p, |
| 6081 | +#password-rate p, | |
| 6070 | 6082 | #password-check p, |
| 6071 | 6083 | #url-check p { |
| 6072 | 6084 | margin: 0; |
| ... | ... | @@ -6576,3 +6588,19 @@ ul.article-versions li { |
| 6576 | 6588 | .controller-features .manage-fields-batch-actions td { |
| 6577 | 6589 | font-style: italic; |
| 6578 | 6590 | } |
| 6591 | + | |
| 6592 | +#result-short { | |
| 6593 | + color: red !important; | |
| 6594 | +} | |
| 6595 | + | |
| 6596 | +#result-bad { | |
| 6597 | + color: #825A2C !important; | |
| 6598 | +} | |
| 6599 | + | |
| 6600 | +#result-good { | |
| 6601 | + color: green !important; | |
| 6602 | +} | |
| 6603 | + | |
| 6604 | +#result-strong { | |
| 6605 | + color: #32CD32 !important; | |
| 6606 | +} | ... | ... |