X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecials%2FSpecialVersion.php;h=4651fe6c8ce931eb78d7f44042dd412202d1bc82;hb=5bf7522c8e8cf43234142f8858e347fa2d18fe1b;hp=a62c248f2b6cbba2e52595b9f604b73fb349cb23;hpb=39c005ca7948d4935aa26539121ed9c13fe82363;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index a62c248f2b..4651fe6c8c 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -29,15 +29,15 @@ * @ingroup SpecialPage */ class SpecialVersion extends SpecialPage { - + protected $firstExtOpened = false; protected static $extensionTypes = false; - + protected static $viewvcUrls = array( 'svn+ssh://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', 'http://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', - # Doesn't work at the time of writing but maybe some day: + # Doesn't work at the time of writing but maybe some day: 'https://svn.wikimedia.org/viewvc/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', ); @@ -49,29 +49,34 @@ class SpecialVersion extends SpecialPage { * main() */ public function execute( $par ) { - global $wgOut, $wgSpecialVersionShowHooks, $wgContLang; - + global $wgSpecialVersionShowHooks; + $this->setHeaders(); $this->outputHeader(); + $out = $this->getOutput(); + $out->allowClickjacking(); - $wgOut->addHTML( Xml::openElement( 'div', - array( 'dir' => $wgContLang->getDir() ) ) ); - $text = + $text = $this->getMediaWikiCredits() . $this->softwareInformation() . $this->getExtensionCredits(); if ( $wgSpecialVersionShowHooks ) { $text .= $this->getWgHooks(); } - - $wgOut->addWikiText( $text ); - $wgOut->addHTML( $this->IPInfo() ); - $wgOut->addHTML( '' ); + + $out->addWikiText( $text ); + $out->addHTML( $this->IPInfo() ); + + if ( $this->getRequest()->getVal( 'easteregg' ) ) { + if ( $this->showEasterEgg() ) { + // TODO: put something interesting here + } + } } /** * Returns wiki text showing the license information. - * + * * @return string */ private static function getMediaWikiCredits() { @@ -88,18 +93,21 @@ class SpecialVersion extends SpecialPage { } /** - * Get the "Mediawiki is copyright 2001-20xx by lots of cool guys" text + * Get the "MediaWiki is copyright 2001-20xx by lots of cool guys" text * * @return String */ public static function getCopyrightAndAuthorList() { global $wgLang; - $authorList = array( 'Magnus Manske', 'Brion Vibber', 'Lee Daniel Crocker', + $authorList = array( + 'Magnus Manske', 'Brion Vibber', 'Lee Daniel Crocker', 'Tim Starling', 'Erik Möller', 'Gabriel Wicke', 'Ævar Arnfjörð Bjarmason', 'Niklas Laxström', 'Domas Mituzas', 'Rob Church', 'Yuri Astrakhan', 'Aryeh Gregor', 'Aaron Schulz', 'Andrew Garrett', 'Raimond Spekking', 'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe', + 'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed', + 'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Ashar Voultoiz', wfMsg( 'version-poweredby-others' ) ); @@ -109,7 +117,7 @@ class SpecialVersion extends SpecialPage { /** * Returns wiki text showing the third party software versions (apache, php, mysql). - * + * * @return string */ static function softwareInformation() { @@ -132,14 +140,14 @@ class SpecialVersion extends SpecialPage { " . wfMsg( 'version-software-product' ) . " " . wfMsg( 'version-software-version' ) . " \n"; - + foreach( $software as $name => $version ) { $out .= " " . $name . " - " . $version . " + " . $version . " \n"; } - + return $out . Xml::closeElement( 'table' ); } @@ -159,8 +167,8 @@ class SpecialVersion extends SpecialPage { $version = "$wgVersion (r{$info['checkout-rev']})"; } else { $version = $wgVersion . ' ' . - wfMsg( - 'version-svn-revision', + wfMsg( + 'version-svn-revision', isset( $info['directory-rev'] ) ? $info['directory-rev'] : '', $info['checkout-rev'] ); @@ -169,7 +177,7 @@ class SpecialVersion extends SpecialPage { wfProfileOut( __METHOD__ ); return $version; } - + /** * Return a wikitext-formatted string of the MediaWiki version with a link to * the SVN revision if available. @@ -179,16 +187,16 @@ class SpecialVersion extends SpecialPage { public static function getVersionLinked() { global $wgVersion, $IP; wfProfileIn( __METHOD__ ); - + $info = self::getSvnInfo( $IP ); - - if ( isset( $info['checkout-rev'] ) ) { + + if ( isset( $info['checkout-rev'] ) ) { $linkText = wfMsg( 'version-svn-revision', isset( $info['directory-rev'] ) ? $info['directory-rev'] : '', $info['checkout-rev'] ); - + if ( isset( $info['viewvc-url'] ) ) { $version = "$wgVersion [{$info['viewvc-url']} $linkText]"; } else { @@ -197,7 +205,7 @@ class SpecialVersion extends SpecialPage { } else { $version = $wgVersion; } - + wfProfileOut( __METHOD__ ); return $version; } @@ -205,13 +213,13 @@ class SpecialVersion extends SpecialPage { /** * Returns an array with the base extension types. * Type is stored as array key, the message as array value. - * + * * TODO: ideally this would return all extension types, including * those added by SpecialVersionExtensionTypes. This is not possible * since this hook is passing along $this though. - * + * * @since 1.17 - * + * * @return array */ public static function getExtensionTypes() { @@ -221,43 +229,46 @@ class SpecialVersion extends SpecialPage { 'parserhook' => wfMsg( 'version-parserhooks' ), 'variable' => wfMsg( 'version-variables' ), 'media' => wfMsg( 'version-mediahandlers' ), + 'antispam' => wfMsg( 'version-antispam' ), + 'skin' => wfMsg( 'version-skins' ), + 'api' => wfMsg( 'version-api' ), 'other' => wfMsg( 'version-other' ), ); - + wfRunHooks( 'ExtensionTypes', array( &self::$extensionTypes ) ); } - + return self::$extensionTypes; } - + /** * Returns the internationalized name for an extension type. - * + * * @since 1.17 - * + * * @param $type String - * + * * @return string */ public static function getExtensionTypeName( $type ) { $types = self::getExtensionTypes(); - return $types[$type]; + return isset( $types[$type] ) ? $types[$type] : $types['other']; } - + /** * Generate wikitext showing extensions name, URL, author and description. * * @return String: Wikitext */ function getExtensionCredits() { - global $wgExtensionCredits, $wgExtensionFunctions, $wgParser, $wgSkinExtensionFunctions; + global $wgExtensionCredits, $wgExtensionFunctions, $wgParser; - if ( !count( $wgExtensionCredits ) && !count( $wgExtensionFunctions ) && !count( $wgSkinExtensionFunctions ) ) { + if ( !count( $wgExtensionCredits ) && !count( $wgExtensionFunctions ) ) { return ''; } $extensionTypes = self::getExtensionTypes(); - + /** * @deprecated as of 1.17, use hook ExtensionTypes instead. */ @@ -266,25 +277,25 @@ class SpecialVersion extends SpecialPage { $out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), wfMsg( 'version-extensions' ) ) . Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-ext' ) ); - // Make sure the 'other' type is set to an array. + // Make sure the 'other' type is set to an array. if ( !array_key_exists( 'other', $wgExtensionCredits ) ) { $wgExtensionCredits['other'] = array(); } - + // Find all extensions that do not have a valid type and give them the type 'other'. foreach ( $wgExtensionCredits as $type => $extensions ) { if ( !array_key_exists( $type, $extensionTypes ) ) { $wgExtensionCredits['other'] = array_merge( $wgExtensionCredits['other'], $extensions ); } } - + // Loop through the extension categories to display their extensions in the list. foreach ( $extensionTypes as $type => $message ) { if ( $type != 'other' ) { $out .= $this->getExtensionCategory( $type, $message ); } } - + // We want the 'other' type to be last in the list. $out .= $this->getExtensionCategory( 'other', $extensionTypes['other'] ); @@ -304,36 +315,32 @@ class SpecialVersion extends SpecialPage { $out .= '' . $this->listToText( $tags ). "\n"; } - if( count( $fhooks = $wgParser->getFunctionHooks() ) ) { + $fhooks = $wgParser->getFunctionHooks(); + if( count( $fhooks ) ) { $out .= $this->openExtType( wfMsg( 'version-parser-function-hooks' ), 'parser-function-hooks' ); $out .= '' . $this->listToText( $fhooks ) . "\n"; } - if ( count( $wgSkinExtensionFunctions ) ) { - $out .= $this->openExtType( wfMsg( 'version-skin-extension-functions' ), 'skin-extension-functions' ); - $out .= '' . $this->listToText( $wgSkinExtensionFunctions ) . "\n"; - } - $out .= Xml::closeElement( 'table' ); - + return $out; } - + /** * Creates and returns the HTML for a single extension category. - * + * * @since 1.17 - * + * * @param $type String * @param $message String - * + * * @return string */ protected function getExtensionCategory( $type, $message ) { - global $wgExtensionCredits; - + global $wgExtensionCredits; + $out = ''; - + if ( array_key_exists( $type, $wgExtensionCredits ) && count( $wgExtensionCredits[$type] ) > 0 ) { $out .= $this->openExtType( $message, 'credits-' . $type ); @@ -345,17 +352,16 @@ class SpecialVersion extends SpecialPage { } return $out; - } + } /** * Callback to sort extensions by type. */ function compare( $a, $b ) { - global $wgLang; if( $a['name'] === $b['name'] ) { return 0; } else { - return $wgLang->lc( $a['name'] ) > $wgLang->lc( $b['name'] ) + return $this->getLang()->lc( $a['name'] ) > $this->getLang()->lc( $b['name'] ) ? 1 : -1; } @@ -363,14 +369,14 @@ class SpecialVersion extends SpecialPage { /** * Creates and formats the creidts for a single extension and returns this. - * + * * @param $extension Array - * + * * @return string */ function getCreditsForExtension( array $extension ) { $name = isset( $extension['name'] ) ? $extension['name'] : '[no name]'; - + if ( isset( $extension['path'] ) ) { $svnInfo = self::getSvnInfo( dirname($extension['path']) ); $directoryRev = isset( $svnInfo['directory-rev'] ) ? $svnInfo['directory-rev'] : null; @@ -388,10 +394,10 @@ class SpecialVersion extends SpecialPage { } else { $mainLink = $name; } - + if ( isset( $extension['version'] ) ) { - $versionText = '' . - wfMsg( 'version-version', $extension['version'] ) . + $versionText = '' . + wfMsg( 'version-version', $extension['version'] ) . ''; } else { $versionText = ''; @@ -407,22 +413,19 @@ class SpecialVersion extends SpecialPage { # Make description text. $description = isset ( $extension['description'] ) ? $extension['description'] : ''; - + if( isset ( $extension['descriptionmsg'] ) ) { # Look for a localized description. $descriptionMsg = $extension['descriptionmsg']; - + if( is_array( $descriptionMsg ) ) { $descriptionMsgKey = $descriptionMsg[0]; // Get the message key array_shift( $descriptionMsg ); // Shift out the message key to get the parameters only array_map( "htmlspecialchars", $descriptionMsg ); // For sanity - $msg = wfMsg( $descriptionMsgKey, $descriptionMsg ); + $description = wfMsg( $descriptionMsgKey, $descriptionMsg ); } else { - $msg = wfMsg( $descriptionMsg ); + $description = wfMsg( $descriptionMsg ); } - if ( !wfEmptyMsg( $descriptionMsg, $msg ) && $msg != '' ) { - $description = $msg; - } } if ( $svnText !== false ) { @@ -433,12 +436,12 @@ class SpecialVersion extends SpecialPage { $extNameVer = " $mainLink $versionText"; } - + $author = isset ( $extension['author'] ) ? $extension['author'] : array(); $extDescAuthor = "$description - " . $this->listToText( (array)$author, false ) . " + " . $this->listAuthors( $author, false ) . " \n"; - + return $extNameVer . $extDescAuthor; } @@ -461,11 +464,12 @@ class SpecialVersion extends SpecialPage { " . wfMsg( 'version-hook-subscribedby' ) . " \n"; - foreach ( $myWgHooks as $hook => $hooks ) + foreach ( $myWgHooks as $hook => $hooks ) { $ret .= " $hook " . $this->listToText( $hooks ) . " \n"; + } $ret .= Xml::closeElement( 'table' ); return $ret; @@ -482,13 +486,13 @@ class SpecialVersion extends SpecialPage { $out .= '' . Html::element( 'td', $opt ) . "\n"; } $this->firstExtOpened = true; - + if( $name ) { $opt['id'] = "sv-$name"; } $out .= "" . Xml::element( 'th', $opt, $text ) . "\n"; - + return $out; } @@ -498,17 +502,35 @@ class SpecialVersion extends SpecialPage { * @return String: HTML fragment */ private function IPInfo() { - $ip = str_replace( '--', ' - ', htmlspecialchars( wfGetIP() ) ); + $ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) ); return "\n" . "visited from $ip"; } + /** + * Return a formatted unsorted list of authors + * + * @param $authors mixed: string or array of strings + * @return String: HTML fragment + */ + function listAuthors( $authors ) { + $list = array(); + foreach( (array)$authors as $item ) { + if( $item == '...' ) { + $list[] = wfMsg( 'version-poweredby-others' ); + } else { + $list[] = $item; + } + } + return $this->listToText( $list, false ); + } + /** * Convert an array of items into a list for display. * * @param $list Array of elements to display * @param $sort Boolean: whether to sort the items in $list - * + * * @return String */ function listToText( $list, $sort = true ) { @@ -520,11 +542,10 @@ class SpecialVersion extends SpecialPage { } elseif ( $cnt == 0 ) { return ''; } else { - global $wgLang; if ( $sort ) { sort( $list ); } - return $wgLang->listToText( array_map( array( __CLASS__, 'arrayToString' ), $list ) ); + return $this->getLang()->listToText( array_map( array( __CLASS__, 'arrayToString' ), $list ) ); } } @@ -533,29 +554,31 @@ class SpecialVersion extends SpecialPage { * * @param $list Mixed: will convert an array to string if given and return * the paramater unaltered otherwise - * + * * @return Mixed */ - static function arrayToString( $list ) { - if( is_array( $list ) && count( $list ) == 1 ) + public static function arrayToString( $list ) { + if( is_array( $list ) && count( $list ) == 1 ) { $list = $list[0]; + } if( is_object( $list ) ) { $class = get_class( $list ); return "($class)"; } elseif ( !is_array( $list ) ) { return $list; } else { - if( is_object( $list[0] ) ) + if( is_object( $list[0] ) ) { $class = get_class( $list[0] ); - else + } else { $class = $list[0]; + } return "($class, {$list[1]})"; } } /** - * Get an associative array of information about a given path, from its .svn - * subdirectory. Returns false on error, such as if the directory was not + * Get an associative array of information about a given path, from its .svn + * subdirectory. Returns false on error, such as if the directory was not * checked out with subversion. * * Returned keys are: @@ -603,7 +626,7 @@ class SpecialVersion extends SpecialPage { } } } - + return false; } @@ -611,26 +634,26 @@ class SpecialVersion extends SpecialPage { if ( count( $lines ) < 11 ) { return false; } - + $info = array( 'checkout-rev' => intval( trim( $lines[3] ) ), 'url' => trim( $lines[4] ), 'repo-url' => trim( $lines[5] ), 'directory-rev' => intval( trim( $lines[10] ) ) ); - + if ( isset( self::$viewvcUrls[$info['repo-url']] ) ) { - $viewvc = str_replace( - $info['repo-url'], + $viewvc = str_replace( + $info['repo-url'], self::$viewvcUrls[$info['repo-url']], $info['url'] ); - + $viewvc .= '/?pathrev='; $viewvc .= urlencode( $info['checkout-rev'] ); $info['viewvc-url'] = $viewvc; } - + return $info; } @@ -638,12 +661,12 @@ class SpecialVersion extends SpecialPage { * Retrieve the revision number of a Subversion working directory. * * @param $dir String: directory of the svn checkout - * + * * @return Integer: revision number as int */ public static function getSvnRevision( $dir ) { $info = self::getSvnInfo( $dir ); - + if ( $info === false ) { return false; } elseif ( isset( $info['checkout-rev'] ) ) { @@ -653,4 +676,108 @@ class SpecialVersion extends SpecialPage { } } + function showEasterEgg() { + $rx = $rp = $xe = ''; + $alpha = array("", "kbQW", "\$\n()"); + $beta = implode( "', '", $alpha); + $juliet = 'echo $delta + strrev($foxtrot) - $alfa + $wgVersion . base64_decode($bravo) * $charlie'; + for ( $i = 1; $i <= 4; $i++ ) { + $rx .= '([^j]*)J'; + $rp .= "+(\\$i)"; + } + + $rx = "/$rx/Sei"; + $O = substr("$alpha')", 1); + for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) { + $rx[$i-1] = strtolower( $rx[$i-1] ); + } + $ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*"; + $ry = "/$ry/Sei"; + $O = substr("$beta')", 1); + preg_match_all('/(?<=\$)[[:alnum:]]*/',substr($juliet, 0, $i<<1), $charlie); + foreach( $charlie[0] as $bravo ) { + $$bravo =& $xe; + } + $xe = 'xe=<<0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo'; + + $haystack = preg_replace($ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet); + return preg_replace( $rx, $rp, $haystack ); + } }