diff --git a/README.md b/README.md index 1c66fd5b..8aa62665 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.6.9](https://github.com/ultimatemember/ultimatemember/releases/tag/2.6.9). +[Official Release Version: 2.6.10](https://github.com/ultimatemember/ultimatemember/releases/tag/2.6.10). ## Changelog diff --git a/assets/js/um-modal.js b/assets/js/um-modal.js index 01e6fb4b..5708f467 100644 --- a/assets/js/um-modal.js +++ b/assets/js/um-modal.js @@ -1,10 +1,10 @@ jQuery(document).ready(function() { - + jQuery(document).on('click', '.um-popup-overlay', function(){ remove_Modal(); }); - + jQuery(document).on('click', '.um-modal-overlay, a[data-action="um_remove_modal"]', function(){ um_remove_modal(); }); @@ -13,7 +13,7 @@ jQuery(document).ready(function() { e.preventDefault(); return false; }); - + jQuery(document).on('click', '.um-modal .um-single-file-preview a.cancel', function(e){ e.preventDefault(); @@ -37,10 +37,10 @@ jQuery(document).ready(function() { um_modal_responsive(); } }); - + return false; }); - + jQuery(document).on('click', '.um-modal .um-single-image-preview a.cancel', function(e){ e.preventDefault(); @@ -67,30 +67,30 @@ jQuery(document).ready(function() { um_modal_responsive(); } }); - + return false; }); - + jQuery(document).on('click', '.um-finish-upload.file:not(.disabled)', function(){ - + var key = jQuery(this).attr('data-key'); - + var preview = jQuery(this).parents('.um-modal-body').find('.um-single-file-preview').html(); - + um_remove_modal(); - + jQuery('.um-single-file-preview[data-key='+key+']').fadeIn().html( preview ); var file = jQuery('.um-field[data-key='+key+']').find('.um-single-fileinfo a').data('file'); - + jQuery('.um-single-file-preview[data-key='+key+']').parents('.um-field').find('.um-btn-auto-width').html( jQuery(this).attr('data-change') ); - + jQuery('.um-single-file-preview[data-key='+key+']').parents('.um-field').find('input[type="hidden"]').val( file ); - + }); jQuery(document).on('click', '.um-finish-upload.image:not(.disabled)', function(){ - + var elem = jQuery(this); var key = jQuery(this).attr('data-key'); var img_c = jQuery(this).parents('.um-modal-body').find('.um-single-image-preview'); @@ -112,7 +112,7 @@ jQuery(document).ready(function() { } if ( coord ) { - + jQuery(this).html( jQuery(this).attr('data-processing') ).addClass('disabled'); jQuery.ajax({ @@ -157,23 +157,23 @@ jQuery(document).ready(function() { } }); - + } else { d = new Date(); jQuery('.um-single-image-preview[data-key='+key+']').fadeIn().find('img').attr('src', src + "?"+d.getTime()); - + um_remove_modal(); - + jQuery('.um-single-image-preview[data-key='+key+']').parents('.um-field').find('.um-btn-auto-width').html( elem.attr('data-change') ); - + jQuery('.um-single-image-preview[data-key='+key+']').parents('.um-field').find('input[type=hidden]').val( file ); - + } }); - + jQuery(document.body).on('click', 'a[data-modal^="um_"], span[data-modal^="um_"]', function(e){ var modal_id = jQuery(this).attr('data-modal'); @@ -183,19 +183,19 @@ jQuery(document).ready(function() { if ( jQuery(this).data('modal-size') ) { size = jQuery(this).data('modal-size'); } - + if ( jQuery(this).data('modal-copy') ) { - + jQuery('#' + modal_id).html( jQuery(this).parents('.um-field').find('.um-modal-hidden-content').html() ); - + if ( jQuery(this).parents('.um-profile-photo').attr('data-user_id') ) { jQuery('#' + modal_id).attr('data-user_id', jQuery(this).parents('.um-profile-photo').attr('data-user_id') ); } - + if ( jQuery(this).parents('.um-cover').attr('data-ratio') ) { jQuery('#' + modal_id).attr('data-ratio', jQuery(this).parents('.um-cover').attr('data-ratio') ); } - + if ( jQuery(this).parents('.um-cover').attr('data-user_id') ) { jQuery('#' + modal_id).attr('data-user_id', jQuery(this).parents('.um-cover').attr('data-user_id') ); } @@ -209,4 +209,4 @@ jQuery(document).ready(function() { um_new_modal( modal_id, size ); }); -}); \ No newline at end of file +}); diff --git a/assets/js/um-profile.js b/assets/js/um-profile.js index 5929df97..5a95598d 100644 --- a/assets/js/um-profile.js +++ b/assets/js/um-profile.js @@ -88,36 +88,22 @@ jQuery(document).ready(function() { return false; }); - /*function um_update_bio_countdown() { - // - jQuery(this) - if ( typeof jQuery('textarea[id="um-meta-bio"]').val() !== 'undefined' ){ - var um_bio_limit = jQuery('textarea[id="um-meta-bio"]').attr( "data-character-limit" ); - var remaining = um_bio_limit - jQuery('textarea[id="um-meta-bio"]').val().length; - jQuery('span.um-meta-bio-character span.um-bio-limit').text( remaining ); - if ( remaining < 5 ) { - jQuery('span.um-meta-bio-character').css('color','red'); - } else { - jQuery('span.um-meta-bio-character').css('color',''); - } - } - }*/ - - //um_update_bio_countdown(); - //jQuery( 'textarea[id="um-meta-bio"]' ).on('change', um_update_bio_countdown ).keyup( um_update_bio_countdown ).trigger('change'); - // Bio characters limit jQuery( document.body ).on( 'change keyup', '#um-meta-bio', function() { if ( typeof jQuery(this).val() !== 'undefined' ) { - var um_bio_limit = jQuery(this).data( 'character-limit' ); - var remaining = um_bio_limit - jQuery(this).val().length; + let um_bio_limit = jQuery(this).data( 'character-limit' ); + let bio_html = jQuery(this).data( 'html' ); + + let remaining = um_bio_limit - jQuery(this).val().length; + if ( parseInt( bio_html ) === 1 ) { + remaining = um_bio_limit - jQuery(this).val().replace(/(<([^>]+)>)/ig,'').length; + } + + remaining = remaining < 0 ? 0 : remaining; jQuery( 'span.um-meta-bio-character span.um-bio-limit' ).text( remaining ); - if ( remaining < 5 ) { - jQuery('span.um-meta-bio-character').css('color','red'); - } else { - jQuery('span.um-meta-bio-character').css('color',''); - } + let color = remaining < 5 ? 'red' : ''; + jQuery('span.um-meta-bio-character').css( 'color', color ); } }); jQuery( '#um-meta-bio' ).trigger('change'); @@ -153,5 +139,4 @@ jQuery(document).ready(function() { jQuery( '.um-profile-nav a' ).on( 'touchend', function(e) { jQuery( e.currentTarget).trigger( "click" ); }); - }); diff --git a/assets/js/um-profile.min.js b/assets/js/um-profile.min.js index f965ed66..557d45b8 100644 --- a/assets/js/um-profile.min.js +++ b/assets/js/um-profile.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){jQuery(".um-profile.um-viewing .um-profile-body .um-row").each(function(){var e=jQuery(this);0==e.find(".um-field").length&&(e.prev(".um-row-heading").remove(),e.remove())}),jQuery(".um-profile.um-viewing .um-profile-body").length&&0==jQuery(".um-profile.um-viewing .um-profile-body").find(".um-field").length&&(jQuery(".um-profile.um-viewing .um-profile-body").find(".um-row-heading,.um-row").remove(),jQuery(".um-profile-note").show()),jQuery(document.body).on("click",".um-profile-save",function(e){return e.preventDefault(),jQuery(this).parents(".um").find("form").trigger("submit"),!1}),jQuery(document.body).on("click",".um-profile-edit-a",function(e){jQuery(this).addClass("active")}),jQuery(document.body).on("click",".um-cover a.um-cover-add, .um-photo a",function(e){e.preventDefault()}),jQuery(document.body).on("click",".um-photo-modal",function(e){e.preventDefault();e=jQuery(this).attr("data-src");return um_new_modal("um_view_photo","fit",!0,e),!1}),jQuery(document.body).on("click",".um-reset-profile-photo",function(e){return jQuery(".um-profile-photo-img img").attr("src",jQuery(this).attr("data-default_src")),user_id=jQuery(this).attr("data-user_id"),metakey="profile_photo",UM.dropdown.hideAll(),jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_profile_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce}}),jQuery(this).parents("li").hide(),!1}),jQuery(document.body).on("click",".um-reset-cover-photo",function(e){var r=jQuery(this);return jQuery(".um-cover-overlay").hide(),jQuery(".um-cover-e").html(''),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_cover_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce},success:function(e){r.hide()}}),UM.dropdown.hideAll(),!1}),jQuery(document.body).on("change keyup","#um-meta-bio",function(){var e;void 0!==jQuery(this).val()&&(e=jQuery(this).data("character-limit")-jQuery(this).val().length,jQuery("span.um-meta-bio-character span.um-bio-limit").text(e),e<5?jQuery("span.um-meta-bio-character").css("color","red"):jQuery("span.um-meta-bio-character").css("color",""))}),jQuery("#um-meta-bio").trigger("change"),jQuery(".um-profile form").each(function(){let r=jQuery(this).data("description_key");jQuery(this).find('textarea[name="'+r+'"]').length&&jQuery(document.body).on("change input",'textarea[name="'+r+'"]',function(e){jQuery(this).parents("form").find('textarea[name="'+r+'"]').each(function(){jQuery(this).val(e.currentTarget.value),jQuery("#um-meta-bio")[0]!==e.currentTarget&&jQuery("#um-meta-bio")[0]===jQuery(this)[0]&&jQuery(this).trigger("change")})})}),jQuery(".um-profile-edit a.um_delete-item").on("click",function(e){if(e.preventDefault(),!confirm(wp.i18n.__("Are you sure that you want to delete this user?","ultimate-member")))return!1}),jQuery(".um-profile-nav a").on("touchend",function(e){jQuery(e.currentTarget).trigger("click")})}); \ No newline at end of file +jQuery(document).ready(function(){jQuery(".um-profile.um-viewing .um-profile-body .um-row").each(function(){var e=jQuery(this);0==e.find(".um-field").length&&(e.prev(".um-row-heading").remove(),e.remove())}),jQuery(".um-profile.um-viewing .um-profile-body").length&&0==jQuery(".um-profile.um-viewing .um-profile-body").find(".um-field").length&&(jQuery(".um-profile.um-viewing .um-profile-body").find(".um-row-heading,.um-row").remove(),jQuery(".um-profile-note").show()),jQuery(document.body).on("click",".um-profile-save",function(e){return e.preventDefault(),jQuery(this).parents(".um").find("form").trigger("submit"),!1}),jQuery(document.body).on("click",".um-profile-edit-a",function(e){jQuery(this).addClass("active")}),jQuery(document.body).on("click",".um-cover a.um-cover-add, .um-photo a",function(e){e.preventDefault()}),jQuery(document.body).on("click",".um-photo-modal",function(e){e.preventDefault();e=jQuery(this).attr("data-src");return um_new_modal("um_view_photo","fit",!0,e),!1}),jQuery(document.body).on("click",".um-reset-profile-photo",function(e){return jQuery(".um-profile-photo-img img").attr("src",jQuery(this).attr("data-default_src")),user_id=jQuery(this).attr("data-user_id"),metakey="profile_photo",UM.dropdown.hideAll(),jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_profile_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce}}),jQuery(this).parents("li").hide(),!1}),jQuery(document.body).on("click",".um-reset-cover-photo",function(e){var t=jQuery(this);return jQuery(".um-cover-overlay").hide(),jQuery(".um-cover-e").html(''),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_cover_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce},success:function(e){t.hide()}}),UM.dropdown.hideAll(),!1}),jQuery(document.body).on("change keyup","#um-meta-bio",function(){if(void 0!==jQuery(this).val()){var t=jQuery(this).data("character-limit"),r=jQuery(this).data("html");let e=t-jQuery(this).val().length;e=(e=1===parseInt(r)?t-jQuery(this).val().replace(/(<([^>]+)>)/gi,"").length:e)<0?0:e,jQuery("span.um-meta-bio-character span.um-bio-limit").text(e);r=e<5?"red":"";jQuery("span.um-meta-bio-character").css("color",r)}}),jQuery("#um-meta-bio").trigger("change"),jQuery(".um-profile form").each(function(){let t=jQuery(this).data("description_key");jQuery(this).find('textarea[name="'+t+'"]').length&&jQuery(document.body).on("change input",'textarea[name="'+t+'"]',function(e){jQuery(this).parents("form").find('textarea[name="'+t+'"]').each(function(){jQuery(this).val(e.currentTarget.value),jQuery("#um-meta-bio")[0]!==e.currentTarget&&jQuery("#um-meta-bio")[0]===jQuery(this)[0]&&jQuery(this).trigger("change")})})}),jQuery(".um-profile-edit a.um_delete-item").on("click",function(e){if(e.preventDefault(),!confirm(wp.i18n.__("Are you sure that you want to delete this user?","ultimate-member")))return!1}),jQuery(".um-profile-nav a").on("touchend",function(e){jQuery(e.currentTarget).trigger("click")})}); \ No newline at end of file diff --git a/includes/admin/assets/js/um-admin-modal.js b/includes/admin/assets/js/um-admin-modal.js index ead883f7..52278298 100644 --- a/includes/admin/assets/js/um-admin-modal.js +++ b/includes/admin/assets/js/um-admin-modal.js @@ -199,7 +199,7 @@ function um_admin_remove_modal() { jQuery('.um_tiny_placeholder').replaceWith( jQuery( $um_tiny_editor ).html() ); } - if ( 'undefined' !== typeof window.UM.admin.allTooltips && window.UM.admin.allTooltips.length > 0 ) { + if ( 'undefined' !== typeof window.UM.admin.allTooltips && window.UM.admin.allTooltips.length > 0 && 'function' === typeof window.UM.admin.allTooltips.tooltip ) { window.UM.admin.allTooltips.tooltip('close'); } jQuery('.tipsy').hide(); @@ -234,7 +234,7 @@ jQuery(document).ready(function() { /** disable link **/ - jQuery(document.body).on('click', '.um-admin-builder a, .um-admin-modal a', function(e){ + jQuery(document.body).on('click', '.um-admin-builder a, .um-admin-modal a:not(.um-preview-upload)', function(e){ e.preventDefault(); return false; }); diff --git a/includes/admin/class-secure.php b/includes/admin/class-secure.php index 65f8ec79..5c35cb43 100644 --- a/includes/admin/class-secure.php +++ b/includes/admin/class-secure.php @@ -73,28 +73,20 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { */ public function filter_users_by_date_registered( $query ) { global $pagenow; - if ( is_admin() && 'users.php' === $pagenow ) { + if ( 'users.php' === $pagenow && is_admin() ) { // phpcs:disable WordPress.Security.NonceVerification $date_from = isset( $_GET['um_secure_date_from'] ) ? $_GET['um_secure_date_from'] : null; $date_to = isset( $_GET['um_secure_date_to'] ) ? $_GET['um_secure_date_to'] : null; // phpcs:enable WordPress.Security.NonceVerification - if ( ! $date_to ) { - $query->set( - 'date_query', - array( - 'after' => human_time_diff( $date_from, strtotime( current_time( 'mysql' ) ) ) . ' ago', - 'inclusive' => true, - ) - ); - } elseif ( $date_from && $date_to ) { - $query->set( - 'date_query', - array( - 'after' => human_time_diff( $date_from, strtotime( current_time( 'mysql' ) ) ) . ' ago', - 'before' => human_time_diff( $date_to, strtotime( current_time( 'mysql' ) ) ) . ' ago', - 'inclusive' => true, - ) + if ( $date_from ) { + $date_query_attr = array( + 'after' => human_time_diff( $date_from, strtotime( current_time( 'mysql' ) ) ) . ' ago', + 'inclusive' => true, ); + if ( $date_to ) { + $date_query_attr['before'] = human_time_diff( $date_to, strtotime( current_time( 'mysql' ) ) ) . ' ago'; + } + $query->set( 'date_query', $date_query_attr ); } } @@ -123,13 +115,24 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { /** * Destroy all user sessions except the current logged-in user. */ - $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . $wpdb->usermeta . ' WHERE meta_key="session_tokens" AND user_id != %d', get_current_user_id() ) ); + $wpdb->query( + $wpdb->prepare( + "DELETE + FROM {$wpdb->usermeta} + WHERE meta_key='session_tokens' AND + user_id != %d", + get_current_user_id() + ) + ); if ( UM()->options()->get( 'display_login_form_notice' ) ) { global $wpdb; $wpdb->query( $wpdb->prepare( - "DELETE FROM {$wpdb->usermeta} WHERE user_id != %d AND ( meta_key = 'um_secure_has_reset_password' OR meta_key = 'um_secure_has_reset_password__timestamp' )", + "DELETE + FROM {$wpdb->usermeta} + WHERE user_id != %d AND + ( meta_key = 'um_secure_has_reset_password' OR meta_key = 'um_secure_has_reset_password__timestamp' )", get_current_user_id() ) ); diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php index 72dd29eb..257db6e7 100644 --- a/includes/admin/core/class-admin-notices.php +++ b/includes/admin/core/class-admin-notices.php @@ -53,6 +53,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { $this->template_version(); + $this->child_theme_required(); + // removed for now to avoid the bad reviews //$this->reviews_notice(); @@ -801,6 +803,39 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { } } + /** + * Check if there isn't installed child-theme. Child theme is required for safely saved customizations. + */ + public function child_theme_required() { + if ( ! is_child_theme() ) { + if ( ! is_dir( get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'ultimate-member' ) ) { + return; + } + + ob_start(); + ?> + +
+ child-theme for Ultimate Member customization, which hasn\'t dependencies with the official themes repo, so your custom files cannot be rewritten after a theme upgrade.
Otherwise, the customization files may be deleted after every theme upgrade.', 'ultimate-member' ), 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ), UM()->get_allowed_html( 'admin_notice' ) );
+ ?>
+