diff --git a/includes/admin/assets/css/um-admin-settings.css b/includes/admin/assets/css/um-admin-settings.css index 113d921d..0f8d78df 100644 --- a/includes/admin/assets/css/um-admin-settings.css +++ b/includes/admin/assets/css/um-admin-settings.css @@ -109,7 +109,7 @@ th.column-email.column-primary { width: 30.5%; max-width: 350px; padding: 14px; - min-height: 220px; + min-height: 240px; position: relative; box-sizing: border-box; } diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index ef01be07..59009ddf 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -1704,7 +1704,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { return; foreach ( $_POST['um_options'] as $key => $value ) { - $this->previous_licenses[$key] = UM()->options()->get( $key ); + $this->previous_licenses[ $key ] = UM()->options()->get( $key ); } } @@ -1713,25 +1713,27 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { * */ function licenses_save() { - if ( empty( $_POST['um_options'] ) || empty( $_POST['licenses_settings'] ) ) + if ( empty( $_POST['um_options'] ) || empty( $_POST['licenses_settings'] ) ) { return; + } foreach ( $_POST['um_options'] as $key => $value ) { $edd_action = ''; $license_key = ''; - if ( empty( $this->previous_licenses[$key] ) && ! empty( $value ) || ( ! empty( $this->previous_licenses[$key] ) && ! empty( $value ) && $this->previous_licenses[$key] != $value ) ) { + if ( empty( $this->previous_licenses[ $key ] ) && ! empty( $value ) || ( ! empty( $this->previous_licenses[ $key ] ) && ! empty( $value ) && $this->previous_licenses[ $key ] != $value ) ) { $edd_action = 'activate_license'; $license_key = $value; - } elseif ( ! empty( $this->previous_licenses[$key] ) && empty( $value ) ) { + } elseif ( ! empty( $this->previous_licenses[ $key ] ) && empty( $value ) ) { $edd_action = 'deactivate_license'; - $license_key = $this->previous_licenses[$key]; - } elseif ( ! empty( $this->previous_licenses[$key] ) && ! empty( $value ) ) { + $license_key = $this->previous_licenses[ $key ]; + } elseif ( ! empty( $this->previous_licenses[ $key ] ) && ! empty( $value ) ) { $edd_action = 'check_license'; $license_key = $value; } - if ( empty( $edd_action ) ) + if ( empty( $edd_action ) ) { continue; + } $item_name = false; $version = false; @@ -1762,15 +1764,17 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ) ); - if ( ! is_wp_error( $request ) ) + if ( ! is_wp_error( $request ) ) { $request = json_decode( wp_remote_retrieve_body( $request ) ); + } $request = ( $request ) ? maybe_unserialize( $request ) : false; - if ( $edd_action == 'activate_license' || $edd_action == 'check_license' ) + if ( $edd_action == 'activate_license' || $edd_action == 'check_license' ) { update_option( "{$key}_edd_answer", $request ); - else + } else { delete_option( "{$key}_edd_answer" ); + } } } @@ -1884,13 +1888,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { options()->get( $field_data['id'] ); - $value = isset( $option_value ) && ! empty( $option_value ) ? $option_value : ( isset( $field_data['default'] ) ? $field_data['default'] : '' ); + $value = isset( $option_value ) && ! empty( $option_value ) ? $option_value : ( isset( $field_data['default'] ) ? $field_data['default'] : '' ); $license = get_option( "{$field_data['id']}_edd_answer" ); if ( is_object( $license ) && ! empty( $value ) ) { // activate_license 'invalid' on anything other than valid, so if there was an error capture it - if ( false === $license->success ) { + if ( empty( $license->success ) ) { if ( ! empty( $license->error ) ) { switch ( $license->error ) { @@ -1935,16 +1939,16 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { case 'invalid' : case 'site_inactive' : - $class = 'error'; - $messages[] = sprintf( - __( 'Your %s is not active for this URL. Please visit your account page to manage your license key URLs.', 'ultimate-member' ), - $field_data['item_name'], - 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=invalid' - ); + $class = 'error'; + $messages[] = sprintf( + __( 'Your %s is not active for this URL. Please visit your account page to manage your license key URLs.', 'ultimate-member' ), + $field_data['item_name'], + 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=invalid' + ); - $license_status = 'license-' . $class . '-notice'; + $license_status = 'license-' . $class . '-notice'; - break; + break; case 'item_name_mismatch' : @@ -1975,7 +1979,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { default : $class = 'error'; - $error = ! empty( $license->error ) ? $license->error : __( 'unknown_error', 'ultimate-member' ); + $error = ! empty( $license->error ) ? $license->error : __( 'unknown_error', 'ultimate-member' ); $messages[] = sprintf( __( 'There was an error with this license key: %s. Please contact our support team.', 'ultimate-member' ), $error, 'https://ultimatemember.com/support' ); $license_status = 'license-' . $class . '-notice'; @@ -1983,12 +1987,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } } else { $class = 'error'; - $error = ! empty( $license->error ) ? $license->error : __( 'unknown_error', 'ultimate-member' ); + $error = ! empty( $license->error ) ? $license->error : __( 'unknown_error', 'ultimate-member' ); $messages[] = sprintf( __( 'There was an error with this license key: %s. Please contact our support team.', 'ultimate-member' ), $error, 'https://ultimatemember.com/support' ); $license_status = 'license-' . $class . '-notice'; } + } elseif ( ! empty( $license->errors ) ) { + + $errors = array_keys( $license->errors ); + $errors_data = array_values( $license->errors ); + + $class = 'error'; + $error = ! empty( $errors[0] ) ? $errors[0] : __( 'unknown_error', 'ultimate-member' ); + $errors_data = ! empty( $errors_data[0][0] ) ? ', ' . $errors_data[0][0] : ''; + $messages[] = sprintf( __( 'There was an error with this license key: %s%s. Please contact our support team.', 'ultimate-member' ), $error, $errors_data, 'https://ultimatemember.com/support' ); + + $license_status = 'license-' . $class . '-notice'; + } else { switch( $license->license ) { @@ -2033,16 +2049,16 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { case 'invalid' : case 'site_inactive' : - $class = 'error'; - $messages[] = sprintf( - __( 'Your %s is not active for this URL. Please visit your account page to manage your license key URLs.', 'ultimate-member' ), - $field_data['item_name'], - 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=invalid' - ); + $class = 'error'; + $messages[] = sprintf( + __( 'Your %s is not active for this URL. Please visit your account page to manage your license key URLs.', 'ultimate-member' ), + $field_data['item_name'], + 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=invalid' + ); - $license_status = 'license-' . $class . '-notice'; + $license_status = 'license-' . $class . '-notice'; - break; + break; case 'item_name_mismatch' : @@ -2073,39 +2089,39 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { case 'valid' : default: - $class = 'valid'; + $class = 'valid'; - $now = current_time( 'timestamp' ); - $expiration = strtotime( $license->expires, current_time( 'timestamp' ) ); + $now = current_time( 'timestamp' ); + $expiration = strtotime( $license->expires, $now ); - if( 'lifetime' === $license->expires ) { + if( 'lifetime' === $license->expires ) { - $messages[] = __( 'License key never expires.', 'ultimate-member' ); + $messages[] = __( 'License key never expires.', 'ultimate-member' ); - $license_status = 'license-lifetime-notice'; + $license_status = 'license-lifetime-notice'; - } elseif( $expiration > $now && $expiration - $now < ( DAY_IN_SECONDS * 30 ) ) { + } elseif( $expiration > $now && $expiration - $now < ( DAY_IN_SECONDS * 30 ) ) { - $messages[] = sprintf( - __( 'Your license key expires soon! It expires on %s. Renew your license key.', 'ultimate-member' ), - date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ), - 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew' - ); + $messages[] = sprintf( + __( 'Your license key expires soon! It expires on %s. Renew your license key.', 'ultimate-member' ), + date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ), + 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew' + ); - $license_status = 'license-expires-soon-notice'; + $license_status = 'license-expires-soon-notice'; - } else { + } else { - $messages[] = sprintf( - __( 'Your license key expires on %s.', 'ultimate-member' ), - date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ) - ); + $messages[] = sprintf( + __( 'Your license key expires on %s.', 'ultimate-member' ), + date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ) + ); - $license_status = 'license-expiration-date-notice'; + $license_status = 'license-expiration-date-notice'; - } + } - break; + break; } @@ -2121,9 +2137,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $license_status = null; - } - - ?> + } ?> diff --git a/includes/admin/core/list-tables/roles-list-table.php b/includes/admin/core/list-tables/roles-list-table.php index 0df585c8..e2b425bd 100644 --- a/includes/admin/core/list-tables/roles-list-table.php +++ b/includes/admin/core/list-tables/roles-list-table.php @@ -429,11 +429,11 @@ if ( $role_keys ) { $role_meta = get_option( "um_role_{$role_key}_meta" ); if ( $role_meta ) { - $roles['um_' . $role_key] = array( + $roles[ 'um_' . $role_key ] = array( 'key' => $role_key, - 'users' => ! empty( $users_count['avail_roles']['um_' . $role_key] ) ? $users_count['avail_roles']['um_' . $role_key] : 0 + 'users' => ! empty( $users_count['avail_roles'][ 'um_' . $role_key ] ) ? $users_count['avail_roles'][ 'um_' . $role_key ] : 0 ); - $roles['um_' . $role_key] = array_merge( $roles['um_' . $role_key], $role_meta ); + $roles[ 'um_' . $role_key ] = array_merge( $roles[ 'um_' . $role_key ], $role_meta ); } } } @@ -441,18 +441,20 @@ if ( $role_keys ) { global $wp_roles; foreach ( $wp_roles->roles as $roleID => $role_data ) { - if ( in_array( $roleID, array_keys( $roles ) ) ) + if ( in_array( $roleID, array_keys( $roles ) ) ) { continue; + } - $roles[$roleID] = array( + $roles[ $roleID ] = array( 'key' => $roleID, - 'users' => ! empty( $users_count['avail_roles'][$roleID] ) ? $users_count['avail_roles'][$roleID] : 0, - 'name' => $role_data['name'] + 'users' => ! empty( $users_count['avail_roles'][ $roleID ] ) ? $users_count['avail_roles'][ $roleID ] : 0, + 'name' => $role_data['name'] ); $role_meta = get_option( "um_role_{$roleID}_meta" ); - if ( $role_meta ) - $roles[$roleID] = array_merge( $roles[$roleID], $role_meta ); + if ( $role_meta ) { + $roles[ $roleID ] = array_merge( $roles[ $roleID ], $role_meta ); + } } switch( strtolower( $order ) ) { diff --git a/includes/admin/core/packages/2.0.54/functions.php b/includes/admin/core/packages/2.0.54/functions.php new file mode 100644 index 00000000..7327676b --- /dev/null +++ b/includes/admin/core/packages/2.0.54/functions.php @@ -0,0 +1,14 @@ +admin()->check_ajax_nonce(); + + um_maybe_unset_time_limit(); + + include 'roles.php'; + + update_option( 'um_last_version_upgrade', '2.0.54' ); + + wp_send_json_success( array( 'message' => __( 'Roles was upgraded successfully', 'ultimate-member' ) ) ); +} \ No newline at end of file diff --git a/includes/admin/core/packages/2.0.54/hooks.php b/includes/admin/core/packages/2.0.54/hooks.php new file mode 100644 index 00000000..c20a336e --- /dev/null +++ b/includes/admin/core/packages/2.0.54/hooks.php @@ -0,0 +1,5 @@ + 'roles2054', +); \ No newline at end of file diff --git a/includes/admin/core/packages/2.0.54/init.php b/includes/admin/core/packages/2.0.54/init.php new file mode 100644 index 00000000..4931d633 --- /dev/null +++ b/includes/admin/core/packages/2.0.54/init.php @@ -0,0 +1,31 @@ + + + + \ No newline at end of file diff --git a/includes/admin/core/packages/2.0.54/roles.php b/includes/admin/core/packages/2.0.54/roles.php new file mode 100644 index 00000000..6ffcd868 --- /dev/null +++ b/includes/admin/core/packages/2.0.54/roles.php @@ -0,0 +1,21 @@ +roles as $roleID => $role_data ) { + if ( in_array( $roleID, $role_keys ) ) { + continue; + } + + $role_meta = get_option( "um_role_{$roleID}_meta", array() ); + if ( ! empty( $role_meta ) ) { + if ( $role_meta['name'] === null ) { + unset( $role_meta['name'] ); + update_option( "um_role_{$roleID}_meta", $role_meta ); + } + } +} \ No newline at end of file diff --git a/includes/admin/templates/role/role-edit.php b/includes/admin/templates/role/role-edit.php index 64c40949..0e0a2a42 100644 --- a/includes/admin/templates/role/role-edit.php +++ b/includes/admin/templates/role/role-edit.php @@ -98,9 +98,11 @@ if ( ! empty( $_POST['role'] ) ) { $id = $_GET['id']; $pre_role_meta = get_option( "um_role_{$id}_meta", array() ); - $data['name'] = $pre_role_meta['name']; + if ( isset( $pre_role_meta['name'] ) ) { + $data['name'] = $pre_role_meta['name']; + } - $redirect = add_query_arg( array( 'page' => 'um_roles', 'tab'=>'edit', 'id'=>$id, 'msg'=>'u' ), admin_url( 'admin.php' ) ); + $redirect = add_query_arg( array( 'page' => 'um_roles', 'tab' => 'edit', 'id' => $id, 'msg'=> 'u' ), admin_url( 'admin.php' ) ); } diff --git a/readme.txt b/readme.txt index 07130526..f04a20fb 100644 --- a/readme.txt +++ b/readme.txt @@ -41,6 +41,7 @@ Read about all of the plugin's features at [Ultimate Member](https://ultimatemem Ultimate Member has a range of extensions that allow you to extend the power of the plugin. You can purchase all of these extensions at a significant discount with our [All Access Pass](https://ultimatemember.com/pricing/) or you can purchase extensions individually. +* [User Bookmarks](https://ultimatemember.com/extensions/user-bookmarks/) - Allow users to bookmark content from your website * [Private Content](https://ultimatemember.com/extensions/private-content/) - Display private content to logged in users that only they can access * [Instagram](https://ultimatemember.com/extensions/instagram/) - Allow users to show their Instagram photos on their profile * [User Tags](https://ultimatemember.com/extensions/user-tags/) - Lets you add a user tag system to your website @@ -53,7 +54,7 @@ Ultimate Member has a range of extensions that allow you to extend the power of * [bbPress](https://ultimatemember.com/extensions/bbpress/) - With the bbPress extension you can beautifully integrate Ultimate Member with bbPress * [MailChimp](https://ultimatemember.com/extensions/mailchimp/) - Allow users to subscribe to your MailChimp lists when they signup on your site and sync user meta to MailChimp * [User Reviews](https://ultimatemember.com/extensions/user-reviews/) - Allow users to rate & review each other using a 5 star rate/review system -* [Verified Users](https://ultimatemember.com/extensions/verified-users/) - Add a user verficiation system to your site so user accounts can be verified +* [Verified Users](https://ultimatemember.com/extensions/verified-users/) - Add a user verification system to your site so user accounts can be verified * [myCRED](https://ultimatemember.com/extensions/mycred/) - With the myCRED extension you can integrate Ultimate Member with the popular myCRED points management plugin * [Notices](https://ultimatemember.com/extensions/notices/) - Alert users to important information using conditional notices * [Profile Completeness](https://ultimatemember.com/extensions/profile-completeness/) - Encourage or force users to complete their profiles with the profile completeness extension @@ -138,6 +139,16 @@ The plugin works with popular caching plugins by automatically excluding Ultimat = Important: UM2.0+ is a significant update to the code base from 1.3.88. Please make sure you take a full-site backup with restore point before updating the plugin = += 2.0.54: July 17, 2019 = + +* Enhancements: + - Added security fixes (XSS) + +* Bugfixes: + - Fixed update process for not UM custom role + - Fixed user description length validation + - Fixed extensions licenses validation handler + = 2.0.53: July 16, 2019 = * Enhancements: diff --git a/ultimate-member.php b/ultimate-member.php index 2a12603b..be28bb21 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -3,7 +3,7 @@ Plugin Name: Ultimate Member Plugin URI: http://ultimatemember.com/ Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress -Version: 2.0.53 +Version: 2.0.54 Author: Ultimate Member Author URI: http://ultimatemember.com/ Text Domain: ultimate-member