Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/wp-user-avatar/src/Admin/UserRolesEdit.php
+++ b/wp-user-avatar/src/Admin/UserRolesEdit.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace ProfilePressCoreAdmin;
+
+use WP_User;
+
+class UserRolesEdit
+{
+ public function __construct()
+ {
+ add_action('show_user_profile', [$this, 'display_secondary_user_roles_field'], -1);
+ add_action('edit_user_profile', [$this, 'display_secondary_user_roles_field'], -1);
+
+
+ add_action('admin_footer', [$this, 'scripts'], 99);
+ add_action('admin_head', [$this, 'styles']);
+
+ // Must use `profile_update` to change role. Otherwise, WP will wipe it out.
+ add_action('profile_update', [$this, 'update_roles'], 99, 2);
+ }
+
+ public function display_secondary_user_roles_field($user)
+ {
+ if (current_user_can('promote_users') && current_user_can('edit_user', $user->ID)) :
+
+ $editable_roles = get_editable_roles();
+ // Compare user role against currently editable roles.
+ $user_roles = array_intersect(array_values($user->roles), array_keys($editable_roles));
+
+ wp_nonce_field('ppress_new_user_roles', 'ppress_new_user_roles_nonce');
+ ?>
+ <h2><?php esc_html_e('Roles', 'wp-user-avatar'); ?></h2>
+ <table class="form-table">
+ <tbody>
+ <tr>
+ <th><?php esc_html_e('Select User Roles', 'wp-user-avatar'); ?></th>
+ <td>
+ <div class="wp-tab-panel">
+ <ul>
+ <?php foreach ($editable_roles as $role => $details): ?>
+ <li>
+ <label>
+ <input type="checkbox" name="ppress_user_roles[]" value="<?php echo esc_attr($role); ?>" <?php echo in_array($role, $user_roles) ? 'checked="checked"' : ''; ?>>
+ <?php echo translate_user_role($details['name']); ?>
+ </label>
+ </li>
+ <?php endforeach; ?>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <?php endif;
+ }
+
+ /**
+ * @param int $user_id
+ * @param WP_User $old_user_data
+ *
+ * @return void
+ */
+ public function update_roles($user_id, $old_user_data)
+ {
+ // Early return if user lacks permissions
+ if ( ! current_user_can('promote_users') || ! current_user_can('edit_user', $user_id)) return;
+
+ if (empty($_POST['ppress_new_user_roles_nonce']) || ! wp_verify_nonce($_POST['ppress_new_user_roles_nonce'], 'ppress_new_user_roles')) return;
+
+ // Cache editable roles and extract just the role names for efficiency
+ $editable_roles = array_keys(get_editable_roles());
+
+ // Get current user roles
+ $current_roles = (array)$old_user_data->roles;
+
+ // Get and sanitize new roles, defaulting to empty array
+ $new_roles = isset($_POST['ppress_user_roles']) ? array_map('sanitize_text_field', (array)$_POST['ppress_user_roles']) : [];
+
+ // Filter new roles to only include editable ones
+ $new_roles = array_intersect($new_roles, $editable_roles);
+
+ // Calculate roles to add and remove
+ $roles_to_add = array_diff($new_roles, $current_roles);
+ $roles_to_remove = array_intersect(array_diff($current_roles, $new_roles), $editable_roles);
+
+ // Add new roles
+ foreach ($roles_to_add as $role) {
+ $old_user_data->add_role($role);
+ }
+
+ // Remove old roles
+ foreach ($roles_to_remove as $role) {
+ $old_user_data->remove_role($role);
+ }
+
+ do_action('ppress_user_roles_updated', $user_id, $roles_to_add, $roles_to_remove);
+ }
+
+ public function scripts()
+ {
+ if ( ! $this->is_profile_page()) return;
+ ?>
+ <script type="text/javascript">
+ document.addEventListener('DOMContentLoaded', () => {
+ document.querySelectorAll('.user-role-wrap').forEach(function (el) {
+ return el.remove();
+ });
+ });
+ </script>
+ <?php
+ }
+
+ public function styles()
+ {
+ if ( ! $this->is_profile_page()) return;
+ ?>
+ <style>.user-role-wrap {
+ display: none !important;
+ }</style>
+ <?php
+ }
+
+ private function is_profile_page()
+ {
+ global $pagenow;
+
+ return in_array($pagenow, ['profile.php', 'user-edit.php']);
+ }
+
+ public static function get_instance()
+ {
+ static $instance = null;
+
+ if (is_null($instance)) {
+ $instance = new self();
+ }
+
+ return $instance;
+ }
+}
No newline at end of file
--- a/wp-user-avatar/src/Base.php
+++ b/wp-user-avatar/src/Base.php
@@ -21,6 +21,7 @@
use ProfilePressCoreAdminSettingsPagesMembershipPlansPageSettingsPage as PlansSettingsPage;
use ProfilePressCoreAdminSettingsPagesMembershipSubscriptionsPageSettingsPage as SubscriptionsPageSettingsPage;
use ProfilePressCoreAdminSettingsPagesToolsSettingsPage;
+use ProfilePressCoreAdminUserRolesEdit;
use ProfilePressCoreClassesBlockRegistrations;
use ProfilePressCoreClassesDisableConcurrentLogins;
use ProfilePressCoreClassesGlobalSiteAccess;
@@ -108,16 +109,16 @@
class Base extends DBTables
{
// core contact info fields
- const cif_facebook = 'facebook';
- const cif_twitter = 'twitter';
- const cif_linkedin = 'linkedin';
- const cif_youtube = 'youtube';
- const cif_vk = 'vk';
- const cif_instagram = 'instagram';
- const cif_github = 'github';
- const cif_pinterest = 'pinterest';
- const cif_bluesky = 'bluesky';
- const cif_threads = 'threads';
+ const cif_facebook = 'facebook';
+ const cif_twitter = 'twitter';
+ const cif_linkedin = 'linkedin';
+ const cif_youtube = 'youtube';
+ const cif_vk = 'vk';
+ const cif_instagram = 'instagram';
+ const cif_github = 'github';
+ const cif_pinterest = 'pinterest';
+ const cif_bluesky = 'bluesky';
+ const cif_threads = 'threads';
public function __construct()
{
@@ -234,6 +235,7 @@
AdminSettingsPagesMembershipTaxSettingsSettingsPage::get_instance();
ProfileCustomFields::get_instance();
+ UserRolesEdit::get_instance();
EmailSettingsPage::get_instance();
ToolsSettingsPage::get_instance();
--- a/wp-user-avatar/src/Classes/BlockRegistrations.php
+++ b/wp-user-avatar/src/Classes/BlockRegistrations.php
@@ -6,7 +6,10 @@
{
public static function init()
{
- add_filter('ppress_registration_validation', array(__CLASS__, 'do_action'), 999999, 3);
+ add_filter('ppress_registration_validation', [__CLASS__, 'do_action'], 999999, 3);
+ add_filter('ppress_checkout_registration_validation', function ($error_bucket, $user_data) {
+ return self::do_action($error_bucket, 0, $user_data);
+ }, 999999, 2);
}
/**
@@ -55,7 +58,7 @@
);
- if (is_array($allowed_email_addresses) && ! empty($allowed_email_addresses)) {
+ if ( ! empty($allowed_email_addresses)) {
if ( ! self::is_email_matches($user_email, $allowed_email_addresses)) {
$reg_errors->add('blocked_email_address', $blocked_error_message);
@@ -67,7 +70,7 @@
$allowed_email_addresses = array_map('trim', explode("n", $allowed_email_addresses_list));
- if (is_array($allowed_email_addresses) && ! empty($allowed_email_addresses)) {
+ if ( ! empty($allowed_email_addresses)) {
if (self::is_email_matches($user_email, $allowed_email_addresses)) {
return $reg_errors;
@@ -79,7 +82,7 @@
$blocked_email_addresses = array_map('trim', explode("n", $blocked_email_addresses_list));
- if (is_array($blocked_email_addresses) && ! empty($blocked_email_addresses)) {
+ if ( ! empty($blocked_email_addresses)) {
if (self::is_email_matches($user_email, $blocked_email_addresses)) {
$reg_errors->add('blocked_email_address', $blocked_error_message);
--- a/wp-user-avatar/src/Classes/RegistrationAuth.php
+++ b/wp-user-avatar/src/Classes/RegistrationAuth.php
@@ -128,7 +128,7 @@
}
// sanitize_textarea_field is used to preserve any line breaks
- $segregated_userdata[$key] = sanitize_textarea_field($value);
+ $segregated_userdata[$key] = strip_shortcodes(sanitize_textarea_field($value));
}
}
--- a/wp-user-avatar/src/ShortcodeParser/Builder/FieldsShortcodeCallback.php
+++ b/wp-user-avatar/src/ShortcodeParser/Builder/FieldsShortcodeCallback.php
@@ -87,7 +87,7 @@
return sanitize_text_field($field['label_name']);
}
- return ucfirst(str_replace('_', ' ', $key));
+ return ucfirst(str_replace(['ppress_', '_'], ['', ' '], $key));
}
public static function sanitize_field_attributes($atts)
--- a/wp-user-avatar/src/ShortcodeParser/Builder/FrontendProfileBuilder.php
+++ b/wp-user-avatar/src/ShortcodeParser/Builder/FrontendProfileBuilder.php
@@ -315,7 +315,7 @@
*/
public function profile_first_name()
{
- return apply_filters('ppress_profile_first_name', ucwords(self::$user_data->first_name), self::$user_data);
+ return apply_filters('ppress_profile_first_name', ucwords(strip_shortcodes(self::$user_data->first_name)), self::$user_data);
}
@@ -326,7 +326,7 @@
*/
public function profile_last_name()
{
- return apply_filters('ppress_profile_last_name', ucwords(self::$user_data->last_name), self::$user_data);
+ return apply_filters('ppress_profile_last_name', ucwords(strip_shortcodes(self::$user_data->last_name)), self::$user_data);
}
/**
@@ -336,7 +336,7 @@
*/
public function profile_bio()
{
- return apply_filters('ppress_profile_bio', make_clickable(wpautop(wp_kses_post(html_entity_decode(self::$user_data->description)))), self::$user_data);
+ return apply_filters('ppress_profile_bio', make_clickable(wpautop(wp_kses_post(html_entity_decode(strip_shortcodes(self::$user_data->description))))), self::$user_data);
}
/**
@@ -382,7 +382,7 @@
$data = esc_attr($atts['default']);
}
- return apply_filters('ppress_profile_cpf', $data, self::$user_data);
+ return apply_filters('ppress_profile_cpf', strip_shortcodes($data), self::$user_data);
}
public static function get_user_uploaded_file($user_id, $field_key, $is_raw = false)
--- a/wp-user-avatar/third-party/vendor/composer/installed.php
+++ b/wp-user-avatar/third-party/vendor/composer/installed.php
@@ -2,4 +2,4 @@
namespace ProfilePressVendor;
-return array('root' => array('name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => 'a59c4d91820b73b4ab7bbbc01ee3ad5d3b8d3848', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true), 'versions' => array('__root__' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => 'a59c4d91820b73b4ab7bbbc01ee3ad5d3b8d3848', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false), 'barryvdh/composer-cleanup-plugin' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '80cceff45bfb85a0f49236537b1f1c928a1ee820', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../barryvdh/composer-cleanup-plugin', 'aliases' => array(0 => '0.1.x-dev'), 'dev_requirement' => false), 'brick/math' => array('pretty_version' => '0.9.3', 'version' => '0.9.3.0', 'reference' => 'ca57d18f028f84f777b2168cd1911b0dee2343ae', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), 'dev_requirement' => false), 'carbonphp/carbon-doctrine-types' => array('pretty_version' => '2.1.0', 'version' => '2.1.0.0', 'reference' => '99f76ffa36cce3b70a4a6abce41dba15ca2e84cb', 'type' => 'library', 'install_path' => __DIR__ . '/../carbonphp/carbon-doctrine-types', 'aliases' => array(), 'dev_requirement' => false), 'collizo4sky/persist-admin-notices-dismissal' => array('pretty_version' => '1.4.5', 'version' => '1.4.5.0', 'reference' => '163b868c98cf97ea15b4d7e1305e2d52c9242e7e', 'type' => 'library', 'install_path' => __DIR__ . '/../collizo4sky/persist-admin-notices-dismissal', 'aliases' => array(), 'dev_requirement' => false), 'league/csv' => array('pretty_version' => '9.8.0', 'version' => '9.8.0.0', 'reference' => '9d2e0265c5d90f5dd601bc65ff717e05cec19b47', 'type' => 'library', 'install_path' => __DIR__ . '/../league/csv', 'aliases' => array(), 'dev_requirement' => false), 'nesbot/carbon' => array('pretty_version' => '2.73.0', 'version' => '2.73.0.0', 'reference' => '9228ce90e1035ff2f0db84b40ec2e023ed802075', 'type' => 'library', 'install_path' => __DIR__ . '/../nesbot/carbon', 'aliases' => array(), 'dev_requirement' => false), 'pelago/emogrifier' => array('pretty_version' => 'v6.0.0', 'version' => '6.0.0.0', 'reference' => 'aa72d5407efac118f3896bcb995a2cba793df0ae', 'type' => 'library', 'install_path' => __DIR__ . '/../pelago/emogrifier', 'aliases' => array(), 'dev_requirement' => false), 'psr/clock' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/clock', 'aliases' => array(), 'dev_requirement' => false), 'psr/clock-implementation' => array('dev_requirement' => false, 'provided' => array(0 => '1.0')), 'sabberworm/php-css-parser' => array('pretty_version' => 'v8.9.0', 'version' => '8.9.0.0', 'reference' => 'd8e916507b88e389e26d4ab03c904a082aa66bb9', 'type' => 'library', 'install_path' => __DIR__ . '/../sabberworm/php-css-parser', 'aliases' => array(), 'dev_requirement' => false), 'sniccowp/php-scoper-wordpress-excludes' => array('pretty_version' => '6.8.1', 'version' => '6.8.1.0', 'reference' => 'c2c18f89a9aa2d7ef1998d233b9ed00d0deff5dd', 'type' => 'library', 'install_path' => __DIR__ . '/../sniccowp/php-scoper-wordpress-excludes', 'aliases' => array(), 'dev_requirement' => true), 'stripe/stripe-php' => array('pretty_version' => 'v16.6.0', 'version' => '16.6.0.0', 'reference' => 'd6de0a536f00b5c5c74f36b8f4d0d93b035499ff', 'type' => 'library', 'install_path' => __DIR__ . '/../stripe/stripe-php', 'aliases' => array(), 'dev_requirement' => false), 'symfony/css-selector' => array('pretty_version' => 'v5.4.45', 'version' => '5.4.45.0', 'reference' => '4f7f3c35fba88146b56d0025d20ace3f3901f097', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/css-selector', 'aliases' => array(), 'dev_requirement' => false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v2.5.4', 'version' => '2.5.4.0', 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false), 'symfony/polyfill-php80' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => false), 'symfony/translation' => array('pretty_version' => 'v5.4.45', 'version' => '5.4.45.0', 'reference' => '98f26acc99341ca4bab345fb14d7b1d7cb825bed', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation', 'aliases' => array(), 'dev_requirement' => false), 'symfony/translation-contracts' => array('pretty_version' => 'v2.5.4', 'version' => '2.5.4.0', 'reference' => '450d4172653f38818657022252f9d81be89ee9a8', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), 'dev_requirement' => false), 'symfony/translation-implementation' => array('dev_requirement' => false, 'provided' => array(0 => '2.3'))));
+return array('root' => array('name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => 'a4e0ae0f4e087c37569ec3f27a551353ed8c0bcd', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true), 'versions' => array('__root__' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => 'a4e0ae0f4e087c37569ec3f27a551353ed8c0bcd', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false), 'barryvdh/composer-cleanup-plugin' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '80cceff45bfb85a0f49236537b1f1c928a1ee820', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../barryvdh/composer-cleanup-plugin', 'aliases' => array(0 => '0.1.x-dev'), 'dev_requirement' => false), 'brick/math' => array('pretty_version' => '0.9.3', 'version' => '0.9.3.0', 'reference' => 'ca57d18f028f84f777b2168cd1911b0dee2343ae', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), 'dev_requirement' => false), 'carbonphp/carbon-doctrine-types' => array('pretty_version' => '2.1.0', 'version' => '2.1.0.0', 'reference' => '99f76ffa36cce3b70a4a6abce41dba15ca2e84cb', 'type' => 'library', 'install_path' => __DIR__ . '/../carbonphp/carbon-doctrine-types', 'aliases' => array(), 'dev_requirement' => false), 'collizo4sky/persist-admin-notices-dismissal' => array('pretty_version' => '1.4.5', 'version' => '1.4.5.0', 'reference' => '163b868c98cf97ea15b4d7e1305e2d52c9242e7e', 'type' => 'library', 'install_path' => __DIR__ . '/../collizo4sky/persist-admin-notices-dismissal', 'aliases' => array(), 'dev_requirement' => false), 'league/csv' => array('pretty_version' => '9.8.0', 'version' => '9.8.0.0', 'reference' => '9d2e0265c5d90f5dd601bc65ff717e05cec19b47', 'type' => 'library', 'install_path' => __DIR__ . '/../league/csv', 'aliases' => array(), 'dev_requirement' => false), 'nesbot/carbon' => array('pretty_version' => '2.73.0', 'version' => '2.73.0.0', 'reference' => '9228ce90e1035ff2f0db84b40ec2e023ed802075', 'type' => 'library', 'install_path' => __DIR__ . '/../nesbot/carbon', 'aliases' => array(), 'dev_requirement' => false), 'pelago/emogrifier' => array('pretty_version' => 'v6.0.0', 'version' => '6.0.0.0', 'reference' => 'aa72d5407efac118f3896bcb995a2cba793df0ae', 'type' => 'library', 'install_path' => __DIR__ . '/../pelago/emogrifier', 'aliases' => array(), 'dev_requirement' => false), 'psr/clock' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/clock', 'aliases' => array(), 'dev_requirement' => false), 'psr/clock-implementation' => array('dev_requirement' => false, 'provided' => array(0 => '1.0')), 'sabberworm/php-css-parser' => array('pretty_version' => 'v8.9.0', 'version' => '8.9.0.0', 'reference' => 'd8e916507b88e389e26d4ab03c904a082aa66bb9', 'type' => 'library', 'install_path' => __DIR__ . '/../sabberworm/php-css-parser', 'aliases' => array(), 'dev_requirement' => false), 'sniccowp/php-scoper-wordpress-excludes' => array('pretty_version' => '6.8.1', 'version' => '6.8.1.0', 'reference' => 'c2c18f89a9aa2d7ef1998d233b9ed00d0deff5dd', 'type' => 'library', 'install_path' => __DIR__ . '/../sniccowp/php-scoper-wordpress-excludes', 'aliases' => array(), 'dev_requirement' => true), 'stripe/stripe-php' => array('pretty_version' => 'v16.6.0', 'version' => '16.6.0.0', 'reference' => 'd6de0a536f00b5c5c74f36b8f4d0d93b035499ff', 'type' => 'library', 'install_path' => __DIR__ . '/../stripe/stripe-php', 'aliases' => array(), 'dev_requirement' => false), 'symfony/css-selector' => array('pretty_version' => 'v5.4.45', 'version' => '5.4.45.0', 'reference' => '4f7f3c35fba88146b56d0025d20ace3f3901f097', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/css-selector', 'aliases' => array(), 'dev_requirement' => false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v2.5.4', 'version' => '2.5.4.0', 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false), 'symfony/polyfill-php80' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => false), 'symfony/translation' => array('pretty_version' => 'v5.4.45', 'version' => '5.4.45.0', 'reference' => '98f26acc99341ca4bab345fb14d7b1d7cb825bed', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation', 'aliases' => array(), 'dev_requirement' => false), 'symfony/translation-contracts' => array('pretty_version' => 'v2.5.4', 'version' => '2.5.4.0', 'reference' => '450d4172653f38818657022252f9d81be89ee9a8', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), 'dev_requirement' => false), 'symfony/translation-implementation' => array('dev_requirement' => false, 'provided' => array(0 => '2.3'))));
--- a/wp-user-avatar/wp-user-avatar.php
+++ b/wp-user-avatar/wp-user-avatar.php
@@ -3,7 +3,7 @@
* Plugin Name: ProfilePress
* Plugin URI: https://profilepress.com
* Description: The modern WordPress membership and user profile plugin.
- * Version: 4.16.4
+ * Version: 4.16.5
* Author: ProfilePress Membership Team
* Author URI: https://profilepress.com
* Text Domain: wp-user-avatar
@@ -13,7 +13,7 @@
defined('ABSPATH') or die("No script kiddies please!");
define('PROFILEPRESS_SYSTEM_FILE_PATH', __FILE__);
-define('PPRESS_VERSION_NUMBER', '4.16.4');
+define('PPRESS_VERSION_NUMBER', '4.16.5');
if ( ! defined('PPRESS_STRIPE_API_VERSION')) {
define('PPRESS_STRIPE_API_VERSION', '2024-06-20');