Skip to content

Commit a3f28d0

Browse files
committed
fix: distinguish unchanged enrollment meta
1 parent eb7e9aa commit a3f28d0

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

providers/class-two-factor-totp.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ public function rest_begin_enrollment( $request ) {
331331
'expires_at' => $expires_at,
332332
);
333333

334-
if ( ! update_user_meta( $user->ID, self::PENDING_ENROLLMENT_META_KEY, $pending ) ) {
334+
if ( ! update_user_meta( $user->ID, self::PENDING_ENROLLMENT_META_KEY, $pending ) && get_user_meta( $user->ID, self::PENDING_ENROLLMENT_META_KEY, true ) !== $pending ) {
335335
return new WP_Error( 'db_error', __( 'Unable to begin Two Factor Authentication enrollment.', 'two-factor' ), array( 'status' => 500 ) );
336336
}
337337

tests/providers/class-two-factor-totp-rest-api.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,40 @@ public function test_begin_and_confirm_server_owned_enrollment() {
349349
Two_Factor_Totp::set_time( null );
350350
}
351351

352+
/**
353+
* An unchanged pending enrollment value is not a database error.
354+
*
355+
* @covers Two_Factor_Totp::rest_begin_enrollment
356+
*/
357+
public function test_begin_enrollment_accepts_unchanged_meta_update() {
358+
wp_set_current_user( self::$admin_id );
359+
360+
$filter = function ( $check, $user_id, $meta_key, $meta_value ) use ( &$filter ) {
361+
if ( Two_Factor_Totp::PENDING_ENROLLMENT_META_KEY !== $meta_key ) {
362+
return $check;
363+
}
364+
365+
remove_filter( 'update_user_metadata', $filter );
366+
update_user_meta( $user_id, $meta_key, $meta_value );
367+
368+
return false;
369+
};
370+
add_filter( 'update_user_metadata', $filter, 10, 4 );
371+
372+
$request = new WP_REST_Request( 'POST', '/' . Two_Factor_Core::REST_NAMESPACE . '/totp/enrollment' );
373+
$request->set_body_params( array( 'user_id' => self::$admin_id ) );
374+
$response = rest_do_request( $request );
375+
$data = $response->get_data();
376+
377+
remove_filter( 'update_user_metadata', $filter );
378+
379+
$this->assertSame( 200, $response->get_status() );
380+
$pending = get_user_meta( self::$admin_id, Two_Factor_Totp::PENDING_ENROLLMENT_META_KEY, true );
381+
$this->assertSame( $data['secret'], $pending['key'] );
382+
383+
delete_user_meta( self::$admin_id, Two_Factor_Totp::PENDING_ENROLLMENT_META_KEY );
384+
}
385+
352386
/**
353387
* A newer enrollment replaces the previous pending secret.
354388
*

0 commit comments

Comments
 (0)