lookup = $lookup ? $lookup : static function ( string $name ): array { return defined( $name ) ? array( true, constant( $name ) ) : array( false, null ); }; } /** * {@inheritDoc} */ public function name(): string { return 'get_config'; } /** * {@inheritDoc} */ public function access(): string { return Tool::ACCESS_PROTECTED; } /** * {@inheritDoc} */ public function definition(): array { return Definition::read_only( $this->name(), 'Get wp-config settings with FlitAgent', 'reads non-secret wp-config.php settings: debug, environment, memory, cron, automatic updates, file editing, revisions, trash, SSL, script concatenation, multisite, home and site URL, language, database charset, plus table_prefix and environment_type. Database credentials, keys, salts and filesystem paths are never returned. Each entry says whether the constant is defined.', array( 'name' => array( 'type' => 'string', 'description' => 'One setting, e.g. "WP_DEBUG". Omit for all.', ), ) ); } /** * Reads the settings. * * @param array $arguments Tool arguments. * @return array * @throws ToolError When the named setting is not exposed. */ public function call( array $arguments ): array { Arguments::only( $arguments, array( 'name' ), $this->name() ); $name = Arguments::string( $arguments, 'name', false ); $names = array_merge( self::ALLOWED, self::DERIVED ); if ( null !== $name ) { if ( ! in_array( $name, $names, true ) ) { throw new ToolError( sprintf( '"%s" is not exposed. get_config returns only non-secret settings: %s.', esc_textarea( $name ), esc_textarea( implode( ', ', $names ) ) ) ); } $names = array( $name ); } $settings = array(); foreach ( $names as $setting ) { $settings[] = $this->setting( $setting ); } return array( 'settings' => $settings ); } /** * One setting. * * @param string $name Setting name. * @return array */ private function setting( string $name ): array { if ( 'table_prefix' === $name ) { return array( 'name' => $name, 'defined' => true, 'value' => isset( $GLOBALS['wpdb']->prefix ) ? (string) $GLOBALS['wpdb']->prefix : null, ); } if ( 'environment_type' === $name ) { return array( 'name' => $name, 'defined' => true, 'value' => wp_get_environment_type(), ); } list( $defined, $value ) = call_user_func( $this->lookup, $name ); return array( 'name' => $name, 'defined' => (bool) $defined, 'value' => $defined ? self::safe( $name, $value ) : null, ); } /** * Hides filesystem paths in a setting's value. * * @param string $name Setting name. * @param mixed $value Value. * @return mixed */ private static function safe( string $name, $value ) { if ( is_string( $value ) && ( '' !== $value && ( '/' === $value[0] || 1 === preg_match( '/^[A-Za-z]:[\\\\\/]/', $value ) ) ) ) { return 'WP_DEBUG_LOG' === $name ? 'custom file' : 'path hidden'; } return $value; } }