WordPress.org

Make WordPress Core

Ticket #4470: password-strength-meter-revised2.diff

File password-strength-meter-revised2.diff, 18.2 KB (added by JDTrower, 6 years ago)
  • wp-admin/includes/user.php

     
    101101        /* checking the password has been typed twice the same */ 
    102102        if ( $pass1 != $pass2 ) 
    103103                $errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter the same password in the two password fields.' ), array( 'form-field' => 'pass1' ) ); 
     104                 
     105        /* Check password strength */ 
     106        if ( get_option("strong_passwords") == 1 && wp_test_password($pass1) != "") $errors->add( 'pass', __('<strong>ERROR</strong>: ') .wp_test_password($pass1), array( 'form-field' => 'pass1' ) ); 
    104107 
    105108        if (!empty ( $pass1 )) 
    106109                $user->user_pass = $pass1; 
  • wp-admin/js/password-strength-meter.js

     
    1 // Password strength meter 
    2 // This jQuery plugin is written by firas kassem [2007.04.05] 
    3 // Firas Kassem  phiras.wordpress.com || phiras at gmail {dot} com 
    4 // for more information : http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/ 
    5  
    6 var shortPass = 'Too short' 
    7 var badPass = 'Bad' 
    8 var goodPass = 'Good' 
    9 var strongPass = 'Strong' 
    10  
    11  
    12  
    13 function passwordStrength(password,username) 
     1function passwordStrength(password) 
    142{ 
    15     score = 0  
    16      
    17     //password < 4 
    18     if (password.length < 4 ) { return shortPass } 
    19      
    20     //password == username 
    21     if (password.toLowerCase()==username.toLowerCase()) return badPass 
    22      
    23     //password length 
    24     score += password.length * 4 
    25     score += ( checkRepetition(1,password).length - password.length ) * 1 
    26     score += ( checkRepetition(2,password).length - password.length ) * 1 
    27     score += ( checkRepetition(3,password).length - password.length ) * 1 
    28     score += ( checkRepetition(4,password).length - password.length ) * 1 
     3        var desc = new Array(); 
     4        desc[0] = "Too Short"; 
     5        desc[1] = "Very Weak"; 
     6        desc[2] = "Weak"; 
     7        desc[3] = "Medium"; 
     8        desc[4] = "Better"; 
     9        desc[5] = "Strong"; 
     10        desc[6] = "Very Strong"; 
    2911 
    30     //password has 3 numbers 
    31     if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5  
    32      
    33     //password has 2 sybols 
    34     if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5  
    35      
    36     //password has Upper and Lower chars 
    37     if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10  
    38      
    39     //password has number and chars 
    40     if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15  
    41     // 
    42     //password has number and symbol 
    43     if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15  
    44      
    45     //password has char and symbol 
    46     if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15  
    47      
    48     //password is just a nubers or chars 
    49     if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10  
    50      
    51     //verifing 0 < score < 100 
    52     if ( score < 0 )  score = 0  
    53     if ( score > 100 )  score = 100  
    54      
    55     if (score < 34 )  return badPass  
    56     if (score < 68 )  return goodPass 
    57     return strongPass 
    58 } 
     12        var strength = 100;  
     13        var score        = 0; 
     14                 
     15        if ( password.length <= 7 ) 
     16                strength -= ( password.length * 5 ); 
     17         
     18        if ( password.length > 7 ) 
     19                strength -= ( ( password.length * 10 ) - ( 7 * 5 ) ); 
     20         
     21        var characters = ""; 
     22        var nNumbers = 0; 
     23        var nLowercase = 0; 
     24        var nUppercase = 0; 
     25        var nSymbols = 0; 
     26         
     27        for ( i = 0; i < password.length; i++ ) 
     28        { 
     29                characters = password.charAt(i); 
     30                if ( characters >= "0" && characters <= "9" ) nNumbers++; 
     31                else if ( characters >= "a" && characters <= "z" ) nLowercase++; 
     32                else if ( characters >= "A" && characters <= "Z" ) nUppercase++; 
     33                else nSymbols++; 
     34        } 
     35         
     36        if ( nLowercase > 0 ) 
     37                strength -= ( nLowercase * 1 ); 
     38         
     39        if ( nUppercase >= 1 ) 
     40                strength -= ( nUppercase * 3 ); 
     41         
     42        if ( nNumbers >= 1 ) 
     43                strength -= ( nNumbers * 7 ); 
     44         
     45        if ( nSymbols >= 1 ) 
     46                strength -= ( nSymbols * 10 ); 
     47         
     48        //verifing 0 < strength < 100 
     49        if ( strength < 0 ) strength = 0; 
     50        if ( strength > 100 ) strength = 100; 
    5951 
     52        var lca = password.match(/[a-z]/); 
     53        var uca = password.match(/[A-Z]/); 
     54        var nmb = password.match(/[0-9]/); 
     55        var smb = password.match(/[~,!,@,#,$,%,^,&,*,(,),\-,_,\=,\+,\[,\],\{,\},\;,\:,\,,\.,\/,\<,\>,?,\|,\',\",\`]/) 
    6056 
    61 // checkRepetition(1,'aaaaaaabcbc')   = 'abcbc' 
    62 // checkRepetition(2,'aaaaaaabcbc')   = 'aabc' 
    63 // checkRepetition(2,'aaaaaaabcdbcd') = 'aabcd' 
    64  
    65 function checkRepetition(pLen,str) { 
    66     res = "" 
    67     for ( i=0; i<str.length ; i++ ) { 
    68         repeated=true 
    69         for (j=0;j < pLen && (j+i+pLen) < str.length;j++) 
    70             repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen)) 
    71         if (j<pLen) repeated=false 
    72         if (repeated) { 
    73             i+=pLen-1 
    74             repeated=false 
    75         } 
    76         else { 
    77             res+=str.charAt(i) 
    78         } 
    79     } 
    80     return res 
    81 } 
    82 // Password strength meter 
    83 // This jQuery plugin is written by firas kassem [2007.04.05] 
    84 // Firas Kassem  phiras.wordpress.com || phiras at gmail {dot} com 
    85 // for more information : http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/ 
    86  
    87 var shortPass = 'Too short' 
    88 var badPass = 'Bad' 
    89 var goodPass = 'Good' 
    90 var strongPass = 'Strong' 
    91  
    92  
    93  
    94 function passwordStrength(password,username) 
    95 { 
    96     score = 0  
    97      
    98     //password < 4 
    99     if (password.length < 4 ) { return shortPass } 
    100      
    101     //password == username 
    102     if (password.toLowerCase()==username.toLowerCase()) return badPass 
    103      
    104     //password length 
    105     score += password.length * 4 
    106     score += ( checkRepetition(1,password).length - password.length ) * 1 
    107     score += ( checkRepetition(2,password).length - password.length ) * 1 
    108     score += ( checkRepetition(3,password).length - password.length ) * 1 
    109     score += ( checkRepetition(4,password).length - password.length ) * 1 
    110  
    111     //password has 3 numbers 
    112     if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5  
    113      
    114     //password has 2 sybols 
    115     if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5  
    116      
    117     //password has Upper and Lower chars 
    118     if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10  
    119      
    120     //password has number and chars 
    121     if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15  
    122     // 
    123     //password has number and symbol 
    124     if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15  
    125      
    126     //password has char and symbol 
    127     if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15  
    128      
    129     //password is just a nubers or chars 
    130     if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10  
    131      
    132     //verifing 0 < score < 100 
    133     if ( score < 0 )  score = 0  
    134     if ( score > 100 )  score = 100  
    135      
    136     if (score < 34 )  return badPass  
    137     if (score < 68 )  return goodPass 
    138     return strongPass 
    139 } 
    140  
    141  
    142 // checkRepetition(1,'aaaaaaabcbc')   = 'abcbc' 
    143 // checkRepetition(2,'aaaaaaabcbc')   = 'aabc' 
    144 // checkRepetition(2,'aaaaaaabcdbcd') = 'aabcd' 
    145  
    146 function checkRepetition(pLen,str) { 
    147     res = "" 
    148     for ( i=0; i<str.length ; i++ ) { 
    149         repeated=true 
    150         for (j=0;j < pLen && (j+i+pLen) < str.length;j++) 
    151             repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen)) 
    152         if (j<pLen) repeated=false 
    153         if (repeated) { 
    154             i+=pLen-1 
    155             repeated=false 
    156         } 
    157         else { 
    158             res+=str.charAt(i) 
    159         } 
    160     } 
    161     return res 
    162 } 
     57        if ( ( strength <= 100 ) && ( ( lca ) || ( uca ) || ( nmb ) || ( smb ) ) ) score ++; 
     58        if ( ( strength <= 58 ) && ( ( ( lca ) && ( uca ) ) || ( ( lca ) && ( nmb ) ) || ( ( lca ) && ( smb ) ) || ( ( uca ) && ( nmb ) ) || ( ( uca ) && ( smb ) ) || ( ( nmb ) && ( smb ) ) ) ) score++; 
     59        if ( ( strength <= 54 ) && ( ( ( lca ) && ( uca ) && ( nmb ) ) || ( ( lca ) && ( uca ) && ( smb ) ) || ( ( lca ) && ( nmb ) && ( smb ) ) || ( ( uca ) && ( nmb ) && ( smb ) ) ) ) score++;  
     60        if ( ( strength <= 48 ) && ( password.length >= 7 ) && ( ( ( lca ) && ( uca ) && ( nmb ) ) || ( ( lca ) && ( uca ) && ( smb ) ) || ( ( lca ) && ( nmb ) && ( smb ) ) || ( ( uca ) && ( nmb ) && ( smb ) ) ) ) score++; 
     61        if ( ( strength <= 35 ) && ( password.length >= 7 ) && ( lca ) && ( uca ) && ( nmb ) && ( smb ) ) score++; 
     62        if ( ( strength <= 24 ) && ( password.length >= 12 ) && ( lca ) && ( uca ) && ( nmb ) && ( smb ) ) score++; 
     63         
     64        if ( ( password.length > 0 ) && ( score <= 3 ) ) 
     65                document.getElementById("submit").disabled = true; 
     66        else 
     67                document.getElementById("submit").disabled = false; 
     68         
     69        document.getElementById("passwordDescription").innerHTML = desc[score]; 
     70        document.getElementById("passwordStrength").className = "strength" + score; 
     71} 
     72 No newline at end of file 
  • wp-admin/options-general.php

     
    5454<select name="default_role" id="default_role"><?php wp_dropdown_roles( get_option('default_role') ); ?></select></label> 
    5555</td> 
    5656</tr> 
     57<tr valign="top"> 
     58<th scope="row"><?php _e('Security:') ?></th> 
     59<td><label for="strong_passwords"> 
     60<input name="strong_passwords" type="checkbox" id="strong_passwords" value="1" <?php checked('1', get_option('strong_passwords')); ?> /> 
     61<?php _e('Enforce Strong Passwords') ?></label> 
     62</td> 
    5763<tr> 
    5864<th scope="row"><?php _e('<abbr title="Coordinated Universal Time">UTC</abbr> time is:') ?> </th> 
    5965<td><code><?php echo gmdate(__('Y-m-d g:i:s a')); ?></code></td> 
     
    9298 
    9399<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /> 
    94100<input type="hidden" name="action" value="update" /> 
    95 <input type="hidden" name="page_options" value="<?php if ( ! defined( 'WP_SITEURL' ) ) echo 'siteurl,'; if ( ! defined( 'WP_HOME' ) ) echo 'home,'; ?>blogname,blogdescription,admin_email,users_can_register,gmt_offset,date_format,time_format,start_of_week,comment_registration,default_role" /> 
     101<input type="hidden" name="page_options" value="<?php if ( ! defined( 'WP_SITEURL' ) ) echo 'siteurl,'; if ( ! defined( 'WP_HOME' ) ) echo 'home,'; ?>blogname,blogdescription,admin_email,users_can_register,gmt_offset,date_format,time_format,start_of_week,comment_registration,default_role,strong_passwords" /> 
    96102</p> 
    97103</form> 
    98104 
  • wp-admin/user-edit.php

     
    99 
    1010function profile_js ( ) { 
    1111?> 
    12 <script type="text/javascript"> 
    13         function check_pass_strength ( ) { 
    14  
    15                 var pass = jQuery('#pass1').val(); 
    16                 var user = jQuery('#user_login').val(); 
    17  
    18                 // get the result as an object, i'm tired of typing it 
    19                 var res = jQuery('#pass-strength-result'); 
    20  
    21                 var strength = passwordStrength(pass, user); 
    22  
    23                 jQuery(res).removeClass('short bad good strong'); 
    24  
    25                 if ( strength == 'Bad' ) { 
    26                         jQuery(res).addClass('bad'); 
    27                         jQuery(res).html( pwsL10n.bad ); 
    28                 } 
    29                 else if ( strength == 'Good' ) { 
    30                         jQuery(res).addClass('good'); 
    31                         jQuery(res).html( pwsL10n.good ); 
    32                 } 
    33                 else if ( strength == 'Strong' ) { 
    34                         jQuery(res).addClass('strong'); 
    35                         jQuery(res).html( pwsL10n.strong ); 
    36                 } 
    37                 else { 
    38                         // this catches 'Too short' and the off chance anything else comes along 
    39                         jQuery(res).addClass('short'); 
    40                         jQuery(res).html( pwsL10n.short ); 
    41                 } 
    42  
    43         } 
    44  
    45         jQuery(document).ready( function() { jQuery('#pass1').keyup( check_pass_strength ) } ); 
     12<script type="text/javascript">  
     13        function check_pass_strength ( ) {  
     14  
     15                var pass = jQuery('#pass1').val();  
     16                var user = jQuery('#user_login').val();  
     17  
     18                // get the result as an object, i'm tired of typing it  
     19                var res = jQuery('#pass-strength-result');  
     20  
     21                var strength = passwordStrength(pass, user); 
     22  
     23        jQuery(res).removeClass('short vweak weak medium better strong vstrong');  
     24                 
     25                if ( strength == 'Very Weak' ) {  
     26                        jQuery(res).addClass('vweak');  
     27                        jQuery(res).html( pwsL10n.vweak );  
     28                }  
     29                else if ( strength == 'Weak' ) {  
     30                        jQuery(res).addClass('weak');  
     31                        jQuery(res).html( pwsL10n.weak );  
     32                }  
     33                else if ( strength == 'Medium' ) {  
     34                        jQuery(res).addClass('medium');  
     35                        jQuery(res).html( pwsL10n.medium );  
     36                }  
     37                else if ( strength == 'Better' ) {  
     38                        jQuery(res).addClass('better');  
     39                        jQuery(res).html( pwsL10n.better );  
     40                }  
     41                else if ( strength == 'Strong' ) {  
     42                        jQuery(res).addClass('strong');  
     43                        jQuery(res).html( pwsL10n.strong );  
     44                }  
     45                else if ( strength == 'Very Strong' ) {  
     46                        jQuery(res).addClass('vstrong');  
     47                        jQuery(res).html( pwsL10n.vstrong );  
     48                }  
     49                else {  
     50                        // this catches 'Too short' and the off chance anything else comes along  
     51                        jQuery(res).addClass('short');  
     52                        jQuery(res).html( pwsL10n.short );  
     53                }  
     54  
     55        }  
     56  
     57jQuery(document).ready( function() { jQuery('#pass1').keyup( check_pass_strength ) } );  
    4658</script> 
    4759<?php 
    4860} 
     
    261273</label></p> 
    262274<?php if ( $is_profile_page ): ?> 
    263275<p><strong><?php _e('Password Strength:'); ?></strong></p> 
    264 <div id="pass-strength-result"><?php _e('Too short'); ?></div> 
    265 <p><?php _e('Hint: Use upper and lower case characters, numbers and symbols like !"?$%^&( in your password.'); ?></p> 
     276<p><div id="passwordDescription">Password not entered</div> 
     277<div id="passwordStrength" class="strength0"></div></p> 
     278<p><?php _e('Hint: You must use upper and lower case characters as well as numbers and/or symbols in your password with a minimum password length of 7 characters.'); ?></p> 
     279<p><?php _e('You <strong>MUST</strong> have a strength of "Better," "Strong," or "Very Strong" to change your password.'); ?></p> 
    266280<?php endif; ?> 
    267281</fieldset> 
    268282<?php endif; ?> 
     
    300314<p class="submit"> 
    301315        <input type="hidden" name="action" value="update" /> 
    302316        <input type="hidden" name="user_id" id="user_id" value="<?php echo $user_id; ?>" /> 
    303         <input type="submit" value="<?php $is_profile_page? _e('Update Profile &raquo;') : _e('Update User &raquo;') ?>" name="submit" /> 
     317        <input type="submit" value="<?php $is_profile_page? _e('Update Profile &raquo;') : _e('Update User &raquo;') ?>" name="submit" id="submit" /> 
    304318 </p> 
    305319</form> 
    306320</div> 
  • wp-admin/wp-admin.css

     
    772772        color: #036; 
    773773} 
    774774 
    775 #pass-strength-result {  
    776         padding: 3px 5px 3px 5px; 
    777         margin-top: 3px; 
    778         text-align: center;  
    779         background-color: #e3e3e3; 
    780         border: 1px solid #000000; 
     775#passwordStrength { 
     776        height:10px; 
     777        display:block; 
     778        float:left; 
    781779} 
    782  
    783 #pass-strength-result.short {  
    784         background-color: #e3e3e3; 
    785         border: 1px solid #000000;  
     780  
     781.strength0 { 
     782        width:102%; 
     783        background:#cccccc; 
    786784} 
    787  
    788 #pass-strength-result.bad {  
    789         background-color: #ffeff7; 
    790         border: 1px solid #cc6699;  
     785  
     786.strength1 { 
     787        width:17%; 
     788        background:#ff0000; 
    791789} 
     790  
     791.strength2 { 
     792        width:34%;       
     793        background:#ff5f5f; 
     794} 
     795  
     796.strength3 { 
     797        width:51%; 
     798        background:#ffff66; 
     799} 
     800  
     801.strength4 { 
     802        width:68%; 
     803        background:#aefe36; 
     804} 
    792805 
    793 #pass-strength-result.good {  
    794         background-color: #effff4; 
    795         border: 1px solid #66cc87;  
     806.strength5 { 
     807        background:#4dcd00; 
     808        width:85%; 
    796809} 
    797810 
    798 #pass-strength-result.strong {  
    799         background-color: #59ef86; 
    800         border: 1px solid #319f52; 
     811.strength6 { 
     812        background:#308000; 
     813        width:102%; 
    801814} 
    802815 
    803816a.view-comment-post-link { 
  • wp-includes/pluggable.php

     
    973973} 
    974974endif; 
    975975 
     976if ( !function_exists('wp_test_password') ) : 
     977function wp_test_password($password) { 
     978        $error = ""; 
     979         
     980        // Check that the password containes lowercase and uppercase letters, numbers, and symbols 
     981        $lowercase = false; 
     982        $uppercase = false; 
     983        $numbers   = false; 
     984        $symbols   = false; 
     985        for($i=0;$i<strlen($password) && !($lowercase && $uppercase && $numbers && $symbols);$i++){ 
     986                $lowercase = $lowercase || (ord(substr($password,$i,1)) > 96 && ord(substr($password,$i,1)) < 123); 
     987                $uppercase = $uppercase || (ord(substr($password,$i,1)) > 64 && ord(substr($password,$i,1)) < 91); 
     988                $numbers   = $numbers || (ord(substr($password,$i,1)) > 47 && ord(substr($password,$i,1)) < 58); 
     989                $symbols   = $symbols || ((ord(substr($password,$i,1)) > 32 && ord(substr($password,$i,1)) < 48) || (ord(substr($password,$i,1)) > 57 && ord(substr($password,$i,1)) < 65) || (ord(substr($password,$i,1)) > 90 && ord(substr($password,$i,1)) < 97) || (ord(substr($password,$i,1)) > 122 && ord(substr($password,$i,1)) < 127)); 
     990        } 
     991         
     992        if (!($lowercase)) $error .= __("The password does not contain lowercase letters<br/>\n"); 
     993        if (!($uppercase)) $error .= __("The password does not contain uppercase letters<br/>\n"); 
     994        if (!($numbers)) $error .= __("The password does not contain numbers<br/>\n"); 
     995        if (!($symbols)) $error .= __("The password does not contain symbols<br/>\n"); 
     996         
     997        // Check password length 
     998        if(strlen($password) < 7) $error .= __("The password is not long enough<br/>\n"); 
     999        return $error; 
     1000} 
     1001endif; 
     1002 
    9761003if ( !function_exists('wp_salt') ) : 
    9771004/** 
    9781005 * wp_salt() - Get salt to add to hashes to help prevent attacks 
  • wp-includes/script-loader.php

     
    121121                        $this->add( 'password-strength-meter', '/wp-admin/js/password-strength-meter.js', array('jquery'), '20070405' ); 
    122122                        $this->localize( 'password-strength-meter', 'pwsL10n', array( 
    123123                                'short' => __('Too short'), 
    124                                 'bad' => __('Bad'), 
    125                                 'good' => __('Good'), 
    126                                 'strong' => __('Strong') 
     124                                'vweak' => __('Very Weak'), 
     125                                'weak' => __('Weak'), 
     126                                'medium' => __('Medium'),  
     127                                'better' => __('Better'), 
     128                                'strong' => __('Strong'), 
     129                                'vstrong' => __('Very Strong') 
    127130                        ) ); 
    128131                        $this->add( 'admin-comments', '/wp-admin/js/edit-comments.js', array('wp-lists'), '20071104' ); 
    129132                        $this->add( 'admin-posts', '/wp-admin/js/edit-posts.js', array('wp-lists'), '20071023' );