From 75e2d83ad54c0ce7232dd8d0ba539bd1282fd1e2 Mon Sep 17 00:00:00 2001 From: ale <ale@incal.net> Date: Fri, 24 Apr 2015 20:21:45 +0100 Subject: [PATCH] Upgrade Wordpress to 4.1.3 --- readme.html | 2 +- wp-admin/about.php | 10 +- .../includes/class-wp-comments-list-table.php | 4 +- wp-admin/includes/dashboard.php | 2 +- wp-admin/includes/template.php | 2 +- wp-admin/js/nav-menu.js | 6 +- wp-admin/js/nav-menu.min.js | 2 +- wp-admin/update-core.php | 4 +- wp-content/plugins/akismet/_inc/akismet.css | 7 +- wp-content/plugins/akismet/_inc/akismet.js | 6 +- wp-content/plugins/akismet/akismet.php | 6 +- wp-content/plugins/akismet/class.akismet.php | 137 ++- wp-content/plugins/akismet/readme.txt | 18 +- wp-content/plugins/akismet/views/config.php | 34 +- wp-content/plugins/akismet/views/notice.php | 2 +- wp-content/plugins/akismet/wrapper.php | 92 +- wp-includes/capabilities.php | 12 +- wp-includes/class-wp-editor.php | 6 - wp-includes/formatting.php | 22 +- wp-includes/functions.php | 2 +- wp-includes/js/plupload/plupload.flash.swf | Bin 28902 -> 29577 bytes wp-includes/version.php | 2 +- wp-includes/wp-db.php | 808 ++++++++++++++++-- 23 files changed, 1001 insertions(+), 185 deletions(-) diff --git a/readme.html b/readme.html index 164a54233..09f0376eb 100644 --- a/readme.html +++ b/readme.html @@ -9,7 +9,7 @@ <body> <h1 id="logo"> <a href="https://wordpress.org/"><img alt="WordPress" src="wp-admin/images/wordpress-logo.png" /></a> - <br /> Version 4.1.1 + <br /> Version 4.1.3 </h1> <p style="text-align: center">Semantic Personal Publishing Platform</p> diff --git a/wp-admin/about.php b/wp-admin/about.php index c8512135b..b0ec9a436 100644 --- a/wp-admin/about.php +++ b/wp-admin/about.php @@ -42,7 +42,15 @@ include( ABSPATH . 'wp-admin/admin-header.php' ); </h2> <div class="changelog point-releases"> - <h3><?php echo _n( 'Maintenance Release', 'Maintenance Releases', 1 ); ?></h3> + <h3><?php echo _n( 'Maintenance and Security Release', 'Maintenance and Security Releases', 3 ); ?></h3> + <p><?php printf( _n( '<strong>Version %1$s</strong> addressed %2$s bug.', + '<strong>Version %1$s</strong> addressed %2$s bugs.', 1 ), '4.1.3', number_format_i18n( 1 ) ); ?> + <?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.1.3' ); ?> + </p> + <p><?php printf( _n( '<strong>Version %1$s</strong> addressed a security issue.', + '<strong>Version %1$s</strong> addressed some security issues.', 8 ), '4.1.2' ); ?> + <?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.1.2' ); ?> + </p> <p><?php printf( _n( '<strong>Version %1$s</strong> addressed %2$s bug.', '<strong>Version %1$s</strong> addressed %2$s bugs.', 21 ), '4.1.1', number_format_i18n( 21 ) ); ?> <?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.1.1' ); ?> diff --git a/wp-admin/includes/class-wp-comments-list-table.php b/wp-admin/includes/class-wp-comments-list-table.php index 3814f98bc..35a193f1c 100644 --- a/wp-admin/includes/class-wp-comments-list-table.php +++ b/wp-admin/includes/class-wp-comments-list-table.php @@ -554,9 +554,9 @@ class WP_Comments_List_Table extends WP_List_Table { if ( current_user_can( 'edit_post', $post->ID ) ) { $post_link = "<a href='" . get_edit_post_link( $post->ID ) . "'>"; - $post_link .= get_the_title( $post->ID ) . '</a>'; + $post_link .= esc_html( get_the_title( $post->ID ) ) . '</a>'; } else { - $post_link = get_the_title( $post->ID ); + $post_link = esc_html( get_the_title( $post->ID ) ); } echo '<div class="response-links"><span class="post-com-count-wrapper">'; diff --git a/wp-admin/includes/dashboard.php b/wp-admin/includes/dashboard.php index bf37176ba..75a5b1cb8 100644 --- a/wp-admin/includes/dashboard.php +++ b/wp-admin/includes/dashboard.php @@ -518,7 +518,7 @@ function wp_dashboard_recent_drafts( $drafts = false ) { function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) { $GLOBALS['comment'] =& $comment; - $comment_post_title = strip_tags(get_the_title( $comment->comment_post_ID )); + $comment_post_title = _draft_or_post_title( $comment->comment_post_ID ); if ( current_user_can( 'edit_post', $comment->comment_post_ID ) ) { $comment_post_url = get_edit_post_link( $comment->comment_post_ID ); diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php index 425e40b0f..1087837cd 100644 --- a/wp-admin/includes/template.php +++ b/wp-admin/includes/template.php @@ -1505,7 +1505,7 @@ function _draft_or_post_title( $post = 0 ) { $title = get_the_title( $post ); if ( empty( $title ) ) $title = __( '(no title)' ); - return $title; + return esc_html( $title ); } /** diff --git a/wp-admin/js/nav-menu.js b/wp-admin/js/nav-menu.js index dc2183c9a..33324b149 100644 --- a/wp-admin/js/nav-menu.js +++ b/wp-admin/js/nav-menu.js @@ -453,14 +453,14 @@ var wpNavMenu; if ( ! isPrimaryMenuItem ) { thisLink = menuItem.find( '.menus-move-left' ), thisLinkText = menus.outFrom.replace( '%s', prevItemNameLeft ); - thisLink.prop( 'title', menus.moveOutFrom.replace( '%s', prevItemNameLeft ) ).html( thisLinkText ).css( 'display', 'inline' ); + thisLink.prop( 'title', menus.moveOutFrom.replace( '%s', prevItemNameLeft ) ).text( thisLinkText ).css( 'display', 'inline' ); } if ( 0 !== position ) { if ( menuItem.find( '.menu-item-data-parent-id' ).val() !== menuItem.prev().find( '.menu-item-data-db-id' ).val() ) { thisLink = menuItem.find( '.menus-move-right' ), thisLinkText = menus.under.replace( '%s', prevItemNameRight ); - thisLink.prop( 'title', menus.moveUnder.replace( '%s', prevItemNameRight ) ).html( thisLinkText ).css( 'display', 'inline' ); + thisLink.prop( 'title', menus.moveUnder.replace( '%s', prevItemNameRight ) ).text( thisLinkText ).css( 'display', 'inline' ); } } @@ -482,7 +482,7 @@ var wpNavMenu; title = menus.subMenuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$s', parentItemName ); } - $this.prop('title', title).html( title ); + $this.prop('title', title).text( title ); }); }, diff --git a/wp-admin/js/nav-menu.min.js b/wp-admin/js/nav-menu.min.js index f270b4948..62befe4e2 100644 --- a/wp-admin/js/nav-menu.min.js +++ b/wp-admin/js/nav-menu.min.js @@ -1 +1 @@ -var wpNavMenu;!function(a){var b;b=wpNavMenu={options:{menuItemDepthPerLevel:30,globalMaxDepth:11},menuList:void 0,targetList:void 0,menusChanged:!1,isRTL:!("undefined"==typeof isRtl||!isRtl),negateIfRTL:"undefined"!=typeof isRtl&&isRtl?-1:1,init:function(){b.menuList=a("#menu-to-edit"),b.targetList=b.menuList,this.jQueryExtensions(),this.attachMenuEditListeners(),this.setupInputWithDefaultTitle(),this.attachQuickSearchListeners(),this.attachThemeLocationsListeners(),this.attachTabsPanelListeners(),this.attachUnsavedChangesListener(),b.menuList.length&&this.initSortables(),menus.oneThemeLocationNoMenus&&a("#posttype-page").addSelectedToMenu(b.addMenuItemToBottom),this.initManageLocations(),this.initAccessibility(),this.initToggles(),this.initPreviewing()},jQueryExtensions:function(){a.fn.extend({menuItemDepth:function(){var a=this.eq(0).css(b.isRTL?"margin-right":"margin-left");return b.pxToDepth(a&&-1!=a.indexOf("px")?a.slice(0,-2):0)},updateDepthClass:function(b,c){return this.each(function(){var d=a(this);c=c||d.menuItemDepth(),a(this).removeClass("menu-item-depth-"+c).addClass("menu-item-depth-"+b)})},shiftDepthClass:function(b){return this.each(function(){var c=a(this),d=c.menuItemDepth();a(this).removeClass("menu-item-depth-"+d).addClass("menu-item-depth-"+(d+b))})},childMenuItems:function(){var b=a();return this.each(function(){for(var c=a(this),d=c.menuItemDepth(),e=c.next();e.length&&e.menuItemDepth()>d;)b=b.add(e),e=e.next()}),b},shiftHorizontally:function(b){return this.each(function(){var c=a(this),d=c.menuItemDepth(),e=d+b;c.moveHorizontally(e,d)})},moveHorizontally:function(b,c){return this.each(function(){var d=a(this),e=d.childMenuItems(),f=b-c,g=d.find(".is-submenu");d.updateDepthClass(b,c).updateParentMenuItemDBId(),e&&e.each(function(){var b=a(this),c=b.menuItemDepth(),d=c+f;b.updateDepthClass(d,c).updateParentMenuItemDBId()}),0===b?g.hide():g.show()})},updateParentMenuItemDBId:function(){return this.each(function(){var b=a(this),c=b.find(".menu-item-data-parent-id"),d=parseInt(b.menuItemDepth(),10),e=d-1,f=b.prevAll(".menu-item-depth-"+e).first();c.val(0===d?0:f.find(".menu-item-data-db-id").val())})},hideAdvancedMenuItemFields:function(){return this.each(function(){var b=a(this);a(".hide-column-tog").not(":checked").each(function(){b.find(".field-"+a(this).val()).addClass("hidden-field")})})},addSelectedToMenu:function(c){return 0===a("#menu-to-edit").length?!1:this.each(function(){var d=a(this),e={},f=d.find(menus.oneThemeLocationNoMenus&&0===d.find(".tabs-panel-active .categorychecklist li input:checked").length?'#page-all li input[type="checkbox"]':".tabs-panel-active .categorychecklist li input:checked"),g=/menu-item\[([^\]]*)/;return c=c||b.addMenuItemToBottom,f.length?(d.find(".spinner").show(),a(f).each(function(){var d=a(this),f=g.exec(d.attr("name")),h="undefined"==typeof f[1]?0:parseInt(f[1],10);this.className&&-1!=this.className.indexOf("add-to-top")&&(c=b.addMenuItemToTop),e[h]=d.closest("li").getItemData("add-menu-item",h)}),void b.addItemToMenu(e,c,function(){f.removeAttr("checked"),d.find(".spinner").hide()})):!1})},getItemData:function(a,b){a=a||"menu-item";var c,d={},e=["menu-item-db-id","menu-item-object-id","menu-item-object","menu-item-parent-id","menu-item-position","menu-item-type","menu-item-title","menu-item-url","menu-item-description","menu-item-attr-title","menu-item-target","menu-item-classes","menu-item-xfn"];return b||"menu-item"!=a||(b=this.find(".menu-item-data-db-id").val()),b?(this.find("input").each(function(){var f;for(c=e.length;c--;)"menu-item"==a?f=e[c]+"["+b+"]":"add-menu-item"==a&&(f="menu-item["+b+"]["+e[c]+"]"),this.name&&f==this.name&&(d[e[c]]=this.value)}),d):d},setItemData:function(b,c,d){return c=c||"menu-item",d||"menu-item"!=c||(d=a(".menu-item-data-db-id",this).val()),d?(this.find("input").each(function(){var e,f=a(this);a.each(b,function(a,b){"menu-item"==c?e=a+"["+d+"]":"add-menu-item"==c&&(e="menu-item["+d+"]["+a+"]"),e==f.attr("name")&&f.val(b)})}),this):this}})},countMenuItems:function(b){return a(".menu-item-depth-"+b).length},moveMenuItem:function(c,d){var e,f,g,h=a("#menu-to-edit li"),i=h.length,j=c.parents("li.menu-item"),k=j.childMenuItems(),l=j.getItemData(),m=parseInt(j.menuItemDepth(),10),n=parseInt(j.index(),10),o=j.next(),p=o.childMenuItems(),q=parseInt(o.menuItemDepth(),10)+1,r=j.prev(),s=parseInt(r.menuItemDepth(),10),t=r.getItemData()["menu-item-db-id"];switch(d){case"up":if(f=n-1,0===n)break;0===f&&0!==m&&j.moveHorizontally(0,m),0!==s&&j.moveHorizontally(s,m),k?(e=j.add(k),e.detach().insertBefore(h.eq(f)).updateParentMenuItemDBId()):j.detach().insertBefore(h.eq(f)).updateParentMenuItemDBId();break;case"down":if(k){if(e=j.add(k),o=h.eq(e.length+n),p=0!==o.childMenuItems().length,p&&(g=parseInt(o.menuItemDepth(),10)+1,j.moveHorizontally(g,m)),i===n+e.length)break;e.detach().insertAfter(h.eq(n+e.length)).updateParentMenuItemDBId()}else{if(0!==p.length&&j.moveHorizontally(q,m),i===n+1)break;j.detach().insertAfter(h.eq(n+1)).updateParentMenuItemDBId()}break;case"top":if(0===n)break;k?(e=j.add(k),e.detach().insertBefore(h.eq(0)).updateParentMenuItemDBId()):j.detach().insertBefore(h.eq(0)).updateParentMenuItemDBId();break;case"left":if(0===m)break;j.shiftHorizontally(-1);break;case"right":if(0===n)break;if(l["menu-item-parent-id"]===t)break;j.shiftHorizontally(1)}c.focus(),b.registerChange(),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},initAccessibility:function(){var c=a("#menu-to-edit");b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility(),c.on("click",".menus-move-up",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"up"),c.preventDefault()}),c.on("click",".menus-move-down",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"down"),c.preventDefault()}),c.on("click",".menus-move-top",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"top"),c.preventDefault()}),c.on("click",".menus-move-left",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"left"),c.preventDefault()}),c.on("click",".menus-move-right",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"right"),c.preventDefault()})},refreshAdvancedAccessibility:function(){a(".menu-item-settings .field-move a").css("display","none"),a(".item-edit").each(function(){var b,c,d,e,f,g,h,i,j,k=a(this),l=k.closest("li.menu-item").first(),m=l.menuItemDepth(),n=0===m,o=k.closest(".menu-item-handle").find(".menu-item-title").text(),p=parseInt(l.index(),10),q=n?m:parseInt(m-1,10),r=l.prevAll(".menu-item-depth-"+q).first().find(".menu-item-title").text(),s=l.prevAll(".menu-item-depth-"+m).first().find(".menu-item-title").text(),t=a("#menu-to-edit li").length,u=l.nextAll(".menu-item-depth-"+m).length;0!==p&&(b=l.find(".menus-move-up"),b.prop("title",menus.moveUp).css("display","inline")),0!==p&&n&&(b=l.find(".menus-move-top"),b.prop("title",menus.moveToTop).css("display","inline")),p+1!==t&&0!==p&&(b=l.find(".menus-move-down"),b.prop("title",menus.moveDown).css("display","inline")),0===p&&0!==u&&(b=l.find(".menus-move-down"),b.prop("title",menus.moveDown).css("display","inline")),n||(b=l.find(".menus-move-left"),c=menus.outFrom.replace("%s",r),b.prop("title",menus.moveOutFrom.replace("%s",r)).html(c).css("display","inline")),0!==p&&l.find(".menu-item-data-parent-id").val()!==l.prev().find(".menu-item-data-db-id").val()&&(b=l.find(".menus-move-right"),c=menus.under.replace("%s",s),b.prop("title",menus.moveUnder.replace("%s",s)).html(c).css("display","inline")),n?(d=a(".menu-item-depth-0"),e=d.index(l)+1,t=d.length,f=menus.menuFocus.replace("%1$s",o).replace("%2$d",e).replace("%3$d",t)):(g=l.prevAll(".menu-item-depth-"+parseInt(m-1,10)).first(),h=g.find(".menu-item-data-db-id").val(),i=g.find(".menu-item-title").text(),j=a('.menu-item .menu-item-data-parent-id[value="'+h+'"]'),e=a(j.parents(".menu-item").get().reverse()).index(l)+1,f=menus.subMenuFocus.replace("%1$s",o).replace("%2$d",e).replace("%3$s",i)),k.prop("title",f).html(f)})},refreshKeyboardAccessibility:function(){a(".item-edit").off("focus").on("focus",function(){a(this).off("keydown").on("keydown",function(c){var d,e=a(this),f=e.parents("li.menu-item"),g=f.getItemData();if((37==c.which||38==c.which||39==c.which||40==c.which)&&(e.off("keydown"),1!==a("#menu-to-edit li").length)){switch(d={38:"up",40:"down",37:"left",39:"right"},a("body").hasClass("rtl")&&(d={38:"up",40:"down",39:"left",37:"right"}),d[c.which]){case"up":b.moveMenuItem(e,"up");break;case"down":b.moveMenuItem(e,"down");break;case"left":b.moveMenuItem(e,"left");break;case"right":b.moveMenuItem(e,"right")}return a("#edit-"+g["menu-item-db-id"]).focus(),!1}})})},initPreviewing:function(){a("#menu-to-edit").on("change input",".edit-menu-item-title",function(b){var c,d,e=a(b.currentTarget);c=e.val(),d=e.closest(".menu-item").find(".menu-item-title"),c?d.text(c).removeClass("no-title"):d.text(navMenuL10n.untitled).addClass("no-title")})},initToggles:function(){postboxes.add_postbox_toggles("nav-menus"),columns.useCheckboxesForHidden(),columns.checked=function(b){a(".field-"+b).removeClass("hidden-field")},columns.unchecked=function(b){a(".field-"+b).addClass("hidden-field")},b.menuList.hideAdvancedMenuItemFields(),a(".hide-postbox-tog").click(function(){var b=a(".accordion-container li.accordion-section").filter(":hidden").map(function(){return this.id}).get().join(",");a.post(ajaxurl,{action:"closed-postboxes",hidden:b,closedpostboxesnonce:jQuery("#closedpostboxesnonce").val(),page:"nav-menus"})})},initSortables:function(){function c(a){var c;j=a.placeholder.prev(),k=a.placeholder.next(),j[0]==a.item[0]&&(j=j.prev()),k[0]==a.item[0]&&(k=k.next()),l=j.length?j.offset().top+j.height():0,m=k.length?k.offset().top+k.height()/3:0,h=k.length?k.menuItemDepth():0,i=j.length?(c=j.menuItemDepth()+1)>b.options.globalMaxDepth?b.options.globalMaxDepth:c:0}function d(a,b){a.placeholder.updateDepthClass(b,q),q=b}function e(){if(!s[0].className)return 0;var a=s[0].className.match(/menu-max-depth-(\d+)/);return a&&a[1]?parseInt(a[1],10):0}function f(c){var d,e=t;if(0!==c){if(c>0)d=p+c,d>t&&(e=d);else if(0>c&&p==t)for(;!a(".menu-item-depth-"+e,b.menuList).length&&e>0;)e--;s.removeClass("menu-max-depth-"+t).addClass("menu-max-depth-"+e),t=e}}var g,h,i,j,k,l,m,n,o,p,q=0,r=b.menuList.offset().left,s=a("body"),t=e();0!==a("#menu-to-edit li").length&&a(".drag-instructions").show(),r+=b.isRTL?b.menuList.width():0,b.menuList.sortable({handle:".menu-item-handle",placeholder:"sortable-placeholder",start:function(e,f){var h,i,j,k,l;b.isRTL&&(f.item[0].style.right="auto"),o=f.item.children(".menu-item-transport"),g=f.item.menuItemDepth(),d(f,g),j=f.item.next()[0]==f.placeholder[0]?f.item.next():f.item,k=j.childMenuItems(),o.append(k),h=o.outerHeight(),h+=h>0?1*f.placeholder.css("margin-top").slice(0,-2):0,h+=f.helper.outerHeight(),n=h,h-=2,f.placeholder.height(h),p=g,k.each(function(){var b=a(this).menuItemDepth();p=b>p?b:p}),i=f.helper.find(".menu-item-handle").outerWidth(),i+=b.depthToPx(p-g),i-=2,f.placeholder.width(i),l=f.placeholder.next(),l.css("margin-top",n+"px"),f.placeholder.detach(),a(this).sortable("refresh"),f.item.after(f.placeholder),l.css("margin-top",0),c(f)},stop:function(a,c){var d,e,h=q-g;d=o.children().insertAfter(c.item),e=c.item.find(".item-title .is-submenu"),q>0?e.show():e.hide(),0!==h&&(c.item.updateDepthClass(q),d.shiftDepthClass(h),f(h)),b.registerChange(),c.item.updateParentMenuItemDBId(),c.item[0].style.top=0,b.isRTL&&(c.item[0].style.left="auto",c.item[0].style.right=0),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},change:function(a,d){d.placeholder.parent().hasClass("menu")||(j.length?j.after(d.placeholder):b.menuList.prepend(d.placeholder)),c(d)},sort:function(e,f){var g=f.helper.offset(),j=b.isRTL?g.left+f.helper.width():g.left,o=b.negateIfRTL*b.pxToDepth(j-r);o>i||g.top<l?o=i:h>o&&(o=h),o!=q&&d(f,o),m&&g.top+n>m&&(k.after(f.placeholder),c(f),a(this).sortable("refreshPositions"))}})},initManageLocations:function(){a("#menu-locations-wrap form").submit(function(){window.onbeforeunload=null}),a(".menu-location-menus select").on("change",function(){var b=a(this).closest("tr").find(".locations-edit-menu-link");a(this).find("option:selected").data("orig")?b.show():b.hide()})},attachMenuEditListeners:function(){var b=this;a("#update-nav-menu").bind("click",function(a){if(a.target&&a.target.className){if(-1!=a.target.className.indexOf("item-edit"))return b.eventOnClickEditLink(a.target);if(-1!=a.target.className.indexOf("menu-save"))return b.eventOnClickMenuSave(a.target);if(-1!=a.target.className.indexOf("menu-delete"))return b.eventOnClickMenuDelete(a.target);if(-1!=a.target.className.indexOf("item-delete"))return b.eventOnClickMenuItemDelete(a.target);if(-1!=a.target.className.indexOf("item-cancel"))return b.eventOnClickCancelLink(a.target)}}),a('#add-custom-links input[type="text"]').keypress(function(b){13===b.keyCode&&(b.preventDefault(),a("#submit-customlinkdiv").click())})},setupInputWithDefaultTitle:function(){var b="input-with-default-title";a("."+b).each(function(){var c=a(this),d=c.attr("title"),e=c.val();if(c.data(b,d),""===e)c.val(d);else{if(d==e)return;c.removeClass(b)}}).focus(function(){var c=a(this);c.val()==c.data(b)&&c.val("").removeClass(b)}).blur(function(){var c=a(this);""===c.val()&&c.addClass(b).val(c.data(b))}),a(".blank-slate .input-with-default-title").focus()},attachThemeLocationsListeners:function(){var b=a("#nav-menu-theme-locations"),c={};c.action="menu-locations-save",c["menu-settings-column-nonce"]=a("#menu-settings-column-nonce").val(),b.find('input[type="submit"]').click(function(){return b.find("select").each(function(){c[this.name]=a(this).val()}),b.find(".spinner").show(),a.post(ajaxurl,c,function(){b.find(".spinner").hide()}),!1})},attachQuickSearchListeners:function(){var c;a(".quick-search").keypress(function(d){var e=a(this);return 13==d.which?(b.updateQuickSearchResults(e),!1):(c&&clearTimeout(c),void(c=setTimeout(function(){b.updateQuickSearchResults(e)},400)))}).attr("autocomplete","off")},updateQuickSearchResults:function(c){var d,e,f=2,g=c.val();g.length<f||(d=c.parents(".tabs-panel"),e={action:"menu-quick-search","response-format":"markup",menu:a("#menu").val(),"menu-settings-column-nonce":a("#menu-settings-column-nonce").val(),q:g,type:c.attr("name")},a(".spinner",d).show(),a.post(ajaxurl,e,function(a){b.processQuickSearchQueryResponse(a,e,d)}))},addCustomLink:function(c){var d=a("#custom-menu-item-url").val(),e=a("#custom-menu-item-name").val();return c=c||b.addMenuItemToBottom,""===d||"http://"==d?!1:(a(".customlinkdiv .spinner").show(),void this.addLinkToMenu(d,e,c,function(){a(".customlinkdiv .spinner").hide(),a("#custom-menu-item-name").val("").blur(),a("#custom-menu-item-url").val("http://")}))},addLinkToMenu:function(a,c,d,e){d=d||b.addMenuItemToBottom,e=e||function(){},b.addItemToMenu({"-1":{"menu-item-type":"custom","menu-item-url":a,"menu-item-title":c}},d,e)},addItemToMenu:function(b,c,d){var e,f=a("#menu").val(),g=a("#menu-settings-column-nonce").val();c=c||function(){},d=d||function(){},e={action:"add-menu-item",menu:f,"menu-settings-column-nonce":g,"menu-item":b},a.post(ajaxurl,e,function(b){var f=a("#menu-instructions");b=a.trim(b),c(b,e),a("li.pending").hide().fadeIn("slow"),a(".drag-instructions").show(),!f.hasClass("menu-instructions-inactive")&&f.siblings().length&&f.addClass("menu-instructions-inactive"),d()})},addMenuItemToBottom:function(c){a(c).hideAdvancedMenuItemFields().appendTo(b.targetList),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},addMenuItemToTop:function(c){a(c).hideAdvancedMenuItemFields().prependTo(b.targetList),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},attachUnsavedChangesListener:function(){a("#menu-management input, #menu-management select, #menu-management, #menu-management textarea, .menu-location-menus select").change(function(){b.registerChange()}),0!==a("#menu-to-edit").length||0!==a(".menu-location-menus select").length?window.onbeforeunload=function(){return b.menusChanged?navMenuL10n.saveAlert:void 0}:a("#menu-settings-column").find("input,select").end().find("a").attr("href","#").unbind("click")},registerChange:function(){b.menusChanged=!0},attachTabsPanelListeners:function(){a("#menu-settings-column").bind("click",function(c){var d,e,f,g,h=a(c.target);if(h.hasClass("nav-tab-link"))e=h.data("type"),f=h.parents(".accordion-section-content").first(),a("input",f).removeAttr("checked"),a(".tabs-panel-active",f).removeClass("tabs-panel-active").addClass("tabs-panel-inactive"),a("#"+e,f).removeClass("tabs-panel-inactive").addClass("tabs-panel-active"),a(".tabs",f).removeClass("tabs"),h.parent().addClass("tabs"),a(".quick-search",f).focus(),c.preventDefault();else if(h.hasClass("select-all")){if(d=/#(.*)$/.exec(c.target.href),d&&d[1])return g=a("#"+d[1]+" .tabs-panel-active .menu-item-title input"),g.length===g.filter(":checked").length?g.removeAttr("checked"):g.prop("checked",!0),!1}else{if(h.hasClass("submit-add-to-menu"))return b.registerChange(),c.target.id&&"submit-customlinkdiv"==c.target.id?b.addCustomLink(b.addMenuItemToBottom):c.target.id&&-1!=c.target.id.indexOf("submit-")&&a("#"+c.target.id.replace(/submit-/,"")).addSelectedToMenu(b.addMenuItemToBottom),!1;if(h.hasClass("page-numbers"))return a.post(ajaxurl,c.target.href.replace(/.*\?/,"").replace(/action=([^&]*)/,"")+"&action=menu-get-metabox",function(b){if(-1!=b.indexOf("replace-id")){var c=a.parseJSON(b),d=document.getElementById(c["replace-id"]),e=document.createElement("div"),f=document.createElement("div");c.markup&&d&&(f.innerHTML=c.markup?c.markup:"",d.parentNode.insertBefore(e,d),e.parentNode.removeChild(d),e.parentNode.insertBefore(f,e),e.parentNode.removeChild(e))}}),!1}})},eventOnClickEditLink:function(b){var c,d,e=/#(.*)$/.exec(b.href);return e&&e[1]&&(c=a("#"+e[1]),d=c.parent(),0!==d.length)?(d.hasClass("menu-item-edit-inactive")?(c.data("menu-item-data")||c.data("menu-item-data",c.getItemData()),c.slideDown("fast"),d.removeClass("menu-item-edit-inactive").addClass("menu-item-edit-active")):(c.slideUp("fast"),d.removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive")),!1):void 0},eventOnClickCancelLink:function(b){var c=a(b).closest(".menu-item-settings"),d=a(b).closest(".menu-item");return d.removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive"),c.setItemData(c.data("menu-item-data")).hide(),!1},eventOnClickMenuSave:function(){var c="",d=a("#menu-name"),e=d.val();return e&&e!=d.attr("title")&&e.replace(/\s+/,"")?(a("#nav-menu-theme-locations select").each(function(){c+='<input type="hidden" name="'+this.name+'" value="'+a(this).val()+'" />'}),a("#update-nav-menu").append(c),b.menuList.find(".menu-item-data-position").val(function(a){return a+1}),window.onbeforeunload=null,!0):(d.parent().addClass("form-invalid"),!1)},eventOnClickMenuDelete:function(){return window.confirm(navMenuL10n.warnDeleteMenu)?(window.onbeforeunload=null,!0):!1},eventOnClickMenuItemDelete:function(c){var d=parseInt(c.id.replace("delete-",""),10);return b.removeMenuItem(a("#menu-item-"+d)),b.registerChange(),!1},processQuickSearchQueryResponse:function(b,c,d){var e,f,g,h={},i=document.getElementById("nav-menu-meta"),j=/menu-item[(\[^]\]*/,k=a("<div>").html(b).find("li");return k.length?(k.each(function(){if(g=a(this),e=j.exec(g.html()),e&&e[1]){for(f=e[1];i.elements["menu-item["+f+"][menu-item-type]"]||h[f];)f--;h[f]=!0,f!=e[1]&&g.html(g.html().replace(new RegExp("menu-item\\["+e[1]+"\\]","g"),"menu-item["+f+"]"))}}),a(".categorychecklist",d).html(k),void a(".spinner",d).hide()):(a(".categorychecklist",d).html("<li><p>"+navMenuL10n.noResultsFound+"</p></li>"),void a(".spinner",d).hide())},removeMenuItem:function(b){var c=b.childMenuItems();b.addClass("deleting").animate({opacity:0,height:0},350,function(){var d=a("#menu-instructions");b.remove(),c.shiftDepthClass(-1).updateParentMenuItemDBId(),0===a("#menu-to-edit li").length&&(a(".drag-instructions").hide(),d.removeClass("menu-instructions-inactive"))})},depthToPx:function(a){return a*b.options.menuItemDepthPerLevel},pxToDepth:function(a){return Math.floor(a/b.options.menuItemDepthPerLevel)}},a(document).ready(function(){wpNavMenu.init()})}(jQuery); \ No newline at end of file +var wpNavMenu;!function(a){var b;b=wpNavMenu={options:{menuItemDepthPerLevel:30,globalMaxDepth:11},menuList:void 0,targetList:void 0,menusChanged:!1,isRTL:!("undefined"==typeof isRtl||!isRtl),negateIfRTL:"undefined"!=typeof isRtl&&isRtl?-1:1,init:function(){b.menuList=a("#menu-to-edit"),b.targetList=b.menuList,this.jQueryExtensions(),this.attachMenuEditListeners(),this.setupInputWithDefaultTitle(),this.attachQuickSearchListeners(),this.attachThemeLocationsListeners(),this.attachTabsPanelListeners(),this.attachUnsavedChangesListener(),b.menuList.length&&this.initSortables(),menus.oneThemeLocationNoMenus&&a("#posttype-page").addSelectedToMenu(b.addMenuItemToBottom),this.initManageLocations(),this.initAccessibility(),this.initToggles(),this.initPreviewing()},jQueryExtensions:function(){a.fn.extend({menuItemDepth:function(){var a=this.eq(0).css(b.isRTL?"margin-right":"margin-left");return b.pxToDepth(a&&-1!=a.indexOf("px")?a.slice(0,-2):0)},updateDepthClass:function(b,c){return this.each(function(){var d=a(this);c=c||d.menuItemDepth(),a(this).removeClass("menu-item-depth-"+c).addClass("menu-item-depth-"+b)})},shiftDepthClass:function(b){return this.each(function(){var c=a(this),d=c.menuItemDepth();a(this).removeClass("menu-item-depth-"+d).addClass("menu-item-depth-"+(d+b))})},childMenuItems:function(){var b=a();return this.each(function(){for(var c=a(this),d=c.menuItemDepth(),e=c.next();e.length&&e.menuItemDepth()>d;)b=b.add(e),e=e.next()}),b},shiftHorizontally:function(b){return this.each(function(){var c=a(this),d=c.menuItemDepth(),e=d+b;c.moveHorizontally(e,d)})},moveHorizontally:function(b,c){return this.each(function(){var d=a(this),e=d.childMenuItems(),f=b-c,g=d.find(".is-submenu");d.updateDepthClass(b,c).updateParentMenuItemDBId(),e&&e.each(function(){var b=a(this),c=b.menuItemDepth(),d=c+f;b.updateDepthClass(d,c).updateParentMenuItemDBId()}),0===b?g.hide():g.show()})},updateParentMenuItemDBId:function(){return this.each(function(){var b=a(this),c=b.find(".menu-item-data-parent-id"),d=parseInt(b.menuItemDepth(),10),e=d-1,f=b.prevAll(".menu-item-depth-"+e).first();c.val(0===d?0:f.find(".menu-item-data-db-id").val())})},hideAdvancedMenuItemFields:function(){return this.each(function(){var b=a(this);a(".hide-column-tog").not(":checked").each(function(){b.find(".field-"+a(this).val()).addClass("hidden-field")})})},addSelectedToMenu:function(c){return 0===a("#menu-to-edit").length?!1:this.each(function(){var d=a(this),e={},f=d.find(menus.oneThemeLocationNoMenus&&0===d.find(".tabs-panel-active .categorychecklist li input:checked").length?'#page-all li input[type="checkbox"]':".tabs-panel-active .categorychecklist li input:checked"),g=/menu-item\[([^\]]*)/;return c=c||b.addMenuItemToBottom,f.length?(d.find(".spinner").show(),a(f).each(function(){var d=a(this),f=g.exec(d.attr("name")),h="undefined"==typeof f[1]?0:parseInt(f[1],10);this.className&&-1!=this.className.indexOf("add-to-top")&&(c=b.addMenuItemToTop),e[h]=d.closest("li").getItemData("add-menu-item",h)}),void b.addItemToMenu(e,c,function(){f.removeAttr("checked"),d.find(".spinner").hide()})):!1})},getItemData:function(a,b){a=a||"menu-item";var c,d={},e=["menu-item-db-id","menu-item-object-id","menu-item-object","menu-item-parent-id","menu-item-position","menu-item-type","menu-item-title","menu-item-url","menu-item-description","menu-item-attr-title","menu-item-target","menu-item-classes","menu-item-xfn"];return b||"menu-item"!=a||(b=this.find(".menu-item-data-db-id").val()),b?(this.find("input").each(function(){var f;for(c=e.length;c--;)"menu-item"==a?f=e[c]+"["+b+"]":"add-menu-item"==a&&(f="menu-item["+b+"]["+e[c]+"]"),this.name&&f==this.name&&(d[e[c]]=this.value)}),d):d},setItemData:function(b,c,d){return c=c||"menu-item",d||"menu-item"!=c||(d=a(".menu-item-data-db-id",this).val()),d?(this.find("input").each(function(){var e,f=a(this);a.each(b,function(a,b){"menu-item"==c?e=a+"["+d+"]":"add-menu-item"==c&&(e="menu-item["+d+"]["+a+"]"),e==f.attr("name")&&f.val(b)})}),this):this}})},countMenuItems:function(b){return a(".menu-item-depth-"+b).length},moveMenuItem:function(c,d){var e,f,g,h=a("#menu-to-edit li"),i=h.length,j=c.parents("li.menu-item"),k=j.childMenuItems(),l=j.getItemData(),m=parseInt(j.menuItemDepth(),10),n=parseInt(j.index(),10),o=j.next(),p=o.childMenuItems(),q=parseInt(o.menuItemDepth(),10)+1,r=j.prev(),s=parseInt(r.menuItemDepth(),10),t=r.getItemData()["menu-item-db-id"];switch(d){case"up":if(f=n-1,0===n)break;0===f&&0!==m&&j.moveHorizontally(0,m),0!==s&&j.moveHorizontally(s,m),k?(e=j.add(k),e.detach().insertBefore(h.eq(f)).updateParentMenuItemDBId()):j.detach().insertBefore(h.eq(f)).updateParentMenuItemDBId();break;case"down":if(k){if(e=j.add(k),o=h.eq(e.length+n),p=0!==o.childMenuItems().length,p&&(g=parseInt(o.menuItemDepth(),10)+1,j.moveHorizontally(g,m)),i===n+e.length)break;e.detach().insertAfter(h.eq(n+e.length)).updateParentMenuItemDBId()}else{if(0!==p.length&&j.moveHorizontally(q,m),i===n+1)break;j.detach().insertAfter(h.eq(n+1)).updateParentMenuItemDBId()}break;case"top":if(0===n)break;k?(e=j.add(k),e.detach().insertBefore(h.eq(0)).updateParentMenuItemDBId()):j.detach().insertBefore(h.eq(0)).updateParentMenuItemDBId();break;case"left":if(0===m)break;j.shiftHorizontally(-1);break;case"right":if(0===n)break;if(l["menu-item-parent-id"]===t)break;j.shiftHorizontally(1)}c.focus(),b.registerChange(),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},initAccessibility:function(){var c=a("#menu-to-edit");b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility(),c.on("click",".menus-move-up",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"up"),c.preventDefault()}),c.on("click",".menus-move-down",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"down"),c.preventDefault()}),c.on("click",".menus-move-top",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"top"),c.preventDefault()}),c.on("click",".menus-move-left",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"left"),c.preventDefault()}),c.on("click",".menus-move-right",function(c){b.moveMenuItem(a(this).parents("li.menu-item").find("a.item-edit"),"right"),c.preventDefault()})},refreshAdvancedAccessibility:function(){a(".menu-item-settings .field-move a").css("display","none"),a(".item-edit").each(function(){var b,c,d,e,f,g,h,i,j,k=a(this),l=k.closest("li.menu-item").first(),m=l.menuItemDepth(),n=0===m,o=k.closest(".menu-item-handle").find(".menu-item-title").text(),p=parseInt(l.index(),10),q=n?m:parseInt(m-1,10),r=l.prevAll(".menu-item-depth-"+q).first().find(".menu-item-title").text(),s=l.prevAll(".menu-item-depth-"+m).first().find(".menu-item-title").text(),t=a("#menu-to-edit li").length,u=l.nextAll(".menu-item-depth-"+m).length;0!==p&&(b=l.find(".menus-move-up"),b.prop("title",menus.moveUp).css("display","inline")),0!==p&&n&&(b=l.find(".menus-move-top"),b.prop("title",menus.moveToTop).css("display","inline")),p+1!==t&&0!==p&&(b=l.find(".menus-move-down"),b.prop("title",menus.moveDown).css("display","inline")),0===p&&0!==u&&(b=l.find(".menus-move-down"),b.prop("title",menus.moveDown).css("display","inline")),n||(b=l.find(".menus-move-left"),c=menus.outFrom.replace("%s",r),b.prop("title",menus.moveOutFrom.replace("%s",r)).text(c).css("display","inline")),0!==p&&l.find(".menu-item-data-parent-id").val()!==l.prev().find(".menu-item-data-db-id").val()&&(b=l.find(".menus-move-right"),c=menus.under.replace("%s",s),b.prop("title",menus.moveUnder.replace("%s",s)).text(c).css("display","inline")),n?(d=a(".menu-item-depth-0"),e=d.index(l)+1,t=d.length,f=menus.menuFocus.replace("%1$s",o).replace("%2$d",e).replace("%3$d",t)):(g=l.prevAll(".menu-item-depth-"+parseInt(m-1,10)).first(),h=g.find(".menu-item-data-db-id").val(),i=g.find(".menu-item-title").text(),j=a('.menu-item .menu-item-data-parent-id[value="'+h+'"]'),e=a(j.parents(".menu-item").get().reverse()).index(l)+1,f=menus.subMenuFocus.replace("%1$s",o).replace("%2$d",e).replace("%3$s",i)),k.prop("title",f).text(f)})},refreshKeyboardAccessibility:function(){a(".item-edit").off("focus").on("focus",function(){a(this).off("keydown").on("keydown",function(c){var d,e=a(this),f=e.parents("li.menu-item"),g=f.getItemData();if((37==c.which||38==c.which||39==c.which||40==c.which)&&(e.off("keydown"),1!==a("#menu-to-edit li").length)){switch(d={38:"up",40:"down",37:"left",39:"right"},a("body").hasClass("rtl")&&(d={38:"up",40:"down",39:"left",37:"right"}),d[c.which]){case"up":b.moveMenuItem(e,"up");break;case"down":b.moveMenuItem(e,"down");break;case"left":b.moveMenuItem(e,"left");break;case"right":b.moveMenuItem(e,"right")}return a("#edit-"+g["menu-item-db-id"]).focus(),!1}})})},initPreviewing:function(){a("#menu-to-edit").on("change input",".edit-menu-item-title",function(b){var c,d,e=a(b.currentTarget);c=e.val(),d=e.closest(".menu-item").find(".menu-item-title"),c?d.text(c).removeClass("no-title"):d.text(navMenuL10n.untitled).addClass("no-title")})},initToggles:function(){postboxes.add_postbox_toggles("nav-menus"),columns.useCheckboxesForHidden(),columns.checked=function(b){a(".field-"+b).removeClass("hidden-field")},columns.unchecked=function(b){a(".field-"+b).addClass("hidden-field")},b.menuList.hideAdvancedMenuItemFields(),a(".hide-postbox-tog").click(function(){var b=a(".accordion-container li.accordion-section").filter(":hidden").map(function(){return this.id}).get().join(",");a.post(ajaxurl,{action:"closed-postboxes",hidden:b,closedpostboxesnonce:jQuery("#closedpostboxesnonce").val(),page:"nav-menus"})})},initSortables:function(){function c(a){var c;j=a.placeholder.prev(),k=a.placeholder.next(),j[0]==a.item[0]&&(j=j.prev()),k[0]==a.item[0]&&(k=k.next()),l=j.length?j.offset().top+j.height():0,m=k.length?k.offset().top+k.height()/3:0,h=k.length?k.menuItemDepth():0,i=j.length?(c=j.menuItemDepth()+1)>b.options.globalMaxDepth?b.options.globalMaxDepth:c:0}function d(a,b){a.placeholder.updateDepthClass(b,q),q=b}function e(){if(!s[0].className)return 0;var a=s[0].className.match(/menu-max-depth-(\d+)/);return a&&a[1]?parseInt(a[1],10):0}function f(c){var d,e=t;if(0!==c){if(c>0)d=p+c,d>t&&(e=d);else if(0>c&&p==t)for(;!a(".menu-item-depth-"+e,b.menuList).length&&e>0;)e--;s.removeClass("menu-max-depth-"+t).addClass("menu-max-depth-"+e),t=e}}var g,h,i,j,k,l,m,n,o,p,q=0,r=b.menuList.offset().left,s=a("body"),t=e();0!==a("#menu-to-edit li").length&&a(".drag-instructions").show(),r+=b.isRTL?b.menuList.width():0,b.menuList.sortable({handle:".menu-item-handle",placeholder:"sortable-placeholder",start:function(e,f){var h,i,j,k,l;b.isRTL&&(f.item[0].style.right="auto"),o=f.item.children(".menu-item-transport"),g=f.item.menuItemDepth(),d(f,g),j=f.item.next()[0]==f.placeholder[0]?f.item.next():f.item,k=j.childMenuItems(),o.append(k),h=o.outerHeight(),h+=h>0?1*f.placeholder.css("margin-top").slice(0,-2):0,h+=f.helper.outerHeight(),n=h,h-=2,f.placeholder.height(h),p=g,k.each(function(){var b=a(this).menuItemDepth();p=b>p?b:p}),i=f.helper.find(".menu-item-handle").outerWidth(),i+=b.depthToPx(p-g),i-=2,f.placeholder.width(i),l=f.placeholder.next(),l.css("margin-top",n+"px"),f.placeholder.detach(),a(this).sortable("refresh"),f.item.after(f.placeholder),l.css("margin-top",0),c(f)},stop:function(a,c){var d,e,h=q-g;d=o.children().insertAfter(c.item),e=c.item.find(".item-title .is-submenu"),q>0?e.show():e.hide(),0!==h&&(c.item.updateDepthClass(q),d.shiftDepthClass(h),f(h)),b.registerChange(),c.item.updateParentMenuItemDBId(),c.item[0].style.top=0,b.isRTL&&(c.item[0].style.left="auto",c.item[0].style.right=0),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},change:function(a,d){d.placeholder.parent().hasClass("menu")||(j.length?j.after(d.placeholder):b.menuList.prepend(d.placeholder)),c(d)},sort:function(e,f){var g=f.helper.offset(),j=b.isRTL?g.left+f.helper.width():g.left,o=b.negateIfRTL*b.pxToDepth(j-r);o>i||g.top<l?o=i:h>o&&(o=h),o!=q&&d(f,o),m&&g.top+n>m&&(k.after(f.placeholder),c(f),a(this).sortable("refreshPositions"))}})},initManageLocations:function(){a("#menu-locations-wrap form").submit(function(){window.onbeforeunload=null}),a(".menu-location-menus select").on("change",function(){var b=a(this).closest("tr").find(".locations-edit-menu-link");a(this).find("option:selected").data("orig")?b.show():b.hide()})},attachMenuEditListeners:function(){var b=this;a("#update-nav-menu").bind("click",function(a){if(a.target&&a.target.className){if(-1!=a.target.className.indexOf("item-edit"))return b.eventOnClickEditLink(a.target);if(-1!=a.target.className.indexOf("menu-save"))return b.eventOnClickMenuSave(a.target);if(-1!=a.target.className.indexOf("menu-delete"))return b.eventOnClickMenuDelete(a.target);if(-1!=a.target.className.indexOf("item-delete"))return b.eventOnClickMenuItemDelete(a.target);if(-1!=a.target.className.indexOf("item-cancel"))return b.eventOnClickCancelLink(a.target)}}),a('#add-custom-links input[type="text"]').keypress(function(b){13===b.keyCode&&(b.preventDefault(),a("#submit-customlinkdiv").click())})},setupInputWithDefaultTitle:function(){var b="input-with-default-title";a("."+b).each(function(){var c=a(this),d=c.attr("title"),e=c.val();if(c.data(b,d),""===e)c.val(d);else{if(d==e)return;c.removeClass(b)}}).focus(function(){var c=a(this);c.val()==c.data(b)&&c.val("").removeClass(b)}).blur(function(){var c=a(this);""===c.val()&&c.addClass(b).val(c.data(b))}),a(".blank-slate .input-with-default-title").focus()},attachThemeLocationsListeners:function(){var b=a("#nav-menu-theme-locations"),c={};c.action="menu-locations-save",c["menu-settings-column-nonce"]=a("#menu-settings-column-nonce").val(),b.find('input[type="submit"]').click(function(){return b.find("select").each(function(){c[this.name]=a(this).val()}),b.find(".spinner").show(),a.post(ajaxurl,c,function(){b.find(".spinner").hide()}),!1})},attachQuickSearchListeners:function(){var c;a(".quick-search").keypress(function(d){var e=a(this);return 13==d.which?(b.updateQuickSearchResults(e),!1):(c&&clearTimeout(c),void(c=setTimeout(function(){b.updateQuickSearchResults(e)},400)))}).attr("autocomplete","off")},updateQuickSearchResults:function(c){var d,e,f=2,g=c.val();g.length<f||(d=c.parents(".tabs-panel"),e={action:"menu-quick-search","response-format":"markup",menu:a("#menu").val(),"menu-settings-column-nonce":a("#menu-settings-column-nonce").val(),q:g,type:c.attr("name")},a(".spinner",d).show(),a.post(ajaxurl,e,function(a){b.processQuickSearchQueryResponse(a,e,d)}))},addCustomLink:function(c){var d=a("#custom-menu-item-url").val(),e=a("#custom-menu-item-name").val();return c=c||b.addMenuItemToBottom,""===d||"http://"==d?!1:(a(".customlinkdiv .spinner").show(),void this.addLinkToMenu(d,e,c,function(){a(".customlinkdiv .spinner").hide(),a("#custom-menu-item-name").val("").blur(),a("#custom-menu-item-url").val("http://")}))},addLinkToMenu:function(a,c,d,e){d=d||b.addMenuItemToBottom,e=e||function(){},b.addItemToMenu({"-1":{"menu-item-type":"custom","menu-item-url":a,"menu-item-title":c}},d,e)},addItemToMenu:function(b,c,d){var e,f=a("#menu").val(),g=a("#menu-settings-column-nonce").val();c=c||function(){},d=d||function(){},e={action:"add-menu-item",menu:f,"menu-settings-column-nonce":g,"menu-item":b},a.post(ajaxurl,e,function(b){var f=a("#menu-instructions");b=a.trim(b),c(b,e),a("li.pending").hide().fadeIn("slow"),a(".drag-instructions").show(),!f.hasClass("menu-instructions-inactive")&&f.siblings().length&&f.addClass("menu-instructions-inactive"),d()})},addMenuItemToBottom:function(c){a(c).hideAdvancedMenuItemFields().appendTo(b.targetList),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},addMenuItemToTop:function(c){a(c).hideAdvancedMenuItemFields().prependTo(b.targetList),b.refreshKeyboardAccessibility(),b.refreshAdvancedAccessibility()},attachUnsavedChangesListener:function(){a("#menu-management input, #menu-management select, #menu-management, #menu-management textarea, .menu-location-menus select").change(function(){b.registerChange()}),0!==a("#menu-to-edit").length||0!==a(".menu-location-menus select").length?window.onbeforeunload=function(){return b.menusChanged?navMenuL10n.saveAlert:void 0}:a("#menu-settings-column").find("input,select").end().find("a").attr("href","#").unbind("click")},registerChange:function(){b.menusChanged=!0},attachTabsPanelListeners:function(){a("#menu-settings-column").bind("click",function(c){var d,e,f,g,h=a(c.target);if(h.hasClass("nav-tab-link"))e=h.data("type"),f=h.parents(".accordion-section-content").first(),a("input",f).removeAttr("checked"),a(".tabs-panel-active",f).removeClass("tabs-panel-active").addClass("tabs-panel-inactive"),a("#"+e,f).removeClass("tabs-panel-inactive").addClass("tabs-panel-active"),a(".tabs",f).removeClass("tabs"),h.parent().addClass("tabs"),a(".quick-search",f).focus(),c.preventDefault();else if(h.hasClass("select-all")){if(d=/#(.*)$/.exec(c.target.href),d&&d[1])return g=a("#"+d[1]+" .tabs-panel-active .menu-item-title input"),g.length===g.filter(":checked").length?g.removeAttr("checked"):g.prop("checked",!0),!1}else{if(h.hasClass("submit-add-to-menu"))return b.registerChange(),c.target.id&&"submit-customlinkdiv"==c.target.id?b.addCustomLink(b.addMenuItemToBottom):c.target.id&&-1!=c.target.id.indexOf("submit-")&&a("#"+c.target.id.replace(/submit-/,"")).addSelectedToMenu(b.addMenuItemToBottom),!1;if(h.hasClass("page-numbers"))return a.post(ajaxurl,c.target.href.replace(/.*\?/,"").replace(/action=([^&]*)/,"")+"&action=menu-get-metabox",function(b){if(-1!=b.indexOf("replace-id")){var c=a.parseJSON(b),d=document.getElementById(c["replace-id"]),e=document.createElement("div"),f=document.createElement("div");c.markup&&d&&(f.innerHTML=c.markup?c.markup:"",d.parentNode.insertBefore(e,d),e.parentNode.removeChild(d),e.parentNode.insertBefore(f,e),e.parentNode.removeChild(e))}}),!1}})},eventOnClickEditLink:function(b){var c,d,e=/#(.*)$/.exec(b.href);return e&&e[1]&&(c=a("#"+e[1]),d=c.parent(),0!==d.length)?(d.hasClass("menu-item-edit-inactive")?(c.data("menu-item-data")||c.data("menu-item-data",c.getItemData()),c.slideDown("fast"),d.removeClass("menu-item-edit-inactive").addClass("menu-item-edit-active")):(c.slideUp("fast"),d.removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive")),!1):void 0},eventOnClickCancelLink:function(b){var c=a(b).closest(".menu-item-settings"),d=a(b).closest(".menu-item");return d.removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive"),c.setItemData(c.data("menu-item-data")).hide(),!1},eventOnClickMenuSave:function(){var c="",d=a("#menu-name"),e=d.val();return e&&e!=d.attr("title")&&e.replace(/\s+/,"")?(a("#nav-menu-theme-locations select").each(function(){c+='<input type="hidden" name="'+this.name+'" value="'+a(this).val()+'" />'}),a("#update-nav-menu").append(c),b.menuList.find(".menu-item-data-position").val(function(a){return a+1}),window.onbeforeunload=null,!0):(d.parent().addClass("form-invalid"),!1)},eventOnClickMenuDelete:function(){return window.confirm(navMenuL10n.warnDeleteMenu)?(window.onbeforeunload=null,!0):!1},eventOnClickMenuItemDelete:function(c){var d=parseInt(c.id.replace("delete-",""),10);return b.removeMenuItem(a("#menu-item-"+d)),b.registerChange(),!1},processQuickSearchQueryResponse:function(b,c,d){var e,f,g,h={},i=document.getElementById("nav-menu-meta"),j=/menu-item[(\[^]\]*/,k=a("<div>").html(b).find("li");return k.length?(k.each(function(){if(g=a(this),e=j.exec(g.html()),e&&e[1]){for(f=e[1];i.elements["menu-item["+f+"][menu-item-type]"]||h[f];)f--;h[f]=!0,f!=e[1]&&g.html(g.html().replace(new RegExp("menu-item\\["+e[1]+"\\]","g"),"menu-item["+f+"]"))}}),a(".categorychecklist",d).html(k),void a(".spinner",d).hide()):(a(".categorychecklist",d).html("<li><p>"+navMenuL10n.noResultsFound+"</p></li>"),void a(".spinner",d).hide())},removeMenuItem:function(b){var c=b.childMenuItems();b.addClass("deleting").animate({opacity:0,height:0},350,function(){var d=a("#menu-instructions");b.remove(),c.shiftDepthClass(-1).updateParentMenuItemDBId(),0===a("#menu-to-edit li").length&&(a(".drag-instructions").hide(),d.removeClass("menu-instructions-inactive"))})},depthToPx:function(a){return a*b.options.menuItemDepthPerLevel},pxToDepth:function(a){return Math.floor(a/b.options.menuItemDepthPerLevel)}},a(document).ready(function(){wpNavMenu.init()})}(jQuery); \ No newline at end of file diff --git a/wp-admin/update-core.php b/wp-admin/update-core.php index 0c7d297b9..600db23ee 100644 --- a/wp-admin/update-core.php +++ b/wp-admin/update-core.php @@ -390,14 +390,14 @@ function do_core_upgrade( $reinstall = false ) { <h2><?php _e('Update WordPress'); ?></h2> <?php - if ( false === ( $credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array(), $allow_relaxed_file_ownership ) ) ) { + if ( false === ( $credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership ) ) ) { echo '</div>'; return; } if ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) { // Failed to connect, Error and request again - request_filesystem_credentials( $url, '', true, ABSPATH, array(), $allow_relaxed_file_ownership ); + request_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership ); echo '</div>'; return; } diff --git a/wp-content/plugins/akismet/_inc/akismet.css b/wp-content/plugins/akismet/_inc/akismet.css index ff076aab2..b754ec678 100644 --- a/wp-content/plugins/akismet/_inc/akismet.css +++ b/wp-content/plugins/akismet/_inc/akismet.css @@ -340,11 +340,16 @@ h2.ak-header { text-align: center; } -.akismet-settings th.strictness { +.akismet-settings th:first-child { vertical-align: top; padding-top: 15px; } +.akismet-settings th.akismet-api-key { + vertical-align: middle; + padding-top: 0; +} + .akismet-settings input[type=text] { width: 75%; } diff --git a/wp-content/plugins/akismet/_inc/akismet.js b/wp-content/plugins/akismet/_inc/akismet.js index 7da76cd52..5e857d161 100644 --- a/wp-content/plugins/akismet/_inc/akismet.js +++ b/wp-content/plugins/akismet/_inc/akismet.js @@ -18,9 +18,11 @@ jQuery( function ( $ ) { var thisId = $(this).attr('commentid'); $(this).insertAfter('#comment-' + thisId + ' .author strong:first').show(); }); - $('#the-comment-list').find('tr.comment, tr[id ^= "comment-"]').find('.column-author a[title ^= "http://"], .column-author a[title ^= "https://"]').each(function () { + $('#the-comment-list').find('tr.comment, tr[id ^= "comment-"]').find('.column-author a[title]').each(function () { + // Comment author URLs are the only URL with a title attribute in the author column. var thisTitle = $(this).attr('title'); - thisCommentId = $(this).parents('tr:first').attr('id').split("-"); + + var thisCommentId = $(this).parents('tr:first').attr('id').split("-"); $(this).attr("id", "author_comment_url_"+ thisCommentId[1]); diff --git a/wp-content/plugins/akismet/akismet.php b/wp-content/plugins/akismet/akismet.php index dc42c2ae3..5cdd32a49 100644 --- a/wp-content/plugins/akismet/akismet.php +++ b/wp-content/plugins/akismet/akismet.php @@ -6,7 +6,7 @@ Plugin Name: Akismet Plugin URI: http://akismet.com/ Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and trackback spam</strong>. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) <a href="http://akismet.com/get/">Sign up for an Akismet API key</a>, and 3) Go to your Akismet configuration page, and save your API key. -Version: 3.0.4 +Version: 3.1.1 Author: Automattic Author URI: http://automattic.com/wordpress-plugins/ License: GPLv2 or later @@ -35,8 +35,8 @@ if ( !function_exists( 'add_action' ) ) { exit; } -define( 'AKISMET_VERSION', '3.0.4' ); -define( 'AKISMET__MINIMUM_WP_VERSION', '3.1' ); +define( 'AKISMET_VERSION', '3.1.1' ); +define( 'AKISMET__MINIMUM_WP_VERSION', '3.2' ); define( 'AKISMET__PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'AKISMET_DELETE_LIMIT', 100000 ); diff --git a/wp-content/plugins/akismet/class.akismet.php b/wp-content/plugins/akismet/class.akismet.php index bcc5163e7..5c786526e 100644 --- a/wp-content/plugins/akismet/class.akismet.php +++ b/wp-content/plugins/akismet/class.akismet.php @@ -23,7 +23,7 @@ class Akismet { self::$initiated = true; add_action( 'wp_insert_comment', array( 'Akismet', 'auto_check_update_meta' ), 10, 2 ); - add_action( 'preprocess_comment', array( 'Akismet', 'auto_check_comment' ), 1 ); + add_filter( 'preprocess_comment', array( 'Akismet', 'auto_check_comment' ), 1 ); add_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_old_comments' ) ); add_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_old_comments_meta' ) ); add_action( 'akismet_schedule_cron_recheck', array( 'Akismet', 'cron_recheck' ) ); @@ -42,6 +42,9 @@ class Akismet { add_action( 'transition_comment_status', array( 'Akismet', 'transition_comment_status' ), 10, 3 ); + // Run this early in the pingback call, before doing a remote fetch of the source uri + add_action( 'xmlrpc_call', array( 'Akismet', 'pre_check_pingback' ) ); + if ( '3.0.5' == $GLOBALS['wp_version'] ) { remove_filter( 'comment_text', 'wp_kses_data' ); if ( is_admin() ) @@ -161,6 +164,7 @@ class Akismet { if ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_single_event') ) { if ( !wp_next_scheduled( 'akismet_schedule_cron_recheck' ) ) { wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); + do_action( 'akismet_scheduled_recheck', 'invalid-response-' . $response[1] ); } } @@ -180,7 +184,7 @@ class Akismet { self::set_last_comment( $commentdata ); self::fix_scheduled_recheck(); - return self::$last_comment; + return $commentdata; } public static function get_last_comment() { @@ -547,6 +551,7 @@ class Akismet { if ( get_option( 'akismet_alert_code' ) || $status == 'invalid' ) { // since there is currently a problem with the key, reschedule a check for 6 hours hence wp_schedule_single_event( time() + 21600, 'akismet_schedule_cron_recheck' ); + do_action( 'akismet_scheduled_recheck', 'key-problem-' . get_option( 'akismet_alert_code' ) . '-' . $status ); return false; } @@ -608,6 +613,7 @@ class Akismet { delete_comment_meta( $comment_id, 'akismet_rechecking' ); wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); + do_action( 'akismet_scheduled_recheck', 'check-db-comment-' . $status ); return; } delete_comment_meta( $comment_id, 'akismet_rechecking' ); @@ -616,6 +622,7 @@ class Akismet { $remaining = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->commentmeta} WHERE meta_key = 'akismet_error'" ); if ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) { wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); + do_action( 'akismet_scheduled_recheck', 'remaining' ); } } @@ -633,6 +640,7 @@ class Akismet { if ( $future_check > $check_range ) { wp_clear_scheduled_hook( 'akismet_schedule_cron_recheck' ); wp_schedule_single_event( time() + 300, 'akismet_schedule_cron_recheck' ); + do_action( 'akismet_scheduled_recheck', 'fix-scheduled-recheck' ); } } @@ -809,11 +817,71 @@ class Akismet { 'timeout' => 15 ); - $akismet_url = "http://{$http_host}/1.1/{$path}"; + $akismet_url = $http_akismet_url = "http://{$http_host}/1.1/{$path}"; + + /** + * Try SSL first; if that fails, try without it and don't try it again for a while. + */ + + $ssl = $ssl_failed = false; + + // Check if SSL requests were disabled fewer than X hours ago. + $ssl_disabled = get_option( 'akismet_ssl_disabled' ); + + if ( $ssl_disabled && $ssl_disabled < ( time() - 60 * 60 * 24 ) ) { // 24 hours + $ssl_disabled = false; + delete_option( 'akismet_ssl_disabled' ); + } + else if ( $ssl_disabled ) { + do_action( 'akismet_ssl_disabled' ); + } + + if ( ! $ssl_disabled && function_exists( 'wp_http_supports') && ( $ssl = wp_http_supports( array( 'ssl' ) ) ) ) { + $akismet_url = set_url_scheme( $akismet_url, 'https' ); + + do_action( 'akismet_https_request_pre' ); + } + $response = wp_remote_post( $akismet_url, $http_args ); + Akismet::log( compact( 'akismet_url', 'http_args', 'response' ) ); - if ( is_wp_error( $response ) ) + + if ( $ssl && is_wp_error( $response ) ) { + do_action( 'akismet_https_request_failure', $response ); + + // Intermittent connection problems may cause the first HTTPS + // request to fail and subsequent HTTP requests to succeed randomly. + // Retry the HTTPS request once before disabling SSL for a time. + $response = wp_remote_post( $akismet_url, $http_args ); + + Akismet::log( compact( 'akismet_url', 'http_args', 'response' ) ); + + if ( is_wp_error( $response ) ) { + $ssl_failed = true; + + do_action( 'akismet_https_request_failure', $response ); + + do_action( 'akismet_http_request_pre' ); + + // Try the request again without SSL. + $response = wp_remote_post( $http_akismet_url, $http_args ); + + Akismet::log( compact( 'http_akismet_url', 'http_args', 'response' ) ); + } + } + + if ( is_wp_error( $response ) ) { + do_action( 'akismet_request_failure', $response ); + return array( '', '' ); + } + + if ( $ssl_failed ) { + // The request failed when using SSL but succeeded without it. Disable SSL for future requests. + update_option( 'akismet_ssl_disabled', time() ); + + do_action( 'akismet_https_disabled' ); + } return array( $response['headers'], $response['body'] ); } @@ -956,4 +1024,65 @@ p { error_log( print_r( compact( 'akismet_debug' ), true ) ); } } + + public static function pre_check_pingback( $method ) { + if ( $method !== 'pingback.ping' ) + return; + + global $wp_xmlrpc_server; + + if ( !is_object( $wp_xmlrpc_server ) ) + return false; + + // Lame: tightly coupled with the IXR class. + $args = $wp_xmlrpc_server->message->params; + + if ( !empty( $args[1] ) ) { + $post_id = url_to_postid( $args[1] ); + + // If this gets through the pre-check, make sure we properly identify the outbound request as a pingback verification + Akismet::pingback_forwarded_for( null, $args[0] ); + add_filter( 'http_request_args', array( 'Akismet', 'pingback_forwarded_for' ), 10, 2 ); + + $comment = array( + 'comment_author_url' => $args[0], + 'comment_post_ID' => $post_id, + 'comment_author' => '', + 'comment_author_email' => '', + 'comment_content' => '', + 'comment_type' => 'pingback', + 'akismet_pre_check' => '1', + 'comment_pingback_target' => $args[1], + ); + + $comment = Akismet::auto_check_comment( $comment ); + + if ( isset( $comment['akismet_result'] ) && 'true' == $comment['akismet_result'] ) { + // Lame: tightly coupled with the IXR classes. Unfortunately the action provides no context and no way to return anything. + $wp_xmlrpc_server->error( new IXR_Error( 0, 'Invalid discovery target' ) ); + } + } + } + + public static function pingback_forwarded_for( $r, $url ) { + static $urls = array(); + + // Call this with $r == null to prime the callback to add headers on a specific URL + if ( is_null( $r ) && !in_array( $url, $urls ) ) { + $urls[] = $url; + } + + // Add X-Pingback-Forwarded-For header, but only for requests to a specific URL (the apparent pingback source) + if ( is_array( $r ) && is_array( $r['headers'] ) && !isset( $r['headers']['X-Pingback-Forwarded-For'] ) && in_array( $url, $urls ) ) { + $remote_ip = preg_replace( '/[^a-fx0-9:.,]/i', '', $_SERVER['REMOTE_ADDR'] ); + + // Note: this assumes REMOTE_ADDR is correct, and it may not be if a reverse proxy or CDN is in use + $r['headers']['X-Pingback-Forwarded-For'] = $remote_ip; + + // Also identify the request as a pingback verification in the UA string so it appears in logs + $r['user-agent'] .= '; verifying pingback from ' . $remote_ip; + } + + return $r; + } } \ No newline at end of file diff --git a/wp-content/plugins/akismet/readme.txt b/wp-content/plugins/akismet/readme.txt index beed79bb9..4efc81ffc 100644 --- a/wp-content/plugins/akismet/readme.txt +++ b/wp-content/plugins/akismet/readme.txt @@ -1,9 +1,9 @@ === Akismet === Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, eoigal, cfinke, automattic, jgs Tags: akismet, comments, spam -Requires at least: 3.1 -Tested up to: 4.1 -Stable tag: 3.0.4 +Requires at least: 3.2 +Tested up to: 4.1.1 +Stable tag: 3.1.1 License: GPLv2 or later Akismet checks your comments against the Akismet Web service to see if they look like spam or not. @@ -30,6 +30,18 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co == Changelog == += 3.1.1 = +*Release Date - 17th March, 2015* + +* Improvements to the "Remove comment author URL" JavaScript +* Include the pingback pre-check from the 2.6 branch. + += 3.1 = +*Release Date - 11th March, 2015* + +* Use HTTPS by default for all requests to Akismet. +* Fix for a situation where Akismet might strip HTML from a comment. + = 3.0.4 = *Release Date - 11th December, 2014* diff --git a/wp-content/plugins/akismet/views/config.php b/wp-content/plugins/akismet/views/config.php index 154f2b2c0..232d10789 100644 --- a/wp-content/plugins/akismet/views/config.php +++ b/wp-content/plugins/akismet/views/config.php @@ -64,13 +64,43 @@ <tbody> <?php if ( !defined( 'WPCOM_API_KEY' ) ):?> <tr> - <th width="10%" align="left" scope="row"><?php esc_html_e('API Key', 'akismet');?></th> + <th class="akismet-api-key" width="10%" align="left" scope="row"><?php esc_html_e('API Key', 'akismet');?></th> <td width="5%"/> <td align="left"> <span class="api-key"><input id="key" name="key" type="text" size="15" maxlength="12" value="<?php echo esc_attr( get_option('wordpress_api_key') ); ?>" class="regular-text code <?php echo $akismet_user->status;?>"></span> </td> </tr> <?php endif; ?> + <?php if ( isset( $_GET['ssl_status'] ) ) { ?> + <tr> + <th align="left" scope="row"><?php esc_html_e( 'SSL Status', 'akismet' ); ?></th> + <td></td> + <td align="left"> + <p> + <?php + + if ( ! function_exists( 'wp_http_supports' ) ) { + ?><b><?php esc_html_e( 'Disabled.', 'akismet' ); ?></b> <?php printf( esc_html( 'Your WordPress installation does not include the function %s; upgrade to the latest version of WordPress.', 'akismet' ), '<code>wp_http_supports</code>' ); ?><?php + } + else if ( ! wp_http_supports( array( 'ssl' ) ) ) { + ?><b><?php esc_html_e( 'Disabled.', 'akismet' ); ?></b> <?php esc_html_e( 'Your Web server cannot make SSL requests; contact your Web host and ask them to add support for SSL requests.', 'akismet' ); ?><?php + } + else { + $ssl_disabled = get_option( 'akismet_ssl_disabled' ); + + if ( $ssl_disabled ) { + ?><b><?php esc_html_e( 'Temporarily disabled.', 'akismet' ); ?></b> <?php esc_html_e( 'Akismet encountered a problem with a previous SSL request and disabled it temporarily. It will begin using SSL for requests again shortly.', 'akismet' ); ?><?php + } + else { + ?><b><?php esc_html_e( 'Enabled.', 'akismet' ); ?></b> <?php esc_html_e( 'All systems functional.', 'akismet' ); ?><?php + } + } + + ?> + </p> + </td> + </tr> + <?php } ?> <tr> <th align="left" scope="row"><?php esc_html_e('Comments', 'akismet');?></th> <td></td> @@ -95,7 +125,7 @@ printf( _n( - 'Spam in the <a href="%s">spam folder</a> older than 1 day is deleted automatically.', + 'Spam in the <a href="%1$s">spam folder</a> older than 1 day is deleted automatically.', 'Spam in the <a href="%1$s">spam folder</a> older than %2$d days is deleted automatically.', $delete_interval, 'akismet' diff --git a/wp-content/plugins/akismet/views/notice.php b/wp-content/plugins/akismet/views/notice.php index 60f2e8ce0..c2fc45afa 100644 --- a/wp-content/plugins/akismet/views/notice.php +++ b/wp-content/plugins/akismet/views/notice.php @@ -93,7 +93,7 @@ <div class="wrap alert critical"> <?php if ( $level == 'yellow' ): ?> <h3 class="key-status failed"><?php esc_html_e("You're using your Akismet key on more sites than your Pro subscription allows.", 'akismet'); ?></h3> - <p class="description"><?php printf( __('If you would like to use Akismet on more than 10 sites, you will need to <a href="%s" target="_blank">upgrade to an Enterprise subscription</a>. If you have any questions, please <a href="%s" target="_blank">get in touch with our support team</a>', 'akismet'), 'https://akismet.com/account/upgrade/', 'https://akismet.com/contact/'); ?></p> + <p class="description"><?php printf( __('Your Pro subscription allows the use of Akismet on only one site. Please <a href="http://docs.akismet.com/billing/add-more-sites/">purchase additional Pro subscriptions</a> or upgrade to an Enterprise subscription that allows the use of Akismet on unlimited sites.<br /><br />If you have any questions, please get in touch with our support team.', 'akismet'), 'https://akismet.com/account/upgrade/', 'https://akismet.com/contact/'); ?></p> <?php elseif ( $level == 'red' ): ?> <h3 class="key-status failed"><?php esc_html_e("You're using Akismet on far too many sites for your Pro subscription.", 'akismet'); ?></h3> <p class="description"><?php printf( __('To continue your service, <a href="%s" target="_blank">upgrade to an Enterprise subscription</a>, which covers an unlimited number of sites. Please <a href="%s" target="_blank">contact our support team</a> with any questions.', 'akismet'), 'https://akismet.com/account/upgrade/', 'https://akismet.com/contact/'); ?></p> diff --git a/wp-content/plugins/akismet/wrapper.php b/wp-content/plugins/akismet/wrapper.php index 12641c7ec..a77d4ce93 100644 --- a/wp-content/plugins/akismet/wrapper.php +++ b/wp-content/plugins/akismet/wrapper.php @@ -7,46 +7,32 @@ $akismet_api_host = Akismet::get_api_key() . '.rest.akismet.com'; $akismet_api_port = 80; function akismet_test_mode() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::is_test_mode()' ); - return Akismet::is_test_mode(); } function akismet_http_post( $request, $host, $path, $port = 80, $ip = null ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::http_post()' ); - $path = str_replace( '/1.1/', '', $path ); return Akismet::http_post( $request, $path, $ip ); } function akismet_microtime() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::_get_microtime()' ); - return Akismet::_get_microtime(); } function akismet_delete_old() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::delete_old_comments()' ); - return Akismet::delete_old_comments(); } function akismet_delete_old_metadata() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::delete_old_comments_meta()' ); - return Akismet::delete_old_comments_meta(); } function akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::check_db_comment()' ); - return Akismet::check_db_comment( $id, $recheck_reason ); } function akismet_rightnow() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::rightnow_stats()' ); - if ( !class_exists( 'Akismet_Admin' ) ) return false; @@ -63,13 +49,9 @@ function akismet_load_js_and_css() { _deprecated_function( __FUNCTION__, '3.0' ); } function akismet_nonce_field( $action = -1 ) { - _deprecated_function( __FUNCTION__, '3.0', 'wp_nonce_field' ); - return wp_nonce_field( $action ); } function akismet_plugin_action_links( $links, $file ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::plugin_action_links()' ); - return Akismet_Admin::plugin_action_links( $links, $file ); } function akismet_conf() { @@ -79,21 +61,15 @@ function akismet_stats_display() { _deprecated_function( __FUNCTION__, '3.0' ); } function akismet_stats() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::dashboard_stats()' ); - return Akismet_Admin::dashboard_stats(); } function akismet_admin_warnings() { _deprecated_function( __FUNCTION__, '3.0' ); } function akismet_comment_row_action( $a, $comment ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::comment_row_action()' ); - return Akismet_Admin::comment_row_actions( $a, $comment ); } function akismet_comment_status_meta_box( $comment ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::comment_status_meta_box()' ); - return Akismet_Admin::comment_status_meta_box( $comment ); } function akismet_comments_columns( $columns ) { @@ -105,63 +81,39 @@ function akismet_comment_column_row( $column, $comment_id ) { _deprecated_function( __FUNCTION__, '3.0' ); } function akismet_text_add_link_callback( $m ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::text_add_link_callback()' ); - return Akismet_Admin::text_add_link_callback( $m ); } function akismet_text_add_link_class( $comment_text ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::text_add_link_class()' ); - return Akismet_Admin::text_add_link_class( $comment_text ); } function akismet_check_for_spam_button( $comment_status ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::check_for_spam_button()' ); - return Akismet_Admin::check_for_spam_button( $comment_status ); } function akismet_submit_nonspam_comment( $comment_id ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::submit_nonspam_comment()' ); - return Akismet::submit_nonspam_comment( $comment_id ); } function akismet_submit_spam_comment( $comment_id ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::submit_spam_comment()' ); - return Akismet::submit_spam_comment( $comment_id ); } function akismet_transition_comment_status( $new_status, $old_status, $comment ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::transition_comment_status()' ); - return Akismet::transition_comment_status( $new_status, $old_status, $comment ); } function akismet_spam_count( $type = false ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::get_spam_count()' ); - return Akismet_Admin::get_spam_count( $type ); } function akismet_recheck_queue() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::recheck_queue()' ); - return Akismet_Admin::recheck_queue(); } function akismet_remove_comment_author_url() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::remove_comment_author_url()' ); - return Akismet_Admin::remove_comment_author_url(); } function akismet_add_comment_author_url() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::add_comment_author_url()' ); - return Akismet_Admin::add_comment_author_url(); } function akismet_check_server_connectivity() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::check_server_connectivity()' ); - return Akismet_Admin::check_server_connectivity(); } function akismet_get_server_connectivity( $cache_timeout = 86400 ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::()' ); - return Akismet_Admin::get_server_connectivity( $cache_timeout ); } function akismet_server_connectivity_ok() { @@ -170,101 +122,63 @@ function akismet_server_connectivity_ok() { return true; } function akismet_admin_menu() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::admin_menu()' ); - return Akismet_Admin::admin_menu(); } function akismet_load_menu() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::load_menu()' ); - return Akismet_Admin::load_menu(); } function akismet_init() { _deprecated_function( __FUNCTION__, '3.0' ); } function akismet_get_key() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_api_key()' ); - return Akismet::get_api_key(); } function akismet_check_key_status( $key, $ip = null ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::check_key_status()' ); - return Akismet::check_key_status( $key, $ip ); } function akismet_update_alert( $response ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::update_alert()' ); - return Akismet::update_alert( $response ); } function akismet_verify_key( $key, $ip = null ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::verify_key()' ); - return Akismet::verify_key( $key, $ip ); } function akismet_get_user_roles( $user_id ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_user_roles()' ); - return Akismet::get_user_roles( $user_id ); } function akismet_result_spam( $approved ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::comment_is_spam()' ); - return Akismet::comment_is_spam( $approved ); } function akismet_result_hold( $approved ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::comment_needs_moderation()' ); - return Akismet::comment_needs_moderation( $approved ); } function akismet_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_user_comments_approved()' ); - return Akismet::get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ); } function akismet_update_comment_history( $comment_id, $message, $event = null ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::update_comment_history()' ); - return Akismet::update_comment_history( $comment_id, $message, $event ); } function akismet_get_comment_history( $comment_id ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_comment_history()' ); - return Akismet::get_comment_history( $comment_id ); } function akismet_cmp_time( $a, $b ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::_cmp_time()' ); - return Akismet::_cmp_time( $a, $b ); } function akismet_auto_check_update_meta( $id, $comment ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::auto_check_update_meta()' ); - return Akismet::auto_check_update_meta( $id, $comment ); } function akismet_auto_check_comment( $commentdata ) { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::auto_check_comment()' ); - return Akismet::auto_check_comment( $commentdata ); } function akismet_get_ip_address() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_ip_address()' ); - return Akismet::get_ip_address(); } function akismet_cron_recheck() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::cron_recheck()' ); - return Akismet::cron_recheck(); } function akismet_add_comment_nonce() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::add_comment_nonce()' ); - return Akismet::add_comment_nonce( $post_id ); } function akismet_fix_scheduled_recheck() { - _deprecated_function( __FUNCTION__, '3.0', 'Akismet::fix_scheduled_recheck()' ); - return Akismet::fix_scheduled_recheck(); } function akismet_spam_comments() { @@ -290,4 +204,10 @@ function akismet_kill_proxy_check( $option ) { _deprecated_function( __FUNCTION__, '3.0' ); return 0; +} +function akismet_pingback_forwarded_for( $r, $url ) { + return Akismet::pingback_forwarded_for( $r, $url ); +} +function akismet_pre_check_pingback( $method ) { + return Akismet::pre_check_pingback( $method ); } \ No newline at end of file diff --git a/wp-includes/capabilities.php b/wp-includes/capabilities.php index 894a149e3..bdb5c7a2d 100644 --- a/wp-includes/capabilities.php +++ b/wp-includes/capabilities.php @@ -1374,21 +1374,25 @@ function current_user_can( $capability ) { * @return bool */ function current_user_can_for_blog( $blog_id, $capability ) { - if ( is_multisite() ) - switch_to_blog( $blog_id ); + $switched = is_multisite() ? switch_to_blog( $blog_id ) : false; $current_user = wp_get_current_user(); - if ( empty( $current_user ) ) + if ( empty( $current_user ) ) { + if ( $switched ) { + restore_current_blog(); + } return false; + } $args = array_slice( func_get_args(), 2 ); $args = array_merge( array( $capability ), $args ); $can = call_user_func_array( array( $current_user, 'has_cap' ), $args ); - if ( is_multisite() ) + if ( $switched ) { restore_current_blog(); + } return $can; } diff --git a/wp-includes/class-wp-editor.php b/wp-includes/class-wp-editor.php index 521c0ee67..6148583d0 100644 --- a/wp-includes/class-wp-editor.php +++ b/wp-includes/class-wp-editor.php @@ -117,12 +117,6 @@ final class _WP_Editors { // A cookie (set when a user resizes the editor) overrides the height. $cookie = (int) get_user_setting( 'ed_size' ); - // Upgrade an old TinyMCE cookie if it is still around, and the new one isn't. - if ( ! $cookie && isset( $_COOKIE['TinyMCE_content_size'] ) ) { - parse_str( $_COOKIE['TinyMCE_content_size'], $cookie ); - $cookie = $cookie['ch']; - } - if ( $cookie ) $set['editor_height'] = $cookie; } diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php index 3d4d1f20c..7bd354afe 100644 --- a/wp-includes/formatting.php +++ b/wp-includes/formatting.php @@ -1309,21 +1309,23 @@ function sanitize_title_with_dashes( $title, $raw_title = '', $context = 'displa } /** - * Ensures a string is a valid SQL order by clause. + * Ensures a string is a valid SQL 'order by' clause. * - * Accepts one or more columns, with or without ASC/DESC, and also accepts - * RAND(). + * Accepts one or more columns, with or without a sort order (ASC / DESC). + * e.g. 'column_1', 'column_1, column_2', 'column_1 ASC, column_2 DESC' etc. + * + * Also accepts 'RAND()'. * * @since 2.5.1 * - * @param string $orderby Order by string to be checked. - * @return false|string Returns the order by clause if it is a match, false otherwise. + * @param string $orderby Order by clause to be validated. + * @return string|bool Returns $orderby if valid, false otherwise. */ -function sanitize_sql_orderby( $orderby ){ - preg_match('/^\s*([a-z0-9_]+(\s+(ASC|DESC))?(\s*,\s*|\s*$))+|^\s*RAND\(\s*\)\s*$/i', $orderby, $obmatches); - if ( !$obmatches ) - return false; - return $orderby; +function sanitize_sql_orderby( $orderby ) { + if ( preg_match( '/^\s*(([a-z0-9_]+|`[a-z0-9_]+`)(\s+(ASC|DESC))?\s*(,\s*(?=[a-z0-9_`])|$))+$/i', $orderby ) || preg_match( '/^\s*RAND\(\s*\)\s*$/i', $orderby ) ) { + return $orderby; + } + return false; } /** diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 76013c934..d903349cf 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -2049,7 +2049,7 @@ function wp_check_filetype( $filename, $mimes = null ) { $ext = false; foreach ( $mimes as $ext_preg => $mime_match ) { - $ext_preg = '!\.(' . $ext_preg . ')(\?.*)?$!i'; + $ext_preg = '!\.(' . $ext_preg . ')$!i'; if ( preg_match( $ext_preg, $filename, $ext_matches ) ) { $type = $mime_match; $ext = $ext_matches[1]; diff --git a/wp-includes/js/plupload/plupload.flash.swf b/wp-includes/js/plupload/plupload.flash.swf index 6493572bdf005ad7765d58f79f2ef65660fba931..47a83cea7f498765155b407c891ce6c501a6b220 100644 GIT binary patch literal 29577 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 T-{<#rm5B*#E&sT+a>~^JT=KV+ literal 28902 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 J85CosB>>=IOBnzF diff --git a/wp-includes/version.php b/wp-includes/version.php index 4a10c0b57..b3bb8584a 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.1.1'; +$wp_version = '4.1.3'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php index 1656df7be..b3eed896e 100644 --- a/wp-includes/wp-db.php +++ b/wp-includes/wp-db.php @@ -143,6 +143,43 @@ class wpdb { */ protected $result; + /** + * Cached column info, for sanity checking data before inserting + * + * @since 4.2.0 + * @access protected + * @var array + */ + protected $col_meta = array(); + + /** + * Calculated character sets on tables + * + * @since 4.2.0 + * @access protected + * @var array + */ + protected $table_charset = array(); + + /** + * Whether text fields in the current query need to be sanity checked. + * + * @since 4.2.0 + * @access protected + * @var bool + */ + protected $check_current_query = true; + + /** + * Flag to ensure we don't run into recursion problems when checking the collation. + * + * @since 4.2.0 + * @access private + * @see wpdb::check_safe_collation() + * @var boolean + */ + private $checking_collation = false; + /** * Saved info on the table column * @@ -647,6 +684,14 @@ class wpdb { * @param mixed $value The value to set */ public function __set( $name, $value ) { + $protected_members = array( + 'col_meta', + 'table_charset', + 'check_current_query', + ); + if ( in_array( $name, $protected_members, true ) ) { + return; + } $this->$name = $value; } @@ -716,7 +761,7 @@ class wpdb { $query = $this->prepare( 'SET NAMES %s', $charset ); if ( ! empty( $collate ) ) $query .= $this->prepare( ' COLLATE %s', $collate ); - mysqli_query( $query, $dbh ); + mysqli_query( $dbh, $query ); } } else { if ( function_exists( 'mysql_set_charset' ) && $this->has_cap( 'set_charset' ) ) { @@ -1541,6 +1586,7 @@ class wpdb { */ public function query( $query ) { if ( ! $this->ready ) { + $this->check_current_query = true; return false; } @@ -1561,6 +1607,19 @@ class wpdb { // Log how the function was called $this->func_call = "\$db->query(\"$query\")"; + // If we're writing to the database, make sure the query will write safely. + if ( $this->check_current_query && ! $this->check_ascii( $query ) ) { + $stripped_query = $this->strip_invalid_text_from_query( $query ); + // strip_invalid_text_from_query() can perform queries, so we need + // to flush again, just to make sure everything is clear. + $this->flush(); + if ( $stripped_query !== $query ) { + $this->insert_id = 0; + return false; + } + } + + $this->check_current_query = true; // Keep track of the last query for debug.. $this->last_query = $query; @@ -1730,23 +1789,29 @@ class wpdb { * @return int|false The number of rows affected, or false on error. */ function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) { - if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) + if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) { + return false; + } + + $data = $this->process_fields( $table, $data, $format ); + if ( false === $data ) { return false; - $this->insert_id = 0; - $formats = $format = (array) $format; - $fields = array_keys( $data ); - $formatted_fields = array(); - foreach ( $fields as $field ) { - if ( !empty( $format ) ) - $form = ( $form = array_shift( $formats ) ) ? $form : $format[0]; - elseif ( isset( $this->field_types[$field] ) ) - $form = $this->field_types[$field]; - else - $form = '%s'; - $formatted_fields[] = $form; } - $sql = "{$type} INTO `$table` (`" . implode( '`,`', $fields ) . "`) VALUES (" . implode( ",", $formatted_fields ) . ")"; - return $this->query( $this->prepare( $sql, $data ) ); + + $formats = $values = array(); + foreach ( $data as $value ) { + $formats[] = $value['format']; + $values[] = $value['value']; + } + + $fields = '`' . implode( '`, `', array_keys( $data ) ) . '`'; + $formats = implode( ', ', $formats ); + + $sql = "$type INTO `$table` ($fields) VALUES ($formats)"; + + $this->insert_id = 0; + $this->check_current_query = false; + return $this->query( $this->prepare( $sql, $values ) ); } /** @@ -1769,34 +1834,36 @@ class wpdb { * @return int|false The number of rows updated, or false on error. */ public function update( $table, $data, $where, $format = null, $where_format = null ) { - if ( ! is_array( $data ) || ! is_array( $where ) ) + if ( ! is_array( $data ) || ! is_array( $where ) ) { return false; + } - $formats = $format = (array) $format; - $bits = $wheres = array(); - foreach ( (array) array_keys( $data ) as $field ) { - if ( !empty( $format ) ) - $form = ( $form = array_shift( $formats ) ) ? $form : $format[0]; - elseif ( isset($this->field_types[$field]) ) - $form = $this->field_types[$field]; - else - $form = '%s'; - $bits[] = "`$field` = {$form}"; + $data = $this->process_fields( $table, $data, $format ); + if ( false === $data ) { + return false; + } + $where = $this->process_fields( $table, $where, $where_format ); + if ( false === $where ) { + return false; } - $where_formats = $where_format = (array) $where_format; - foreach ( (array) array_keys( $where ) as $field ) { - if ( !empty( $where_format ) ) - $form = ( $form = array_shift( $where_formats ) ) ? $form : $where_format[0]; - elseif ( isset( $this->field_types[$field] ) ) - $form = $this->field_types[$field]; - else - $form = '%s'; - $wheres[] = "`$field` = {$form}"; + $fields = $conditions = $values = array(); + foreach ( $data as $field => $value ) { + $fields[] = "`$field` = " . $value['format']; + $values[] = $value['value']; } + foreach ( $where as $field => $value ) { + $conditions[] = "`$field` = " . $value['format']; + $values[] = $value['value']; + } + + $fields = implode( ', ', $fields ); + $conditions = implode( ' AND ', $conditions ); - $sql = "UPDATE `$table` SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres ); - return $this->query( $this->prepare( $sql, array_merge( array_values( $data ), array_values( $where ) ) ) ); + $sql = "UPDATE `$table` SET $fields WHERE $conditions"; + + $this->check_current_query = false; + return $this->query( $this->prepare( $sql, $values ) ); } /** @@ -1816,27 +1883,132 @@ class wpdb { * @return int|false The number of rows updated, or false on error. */ public function delete( $table, $where, $where_format = null ) { - if ( ! is_array( $where ) ) + if ( ! is_array( $where ) ) { + return false; + } + + $where = $this->process_fields( $table, $where, $where_format ); + if ( false === $where ) { + return false; + } + + $conditions = $values = array(); + foreach ( $where as $field => $value ) { + $conditions[] = "`$field` = " . $value['format']; + $values[] = $value['value']; + } + + $conditions = implode( ' AND ', $conditions ); + + $sql = "DELETE FROM `$table` WHERE $conditions"; + + $this->check_current_query = false; + return $this->query( $this->prepare( $sql, $values ) ); + } + + /** + * Processes arrays of field/value pairs and field formats. + * + * This is a helper method for wpdb's CRUD methods, which take field/value + * pairs for inserts, updates, and where clauses. This method first pairs + * each value with a format. Then it determines the charset of that field, + * using that to determine if any invalid text would be stripped. If text is + * stripped, then field processing is rejected and the query fails. + * + * @since 4.2.0 + * @access protected + * + * @param string $table Table name. + * @param array $data Field/value pair. + * @param mixed $format Format for each field. + * @return array|bool Returns an array of fields that contain paired values + * and formats. Returns false for invalid values. + */ + protected function process_fields( $table, $data, $format ) { + $data = $this->process_field_formats( $data, $format ); + $data = $this->process_field_charsets( $data, $table ); + if ( false === $data ) { return false; + } - $wheres = array(); + $converted_data = $this->strip_invalid_text( $data ); - $where_formats = $where_format = (array) $where_format; + if ( $data !== $converted_data ) { + return false; + } - foreach ( array_keys( $where ) as $field ) { - if ( !empty( $where_format ) ) { - $form = ( $form = array_shift( $where_formats ) ) ? $form : $where_format[0]; + return $data; + } + + /** + * Prepares arrays of value/format pairs as passed to wpdb CRUD methods. + * + * @since 4.2.0 + * @access protected + * + * @param array $data Array of fields to values. + * @param mixed $format Formats to be mapped to the values in $data. + * @return array Array, keyed by field names with values being an array + * of 'value' and 'format' keys. + */ + protected function process_field_formats( $data, $format ) { + $formats = $original_formats = (array) $format; + + foreach ( $data as $field => $value ) { + $value = array( + 'value' => $value, + 'format' => '%s', + ); + + if ( ! empty( $format ) ) { + $value['format'] = array_shift( $formats ); + if ( ! $value['format'] ) { + $value['format'] = reset( $original_formats ); + } } elseif ( isset( $this->field_types[ $field ] ) ) { - $form = $this->field_types[ $field ]; + $value['format'] = $this->field_types[ $field ]; + } + + $data[ $field ] = $value; + } + + return $data; + } + + /** + * Adds field charsets to field/value/format arrays generated by + * the {@see wpdb::process_field_formats()} method. + * + * @since 4.2.0 + * @access protected + * + * @param array $data As it comes from the {@see wpdb::process_field_formats()} method. + * @param string $table Table name. + * @return The same array as $data with additional 'charset' keys. + */ + protected function process_field_charsets( $data, $table ) { + foreach ( $data as $field => $value ) { + if ( '%d' === $value['format'] || '%f' === $value['format'] ) { + // We can skip this field if we know it isn't a string. + // This checks %d/%f versus ! %s because it's sprintf() could take more. + $value['charset'] = false; + } elseif ( $this->check_ascii( $value['value'] ) ) { + // If it's ASCII, then we don't need the charset. We can skip this field. + $value['charset'] = false; } else { - $form = '%s'; + $value['charset'] = $this->get_col_charset( $table, $field ); + if ( is_wp_error( $value['charset'] ) ) { + return false; + } + + // This isn't ASCII. Don't have strip_invalid_text() re-check. + $value['ascii'] = false; } - $wheres[] = "$field = $form"; + $data[ $field ] = $value; } - $sql = "DELETE FROM $table WHERE " . implode( ' AND ', $wheres ); - return $this->query( $this->prepare( $sql, $where ) ); + return $data; } /** @@ -1856,6 +2028,10 @@ class wpdb { public function get_var( $query = null, $x = 0, $y = 0 ) { $this->func_call = "\$db->get_var(\"$query\", $x, $y)"; + if ( $this->check_safe_collation( $query ) ) { + $this->check_current_query = false; + } + if ( $query ) { $this->query( $query ); } @@ -1884,6 +2060,11 @@ class wpdb { */ public function get_row( $query = null, $output = OBJECT, $y = 0 ) { $this->func_call = "\$db->get_row(\"$query\",$output,$y)"; + + if ( $this->check_safe_collation( $query ) ) { + $this->check_current_query = false; + } + if ( $query ) { $this->query( $query ); } else { @@ -1921,6 +2102,10 @@ class wpdb { * @return array Database query result. Array indexed from 0 by SQL result row number. */ public function get_col( $query = null , $x = 0 ) { + if ( $this->check_safe_collation( $query ) ) { + $this->check_current_query = false; + } + if ( $query ) { $this->query( $query ); } @@ -1949,6 +2134,10 @@ class wpdb { public function get_results( $query = null, $output = OBJECT ) { $this->func_call = "\$db->get_results(\"$query\", $output)"; + if ( $this->check_safe_collation( $query ) ) { + $this->check_current_query = false; + } + if ( $query ) { $this->query( $query ); } else { @@ -1990,6 +2179,527 @@ class wpdb { return null; } + /** + * Retrieves the character set for the given table. + * + * @since 4.2.0 + * @access protected + * + * @param string $table Table name. + * @return string|WP_Error Table character set, {@see WP_Error} object if it couldn't be found. + */ + protected function get_table_charset( $table ) { + $tablekey = strtolower( $table ); + + /** + * Filter the table charset value before the DB is checked. + * + * Passing a non-null value to the filter will effectively short-circuit + * checking the DB for the charset, returning that value instead. + * + * @since 4.2.0 + * + * @param string $charset The character set to use. Default null. + * @param string $table The name of the table being checked. + */ + $charset = apply_filters( 'pre_get_table_charset', null, $table ); + if ( null !== $charset ) { + return $charset; + } + + if ( isset( $this->table_charset[ $tablekey ] ) ) { + return $this->table_charset[ $tablekey ]; + } + + $charsets = $columns = array(); + $results = $this->get_results( "SHOW FULL COLUMNS FROM `$table`" ); + if ( ! $results ) { + return new WP_Error( 'wpdb_get_table_charset_failure' ); + } + + foreach ( $results as $column ) { + $columns[ strtolower( $column->Field ) ] = $column; + } + + $this->col_meta[ $tablekey ] = $columns; + + foreach ( $columns as $column ) { + if ( ! empty( $column->Collation ) ) { + list( $charset ) = explode( '_', $column->Collation ); + $charsets[ strtolower( $charset ) ] = true; + } + + list( $type ) = explode( '(', $column->Type ); + + // A binary/blob means the whole query gets treated like this. + if ( in_array( strtoupper( $type ), array( 'BINARY', 'VARBINARY', 'TINYBLOB', 'MEDIUMBLOB', 'BLOB', 'LONGBLOB' ) ) ) { + $this->table_charset[ $tablekey ] = 'binary'; + return 'binary'; + } + } + + // utf8mb3 is an alias for utf8. + if ( isset( $charsets['utf8mb3'] ) ) { + $charsets['utf8'] = true; + unset( $charsets['utf8mb3'] ); + } + + // Check if we have more than one charset in play. + $count = count( $charsets ); + if ( 1 === $count ) { + $charset = key( $charsets ); + } elseif ( 0 === $count ) { + // No charsets, assume this table can store whatever. + $charset = false; + } else { + // More than one charset. Remove latin1 if present and recalculate. + unset( $charsets['latin1'] ); + $count = count( $charsets ); + if ( 1 === $count ) { + // Only one charset (besides latin1). + $charset = key( $charsets ); + } elseif ( 2 === $count && isset( $charsets['utf8'], $charsets['utf8mb4'] ) ) { + // Two charsets, but they're utf8 and utf8mb4, use utf8. + $charset = 'utf8'; + } else { + // Two mixed character sets. ascii. + $charset = 'ascii'; + } + } + + $this->table_charset[ $tablekey ] = $charset; + return $charset; + } + + /** + * Retrieves the character set for the given column. + * + * @since 4.2.0 + * @access public + * + * @param string $table Table name. + * @param string $column Column name. + * @return mixed Column character set as a string. False if the column has no + * character set. {@see WP_Error} object if there was an error. + */ + public function get_col_charset( $table, $column ) { + $tablekey = strtolower( $table ); + $columnkey = strtolower( $column ); + + /** + * Filter the column charset value before the DB is checked. + * + * Passing a non-null value to the filter will short-circuit + * checking the DB for the charset, returning that value instead. + * + * @since 4.2.0 + * + * @param string $charset The character set to use. Default null. + * @param string $table The name of the table being checked. + * @param string $column The name of the column being checked. + */ + $charset = apply_filters( 'pre_get_col_charset', null, $table, $column ); + if ( null !== $charset ) { + return $charset; + } + + // Skip this entirely if this isn't a MySQL database. + if ( false === $this->is_mysql ) { + return false; + } + + if ( empty( $this->table_charset[ $tablekey ] ) ) { + // This primes column information for us. + $table_charset = $this->get_table_charset( $table ); + if ( is_wp_error( $table_charset ) ) { + return $table_charset; + } + } + + // If still no column information, return the table charset. + if ( empty( $this->col_meta[ $tablekey ] ) ) { + return $this->table_charset[ $tablekey ]; + } + + // If this column doesn't exist, return the table charset. + if ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) { + return $this->table_charset[ $tablekey ]; + } + + // Return false when it's not a string column. + if ( empty( $this->col_meta[ $tablekey ][ $columnkey ]->Collation ) ) { + return false; + } + + list( $charset ) = explode( '_', $this->col_meta[ $tablekey ][ $columnkey ]->Collation ); + return $charset; + } + + /** + * Check if a string is ASCII. + * + * The negative regex is faster for non-ASCII strings, as it allows + * the search to finish as soon as it encounters a non-ASCII character. + * + * @since 4.2.0 + * @access protected + * + * @param string $string String to check. + * @return bool True if ASCII, false if not. + */ + protected function check_ascii( $string ) { + if ( function_exists( 'mb_check_encoding' ) ) { + if ( mb_check_encoding( $string, 'ASCII' ) ) { + return true; + } + } elseif ( ! preg_match( '/[^\x00-\x7F]/', $string ) ) { + return true; + } + + return false; + } + + /** + * Check if the query is accessing a collation considered safe on the current version of MySQL. + * + * @since 4.2.0 + * @access protected + * + * @param string $query The query to check. + * @return bool True if the collation is safe, false if it isn't. + */ + protected function check_safe_collation( $query ) { + if ( $this->checking_collation ) { + return true; + } + + // We don't need to check the collation for queries that don't read data. + $query = ltrim( $query, "\r\n\t (" ); + if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN)\s/i', $query ) ) { + return true; + } + + // All-ASCII queries don't need extra checking. + if ( $this->check_ascii( $query ) ) { + return true; + } + + $table = $this->get_table_from_query( $query ); + if ( ! $table ) { + return false; + } + + $this->checking_collation = true; + $collation = $this->get_table_charset( $table ); + $this->checking_collation = false; + + // Tables with no collation, or latin1 only, don't need extra checking. + if ( false === $collation || 'latin1' === $collation ) { + return true; + } + + $table = strtolower( $table ); + if ( empty( $this->col_meta[ $table ] ) ) { + return false; + } + + // If any of the columns don't have one of these collations, it needs more sanity checking. + foreach( $this->col_meta[ $table ] as $col ) { + if ( empty( $col->Collation ) ) { + continue; + } + + if ( ! in_array( $col->Collation, array( 'utf8_general_ci', 'utf8_bin', 'utf8mb4_general_ci', 'utf8mb4_bin' ), true ) ) { + return false; + } + } + + return true; + } + + /** + * Strips any invalid characters based on value/charset pairs. + * + * @since 4.2.0 + * @access protected + * + * @param array $data Array of value arrays. Each value array has the keys + * 'value' and 'charset'. An optional 'ascii' key can be + * set to false to avoid redundant ASCII checks. + * @return array|WP_Error The $data parameter, with invalid characters removed from + * each value. This works as a passthrough: any additional keys + * such as 'field' are retained in each value array. If we cannot + * remove invalid characters, a {@see WP_Error} object is returned. + */ + // If any of the columns don't have one of these collations, it needs more sanity checking. + protected function strip_invalid_text( $data ) { + // Some multibyte character sets that we can check in PHP. + $mb_charsets = array( + 'ascii' => 'ASCII', + 'big5' => 'BIG-5', + 'eucjpms' => 'eucJP-win', + 'gb2312' => 'EUC-CN', + 'ujis' => 'EUC-JP', + 'utf32' => 'UTF-32', + ); + + $supported_charsets = array(); + if ( function_exists( 'mb_list_encodings' ) ) { + $supported_charsets = mb_list_encodings(); + } + + $db_check_string = false; + + foreach ( $data as &$value ) { + $charset = $value['charset']; + + // Column isn't a string, or is latin1, which will will happily store anything. + if ( false === $charset || 'latin1' === $charset ) { + continue; + } + + if ( ! is_string( $value['value'] ) ) { + continue; + } + + // ASCII is always OK. + if ( ! isset( $value['ascii'] ) && $this->check_ascii( $value['value'] ) ) { + continue; + } + + // Convert the text locally. + if ( $supported_charsets ) { + if ( isset( $mb_charsets[ $charset ] ) && in_array( $mb_charsets[ $charset ], $supported_charsets ) ) { + $value['value'] = mb_convert_encoding( $value['value'], $mb_charsets[ $charset ], $mb_charsets[ $charset ] ); + continue; + } + } + + // utf8 can be handled by regex, which is a bunch faster than a DB lookup. + if ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) { + $regex = '/ + ( + (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx + | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx + | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 + | [\xE1-\xEC][\x80-\xBF]{2} + | \xED[\x80-\x9F][\x80-\xBF] + | [\xEE-\xEF][\x80-\xBF]{2}'; + + if ( 'utf8mb4' === $charset) { + $regex .= ' + | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 + | [\xF1-\xF3][\x80-\xBF]{3} + | \xF4[\x80-\x8F][\x80-\xBF]{2} + '; + } + + $regex .= '){1,50} # ...one or more times + ) + | . # anything else + /x'; + $value['value'] = preg_replace( $regex, '$1', $value['value'] ); + continue; + } + + // We couldn't use any local conversions, send it to the DB. + $value['db'] = $db_check_string = true; + } + unset( $value ); // Remove by reference. + + if ( $db_check_string ) { + $queries = array(); + foreach ( $data as $col => $value ) { + if ( ! empty( $value['db'] ) ) { + if ( ! isset( $queries[ $value['charset'] ] ) ) { + $queries[ $value['charset'] ] = array(); + } + + // Split the CONVERT() calls by charset, so we can make sure the connection is right + $queries[ $value['charset'] ][ $col ] = $this->prepare( "CONVERT( %s USING {$value['charset']} )", $value['value'] ); + unset( $data[ $col ]['db'] ); + } + } + + $connection_charset = $this->charset; + foreach ( $queries as $charset => $query ) { + if ( ! $query ) { + continue; + } + + // Change the charset to match the string(s) we're converting + if ( $charset !== $connection_charset ) { + $connection_charset = $charset; + $this->set_charset( $this->dbh, $charset ); + } + + $this->check_current_query = false; + + $row = $this->get_row( "SELECT " . implode( ', ', $query ), ARRAY_N ); + if ( ! $row ) { + $this->set_charset( $this->dbh, $connection_charset ); + return new WP_Error( 'wpdb_strip_invalid_text_failure' ); + } + + $cols = array_keys( $query ); + $col_count = count( $cols ); + for ( $ii = 0; $ii < $col_count; $ii++ ) { + $data[ $cols[ $ii ] ]['value'] = $row[ $ii ]; + } + } + + // Don't forget to change the charset back! + if ( $connection_charset !== $this->charset ) { + $this->set_charset( $this->dbh ); + } + } + + return $data; + } + + /** + * Strips any invalid characters from the query. + * + * @since 4.2.0 + * @access protected + * + * @param string $query Query to convert. + * @return string|WP_Error The converted query, or a {@see WP_Error} object if the conversion fails. + */ + protected function strip_invalid_text_from_query( $query ) { + $table = $this->get_table_from_query( $query ); + if ( $table ) { + $charset = $this->get_table_charset( $table ); + if ( is_wp_error( $charset ) ) { + return $charset; + } + + // We can't reliably strip text from tables containing binary/blob columns + if ( 'binary' === $charset ) { + return $query; + } + } else { + $charset = $this->charset; + } + + $data = array( + 'value' => $query, + 'charset' => $charset, + 'ascii' => false, + ); + + $data = $this->strip_invalid_text( array( $data ) ); + if ( is_wp_error( $data ) ) { + return $data; + } + + return $data[0]['value']; + } + + /** + * Strips any invalid characters from the string for a given table and column. + * + * @since 4.2.0 + * @access public + * + * @param string $table Table name. + * @param string $column Column name. + * @param string $value The text to check. + * @return string|WP_Error The converted string, or a `WP_Error` object if the conversion fails. + */ + public function strip_invalid_text_for_column( $table, $column, $value ) { + if ( ! is_string( $value ) || $this->check_ascii( $value ) ) { + return $value; + } + + $charset = $this->get_col_charset( $table, $column ); + if ( ! $charset ) { + // Not a string column. + return $value; + } elseif ( is_wp_error( $charset ) ) { + // Bail on real errors. + return $charset; + } + + $data = array( + $column => array( + 'value' => $value, + 'charset' => $charset, + 'ascii' => false, + ) + ); + + $data = $this->strip_invalid_text( $data ); + if ( is_wp_error( $data ) ) { + return $data; + } + + return $data[ $column ]['value']; + } + + /** + * Find the first table name referenced in a query. + * + * @since 4.2.0 + * @access protected + * + * @param string $query The query to search. + * @return string|false $table The table name found, or false if a table couldn't be found. + */ + protected function get_table_from_query( $query ) { + // Remove characters that can legally trail the table name. + $query = rtrim( $query, ';/-#' ); + + // Allow (select...) union [...] style queries. Use the first query's table name. + $query = ltrim( $query, "\r\n\t (" ); + + /* + * Strip everything between parentheses except nested selects and use only 1,000 + * chars of the query. + */ + $query = preg_replace( '/\((?!\s*select)[^(]*?\)/is', '()', substr( $query, 0, 1000 ) ); + + // Quickly match most common queries. + if ( preg_match( '/^\s*(?:' + . 'SELECT.*?\s+FROM' + . '|INSERT(?:\s+LOW_PRIORITY|\s+DELAYED|\s+HIGH_PRIORITY)?(?:\s+IGNORE)?(?:\s+INTO)?' + . '|REPLACE(?:\s+LOW_PRIORITY|\s+DELAYED)?(?:\s+INTO)?' + . '|UPDATE(?:\s+LOW_PRIORITY)?(?:\s+IGNORE)?' + . '|DELETE(?:\s+LOW_PRIORITY|\s+QUICK|\s+IGNORE)*(?:\s+FROM)?' + . ')\s+`?([\w-]+)`?/is', $query, $maybe ) ) { + return $maybe[1]; + } + + // SHOW TABLE STATUS and SHOW TABLES + if ( preg_match( '/^\s*(?:' + . 'SHOW\s+TABLE\s+STATUS.+(?:LIKE\s+|WHERE\s+Name\s*=\s*)' + . '|SHOW\s+(?:FULL\s+)?TABLES.+(?:LIKE\s+|WHERE\s+Name\s*=\s*)' + . ')\W([\w-]+)\W/is', $query, $maybe ) ) { + return $maybe[1]; + } + + // Big pattern for the rest of the table-related queries. + if ( preg_match( '/^\s*(?:' + . '(?:EXPLAIN\s+(?:EXTENDED\s+)?)?SELECT.*?\s+FROM' + . '|DESCRIBE|DESC|EXPLAIN|HANDLER' + . '|(?:LOCK|UNLOCK)\s+TABLE(?:S)?' + . '|(?:RENAME|OPTIMIZE|BACKUP|RESTORE|CHECK|CHECKSUM|ANALYZE|REPAIR).*\s+TABLE' + . '|TRUNCATE(?:\s+TABLE)?' + . '|CREATE(?:\s+TEMPORARY)?\s+TABLE(?:\s+IF\s+NOT\s+EXISTS)?' + . '|ALTER(?:\s+IGNORE)?\s+TABLE' + . '|DROP\s+TABLE(?:\s+IF\s+EXISTS)?' + . '|CREATE(?:\s+\w+)?\s+INDEX.*\s+ON' + . '|DROP\s+INDEX.*\s+ON' + . '|LOAD\s+DATA.*INFILE.*INTO\s+TABLE' + . '|(?:GRANT|REVOKE).*ON\s+TABLE' + . '|SHOW\s+(?:.*FROM|.*TABLE)' + . ')\s+\(*\s*`?([\w-]+)`?\s*\)*/is', $query, $maybe ) ) { + return $maybe[1]; + } + + return false; + } + /** * Load the column metadata from the last query. * -- GitLab