From d92795db13f862e7d82fc74029cb1bdc5293aa5e Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Mon, 27 Jul 2015 21:25:25 +0000 Subject: [PATCH] Passwords UI: clean up the new JS in `wp-admin/js/user-profile.js`. Instead of wrapping `#pass1` in a `` dynamically, add the `` to the HTML in PHP. It currently has no styling. Fixes #33145. Built from https://develop.svn.wordpress.org/trunk@33450 git-svn-id: http://core.svn.wordpress.org/trunk@33417 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/js/user-profile.js | 300 ++++++++++++++++++-------------- wp-admin/js/user-profile.min.js | 2 +- wp-admin/user-edit.php | 4 +- wp-admin/user-new.php | 4 +- wp-includes/version.php | 2 +- wp-login.php | 4 +- 6 files changed, 177 insertions(+), 139 deletions(-) diff --git a/wp-admin/js/user-profile.js b/wp-admin/js/user-profile.js index 0909443287..e7448140c4 100644 --- a/wp-admin/js/user-profile.js +++ b/wp-admin/js/user-profile.js @@ -1,174 +1,195 @@ /* global ajaxurl, pwsL10n, userProfileL10n */ -(function($){ - $(function(){ - var pw_new = $('.user-pass1-wrap'), - pw_line = pw_new.find('.wp-pwd'), - pw_field = $('#pass1'), - pw_field2 = $('#pass2'), - pw_togglebtn = pw_new.find('.wp-hide-pw'), - pw_generatebtn = pw_new.find('button.wp-generate-pw'), - pw_cancelbtn = pw_new.find('button.wp-cancel-pw'), - pw_2 = $('.user-pass2-wrap'), - parentform = pw_new.closest('form'), - pw_strength = $('#pass-strength-result'), - pw_submitbtn_edit = $('#submit'), - pw_submitbtn_new = $( '#createusersub' ), - pw_checkbox = $('.pw-checkbox'), - pw_weak = $('.pw-weak'), - pw_update_lock = false, - // Set up a text version of the password input - newField = document.createElement( 'input'); +(function($) { + var updateLock = false, - newField.type = 'text'; + $pass1Row, + $pass1Wrap, + $pass1, + $pass1Text, - var pwFieldText = $( newField ); + $pass2, - if ( pw_field.length > 0 ) { - pwFieldText - .attr( { - 'id': 'pass1-text', - 'name': 'pass1-text', - 'autocomplete': 'off' - } ) - .addClass( pw_field[0].className ) - .data( 'pw', pw_field.data( 'pw' ) ) - .val( pw_field.val() ); + $weakRow, + $weakCheckbox, - pw_field - .wrap( '' ) - .after( pwFieldText ); + $submitButtons, + $submitButton; + + function generatePassword() { + if ( typeof zxcvbn !== 'function' ) { + setTimeout( generatePassword, 50 ); + } else { + $pass1.val( $pass1.data( 'pw' ) ); + $pass1.trigger( 'propertychange' ); + $pass1Wrap.addClass( 'show-password' ); } + } - var pwWrapper = pw_field.parent(); - var generatePassword = window.generatePassword = function() { - if ( typeof zxcvbn !== 'function' ) { - setTimeout( generatePassword, 50 ); - } else { - pw_field.val( pw_field.data( 'pw' ) ); - pw_field.trigger( 'propertychange' ); - pwWrapper.addClass( 'show-password' ); - } - }; + function bindPass1() { + var passStrength = $('#pass-strength-result')[0]; - pw_2.hide(); - pw_line.hide(); - pw_togglebtn.show(); - pw_generatebtn.show(); - if ( pw_field.data( 'reveal' ) == 1 ) { + $pass1Wrap = $pass1.parent(); + + $pass1Text = $( '' ) + .attr( { + 'id': 'pass1-text', + 'name': 'pass1-text', + 'autocomplete': 'off' + } ) + .addClass( $pass1[0].className ) + .data( 'pw', $pass1.data( 'pw' ) ) + .val( $pass1.val() ) + .on( 'input', function () { + $pass1.val( $pass1Text.val() ).trigger( 'propertychange' ); + } ); + + $pass1.after( $pass1Text ); + + if ( 1 === parseInt( $pass1.data( 'reveal' ), 10 ) ) { generatePassword(); } - parentform.on('submit', function(){ - pw_update_lock = false; - pw_field2.val( pw_field.val() ); - pwWrapper.removeClass( 'show-password' ); - }); + $pass1.on( 'input propertychange', function () { + setTimeout( function () { + $pass1Text.val( $pass1.val() ); + $pass1.add( $pass1Text ).removeClass( 'short bad good strong' ); - pwFieldText.on( 'input', function(){ - pw_field.val( pwFieldText.val() ); - pw_field.trigger( 'propertychange' ); - } ); - - - pw_field.on('input propertychange', function(){ - setTimeout( function(){ - var cssClass = pw_strength.attr('class'); - pwFieldText.val( pw_field.val() ); - pw_field.add(pwFieldText).removeClass( 'short bad good strong' ); - if ( 'undefined' !== typeof cssClass ) { - pw_field.add(pwFieldText).addClass( cssClass ); - if ( cssClass == 'short' || cssClass == 'bad' ) { - if ( ! pw_checkbox.attr( 'checked' ) ) { - pw_submitbtn_new.attr( 'disabled','disabled' ); - pw_submitbtn_edit.attr( 'disabled','disabled' ); + if ( passStrength.className ) { + $pass1.add( $pass1Text ).addClass( passStrength.className ); + if ( 'short' === passStrength.className || 'bad' === passStrength.className ) { + if ( ! $weakCheckbox.prop( 'checked' ) ) { + $submitButtons.prop( 'disabled', true ); } - pw_weak.show(); + $weakRow.show(); } else { - pw_submitbtn_new.removeAttr( 'disabled' ); - pw_submitbtn_edit.removeAttr( 'disabled' ); - pw_weak.hide(); + $submitButtons.prop( 'disabled', false ); + $weakRow.hide(); } } }, 1 ); } ); + } - pw_checkbox.change( function() { - if ( pw_checkbox.attr( 'checked' ) ) { - pw_submitbtn_new.removeAttr( 'disabled' ); - pw_submitbtn_edit.removeAttr( 'disabled' ); + function bindToggleButton() { + var toggleButton = $pass1Row.find('.wp-hide-pw'); + toggleButton.show().on( 'click', function () { + if ( 1 === parseInt( toggleButton.data( 'toggle' ), 10 ) ) { + $pass1Wrap.addClass( 'show-password' ); + toggleButton + .data( 'toggle', 0 ) + .attr({ + 'aria-label': userProfileL10n.ariaHide + }) + .find( '.text' ) + .text( userProfileL10n.hide ) + .end() + .find( '.dashicons' ) + .removeClass('dashicons-visibility') + .addClass('dashicons-hidden'); + + $pass1Text.focus(); + + if ( ! _.isUndefined( $pass1Text[0].setSelectionRange ) ) { + $pass1Text[0].setSelectionRange( 0, 100 ); + } } else { - pw_submitbtn_new.attr( 'disabled','disabled' ); - pw_submitbtn_edit.attr( 'disabled','disabled' ); + $pass1Wrap.removeClass( 'show-password' ); + toggleButton + .data( 'toggle', 1 ) + .attr({ + 'aria-label': userProfileL10n.ariaShow + }) + .find( '.text' ) + .text( userProfileL10n.show ) + .end() + .find( '.dashicons' ) + .removeClass('dashicons-hidden') + .addClass('dashicons-visibility'); + + $pass1.focus(); + + if ( ! _.isUndefined( $pass1[0].setSelectionRange ) ) { + $pass1[0].setSelectionRange( 0, 100 ); + } } + }); + } + + function bindPasswordForm() { + var $passwordWrapper, + $generateButton, + $cancelButton; + + $pass1Row = $('.user-pass1-wrap'); + // hide this + $('.user-pass2-wrap').hide(); + + $submitButton = $( '#submit' ).on( 'click', function () { + updateLock = false; + }); + + $submitButtons = $submitButton.add( ' #createusersub' ); + + $weakRow = $( '.pw-weak' ); + $weakCheckbox = $weakRow.find( '.pw-checkbox' ); + $weakCheckbox.change( function() { + $submitButtons.prop( 'disabled', ! $weakCheckbox.prop( 'checked' ) ); } ); + $pass1 = $('#pass1'); + if ( $pass1.length ) { + bindPass1(); + } + /** * Fix a LastPass mismatch issue, LastPass only changes pass2. * * This fixes the issue by copying any changes from the hidden * pass2 field to the pass1 field. */ - pw_field2.on( 'input propertychange', function() { - if ( pw_field2.val().length > 0 ) { - pw_field.val( pw_field2.val() ); - pw_field.trigger( 'propertychange' ); + $pass2 = $('#pass2').on( 'input propertychange', function () { + if ( $pass2.val().length > 0 ) { + $pass1.val( $pass2.val() ); + $pass1.trigger( 'propertychange' ); } } ); - pw_new.on( 'click', 'button.wp-generate-pw', function(){ - pw_update_lock = true; - pw_generatebtn.hide(); - pw_line.show(); + $passwordWrapper = $pass1Row.find('.wp-pwd').hide(); + + bindToggleButton(); + + $generateButton = $pass1Row.find( 'button.wp-generate-pw' ).show(); + $generateButton.on( 'click', function () { + updateLock = true; + + $generateButton.hide(); + $passwordWrapper.show(); + generatePassword(); + _.defer( function() { - pwFieldText.focus(); - if ( ! _.isUndefined( pwFieldText[0].setSelectionRange ) ) { - pwFieldText[0].setSelectionRange( 0, 100 ); + $pass1Text.focus(); + if ( ! _.isUndefined( $pass1Text[0].setSelectionRange ) ) { + $pass1Text[0].setSelectionRange( 0, 100 ); } }, 0 ); - }); - - pw_submitbtn_edit.on( 'click', function() { - pw_update_lock = false; - }); - - pw_cancelbtn.on( 'click', function() { - pw_update_lock = false; - pw_generatebtn.show(); - pw_line.hide(); - }); - - pw_togglebtn.on( 'click', function() { - var show = pw_togglebtn.attr( 'data-toggle' ); - if ( show == 1 ) { - pwWrapper.addClass( 'show-password' ); - pw_togglebtn.attr({ 'data-toggle': 0, 'aria-label': userProfileL10n.ariaHide }) - .find( '.text' ).text( userProfileL10n.hide ); - pw_togglebtn.find( '.dashicons' ).removeClass('dashicons-visibility').addClass('dashicons-hidden'); - pwFieldText.focus(); - if ( ! _.isUndefined( pwFieldText[0].setSelectionRange ) ) { - pwFieldText[0].setSelectionRange( 0, 100 ); - } - } else { - pwWrapper.removeClass( 'show-password' ); - pw_togglebtn.attr({ 'data-toggle': 1, 'aria-label': userProfileL10n.ariaShow }) - .find( '.text' ).text( userProfileL10n.show ); - pw_togglebtn.find( '.dashicons' ).removeClass('dashicons-hidden').addClass('dashicons-visibility'); - pw_field.focus(); - if ( ! _.isUndefined( pw_field[0].setSelectionRange ) ) { - pw_field[0].setSelectionRange( 0, 100 ); - } - } - - }); - - /* Warn the user if password was generated but not saved */ - $( window ).on( 'beforeunload', function() { - if ( true === pw_update_lock ) { - return userProfileL10n.warn; - } } ); - }); + + $cancelButton = $pass1Row.find( 'button.wp-cancel-pw' ); + $cancelButton.on( 'click', function () { + updateLock = false; + + $generateButton.show(); + $passwordWrapper.hide(); + } ); + + $pass1Row.closest('form').on( 'submit', function () { + updateLock = false; + + $pass2.val( $pass1.val() ); + $pass1Wrap.removeClass( 'show-password' ); + }); + } function check_pass_strength() { var pass1 = $('#pass1').val(), pass2 = $('#pass2').val(), strength; @@ -295,6 +316,8 @@ }); } }); + + bindPasswordForm(); }); $( '#destroy-sessions' ).on( 'click', function( e ) { @@ -315,4 +338,13 @@ e.preventDefault(); }); + window.generatePassword = generatePassword; + + /* Warn the user if password was generated but not saved */ + $( window ).on( 'beforeunload', function () { + if ( true === updateLock ) { + return userProfileL10n.warn; + } + } ); + })(jQuery); diff --git a/wp-admin/js/user-profile.min.js b/wp-admin/js/user-profile.min.js index 082a2be53d..5f516d6bcf 100644 --- a/wp-admin/js/user-profile.min.js +++ b/wp-admin/js/user-profile.min.js @@ -1 +1 @@ -!function(a){function b(){var b,c=a("#pass1").val(),d=a("#pass2").val();if(a("#pass-strength-result").removeClass("short bad good strong"),!c)return void a("#pass-strength-result").html(" ");switch(b=wp.passwordStrength.meter(c,wp.passwordStrength.userInputBlacklist(),d)){case 2:a("#pass-strength-result").addClass("bad").html(pwsL10n.bad);break;case 3:a("#pass-strength-result").addClass("good").html(pwsL10n.good);break;case 4:a("#pass-strength-result").addClass("strong").html(pwsL10n.strong);break;case 5:a("#pass-strength-result").addClass("short").html(pwsL10n.mismatch);break;default:a("#pass-strength-result").addClass("short").html(pwsL10n["short"])}}a(function(){var b=a(".user-pass1-wrap"),c=b.find(".wp-pwd"),d=a("#pass1"),e=a("#pass2"),f=b.find(".wp-hide-pw"),g=b.find("button.wp-generate-pw"),h=b.find("button.wp-cancel-pw"),i=a(".user-pass2-wrap"),j=b.closest("form"),k=a("#pass-strength-result"),l=a("#submit"),m=a("#createusersub"),n=a(".pw-checkbox"),o=a(".pw-weak"),p=!1,q=document.createElement("input");q.type="text";var r=a(q);d.length>0&&(r.attr({id:"pass1-text",name:"pass1-text",autocomplete:"off"}).addClass(d[0].className).data("pw",d.data("pw")).val(d.val()),d.wrap('').after(r));var s=d.parent(),t=window.generatePassword=function(){"function"!=typeof zxcvbn?setTimeout(t,50):(d.val(d.data("pw")),d.trigger("propertychange"),s.addClass("show-password"))};i.hide(),c.hide(),f.show(),g.show(),1==d.data("reveal")&&t(),j.on("submit",function(){p=!1,e.val(d.val()),s.removeClass("show-password")}),r.on("input",function(){d.val(r.val()),d.trigger("propertychange")}),d.on("input propertychange",function(){setTimeout(function(){var a=k.attr("class");r.val(d.val()),d.add(r).removeClass("short bad good strong"),"undefined"!=typeof a&&(d.add(r).addClass(a),"short"==a||"bad"==a?(n.attr("checked")||(m.attr("disabled","disabled"),l.attr("disabled","disabled")),o.show()):(m.removeAttr("disabled"),l.removeAttr("disabled"),o.hide()))},1)}),n.change(function(){n.attr("checked")?(m.removeAttr("disabled"),l.removeAttr("disabled")):(m.attr("disabled","disabled"),l.attr("disabled","disabled"))}),e.on("input propertychange",function(){e.val().length>0&&(d.val(e.val()),d.trigger("propertychange"))}),b.on("click","button.wp-generate-pw",function(){p=!0,g.hide(),c.show(),t(),_.defer(function(){r.focus(),_.isUndefined(r[0].setSelectionRange)||r[0].setSelectionRange(0,100)},0)}),l.on("click",function(){p=!1}),h.on("click",function(){p=!1,g.show(),c.hide()}),f.on("click",function(){var a=f.attr("data-toggle");1==a?(s.addClass("show-password"),f.attr({"data-toggle":0,"aria-label":userProfileL10n.ariaHide}).find(".text").text(userProfileL10n.hide),f.find(".dashicons").removeClass("dashicons-visibility").addClass("dashicons-hidden"),r.focus(),_.isUndefined(r[0].setSelectionRange)||r[0].setSelectionRange(0,100)):(s.removeClass("show-password"),f.attr({"data-toggle":1,"aria-label":userProfileL10n.ariaShow}).find(".text").text(userProfileL10n.show),f.find(".dashicons").removeClass("dashicons-hidden").addClass("dashicons-visibility"),d.focus(),_.isUndefined(d[0].setSelectionRange)||d[0].setSelectionRange(0,100))}),a(window).on("beforeunload",function(){return!0===p?userProfileL10n.warn:void 0})}),a(document).ready(function(){var c,d,e,f,g=a("#display_name");a("#pass1").val("").on("input propertychange",b),a("#pass2").val("").on("input propertychange",b),a("#pass-strength-result").show(),a(".color-palette").click(function(){a(this).siblings('input[name="admin_color"]').prop("checked",!0)}),g.length&&a("#first_name, #last_name, #nickname").bind("blur.user_profile",function(){var b=[],c={display_nickname:a("#nickname").val()||"",display_username:a("#user_login").val()||"",display_firstname:a("#first_name").val()||"",display_lastname:a("#last_name").val()||""};c.display_firstname&&c.display_lastname&&(c.display_firstlast=c.display_firstname+" "+c.display_lastname,c.display_lastfirst=c.display_lastname+" "+c.display_firstname),a.each(a("option",g),function(a,c){b.push(c.value)}),a.each(c,function(d,e){if(e){var f=e.replace(/<\/?[a-z][^>]*>/gi,"");c[d].length&&-1===a.inArray(f,b)&&(b.push(f),a("