jenkins-bot has submitted this change and it was merged. Change subject: Rebuilt PHPVersionCheck to be an own class ......................................................................
Rebuilt PHPVersionCheck to be an own class The class keyword should work in all reasonable working php installations, as far as I know. In this way, the php version check does not rely on a set of global functions. It also should make maintaining the different checks a bit easier. Change-Id: I73ee098a8cf931ca4df6263c6e0a3e215555b612 --- M autoload.php M includes/PHPVersionCheck.php 2 files changed, 214 insertions(+), 172 deletions(-) Approvals: Krinkle: Looks good to me, but someone else must approve Chad: Looks good to me, approved jenkins-bot: Verified diff --git a/autoload.php b/autoload.php index 17e5df6..e4f39d4 100644 --- a/autoload.php +++ b/autoload.php @@ -1009,6 +1009,7 @@ 'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php', 'Orphans' => __DIR__ . '/maintenance/orphans.php', 'OutputPage' => __DIR__ . '/includes/OutputPage.php', + 'PHPVersionCheck' => __DIR__ . '/includes/PHPVersionCheck.php', 'PNGHandler' => __DIR__ . '/includes/media/PNG.php', 'PNGMetadataExtractor' => __DIR__ . '/includes/media/PNGMetadataExtractor.php', 'PPCustomFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php', diff --git a/includes/PHPVersionCheck.php b/includes/PHPVersionCheck.php index 656ba43..e6e96c7 100644 --- a/includes/PHPVersionCheck.php +++ b/includes/PHPVersionCheck.php @@ -1,4 +1,7 @@ <?php +// @codingStandardsIgnoreFile Generic.Arrays.DisallowLongArraySyntax +// @codingStandardsIgnoreFile Generic.Files.LineLength +// @codingStandardsIgnoreFile MediaWiki.Usage.DirUsage.FunctionFound /** * Check PHP Version, as well as for composer dependencies in entry points, * and display something vaguely comprehensible in the event of a totally @@ -21,107 +24,191 @@ * * @file */ - -/** - * Check php version and that external dependencies are installed, and - * display an informative error if either condition is not satisfied. - * - * @note Since we can't rely on anything, the minimum PHP versions and MW current - * version are hardcoded here - */ -function wfEntryPointCheck( $entryPoint ) { - $mwVersion = '1.29'; - $minimumVersionPHP = '5.5.9'; - $phpVersion = PHP_VERSION; - - if ( !function_exists( 'version_compare' ) - || version_compare( $phpVersion, $minimumVersionPHP ) < 0 - ) { - wfPHPVersionError( $entryPoint, $mwVersion, $minimumVersionPHP, $phpVersion ); - } - - // @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound - if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) { - // @codingStandardsIgnoreEnd - wfMissingVendorError( $entryPoint, $mwVersion ); - } - - // List of functions and their associated PHP extension to check for - // @codingStandardsIgnoreStart Generic.Arrays.DisallowLongArraySyntax - $extensions = array( +class PHPVersionCheck { + /* @var string The number of the MediaWiki version used */ + var $mwVersion = '1.29'; + /* @var string The minimum php version for MediaWiki to run */ + var $minimumVersionPHP = '5.5.9'; + var $functionsExtensionsMapping = array( 'mb_substr' => 'mbstring', 'utf8_encode' => 'xml', 'ctype_digit' => 'ctype', 'json_decode' => 'json', 'iconv' => 'iconv', ); - // List of extensions we're missing - $missingExtensions = array(); - // @codingStandardsIgnoreEnd - foreach ( $extensions as $function => $extension ) { - if ( !function_exists( $function ) ) { - $missingExtensions[] = $extension; + /** + * @var string Which entry point we are protecting. One of: + * - index.php + * - load.php + * - api.php + * - mw-config/index.php + * - cli + */ + var $entryPoint = null; + + /** + * @param string $entryPoint Which entry point we are protecting. One of: + * - index.php + * - load.php + * - api.php + * - mw-config/index.php + * - cli + * @return $this + */ + function setEntryPoint( $entryPoint ) { + $this->entryPoint = $entryPoint; + } + + /** + * Returns the version of the installed php implementation. + * + * @return string + */ + function getPHPImplVersion() { + return PHP_VERSION; + } + + /** + * Displays an error, if the installed php version does not meet the minimum requirement. + * + * @return $this + */ + function checkRequiredPHPVersion() { + if ( !function_exists( 'version_compare' ) + || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0 + ) { + $shortText = "MediaWiki $this->mwVersion requires at least PHP version" + . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}."; + + $longText = "Error: You might be using on older PHP version. \n" + . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n" + . "Check if you have a newer php executable with a different name, " + . "such as php5.\n\n"; + + $longHtml = <<<HTML + Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>. + PHP versions less than 5.5.0 are no longer supported by the PHP Group and will not receive + security or bugfix updates. + </p> + <p> + If for some reason you are unable to upgrade your PHP version, you will need to + <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version + of MediaWiki from our website. See our + <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a> + for details of which versions are compatible with prior versions of PHP. +HTML; + $this->triggerError( 'Supported PHP versions', $shortText, $longText, $longHtml ); } } - if ( $missingExtensions ) { - wfMissingExtensions( $entryPoint, $mwVersion, $missingExtensions ); + /** + * Displays an error, if the vendor/autoload.php file could not be found. + * + * @return $this + */ + function checkVendorExistence() { + if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) { + $shortText = "Installing some external dependencies (e.g. via composer) is required."; + + $longText = "Error: You are missing some external dependencies. \n" + . "MediaWiki now also has some external dependencies that need to be installed\n" + . "via composer or from a separate git repo. Please see\n" + . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n" + . "for help on installing the required components."; + + $longHtml = <<<HTML + MediaWiki now also has some external dependencies that need to be installed via + composer or from a separate git repo. Please see + <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> + for help on installing the required components. +HTML; + + $this->triggerError( 'External dependencies', $shortText, $longText, $longHtml ); + } } -} -/** - * Display something vaguely comprehensible in the event of a totally unrecoverable error. - * Does not assume access to *anything*; no globals, no autoloader, no database, no localisation. - * Safe for PHP4 (and putting this here means that WebStart.php and GlobalSettings.php - * no longer need to be). - * - * Calling this function kills execution immediately. - * - * @param string $type Which entry point we are protecting. One of: - * - index.php - * - load.php - * - api.php - * - mw-config/index.php - * - cli - * @param string $mwVersion The number of the MediaWiki version used - * @param string $title HTML code to be put within an <h2> tag - * @param string $shortText - * @param string $longText - * @param string $longHtml - */ -function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $longHtml ) { - $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'; + /** + * Displays an error, if a PHP extension does not exist. + * + * @return $this + */ + function checkExtensionExistence() { + $missingExtensions = array(); + foreach ( $this->functionsExtensionsMapping as $function => $extension ) { + if ( !function_exists( $function ) ) { + $missingExtensions[] = $extension; + } + } - if ( $type == 'cli' ) { - $finalOutput = $longText; - } else { + if ( $missingExtensions ) { + $shortText = "Installing some PHP extensions is required."; + + $missingExtText = ''; + $missingExtHtml = ''; + $baseUrl = 'https://secure.php.net'; + foreach ( $missingExtensions as $ext ) { + $missingExtText .= " * $ext <$baseUrl/$ext>\n"; + $missingExtHtml .= "<li><b>$ext</b> " + . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>"; + } + + $cliText = "Error: Missing one or more required components of PHP.\n" + . "You are missing a required extension to PHP that MediaWiki needs.\n" + . "Please install:\n" . $missingExtText; + + $longHtml = <<<HTML + You are missing a required extension to PHP that MediaWiki + requires to run. Please install: + <ul> + $missingExtHtml + </ul> +HTML; + + $this->triggerError( 'Required components', $shortText, $cliText, $longHtml ); + } + } + + /** + * Output headers that prevents error pages to be cached. + */ + function outputHTMLHeader() { + $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'; + header( "$protocol 500 MediaWiki configuration Error" ); // Don't cache error pages! They cause no end of trouble... header( 'Cache-control: none' ); header( 'Pragma: no-cache' ); + } - if ( $type == 'index.php' || $type == 'mw-config/index.php' ) { - $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] ); - if ( $type == 'mw-config/index.php' ) { - $dirname = dirname( $pathinfo['dirname'] ); - } else { - $dirname = $pathinfo['dirname']; - } - $encLogo = htmlspecialchars( - str_replace( '//', '/', $dirname . '/' ) . - 'resources/assets/mediawiki.png' - ); - $shortHtml = htmlspecialchars( $shortText ); + /** + * Returns an error page, which is suitable for output to the end user via a web browser. + * + * @param $title + * @param $longHtml + * @param $shortText + * @return string + */ + function getIndexErrorOutput( $title, $longHtml, $shortText ) { + $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] ); + if ( $this->entryPoint == 'mw-config/index.php' ) { + $dirname = dirname( $pathinfo['dirname'] ); + } else { + $dirname = $pathinfo['dirname']; + } + $encLogo = + htmlspecialchars( str_replace( '//', '/', $dirname . '/' ) . + 'resources/assets/mediawiki.png' ); + $shortHtml = htmlspecialchars( $shortText ); - header( 'Content-type: text/html; charset=UTF-8' ); + header( 'Content-type: text/html; charset=UTF-8' ); - $finalOutput = <<<HTML + $finalOutput = <<<HTML <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="UTF-8" /> - <title>MediaWiki {$mwVersion}</title> + <title>MediaWiki {$this->mwVersion}</title> <style media='screen'> body { color: #000; @@ -144,7 +231,7 @@ </head> <body> <img src="{$encLogo}" alt='The MediaWiki logo' /> - <h1>MediaWiki {$mwVersion} internal error</h1> + <h1>MediaWiki {$this->mwVersion} internal error</h1> <div class='error'> <p> {$shortHtml} @@ -157,105 +244,59 @@ </body> </html> HTML; - // Handle everything that's not index.php - } else { - // So nothing thinks this is JS or CSS - $finalOutput = ( $type == 'load.php' ) ? "/* $shortText */" : $shortText; + + return $finalOutput; + } + + /** + * Display something vaguely comprehensible in the event of a totally unrecoverable error. + * Does not assume access to *anything*; no globals, no autoloader, no database, no localisation. + * Safe for PHP4 (and putting this here means that WebStart.php and GlobalSettings.php + * no longer need to be). + * + * Calling this function kills execution immediately. + * + * @param string $title HTML code to be put within an <h2> tag + * @param string $shortText + * @param string $longText + * @param string $longHtml + */ + function triggerError( $title, $shortText, $longText, $longHtml ) { + switch ( $this->entryPoint ) { + case 'cli': + $finalOutput = $longText; + break; + case 'index.php': + case 'mw-config/index.php': + $this->outputHTMLHeader(); + $finalOutput = $this->getIndexErrorOutput( $title, $longHtml, $shortText ); + break; + case 'load.php': + $this->outputHTMLHeader(); + $finalOutput = "/* $shortText */"; + break; + default: + $this->outputHTMLHeader(); + // Handle everything that's not index.php + $finalOutput = $shortText; } + + echo "$finalOutput\n"; + die( 1 ); } - echo "$finalOutput\n"; - die( 1 ); } /** - * Display an error for the minimum PHP version requirement not being satisfied. + * Check php version and that external dependencies are installed, and + * display an informative error if either condition is not satisfied. * - * @param string $type See wfGenericError - * @param string $mwVersion See wfGenericError - * @param string $minimumVersionPHP The minimum PHP version supported by MediaWiki - * @param string $phpVersion The current PHP version + * @note Since we can't rely on anything, the minimum PHP versions and MW current + * version are hardcoded here */ -function wfPHPVersionError( $type, $mwVersion, $minimumVersionPHP, $phpVersion ) { - $shortText = "MediaWiki $mwVersion requires at least " - . "PHP version $minimumVersionPHP, you are using PHP $phpVersion."; - - $longText = "Error: You might be using on older PHP version. \n" - . "MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher.\n\n" - . "Check if you have a newer php executable with a different name, such as php5.\n\n"; - - $longHtml = <<<HTML - Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>. - PHP versions less than 5.5.0 are no longer supported by the PHP Group and will not receive - security or bugfix updates. - </p> - <p> - If for some reason you are unable to upgrade your PHP version, you will need to - <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version - of MediaWiki from our website. See our - <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a> - for details of which versions are compatible with prior versions of PHP. -HTML; - wfGenericError( $type, $mwVersion, 'Supported PHP versions', $shortText, $longText, $longHtml ); -} - -/** - * Display an error for the vendor/autoload.php file not being found. - * - * @param string $type See wfGenericError - * @param string $mwVersion See wfGenericError - */ -function wfMissingVendorError( $type, $mwVersion ) { - $shortText = "Installing some external dependencies (e.g. via composer) is required."; - - $longText = "Error: You are missing some external dependencies. \n" - . "MediaWiki now also has some external dependencies that need to be installed\n" - . "via composer or from a separate git repo. Please see\n" - . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n" - . "for help on installing the required components."; - - // @codingStandardsIgnoreStart Generic.Files.LineLength - $longHtml = <<<HTML - MediaWiki now also has some external dependencies that need to be installed via - composer or from a separate git repo. Please see - <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> - for help on installing the required components. -HTML; - // @codingStandardsIgnoreEnd - - wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml ); -} - -/** - * Display an error for a PHP extension not existing. - * - * @param string $type See wfGenericError - * @param string $mwVersion See wfGenericError - * @param array $missingExts The extensions we're missing - */ -function wfMissingExtensions( $type, $mwVersion, $missingExts ) { - $shortText = "Installing some PHP extensions is required."; - - $missingExtText = ''; - $missingExtHtml = ''; - $baseUrl = 'https://secure.php.net'; - foreach ( $missingExts as $ext ) { - $missingExtText .= " * $ext <$baseUrl/$ext>\n"; - $missingExtHtml .= "<li><b>$ext</b> " - . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>"; - } - - $cliText = "Error: Missing one or more required components of PHP.\n" - . "You are missing a required extension to PHP that MediaWiki needs.\n" - . "Please install:\n" . $missingExtText; - - $longHtml = <<<HTML - You are missing a required extension to PHP that MediaWiki - requires to run. Please install: - <ul> - $missingExtHtml - </ul> -HTML; - - wfGenericError( $type, $mwVersion, 'Required components', $shortText, - $cliText, $longHtml ); +function wfEntryPointCheck( $entryPoint ) { + $phpVersionCheck = new PHPVersionCheck(); + $phpVersionCheck->setEntryPoint( $entryPoint ); + $phpVersionCheck->checkRequiredPHPVersion(); + $phpVersionCheck->checkVendorExistence(); + $phpVersionCheck->checkExtensionExistence(); } -- To view, visit https://gerrit.wikimedia.org/r/310341 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I73ee098a8cf931ca4df6263c6e0a3e215555b612 Gerrit-PatchSet: 9 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Florianschmidtwelzow <florian.schmidt.stargatewis...@gmail.com> Gerrit-Reviewer: 20after4 <mmod...@wikimedia.org> Gerrit-Reviewer: Aaron Schulz <asch...@wikimedia.org> Gerrit-Reviewer: Chad <ch...@wikimedia.org> Gerrit-Reviewer: Florianschmidtwelzow <florian.schmidt.stargatewis...@gmail.com> Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org> Gerrit-Reviewer: Krinkle <krinklem...@gmail.com> Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com> Gerrit-Reviewer: Ori.livneh <o...@wikimedia.org> Gerrit-Reviewer: Paladox <thomasmulhall...@yahoo.com> Gerrit-Reviewer: Reedy <re...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits