From 1442c0605fb30c6fd9cdbffd198d05807a0bb088 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 16 Jun 2025 17:13:56 +0300 Subject: [PATCH] Handle temporary user context switching in email actions Introduces a mechanism to temporarily switch user context with `um_fetch_user` only when necessary, avoiding unintended user data overwrites. Ensures previous user context is restored after async email actions are triggered. This prevents potential conflicts in scenarios involving concurrent user operations. --- includes/common/class-users.php | 94 ++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 12 deletions(-) diff --git a/includes/common/class-users.php b/includes/common/class-users.php index 79c6a4fc..6505ec0e 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -384,8 +384,11 @@ class Users { $userdata = get_userdata( $user_id ); - $current_user_id = get_current_user_id(); - um_fetch_user( $user_id ); + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', @@ -404,7 +407,10 @@ class Users { ) ); - um_fetch_user( $current_user_id ); + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } + /** * Fires after User has been set as pending email confirmation. * @@ -470,7 +476,25 @@ class Users { $this->reset_activation_link( $user_id ); $userdata = get_userdata( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'inactive_email', array( 'fetch_user_id' => $user_id ) ) ); + + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'inactive_email', + array( 'fetch_user_id' => $user_id ), + ) + ); + + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been deactivated. @@ -542,7 +566,25 @@ class Users { $this->reset_activation_link( $user_id ); $userdata = get_userdata( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'rejected_email', array( 'fetch_user_id' => $user_id ) ) ); + + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'rejected_email', + array( 'fetch_user_id' => $user_id ), + ) + ); + + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been rejected. @@ -620,7 +662,25 @@ class Users { $this->reset_activation_link( $user_id ); $userdata = get_userdata( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'pending_email', array( 'fetch_user_id' => $user_id ) ) ); + + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'pending_email', + array( 'fetch_user_id' => $user_id ), + ) + ); + + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been set as pending admin review. @@ -728,8 +788,11 @@ class Users { } } - $current_user_id = get_current_user_id(); - um_fetch_user( $user_id ); + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', @@ -744,7 +807,9 @@ class Users { ) ); - um_fetch_user( $current_user_id ); + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } } /** * Fires after User has been approved. @@ -814,8 +879,11 @@ class Users { $userdata = get_userdata( $user_id ); - $current_user_id = get_current_user_id(); - um_fetch_user( $user_id ); + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } $reset_pw_link = UM()->password()->reset_url( $user_id ); @@ -851,7 +919,9 @@ class Users { ) ); - um_fetch_user( $current_user_id ); + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been reactivated.