@@ -473,6 +473,99 @@ public function test_password_is_hashed_with_bcrypt() {
473
473
$ this ->assertSame ( self ::$ user_id , $ user ->ID );
474
474
}
475
475
476
+ public function data_passwords (): array {
477
+ return array (
478
+ array ( 'a ' ),
479
+ array ( 'password ' ),
480
+ array ( str_repeat ( 'a ' , self ::$ password_length_limit ) ),
481
+ );
482
+ }
483
+
484
+ /**
485
+ * Ensure the hash of the user password remains less than 64 characters in length to account for the old users table schema.
486
+ *
487
+ * @ticket 21022
488
+ * @dataProvider data_passwords
489
+ */
490
+ public function test_user_password_against_old_users_table_schema ( string $ password ) {
491
+ // Mimic the schema of the users table prior to WordPress 4.4.
492
+ add_filter ( 'wp_pre_insert_user_data ' , array ( $ this , 'mimic_users_schema_prior_to_44 ' ) );
493
+
494
+ $ username = 'old-schema-user ' ;
495
+
496
+ // Create a user.
497
+ $ user_id = $ this ->factory ()->user ->create (
498
+ array (
499
+ 'user_login ' => $ username ,
500
+ 'user_email ' =>
'[email protected] ' ,
501
+ 'user_pass ' => $ password ,
502
+ )
503
+ );
504
+
505
+ // Check the user can authenticate.
506
+ $ user = wp_authenticate ( $ username , $ password );
507
+
508
+ $ this ->assertNotWPError ( $ user );
509
+ $ this ->assertInstanceOf ( 'WP_User ' , $ user );
510
+ $ this ->assertSame ( $ user_id , $ user ->ID , 'User should be able to authenticate ' );
511
+ $ this ->assertNotSame ( self ::$ user_id , $ user ->ID , 'A unique user must be created for this test, the shared fixture must not be used ' );
512
+ }
513
+
514
+ /**
515
+ * Ensure the hash of the user activation key remains less than 60 characters in length to account for the old users table schema.
516
+ *
517
+ * @ticket 21022
518
+ */
519
+ public function test_user_activation_key_against_old_users_table_schema () {
520
+ // Mimic the schema of the users table prior to WordPress 4.4.
521
+ add_filter ( 'wp_pre_insert_user_data ' , array ( $ this , 'mimic_users_schema_prior_to_44 ' ) );
522
+
523
+ $ username = 'old-schema-user ' ;
524
+
525
+ // Create a user.
526
+ $ user_id = $ this ->factory ()->user ->create (
527
+ array (
528
+ 'user_login ' => $ username ,
529
+ 'user_email ' =>
'[email protected] ' ,
530
+ )
531
+ );
532
+
533
+ $ user = get_userdata ( $ user_id );
534
+ $ key = get_password_reset_key ( $ user );
535
+
536
+ // A correctly saved key should be accepted.
537
+ $ check = check_password_reset_key ( $ key , $ user ->user_login );
538
+
539
+ $ this ->assertNotWPError ( $ check );
540
+ $ this ->assertInstanceOf ( 'WP_User ' , $ check );
541
+ $ this ->assertSame ( $ user ->ID , $ check ->ID );
542
+ $ this ->assertNotSame ( self ::$ user_id , $ user ->ID , 'A unique user must be created for this test, the shared fixture must not be used ' );
543
+ }
544
+
545
+ /*
546
+ * Fake the schema of the users table prior to WordPress 4.4 to mimic sites that are using the
547
+ * `DO_NOT_UPGRADE_GLOBAL_TABLES` constant and have not updated the users table schema.
548
+ *
549
+ * The schema of the wp_users table on wordpress.org has not been updated since the schema was changed in [35638]
550
+ * for WordPress 4.4, which means the `user_activation_key` field remains at 60 characters length and the `user_pass`
551
+ * field remains at 64 characters length instead of the expected 255. Although this is unlikely to affect other
552
+ * sites, this can be accommodated for in the codebase.
553
+ *
554
+ * Actually altering the database schema during tests will commit the transaction and break subsequent tests, hence
555
+ * the use of this filter.
556
+ */
557
+ public function mimic_users_schema_prior_to_44 ( array $ data ): array {
558
+ if ( isset ( $ data ['user_pass ' ] ) ) {
559
+ $ this ->assertLessThanOrEqual ( 64 , strlen ( $ data ['user_pass ' ] ) );
560
+ }
561
+
562
+ if ( isset ( $ data ['user_activation_key ' ] ) ) {
563
+ $ this ->assertLessThanOrEqual ( 60 , strlen ( $ data ['user_activation_key ' ] ) );
564
+ }
565
+
566
+ return $ data ;
567
+ }
568
+
476
569
/**
477
570
* @ticket 21022
478
571
*/
0 commit comments