Skip to content

Fix PHPCS and PHPStan issues across multiple files#818

Open
aslamdoctor wants to merge 3 commits intoWordPress:masterfrom
aslamdoctor:437-php-wpcs-fixes
Open

Fix PHPCS and PHPStan issues across multiple files#818
aslamdoctor wants to merge 3 commits intoWordPress:masterfrom
aslamdoctor:437-php-wpcs-fixes

Conversation

@aslamdoctor
Copy link
Contributor

@aslamdoctor aslamdoctor commented Feb 26, 2026

Summary

  • Add PHPStan bootstrap file for runtime constants (TWO_FACTOR_DIR, TWO_FACTOR_VERSION) unreachable during static analysis
  • Add missing properties ($new, $last_used) to Registration class in includes/Yubico/U2F.php
  • Fix PHPDoc types for show_two_factor_login, process_provider, authentication_page, rename_link, delete_link, and pack64
  • Fix undefined variable bug in wp_ajax_inline_save where a non-matching key could be incorrectly updated
  • Add input validation, sanitization (sanitize_text_field), and wp_unslash for $_POST/$_REQUEST usage in class-two-factor-fido-u2f-admin.php
  • Remove redundant isset($user->ID) checks and always-true conditions
  • Cast base_convert() result to (int) for array offset usage in base32_encode()

Reference #437

Test plan

  • Run ./vendor/bin/phpstan analyse --memory-limit=1G --no-progress — should pass with 0 errors at level 0
  • Temporarily set PHPStan level to 3 in phpstan.dist.neon and run analysis — should pass with 0 errors
  • Temporarily set PHPStan level to 4 in phpstan.dist.neon and run analysis — should pass with 0 errors
  • Run ./vendor/bin/phpcs --standard=WordPress providers/class-two-factor-fido-u2f-admin.php — should pass with 0 errors/warnings
  • Verify TOTP authentication and setup still works
  • Verify email-based two-factor authentication still works

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: aslamdoctor <aslamdoctor@git.wordpress.org>
Co-authored-by: masteradhoc <masteradhoc@git.wordpress.org>
Co-authored-by: georgestephanis <georgestephanis@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@masteradhoc
Copy link
Collaborator

@aslamdoctor U2F.php and fido-u2f-admin you can ignore, we'll remove them in PR #439 completely.

@masteradhoc masteradhoc requested review from georgestephanis, kasparsd and masteradhoc and removed request for kasparsd and masteradhoc February 28, 2026 21:43
Comment on lines +1 to +10
<?php
/**
* PHPStan bootstrap file.
*
* Defines constants that are set at runtime in two-factor.php
* but unreachable during static analysis because of the ABSPATH guard.
*/

define( 'TWO_FACTOR_DIR', __DIR__ . '/' );
define( 'TWO_FACTOR_VERSION', '0.15.0' );
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I almost wonder if this would be good to rename more generally and include from the main plugin file so these aren't needing to be maintained in multiple places?

I could be overthinking this though.

- Add PHPStan bootstrap file for runtime constants (TWO_FACTOR_DIR, TWO_FACTOR_VERSION)
- Add missing properties ($new, $last_used) to Registration class
- Fix PHPDoc types for show_two_factor_login, process_provider, authentication_page,
  rename_link, delete_link, and pack64
- Fix undefined variable bug in wp_ajax_inline_save
- Add input validation, sanitization, and wp_unslash for $_POST/$_REQUEST usage
- Remove redundant isset($user->ID) checks and always-true conditions
- Cast base_convert() result to int for array offset usage
FIDO/U2F files will be removed entirely in PR WordPress#439, so changes
to U2F.php and class-two-factor-fido-u2f-admin.php are unnecessary.
public function validate_authentication( $user ) {
$code = $this->sanitize_code_from_request( 'two-factor-email-code' );
if ( ! isset( $user->ID ) || ! $code ) {
if ( ! $code ) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A number of these extra conditionals that you're clearing are there to account for unit tests that pass in false to authentication page methods --

#19

Are we sure they're safe to remove in the testing context as well as the real-world use context?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! Tests do pass false as $user to these methods (e.g. test_authentication_page_no_user), so removing isset($user->ID) without a replacement guard would cause errors when $code is truthy or the resend param is set.

I've added explicit early return guards (if ( \! $user ) return false;) to both pre_process_authentication() and validate_authentication(), matching the pattern already used in authentication_page(). Also updated the @param docs to WP_User|false.

@georgestephanis
Copy link
Collaborator

Whoops my stuff was outdated. That's what I get for being up and working early on a Sunday.

@masteradhoc
Copy link
Collaborator

Thanks for your reviews @georgestephanis. Always highly appreciated!! :)

@aslamdoctor
Copy link
Contributor Author

Can you mark them resolved? I didn't as I wanted to make sure all is ok.

Tests pass false as $user to authentication methods. Replace the
removed isset($user->ID) checks with explicit early return guards
to safely handle this case without accessing properties on false.
@masteradhoc masteradhoc added this to the 0.17.0 milestone Mar 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants