feat(privacy): add check for missing wp_privacy_personal_data_exporters registration#1292
Conversation
Add a new static check that warns plugin authors when their plugin handles personal data (user meta, comment meta, direct DB writes) but does not register a callback via the wp_privacy_personal_data_exporters filter. - New check class: Personal_Data_Exporter_Check - Registered in Default_Check_Repository under 'personal_data_exporter' - PHPUnit test class with three test cases - Test data plugins (with and without exporter registration) Fixes WordPress#1251
|
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 If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message. To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
|
Thanks for tackling this, @faisalahammad! I tested the branch locally in wp-env against a few plugins. The
False positives from matching raw text. Because the check runs regex over file contents rather than tokens: (a) a plugin that mentions Scope. Even after the Minor: the |
- switch to token scanner to skip comments and match $wpdb correctly - add experimental trait to avoid noisy stable warnings - exclude plugin's own tests/ directory - fix @SInCE tags to 2.0.0 - add docs/checks.md row and new wpdb-insert test case
|
Thanks for the detailed review. Pushed fixes for everything you flagged. Big ones:
Minor:
Also added a 4th PHPUnit test for the $wpdb->insert case and a matching testdata plugin. All 476 phpunit tests pass, phpcs clean, phpstan clean, coderabbit review clean. Let me know if anything else needs a look. |
- extract is_personal_data_function_call helper to reduce NPath complexity - extract is_wpdb_method_call helper to reduce NPath complexity - extract is_exporter_filter_registration helper to reduce NPath complexity Errors fixed: - PHPMD NPathComplexity: find_file_with_personal_data_signal() from 3154 to < 50 - PHPMD NPathComplexity: plugin_registers_exporter() from 1300 to < 50 - PHPMD CyclomaticComplexity: find_file_with_personal_data_signal() from 21 to < 10 PHP 7.4+ compatible. All CI checks passing.
Summary
Adds a new static check,
Personal_Data_Exporter_Check, that warns plugin authors when their plugin stores personal data (user meta, comment meta, or direct DB writes) but does not register an exporter callback via thewp_privacy_personal_data_exportersfilter. Since WordPress 4.9.6, plugins handling personal data are expected to hook into the Personal Data Export tool so site admins can fulfill GDPR data export requests.Fixes #1251
Changes
includes/Checker/Checks/Plugin_Repo/Personal_Data_Exporter_Check.php(new)A two-phase static file check:
add_user_meta,update_user_meta,add_comment_meta,update_comment_meta,$wpdb->insert/update/replace)add_filter( 'wp_privacy_personal_data_exporters', ... )— if absent, emit a severity-5 warningThe two-step approach avoids false positives on plugins that don't touch personal data at all.
includes/Checker/Default_Check_Repository.phpAfter:
Why: Registers the check under the
Plugin_Repocategory so it runs by default alongside other plugin directory compliance checks.Testing
Test 1: Plugin stores user meta, no exporter registered (expects warning)
update_user_meta()with no exporter filtermissing_personal_data_exporterappears ✅Test 2: Plugin stores user meta, exporter registered (expects clean)
update_user_meta()and registersadd_filter( 'wp_privacy_personal_data_exporters', ... )missing_personal_data_exporterwarning ✅Test 3: Plugin has no personal data handling (expects clean)
missing_personal_data_exporterwarning ✅PHPUnit test class added at
tests/phpunit/tests/Checker/Checks/Personal_Data_Exporter_Check_Tests.phpcovering all three scenarios.