Skip to content

Commit cb7749f

Browse files
authored
Jetpack Sync: Add an extra flag on User role update events (#36112)
* Jetpack Sync: Update Users module with explicit flags on role changes
1 parent e79d560 commit cb7749f

File tree

4 files changed

+65
-12
lines changed

4 files changed

+65
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Significance: patch
2+
Type: changed
3+
Comment: Jetpack Sync: Adds an extra flag on User role update events
4+
5+

projects/packages/sync/src/modules/class-users.php

+43-2
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ public function init_listeners( $callable ) {
127127
add_action( 'jetpack_removed_user_from_blog', $callable, 10, 2 );
128128

129129
// User roles.
130-
add_action( 'add_user_role', array( $this, 'save_user_role_handler' ), 10, 2 );
130+
add_action( 'add_user_role', array( $this, 'add_user_role_handler' ), 10, 2 );
131131
add_action( 'set_user_role', array( $this, 'save_user_role_handler' ), 10, 3 );
132-
add_action( 'remove_user_role', array( $this, 'save_user_role_handler' ), 10, 2 );
132+
add_action( 'remove_user_role', array( $this, 'remove_user_role_handler' ), 10, 2 );
133133

134134
// User capabilities.
135135
add_action( 'added_user_meta', array( $this, 'maybe_save_user_meta' ), 10, 4 );
@@ -512,6 +512,9 @@ public function save_user_handler( $user_id, $old_user_data = null ) {
512512
if ( false === $user->has_prop( $user_field ) ) {
513513
continue;
514514
}
515+
if ( 'ID' === $user_field ) {
516+
continue;
517+
}
515518
if ( $user->$user_field !== $field_value ) {
516519
if ( 'user_email' === $user_field ) {
517520
/**
@@ -547,6 +550,44 @@ public function save_user_handler( $user_id, $old_user_data = null ) {
547550
}
548551
}
549552

553+
/**
554+
* Handler for add user role change.
555+
*
556+
* @access public
557+
*
558+
* @param int $user_id ID of the user.
559+
* @param string $role New user role.
560+
*/
561+
public function add_user_role_handler( $user_id, $role ) {
562+
$this->add_flags(
563+
$user_id,
564+
array(
565+
'role_added' => $role,
566+
)
567+
);
568+
569+
$this->save_user_role_handler( $user_id, $role );
570+
}
571+
572+
/**
573+
* Handler for remove user role change.
574+
*
575+
* @access public
576+
*
577+
* @param int $user_id ID of the user.
578+
* @param string $role Removed user role.
579+
*/
580+
public function remove_user_role_handler( $user_id, $role ) {
581+
$this->add_flags(
582+
$user_id,
583+
array(
584+
'role_removed' => $role,
585+
)
586+
);
587+
588+
$this->save_user_role_handler( $user_id, $role );
589+
}
590+
550591
/**
551592
* Handler for user role change.
552593
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Significance: patch
2+
Type: other
3+
Comment: Jetpack plugin: Update Sync related unit tests
4+
5+

projects/plugins/jetpack/tests/php/sync/test_class.jetpack-sync-users.php

+12-10
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,10 @@ public function test_user_add_role_is_synced() {
221221
$client_user = get_user_by( 'id', $this->user_id );
222222
unset( $client_user->data->user_pass );
223223
$this->assertUsersEqual( $client_user, $server_user );
224+
225+
$save_event = $this->server_event_storage->get_most_recent_event( 'jetpack_sync_save_user' );
226+
$this->assertSame( 'author', $save_event->args[1]['role_added'] );
227+
$this->assertEquals( $this->user_id, $save_event->args[0]->ID );
224228
}
225229

226230
public function test_user_set_role_is_synced() {
@@ -233,6 +237,9 @@ public function test_user_set_role_is_synced() {
233237
$client_user = get_user_by( 'id', $this->user_id );
234238
unset( $client_user->data->user_pass );
235239
$this->assertUsersEqual( $client_user, $server_user );
240+
241+
$save_event = $this->server_event_storage->get_most_recent_event( 'jetpack_sync_save_user' );
242+
$this->assertTrue( $save_event->args[1]['role_changed'] );
236243
}
237244

238245
public function test_user_set_role_is_synced_in_wp_update_user_context() {
@@ -261,23 +268,18 @@ public function test_user_set_role_is_synced_in_wp_update_user_context() {
261268

262269
public function test_user_remove_role_is_synced() {
263270
$user = get_user_by( 'id', $this->user_id );
264-
$user->add_role( 'author' );
265-
$this->sender->do_sync();
266-
267-
$server_user = $this->server_replica_storage->get_user( $this->user_id );
268-
$client_user = get_user_by( 'id', $this->user_id );
269-
unset( $client_user->data->user_pass );
270-
$this->assertUsersEqual( $client_user, $server_user );
271-
272-
// lets now remove role
273-
$user->remove_role( 'author' );
271+
$user->remove_role( 'subscriber' );
274272
$this->sender->do_sync();
275273

276274
$server_user = $this->server_replica_storage->get_user( $this->user_id );
277275

278276
$client_user = get_user_by( 'id', $this->user_id );
279277
unset( $client_user->data->user_pass );
280278
$this->assertUsersEqual( $client_user, $server_user );
279+
280+
$save_event = $this->server_event_storage->get_most_recent_event( 'jetpack_sync_save_user' );
281+
$this->assertSame( 'subscriber', $save_event->args[1]['role_removed'] );
282+
$this->assertEquals( $this->user_id, $save_event->args[0]->ID );
281283
}
282284

283285
// Capabilities syncing

0 commit comments

Comments
 (0)