Changeset 64337
- Timestamp:
- 10/13/2026 07:54:18 PM (less than one hour ago)
- Location:
- trunk
- Files:
-
- 48 added
- 10 edited
-
src/wp-admin/includes/class-wp-site-health.php (modified) (1 diff)
-
src/wp-admin/includes/schema.php (modified) (2 diffs)
-
src/wp-admin/includes/secrets-site-health.php (added)
-
src/wp-admin/includes/upgrade.php (modified) (2 diffs)
-
src/wp-includes/capabilities.php (modified) (1 diff)
-
src/wp-includes/load.php (modified) (1 diff)
-
src/wp-includes/secrets (added)
-
src/wp-includes/secrets.php (added)
-
src/wp-includes/secrets/class-wp-secret-version.php (added)
-
src/wp-includes/secrets/class-wp-secret.php (added)
-
src/wp-includes/secrets/class-wp-secrets-broken-keyring.php (added)
-
src/wp-includes/secrets/class-wp-secrets-broken-provider.php (added)
-
src/wp-includes/secrets/class-wp-secrets-broken-store.php (added)
-
src/wp-includes/secrets/class-wp-secrets-cipher.php (added)
-
src/wp-includes/secrets/class-wp-secrets-config-key-provider.php (added)
-
src/wp-includes/secrets/class-wp-secrets-key-manager.php (added)
-
src/wp-includes/secrets/class-wp-secrets-libsodium-provider.php (added)
-
src/wp-includes/secrets/class-wp-secrets-option-store.php (added)
-
src/wp-includes/secrets/interface-wp-secrets-keyring.php (added)
-
src/wp-includes/secrets/interface-wp-secrets-provider.php (added)
-
src/wp-includes/secrets/interface-wp-secrets-store.php (added)
-
src/wp-includes/version.php (modified) (1 diff)
-
src/wp-settings.php (modified) (2 diffs)
-
tests/phpstan/base.neon (modified) (1 diff)
-
tests/phpunit/includes/bootstrap.php (modified) (2 diffs)
-
tests/phpunit/includes/secrets (added)
-
tests/phpunit/includes/secrets/class-mock-keyring.php (added)
-
tests/phpunit/includes/secrets/class-mock-store.php (added)
-
tests/phpunit/includes/secrets/class-wp-secrets-keyring-conformance.php (added)
-
tests/phpunit/includes/secrets/class-wp-secrets-provider-conformance.php (added)
-
tests/phpunit/includes/secrets/trait-wp-secrets-assertions.php (added)
-
tests/phpunit/tests/secrets (added)
-
tests/phpunit/tests/secrets/brokenDropinFallbacks.php (added)
-
tests/phpunit/tests/secrets/capabilities.php (added)
-
tests/phpunit/tests/secrets/configKeyringConformance.php (added)
-
tests/phpunit/tests/secrets/errorCodes.php (added)
-
tests/phpunit/tests/secrets/extensionPoints.php (added)
-
tests/phpunit/tests/secrets/mockKeyringConformance.php (added)
-
tests/phpunit/tests/secrets/networkScope.php (added)
-
tests/phpunit/tests/secrets/provider.php (added)
-
tests/phpunit/tests/secrets/providerConformance.php (added)
-
tests/phpunit/tests/secrets/readonlyProviderConformance.php (added)
-
tests/phpunit/tests/secrets/siteHealth.php (added)
-
tests/phpunit/tests/secrets/threeStateContract.php (added)
-
tests/phpunit/tests/secrets/versionSlots.php (added)
-
tests/phpunit/tests/secrets/wpDeleteSecret.php (added)
-
tests/phpunit/tests/secrets/wpImportOptionAsSecret.php (added)
-
tests/phpunit/tests/secrets/wpListSecrets.php (added)
-
tests/phpunit/tests/secrets/wpSecret.php (added)
-
tests/phpunit/tests/secrets/wpSecretVersion.php (added)
-
tests/phpunit/tests/secrets/wpSecretsCipher.php (added)
-
tests/phpunit/tests/secrets/wpSecretsConfigKeyProvider.php (added)
-
tests/phpunit/tests/secrets/wpSecretsKeyManager.php (added)
-
tests/phpunit/tests/secrets/wpSecretsMemzero.php (added)
-
tests/phpunit/tests/secrets/wpSecretsOptionStore.php (added)
-
tests/phpunit/tests/secrets/wpSecretsValidateName.php (added)
-
tests/phpunit/tests/secrets/wpSetSecretAndWpGetSecret.php (added)
-
tests/phpunit/tests/user/capabilities.php (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-admin/includes/class-wp-site-health.php
r63443 r64337 7 7 * @since 5.2.0 8 8 */ 9 10 11 require_once __DIR__ . '/secrets-site-health.php'; 9 12 10 13 #[AllowDynamicProperties] -
trunk/src/wp-admin/includes/schema.php
r62334 r64337 733 733 populate_roles_280(); 734 734 populate_roles_300(); 735 populate_roles_720(); 735 736 736 737 // Save the updated roles to the database. … … 969 970 } 970 971 972 /** 973 * Create and modify WordPress roles for WordPress 7.2. 974 * 975 * @since 7.2.0 976 */ 977 function populate_roles_720(): void { 978 $role = get_role( 'administrator' ); 979 980 if ( ! empty( $role ) ) { 981 $role->add_cap( 'manage_secrets' ); 982 } 983 } 984 971 985 if ( ! function_exists( 'install_network' ) ) : 972 986 /** -
trunk/src/wp-admin/includes/upgrade.php
r64163 r64337 893 893 } 894 894 895 if ( $wp_current_db_version < 64337 ) { 896 upgrade_720(); 897 } 898 895 899 maybe_disable_link_manager(); 896 900 … … 2504 2508 2505 2509 /** 2510 * Executes changes made in WordPress 7.2. 2511 * 2512 * @ignore 2513 * @since 7.2.0 2514 * 2515 * @global int $wp_current_db_version The old (current) database version. 2516 */ 2517 function upgrade_720(): void { 2518 global $wp_current_db_version; 2519 2520 // Grant the Secrets API's site-level capability to administrators. 2521 if ( $wp_current_db_version < 64337 ) { 2522 populate_roles_720(); 2523 } 2524 } 2525 2526 /** 2506 2527 * Executes network-level upgrade routines. 2507 2528 * -
trunk/src/wp-includes/capabilities.php
r64336 r64337 768 768 case 'manage_network_themes': 769 769 case 'manage_network_options': 770 case 'manage_network_secrets': 770 771 case 'upgrade_network': 771 772 $caps[] = $cap; -
trunk/src/wp-includes/load.php
r64305 r64337 826 826 827 827 /** 828 * Loads the secrets.php drop-in, if one exists, and records whether it left the 829 * Secrets API's provider, store, and keyring overrides in a usable state. 830 * 831 * Runs once, before must-use plugins load, so that every interface a drop-in's 832 * classes implement already exists and every plugin sees the drop-in's provider. 833 * 834 * Sets `$GLOBALS['wp_secrets_dropin_loaded']` as soon as the file is found, whether 835 * or not it then loads cleanly: wp_using_secrets_dropin() reports presence, not 836 * health. 837 * 838 * Sets `$GLOBALS['wp_secrets_dropin_broken']` when the require throws, or when any of 839 * `$GLOBALS['wp_secrets_provider']`, `$GLOBALS['wp_secrets_store']`, or 840 * `$GLOBALS['wp_secrets_keyring']` is set to something that does not implement its 841 * interface. A global left unset is fine: a drop-in that overrides only the keyring 842 * leaves the other two alone. Once the flag is set, every Secrets API operation 843 * returns WP_Error for the rest of the request rather than falling back to the 844 * default provider, so a broken drop-in reads as unreachable, never as absent. 845 * 846 * PHP treats a class that implements an interface but omits a required method as an 847 * uncatchable fatal error, even inside the try/catch around the require. That case 848 * cannot be intercepted from PHP code. 849 * 850 * @since 7.2.0 851 * @access private 852 */ 853 function wp_load_secrets_dropin(): void { 854 static $loaded = false; 855 856 if ( $loaded ) { 857 return; 858 } 859 860 $loaded = true; 861 862 $dropin_path = WP_CONTENT_DIR . '/secrets.php'; 863 864 if ( ! file_exists( $dropin_path ) ) { 865 return; 866 } 867 868 $GLOBALS['wp_secrets_dropin_loaded'] = true; 869 870 try { 871 require $dropin_path; 872 } catch ( Throwable $e ) { 873 $GLOBALS['wp_secrets_dropin_broken'] = true; 874 875 return; 876 } 877 878 if ( isset( $GLOBALS['wp_secrets_store'] ) && ! ( $GLOBALS['wp_secrets_store'] instanceof WP_Secrets_Store ) ) { 879 $GLOBALS['wp_secrets_dropin_broken'] = true; 880 } 881 882 if ( isset( $GLOBALS['wp_secrets_keyring'] ) && ! ( $GLOBALS['wp_secrets_keyring'] instanceof WP_Secrets_Keyring ) ) { 883 $GLOBALS['wp_secrets_dropin_broken'] = true; 884 } 885 886 if ( isset( $GLOBALS['wp_secrets_provider'] ) && ! ( $GLOBALS['wp_secrets_provider'] instanceof WP_Secrets_Provider ) ) { 887 $GLOBALS['wp_secrets_dropin_broken'] = true; 888 } 889 } 890 891 /** 828 892 * Starts the WordPress object cache. 829 893 * -
trunk/src/wp-includes/version.php
r63167 r64337 24 24 * @global int $wp_db_version 25 25 */ 26 $wp_db_version = 6 1833;26 $wp_db_version = 64337; 27 27 28 28 /** -
trunk/src/wp-settings.php
r64327 r64337 312 312 require ABSPATH . WPINC . '/admin-bar.php'; 313 313 require ABSPATH . WPINC . '/class-wp-application-passwords.php'; 314 require ABSPATH . WPINC . '/secrets.php'; 315 require ABSPATH . WPINC . '/secrets/class-wp-secret-version.php'; 316 require ABSPATH . WPINC . '/secrets/class-wp-secret.php'; 317 require ABSPATH . WPINC . '/secrets/interface-wp-secrets-provider.php'; 318 require ABSPATH . WPINC . '/secrets/interface-wp-secrets-keyring.php'; 319 require ABSPATH . WPINC . '/secrets/interface-wp-secrets-store.php'; 320 require ABSPATH . WPINC . '/secrets/class-wp-secrets-config-key-provider.php'; 321 require ABSPATH . WPINC . '/secrets/class-wp-secrets-broken-keyring.php'; 322 require ABSPATH . WPINC . '/secrets/class-wp-secrets-cipher.php'; 323 require ABSPATH . WPINC . '/secrets/class-wp-secrets-key-manager.php'; 324 require ABSPATH . WPINC . '/secrets/class-wp-secrets-option-store.php'; 325 require ABSPATH . WPINC . '/secrets/class-wp-secrets-broken-store.php'; 326 require ABSPATH . WPINC . '/secrets/class-wp-secrets-libsodium-provider.php'; 327 require ABSPATH . WPINC . '/secrets/class-wp-secrets-broken-provider.php'; 314 328 require ABSPATH . WPINC . '/abilities-api/class-wp-ability-category.php'; 315 329 require ABSPATH . WPINC . '/abilities-api/class-wp-ability-categories-registry.php'; … … 509 523 require_once ABSPATH . 'wp-admin/includes/plugin.php'; 510 524 525 // Load the secrets.php drop-in, which may replace the Secrets API's provider, store, or keyring. 526 wp_load_secrets_dropin(); 527 511 528 // Load must-use plugins. 512 529 foreach ( wp_get_mu_plugins() as $mu_plugin ) { -
trunk/tests/phpstan/base.neon
r64237 r64337 133 133 - HEADER_IMAGE_WIDTH 134 134 - HEADER_TEXTCOLOR 135 - LOGGED_IN_KEY 136 - LOGGED_IN_SALT 135 137 - MEDIA_TRASH 136 138 - MULTISITE -
trunk/tests/phpunit/includes/bootstrap.php
r63300 r64337 29 29 30 30 require_once $config_file_path; 31 32 /* 33 * The Secrets API will not derive a key from the placeholder salts that 34 * wp-tests-config-sample.php ships with, so give the suite a fixed test key. 35 * 36 * Not in a process-isolated test: PHPUnit sets $GLOBALS['__PHPUNIT_BOOTSTRAP'] 37 * while it loads this file in a child process, and the Secrets API tests that 38 * run isolated do so precisely to define WP_SECRETS_KEY themselves, or to 39 * leave it undefined. 40 */ 41 if ( ! defined( 'WP_SECRETS_KEY' ) && ! isset( $GLOBALS['__PHPUNIT_BOOTSTRAP'] ) 42 && defined( 'LOGGED_IN_KEY' ) && 'put your unique phrase here' === LOGGED_IN_KEY 43 ) { 44 define( 'WP_SECRETS_KEY', base64_encode( str_repeat( 'k', 32 ) ) ); 45 } 31 46 require_once __DIR__ . '/functions.php'; 32 47 … … 334 349 require __DIR__ . '/class-wp-sitemaps-empty-test-provider.php'; 335 350 require __DIR__ . '/class-wp-sitemaps-large-test-provider.php'; 351 require __DIR__ . '/secrets/trait-wp-secrets-assertions.php'; 352 require __DIR__ . '/secrets/class-mock-store.php'; 353 require __DIR__ . '/secrets/class-mock-keyring.php'; 354 require __DIR__ . '/secrets/class-wp-secrets-provider-conformance.php'; 355 require __DIR__ . '/secrets/class-wp-secrets-keyring-conformance.php'; 336 356 337 357 /** -
trunk/tests/phpunit/tests/user/capabilities.php
r64065 r64337 127 127 'list_users' => array( 'administrator' ), 128 128 'manage_options' => array( 'administrator' ), 129 'manage_secrets' => array( 'administrator' ), 129 130 'promote_users' => array( 'administrator' ), 130 131 'remove_users' => array( 'administrator' ), … … 210 211 'list_users' => array( 'administrator' ), 211 212 'manage_options' => array( 'administrator' ), 213 'manage_secrets' => array( 'administrator' ), 212 214 'promote_users' => array( 'administrator' ), 213 215 'remove_users' => array( 'administrator' ), … … 276 278 'manage_network_themes' => array(), 277 279 'manage_network_options' => array(), 280 'manage_network_secrets' => array(), 278 281 'delete_site' => array(), 279 282 'upgrade_network' => array(), … … 315 318 'manage_network_themes' => array(), 316 319 'manage_network_options' => array(), 320 'manage_network_secrets' => array(), 317 321 'setup_network' => array(), 318 322 'upload_plugins' => array(),
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)