123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- /**
- * @group error-protection
- */
- class Tests_Recovery_Mode_Key_Service extends WP_UnitTestCase {
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::generate_recovery_mode_token
- * @covers WP_Recovery_Mode_Cookie_Service::generate_and_store_recovery_mode_key
- */
- public function test_generate_and_store_recovery_mode_key_returns_recovery_key() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $key = $service->generate_and_store_recovery_mode_key( $token );
- $this->assertNotWPError( $key );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_no_key_set() {
- $service = new WP_Recovery_Mode_Key_Service();
- $error = $service->validate_recovery_mode_key( '', 'abcd', HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'token_not_found', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_data_missing() {
- update_option( 'recovery_keys', 'gibberish' );
- $service = new WP_Recovery_Mode_Key_Service();
- $error = $service->validate_recovery_mode_key( '', 'abcd', HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'token_not_found', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_bad() {
- update_option( 'recovery_keys', array( 'token' => 'gibberish' ) );
- $service = new WP_Recovery_Mode_Key_Service();
- $error = $service->validate_recovery_mode_key( 'token', 'abcd', HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'invalid_recovery_key_format', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_stored_format_is_invalid() {
- $token = wp_generate_password( 22, false );
- update_option( 'recovery_keys', array( $token => 'gibberish' ) );
- $service = new WP_Recovery_Mode_Key_Service();
- $error = $service->validate_recovery_mode_key( $token, 'abcd', HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'invalid_recovery_key_format', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_empty_key() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $service->generate_and_store_recovery_mode_key( $token );
- $error = $service->validate_recovery_mode_key( $token, '', HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'hash_mismatch', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_hash_mismatch() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $service->generate_and_store_recovery_mode_key( $token );
- $error = $service->validate_recovery_mode_key( $token, 'abcd', HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'hash_mismatch', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_wp_error_if_expired() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $key = $service->generate_and_store_recovery_mode_key( $token );
- $records = get_option( 'recovery_keys' );
- $records[ $token ]['created_at'] = time() - HOUR_IN_SECONDS - 30;
- update_option( 'recovery_keys', $records );
- $error = $service->validate_recovery_mode_key( $token, $key, HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'key_expired', $error->get_error_code() );
- }
- /**
- * @ticket 46130
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_true_for_valid_key() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $key = $service->generate_and_store_recovery_mode_key( $token );
- $this->assertTrue( $service->validate_recovery_mode_key( $token, $key, HOUR_IN_SECONDS ) );
- }
- /**
- * @ticket 46595
- *
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_error_if_token_used_more_than_once() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $key = $service->generate_and_store_recovery_mode_key( $token );
- $this->assertTrue( $service->validate_recovery_mode_key( $token, $key, HOUR_IN_SECONDS ) );
- // Data should be remove by first call.
- $error = $service->validate_recovery_mode_key( $token, $key, HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'token_not_found', $error->get_error_code() );
- }
- /**
- * @ticket 46595
- *
- * @covers WP_Recovery_Mode_Cookie_Service::generate_recovery_mode_token
- * @covers WP_Recovery_Mode_Cookie_Service::generate_and_store_recovery_mode_key
- * @covers WP_Recovery_Mode_Cookie_Service::validate_recovery_mode_key
- */
- public function test_validate_recovery_mode_key_returns_error_if_token_used_more_than_once_more_than_key_stored() {
- $service = new WP_Recovery_Mode_Key_Service();
- // Create an extra key.
- $token = $service->generate_recovery_mode_token();
- $service->generate_and_store_recovery_mode_key( $token );
- $token = $service->generate_recovery_mode_token();
- $key = $service->generate_and_store_recovery_mode_key( $token );
- $this->assertTrue( $service->validate_recovery_mode_key( $token, $key, HOUR_IN_SECONDS ) );
- // Data should be remove by first call.
- $error = $service->validate_recovery_mode_key( $token, $key, HOUR_IN_SECONDS );
- $this->assertWPError( $error );
- $this->assertSame( 'token_not_found', $error->get_error_code() );
- }
- /**
- * @ticket 46595
- *
- * @covers WP_Recovery_Mode_Cookie_Service::clean_expired_keys
- */
- public function test_clean_expired_keys() {
- $service = new WP_Recovery_Mode_Key_Service();
- $token = $service->generate_recovery_mode_token();
- $service->generate_and_store_recovery_mode_key( $token );
- $records = get_option( 'recovery_keys' );
- $records[ $token ]['created_at'] = time() - HOUR_IN_SECONDS - 30;
- update_option( 'recovery_keys', $records );
- $service->clean_expired_keys( HOUR_IN_SECONDS );
- $this->assertEmpty( get_option( 'recovery_keys' ) );
- }
- }
|