From f7dbb2462ba35362be2ab632f466ba1a4d760282 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Wed, 5 Jul 2023 17:39:55 +0000 Subject: [PATCH] General: Increase the minimum supported version of PHP to 7.0.0. This also removes the random compat library which is no longer necessary, and adjusts unit tests and CI workflows that no longer need to take PHP 5.6 into account. Thank you for your service, PHP 5. Onwards! Props SergeyBiryukov, mukesh27, dingo_d, audrasjb, jrf, costdev, azaozz, JavierCasares, hellofromTonya, samiamnot, spacedmonkey, masteradhoc, knutsp, garyjones, chanthaboune Fixes #57345 git-svn-id: https://develop.svn.wordpress.org/trunk@56141 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 36 +-- composer.json | 2 +- phpcompat.xml.dist | 4 +- src/readme.html | 2 +- src/wp-includes/compat.php | 4 - .../random_compat/byte_safe_strings.php | 195 --------------- src/wp-includes/random_compat/cast_to_int.php | 77 ------ .../random_compat/error_polyfill.php | 49 ---- src/wp-includes/random_compat/random.php | 226 ------------------ .../random_compat/random_bytes_com_dotnet.php | 91 ------- .../random_bytes_dev_urandom.php | 190 --------------- .../random_compat/random_bytes_libsodium.php | 91 ------- .../random_bytes_libsodium_legacy.php | 93 ------- .../random_compat/random_bytes_mcrypt.php | 79 ------ src/wp-includes/random_compat/random_int.php | 204 ---------------- src/wp-includes/version.php | 2 +- .../phpunit/tests/admin/wpMediaListTable.php | 2 +- tests/phpunit/tests/date/dateI18n.php | 4 - tests/phpunit/tests/functions/wpListUtil.php | 48 +--- 19 files changed, 13 insertions(+), 1386 deletions(-) delete mode 100644 src/wp-includes/random_compat/byte_safe_strings.php delete mode 100644 src/wp-includes/random_compat/cast_to_int.php delete mode 100644 src/wp-includes/random_compat/error_polyfill.php delete mode 100644 src/wp-includes/random_compat/random.php delete mode 100644 src/wp-includes/random_compat/random_bytes_com_dotnet.php delete mode 100644 src/wp-includes/random_compat/random_bytes_dev_urandom.php delete mode 100644 src/wp-includes/random_compat/random_bytes_libsodium.php delete mode 100644 src/wp-includes/random_compat/random_bytes_libsodium_legacy.php delete mode 100644 src/wp-includes/random_compat/random_bytes_mcrypt.php delete mode 100644 src/wp-includes/random_compat/random_int.php diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index b2e7543341187..618e1d039fc21 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -33,7 +33,6 @@ permissions: {} env: PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: ${{ true }} LOCAL_PHP_MEMCACHED: ${{ false }} - SLOW_TESTS: 'external-http,media,restapi' jobs: # Runs the PHPUnit tests for WordPress. @@ -56,7 +55,7 @@ jobs: # - Checks out the WordPress Test reporter repository. # - Submit the test results to the WordPress.org host test results. test-php: - name: ${{ matrix.php }}${{ matrix.multisite && ' multisite' || '' }}${{ matrix.split_slow && ' slow tests' || '' }}${{ matrix.memcached && ' with memcached' || '' }} on ${{ matrix.os }} + name: ${{ matrix.php }}${{ matrix.multisite && ' multisite' || '' }}${{ matrix.memcached && ' with memcached' || '' }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} permissions: contents: read @@ -65,23 +64,11 @@ jobs: strategy: fail-fast: false matrix: - php: [ '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2' ] + php: [ '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2' ] os: [ ubuntu-latest ] memcached: [ false ] - split_slow: [ false ] multisite: [ false, true ] include: - # Additional "slow" jobs for PHP 5.6. - - php: '5.6' - os: ubuntu-latest - memcached: false - multisite: false - split_slow: true - - php: '5.6' - os: ubuntu-latest - memcached: false - multisite: true - split_slow: true # Include jobs for PHP 7.4 with memcached. - php: '7.4' os: ubuntu-latest @@ -174,37 +161,22 @@ jobs: - name: Install WordPress run: npm run env:install - - name: Run slow PHPUnit tests - if: ${{ matrix.split_slow }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ${{ env.SLOW_TESTS }} - - - name: Run PHPUnit tests for single site excluding slow tests - if: ${{ matrix.php < '7.0' && ! matrix.split_slow && ! matrix.multisite }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --exclude-group ${{ env.SLOW_TESTS }},ajax,ms-files,ms-required - - - name: Run PHPUnit tests for Multisite excluding slow tests - if: ${{ matrix.php < '7.0' && ! matrix.split_slow && matrix.multisite }} - run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --exclude-group ${{ env.SLOW_TESTS }},ajax,ms-files,ms-excluded,oembed-headers - - name: Run PHPUnit tests - if: ${{ matrix.php >= '7.0' }} run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} - name: Run AJAX tests - if: ${{ ! matrix.split_slow }} run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c ${{ env.PHPUNIT_CONFIG }} --group ajax - name: Run ms-files tests as a multisite install - if: ${{ matrix.multisite && ! matrix.split_slow }} + if: ${{ matrix.multisite }} run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c tests/phpunit/multisite.xml --group ms-files - name: Run external HTTP tests - if: ${{ ! matrix.multisite && ! matrix.split_slow }} + if: ${{ ! matrix.multisite }} run: node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit --verbose -c phpunit.xml.dist --group external-http # __fakegroup__ is excluded to force PHPUnit to ignore the settings in phpunit.xml.dist. - name: Run (Xdebug) tests - if: ${{ ! matrix.split_slow }} run: LOCAL_PHP_XDEBUG=true node ./tools/local-env/scripts/docker.js run php ./vendor/bin/phpunit -v --group xdebug --exclude-group __fakegroup__ - name: Ensure version-controlled files are not modified or deleted diff --git a/composer.json b/composer.json index 8e27c8df7b5c5..049343a9efb2c 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "issues": "https://core.trac.wordpress.org/" }, "require": { - "php": ">=5.6" + "php": ">=7.0" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", diff --git a/phpcompat.xml.dist b/phpcompat.xml.dist index d58fee2ef2286..4a60e03161055 100644 --- a/phpcompat.xml.dist +++ b/phpcompat.xml.dist @@ -4,8 +4,8 @@ - - + + diff --git a/src/readme.html b/src/readme.html index 86edbaa53ca58..a40c5e98a95bd 100644 --- a/src/readme.html +++ b/src/readme.html @@ -51,7 +51,7 @@

Migrating from other systems

System Requirements

    -
  • PHP version 5.6.20 or greater.
  • +
  • PHP version 7.0 or greater.
  • MySQL version 5.0 or greater.
diff --git a/src/wp-includes/compat.php b/src/wp-includes/compat.php index 696642f8d272b..2b8de57bd7b9b 100644 --- a/src/wp-includes/compat.php +++ b/src/wp-includes/compat.php @@ -333,10 +333,6 @@ function hash_equals( $known_string, $user_string ) { } endif; -// random_int() was introduced in PHP 7.0. -if ( ! function_exists( 'random_int' ) ) { - require ABSPATH . WPINC . '/random_compat/random.php'; -} // sodium_crypto_box() was introduced in PHP 7.2. if ( ! function_exists( 'sodium_crypto_box' ) ) { require ABSPATH . WPINC . '/sodium_compat/autoload.php'; diff --git a/src/wp-includes/random_compat/byte_safe_strings.php b/src/wp-includes/random_compat/byte_safe_strings.php deleted file mode 100644 index ef24488f9e7bf..0000000000000 --- a/src/wp-includes/random_compat/byte_safe_strings.php +++ /dev/null @@ -1,195 +0,0 @@ - RandomCompat_strlen($binary_string)) { - return ''; - } - - return (string) mb_substr( - (string) $binary_string, - (int) $start, - (int) $length, - '8bit' - ); - } - - } else { - - /** - * substr() implementation that isn't brittle to mbstring.func_overload - * - * This version just uses the default substr() - * - * @param string $binary_string - * @param int $start - * @param int|null $length (optional) - * - * @throws TypeError - * - * @return string - */ - function RandomCompat_substr($binary_string, $start, $length = null) - { - if (!is_string($binary_string)) { - throw new TypeError( - 'RandomCompat_substr(): First argument should be a string' - ); - } - - if (!is_int($start)) { - throw new TypeError( - 'RandomCompat_substr(): Second argument should be an integer' - ); - } - - if ($length !== null) { - if (!is_int($length)) { - throw new TypeError( - 'RandomCompat_substr(): Third argument should be an integer, or omitted' - ); - } - - return (string) substr( - (string )$binary_string, - (int) $start, - (int) $length - ); - } - - return (string) substr( - (string) $binary_string, - (int) $start - ); - } - } -} diff --git a/src/wp-includes/random_compat/cast_to_int.php b/src/wp-includes/random_compat/cast_to_int.php deleted file mode 100644 index 1b1bbfe8dee1b..0000000000000 --- a/src/wp-includes/random_compat/cast_to_int.php +++ /dev/null @@ -1,77 +0,0 @@ - operators might accidentally let a float - * through. - * - * @param int|float $number The number we want to convert to an int - * @param bool $fail_open Set to true to not throw an exception - * - * @return float|int - * @psalm-suppress InvalidReturnType - * - * @throws TypeError - */ - function RandomCompat_intval($number, $fail_open = false) - { - if (is_int($number) || is_float($number)) { - $number += 0; - } elseif (is_numeric($number)) { - /** @psalm-suppress InvalidOperand */ - $number += 0; - } - /** @var int|float $number */ - - if ( - is_float($number) - && - $number > ~PHP_INT_MAX - && - $number < PHP_INT_MAX - ) { - $number = (int) $number; - } - - if (is_int($number)) { - return (int) $number; - } elseif (!$fail_open) { - throw new TypeError( - 'Expected an integer.' - ); - } - return $number; - } -} diff --git a/src/wp-includes/random_compat/error_polyfill.php b/src/wp-includes/random_compat/error_polyfill.php deleted file mode 100644 index c02c5c8b4cdba..0000000000000 --- a/src/wp-includes/random_compat/error_polyfill.php +++ /dev/null @@ -1,49 +0,0 @@ -= 70000) { - return; -} - -if (!defined('RANDOM_COMPAT_READ_BUFFER')) { - define('RANDOM_COMPAT_READ_BUFFER', 8); -} - -$RandomCompatDIR = dirname(__FILE__); - -require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'byte_safe_strings.php'; -require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'cast_to_int.php'; -require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'error_polyfill.php'; - -if (!is_callable('random_bytes')) { - /** - * PHP 5.2.0 - 5.6.x way to implement random_bytes() - * - * We use conditional statements here to define the function in accordance - * to the operating environment. It's a micro-optimization. - * - * In order of preference: - * 1. Use libsodium if available. - * 2. fread() /dev/urandom if available (never on Windows) - * 3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM) - * 4. COM('CAPICOM.Utilities.1')->GetRandom() - * - * See RATIONALE.md for our reasoning behind this particular order - */ - if (extension_loaded('libsodium')) { - // See random_bytes_libsodium.php - if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) { - require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_libsodium.php'; - } elseif (method_exists('Sodium', 'randombytes_buf')) { - require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_libsodium_legacy.php'; - } - } - - /** - * Reading directly from /dev/urandom: - */ - if (DIRECTORY_SEPARATOR === '/') { - // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast - // way to exclude Windows. - $RandomCompatUrandom = true; - $RandomCompat_basedir = ini_get('open_basedir'); - - if (!empty($RandomCompat_basedir)) { - $RandomCompat_open_basedir = explode( - PATH_SEPARATOR, - strtolower($RandomCompat_basedir) - ); - $RandomCompatUrandom = (array() !== array_intersect( - array('/dev', '/dev/', '/dev/urandom'), - $RandomCompat_open_basedir - )); - $RandomCompat_open_basedir = null; - } - - if ( - !is_callable('random_bytes') - && - $RandomCompatUrandom - && - @is_readable('/dev/urandom') - ) { - // Error suppression on is_readable() in case of an open_basedir - // or safe_mode failure. All we care about is whether or not we - // can read it at this point. If the PHP environment is going to - // panic over trying to see if the file can be read in the first - // place, that is not helpful to us here. - - // See random_bytes_dev_urandom.php - require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_dev_urandom.php'; - } - // Unset variables after use - $RandomCompat_basedir = null; - } else { - $RandomCompatUrandom = false; - } - - /** - * mcrypt_create_iv() - * - * We only want to use mcypt_create_iv() if: - * - * - random_bytes() hasn't already been defined - * - the mcrypt extensions is loaded - * - One of these two conditions is true: - * - We're on Windows (DIRECTORY_SEPARATOR !== '/') - * - We're not on Windows and /dev/urandom is readabale - * (i.e. we're not in a chroot jail) - * - Special case: - * - If we're not on Windows, but the PHP version is between - * 5.6.10 and 5.6.12, we don't want to use mcrypt. It will - * hang indefinitely. This is bad. - * - If we're on Windows, we want to use PHP >= 5.3.7 or else - * we get insufficient entropy errors. - */ - if ( - !is_callable('random_bytes') - && - // Windows on PHP < 5.3.7 is broken, but non-Windows is not known to be. - (DIRECTORY_SEPARATOR === '/' || PHP_VERSION_ID >= 50307) - && - // Prevent this code from hanging indefinitely on non-Windows; - // see https://bugs.php.net/bug.php?id=69833 - ( - DIRECTORY_SEPARATOR !== '/' || - (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613) - ) - && - extension_loaded('mcrypt') - ) { - // See random_bytes_mcrypt.php - require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_mcrypt.php'; - } - $RandomCompatUrandom = null; - - /** - * This is a Windows-specific fallback, for when the mcrypt extension - * isn't loaded. - */ - if ( - !is_callable('random_bytes') - && - extension_loaded('com_dotnet') - && - class_exists('COM') - ) { - $RandomCompat_disabled_classes = preg_split( - '#\s*,\s*#', - strtolower(ini_get('disable_classes')) - ); - - if (!in_array('com', $RandomCompat_disabled_classes)) { - try { - $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1'); - /** @psalm-suppress TypeDoesNotContainType */ - if (is_callable(array($RandomCompatCOMtest, 'GetRandom'))) { - // See random_bytes_com_dotnet.php - require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_com_dotnet.php'; - } - } catch (com_exception $e) { - // Don't try to use it. - } - } - $RandomCompat_disabled_classes = null; - $RandomCompatCOMtest = null; - } - - /** - * throw new Exception - */ - if (!is_callable('random_bytes')) { - /** - * We don't have any more options, so let's throw an exception right now - * and hope the developer won't let it fail silently. - * - * @param mixed $length - * @psalm-suppress InvalidReturnType - * @throws Exception - * @return string - */ - function random_bytes($length) - { - unset($length); // Suppress "variable not used" warnings. - throw new Exception( - 'There is no suitable CSPRNG installed on your system' - ); - return ''; - } - } -} - -if (!is_callable('random_int')) { - require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_int.php'; -} - -$RandomCompatDIR = null; diff --git a/src/wp-includes/random_compat/random_bytes_com_dotnet.php b/src/wp-includes/random_compat/random_bytes_com_dotnet.php deleted file mode 100644 index 537d02b27a3cd..0000000000000 --- a/src/wp-includes/random_compat/random_bytes_com_dotnet.php +++ /dev/null @@ -1,91 +0,0 @@ -GetRandom($bytes, 0)); - if (RandomCompat_strlen($buf) >= $bytes) { - /** - * Return our random entropy buffer here: - */ - return (string) RandomCompat_substr($buf, 0, $bytes); - } - ++$execCount; - } while ($execCount < $bytes); - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Could not gather sufficient random data' - ); - } -} diff --git a/src/wp-includes/random_compat/random_bytes_dev_urandom.php b/src/wp-includes/random_compat/random_bytes_dev_urandom.php deleted file mode 100644 index c4e31ccbbbe5e..0000000000000 --- a/src/wp-includes/random_compat/random_bytes_dev_urandom.php +++ /dev/null @@ -1,190 +0,0 @@ - $st */ - $st = fstat($fp); - if (($st['mode'] & 0170000) !== 020000) { - fclose($fp); - $fp = false; - } - } - } - - if (is_resource($fp)) { - /** - * stream_set_read_buffer() does not exist in HHVM - * - * If we don't set the stream's read buffer to 0, PHP will - * internally buffer 8192 bytes, which can waste entropy - * - * stream_set_read_buffer returns 0 on success - */ - if (is_callable('stream_set_read_buffer')) { - stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER); - } - if (is_callable('stream_set_chunk_size')) { - stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER); - } - } - } - - try { - /** @var int $bytes */ - $bytes = RandomCompat_intval($bytes); - } catch (TypeError $ex) { - throw new TypeError( - 'random_bytes(): $bytes must be an integer' - ); - } - - if ($bytes < 1) { - throw new Error( - 'Length must be greater than 0' - ); - } - - /** - * This if() block only runs if we managed to open a file handle - * - * It does not belong in an else {} block, because the above - * if (empty($fp)) line is logic that should only be run once per - * page load. - */ - if (is_resource($fp)) { - /** - * @var int - */ - $remaining = $bytes; - - /** - * @var string|bool - */ - $buf = ''; - - /** - * We use fread() in a loop to protect against partial reads - */ - do { - /** - * @var string|bool - */ - $read = fread($fp, $remaining); - if (!is_string($read)) { - /** - * We cannot safely read from the file. Exit the - * do-while loop and trigger the exception condition - * - * @var string|bool - */ - $buf = false; - break; - } - /** - * Decrease the number of bytes returned from remaining - */ - $remaining -= RandomCompat_strlen($read); - /** - * @var string $buf - */ - $buf .= $read; - } while ($remaining > 0); - - /** - * Is our result valid? - * @var string|bool $buf - */ - if (is_string($buf)) { - if (RandomCompat_strlen($buf) === $bytes) { - /** - * Return our random entropy buffer here: - */ - return $buf; - } - } - } - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Error reading from source device' - ); - } -} diff --git a/src/wp-includes/random_compat/random_bytes_libsodium.php b/src/wp-includes/random_compat/random_bytes_libsodium.php deleted file mode 100644 index 2e5629018293c..0000000000000 --- a/src/wp-includes/random_compat/random_bytes_libsodium.php +++ /dev/null @@ -1,91 +0,0 @@ - 2147483647) { - $buf = ''; - for ($i = 0; $i < $bytes; $i += 1073741824) { - $n = ($bytes - $i) > 1073741824 - ? 1073741824 - : $bytes - $i; - $buf .= \Sodium\randombytes_buf($n); - } - } else { - /** @var string|bool $buf */ - $buf = \Sodium\randombytes_buf($bytes); - } - - if (is_string($buf)) { - if (RandomCompat_strlen($buf) === $bytes) { - return $buf; - } - } - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Could not gather sufficient random data' - ); - } -} diff --git a/src/wp-includes/random_compat/random_bytes_libsodium_legacy.php b/src/wp-includes/random_compat/random_bytes_libsodium_legacy.php deleted file mode 100644 index f78b2199a2b6a..0000000000000 --- a/src/wp-includes/random_compat/random_bytes_libsodium_legacy.php +++ /dev/null @@ -1,93 +0,0 @@ - 2147483647) { - for ($i = 0; $i < $bytes; $i += 1073741824) { - $n = ($bytes - $i) > 1073741824 - ? 1073741824 - : $bytes - $i; - $buf .= Sodium::randombytes_buf((int) $n); - } - } else { - $buf .= Sodium::randombytes_buf((int) $bytes); - } - - if (is_string($buf)) { - if (RandomCompat_strlen($buf) === $bytes) { - return $buf; - } - } - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Could not gather sufficient random data' - ); - } -} diff --git a/src/wp-includes/random_compat/random_bytes_mcrypt.php b/src/wp-includes/random_compat/random_bytes_mcrypt.php deleted file mode 100644 index 0b13fa73c5da0..0000000000000 --- a/src/wp-includes/random_compat/random_bytes_mcrypt.php +++ /dev/null @@ -1,79 +0,0 @@ - operators might accidentally let a float - * through. - */ - - try { - /** @var int $min */ - $min = RandomCompat_intval($min); - } catch (TypeError $ex) { - throw new TypeError( - 'random_int(): $min must be an integer' - ); - } - - try { - /** @var int $max */ - $max = RandomCompat_intval($max); - } catch (TypeError $ex) { - throw new TypeError( - 'random_int(): $max must be an integer' - ); - } - - /** - * Now that we've verified our weak typing system has given us an integer, - * let's validate the logic then we can move forward with generating random - * integers along a given range. - */ - if ($min > $max) { - throw new Error( - 'Minimum value must be less than or equal to the maximum value' - ); - } - - if ($max === $min) { - return (int) $min; - } - - /** - * Initialize variables to 0 - * - * We want to store: - * $bytes => the number of random bytes we need - * $mask => an integer bitmask (for use with the &) operator - * so we can minimize the number of discards - */ - $attempts = $bits = $bytes = $mask = $valueShift = 0; - /** @var int $attempts */ - /** @var int $bits */ - /** @var int $bytes */ - /** @var int $mask */ - /** @var int $valueShift */ - - /** - * At this point, $range is a positive number greater than 0. It might - * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to - * a float and we will lose some precision. - * - * @var int|float $range - */ - $range = $max - $min; - - /** - * Test for integer overflow: - */ - if (!is_int($range)) { - - /** - * Still safely calculate wider ranges. - * Provided by @CodesInChaos, @oittaa - * - * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 - * - * We use ~0 as a mask in this case because it generates all 1s - * - * @ref https://eval.in/400356 (32-bit) - * @ref http://3v4l.org/XX9r5 (64-bit) - */ - $bytes = PHP_INT_SIZE; - /** @var int $mask */ - $mask = ~0; - - } else { - - /** - * $bits is effectively ceil(log($range, 2)) without dealing with - * type juggling - */ - while ($range > 0) { - if ($bits % 8 === 0) { - ++$bytes; - } - ++$bits; - $range >>= 1; - /** @var int $mask */ - $mask = $mask << 1 | 1; - } - $valueShift = $min; - } - - /** @var int $val */ - $val = 0; - /** - * Now that we have our parameters set up, let's begin generating - * random integers until one falls between $min and $max - */ - /** @psalm-suppress RedundantCondition */ - do { - /** - * The rejection probability is at most 0.5, so this corresponds - * to a failure probability of 2^-128 for a working RNG - */ - if ($attempts > 128) { - throw new Exception( - 'random_int: RNG is broken - too many rejections' - ); - } - - /** - * Let's grab the necessary number of random bytes - */ - $randomByteString = random_bytes($bytes); - - /** - * Let's turn $randomByteString into an integer - * - * This uses bitwise operators (<< and |) to build an integer - * out of the values extracted from ord() - * - * Example: [9F] | [6D] | [32] | [0C] => - * 159 + 27904 + 3276800 + 201326592 => - * 204631455 - */ - $val &= 0; - for ($i = 0; $i < $bytes; ++$i) { - $val |= ord($randomByteString[$i]) << ($i * 8); - } - /** @var int $val */ - - /** - * Apply mask - */ - $val &= $mask; - $val += $valueShift; - - ++$attempts; - /** - * If $val overflows to a floating point number, - * ... or is larger than $max, - * ... or smaller than $min, - * then try again. - */ - } while (!is_int($val) || $val > $max || $val < $min); - - return (int) $val; - } -} diff --git a/src/wp-includes/version.php b/src/wp-includes/version.php index cce3f6b49c019..d0f18c677666b 100644 --- a/src/wp-includes/version.php +++ b/src/wp-includes/version.php @@ -37,7 +37,7 @@ * * @global string $required_php_version */ -$required_php_version = '5.6.20'; +$required_php_version = '7.0.0'; /** * Holds the required MySQL version. diff --git a/tests/phpunit/tests/admin/wpMediaListTable.php b/tests/phpunit/tests/admin/wpMediaListTable.php index 1dc1c88af10b0..aae2f3862ae76 100644 --- a/tests/phpunit/tests/admin/wpMediaListTable.php +++ b/tests/phpunit/tests/admin/wpMediaListTable.php @@ -114,7 +114,7 @@ public function tear_down() { * does not result in a PHP warning. * * The warning that we should not see: - * PHP 5.6 - 7.4: `Invalid argument supplied for foreach()`. + * PHP <= 7.4: `Invalid argument supplied for foreach()`. * PHP 8.0 and higher: `Warning: foreach() argument must be of type array|object, bool given`. * * Note: This does not test the actual functioning of the WP_Media_List_Table::prepare_items() method. diff --git a/tests/phpunit/tests/date/dateI18n.php b/tests/phpunit/tests/date/dateI18n.php index 1fe6f38a952e9..544ea9ae47977 100644 --- a/tests/phpunit/tests/date/dateI18n.php +++ b/tests/phpunit/tests/date/dateI18n.php @@ -117,10 +117,6 @@ public function test_adjusts_format_based_on_deprecated_timezone_string() { update_option( 'timezone_string', 'America/Buenos_Aires' ); // This timezone was deprecated pre-PHP 5.6. $expected = '2022-08-01 00:00:00 -03 -03:00 America/Buenos_Aires'; - if ( PHP_VERSION_ID < 70000 ) { - // PHP 5.6. - $expected = '2022-08-01 00:00:00 ART -03:00 America/Buenos_Aires'; - } $this->assertSame( $expected, date_i18n( 'Y-m-d H:i:s T P e', strtotime( '2022-08-01 00:00:00' ) ) ); } diff --git a/tests/phpunit/tests/functions/wpListUtil.php b/tests/phpunit/tests/functions/wpListUtil.php index f40771681e370..752ea1382caee 100644 --- a/tests/phpunit/tests/functions/wpListUtil.php +++ b/tests/phpunit/tests/functions/wpListUtil.php @@ -210,6 +210,7 @@ public function test_wp_list_util_sort_simple() { * @dataProvider data_wp_list_util_sort_int_arrays * @dataProvider data_wp_list_util_sort_arrays_of_arrays * @dataProvider data_wp_list_util_sort_object_arrays + * @dataProvider data_wp_list_util_sort_non_existent_orderby_fields * * @covers WP_List_Util::sort * @covers ::wp_list_sort @@ -1002,54 +1003,11 @@ public function data_wp_list_util_sort_object_arrays() { } /** - * Tests non-existent '$orderby' fields. - * - * In PHP < 7.0.0, the sorting behavior is different, which Core does not - * currently handle. Until this is fixed, or the minimum PHP version is - * raised to PHP 7.0.0+, these tests will be skipped on PHP < 7.0.0. - * - * @ticket 55300 - * - * @dataProvider data_wp_list_util_sort_php_7_or_greater - * - * @covers WP_List_Util::sort - * @covers ::wp_list_sort - * - * @param array $expected The expected array. - * @param array $target_array The array to create a list from. - * @param array $orderby Optional. Either the field name to order by or an array - * of multiple orderby fields as `$orderby => $order`. - * Default empty array. - * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if `$orderby` - * is a string. Default 'ASC'. - * @param bool $preserve_keys Optional. Whether to preserve keys. Default false. - */ - public function test_wp_list_util_sort_php_7_or_greater( $expected, $target_array, $orderby = array(), $order = 'ASC', $preserve_keys = false ) { - if ( version_compare( PHP_VERSION, '7.0.0', '<' ) ) { - $this->markTestSkipped( 'This test can only run on PHP 7.0 or greater due to an unstable sort order.' ); - } - - $util = new WP_List_Util( $target_array ); - $actual = $util->sort( $orderby, $order, $preserve_keys ); - - $this->assertEqualSetsWithIndex( - $expected, - $actual, - 'The sorted value did not match the expected value.' - ); - $this->assertEqualSetsWithIndex( - $expected, - $util->get_output(), - '::get_output() did not return the expected value.' - ); - } - - /** - * Data provider for test_wp_list_util_sort_php_7_or_greater(). + * Data provider for test_wp_list_util_sort(). * * @return array[] */ - public function data_wp_list_util_sort_php_7_or_greater() { + public function data_wp_list_util_sort_non_existent_orderby_fields() { return array( 'int[], int keys, $orderby a non-existent field, $order = ASC and $preserve_keys = false' => array( 'expected' => array( 4, 2, 3, 1 ),