X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FTitle.php;h=0d5d1c74147b95984cfcda6323122b1fdebb669f;hb=4a3cd50cba4aefba6e32c2a3de3de56eb368ad9e;hp=0721c1cab7dcbbca291b4c8712db217d98f3501d;hpb=01d0d88929f7b8789e9328ac9e671ab11348152e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Title.php b/includes/Title.php index 0721c1cab7..0d5d1c7414 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -9,6 +9,8 @@ require_once( 'normal/UtfNormal.php' ); $wgTitleInterwikiCache = array(); +$wgTitleCache = array(); + define ( 'GAID_FOR_UPDATE', 1 ); # Title::newFromTitle maintains a cache to avoid @@ -103,6 +105,7 @@ class Title { * @access public */ function newFromText( $text, $defaultNamespace = NS_MAIN ) { + global $wgTitleCache; $fname = 'Title::newFromText'; wfProfileIn( $fname ); @@ -118,10 +121,9 @@ class Title { * * In theory these are value objects and won't get changed... */ - static $titleCache = array(); - if( $defaultNamespace == NS_MAIN && isset( $titleCache[$text] ) ) { + if( $defaultNamespace == NS_MAIN && isset( $wgTitleCache[$text] ) ) { wfProfileOut( $fname ); - return $titleCache[$text]; + return $wgTitleCache[$text]; } /** @@ -135,11 +137,11 @@ class Title { if( $t->secureAndSplit() ) { if( $defaultNamespace == NS_MAIN ) { - if( count( $titleCache ) >= MW_TITLECACHE_MAX ) { + if( count( $wgTitleCache ) >= MW_TITLECACHE_MAX ) { # Avoid memory leaks on mass operations... - $titleCache = array(); + $wgTitleCache = array(); } - $titleCache[$text] =& $t; + $wgTitleCache[$text] =& $t; } wfProfileOut( $fname ); return $t; @@ -159,7 +161,6 @@ class Title { * @access public */ function newFromURL( $url ) { - global $wgLang, $wgServer; $t = new Title(); # For compatibility with old buggy URLs. "+" is not valid in titles, @@ -316,24 +317,8 @@ class Title { * @access public */ function legalChars() { - # Missing characters: - # * []|# Needed for link syntax - # * % and + are corrupted by Apache when they appear in the path - # - # % seems to work though - # - # The problem with % is that URLs are double-unescaped: once by Apache's - # path conversion code, and again by PHP. So %253F, for example, becomes "?". - # Our code does not double-escape to compensate for this, indeed double escaping - # would break if the double-escaped title was passed in the query string - # rather than the path. This is a minor security issue because articles can be - # created such that they are hard to view or edit. -- TS - # - # Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but - # this breaks interlanguage links - - $set = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF"; - return $set; + global $wgLegalTitleChars; + return $wgLegalTitleChars; } /** @@ -346,7 +331,7 @@ class Title { * search index */ /* static */ function indexTitle( $ns, $title ) { - global $wgDBminWordLen, $wgContLang; + global $wgContLang; require_once( 'SearchEngine.php' ); $lc = SearchEngine::legalSearchChars() . '&#;'; @@ -387,7 +372,7 @@ class Title { * @static (arguably) * @access public */ - function getInterwikiLink( $key, $transludeonly = false ) { + function getInterwikiLink( $key ) { global $wgMemc, $wgDBname, $wgInterwikiExpiry, $wgTitleInterwikiCache; $fname = 'Title::getInterwikiLink'; @@ -483,7 +468,6 @@ class Title { * @access public */ function touchArray( $titles, $timestamp = '' ) { - global $wgUseFileCache; if ( count( $titles ) == 0 ) { return; @@ -492,8 +476,8 @@ class Title { if ( $timestamp == '' ) { $timestamp = $dbw->timestamp(); } - $page = $dbw->tableName( 'page' ); /* + $page = $dbw->tableName( 'page' ); $sql = "UPDATE $page SET page_touched='{$timestamp}' WHERE page_id IN ("; $first = true; @@ -623,7 +607,7 @@ class Title { */ function getPrefixedText() { global $wgContLang; - if ( empty( $this->mPrefixedText ) ) { + if ( empty( $this->mPrefixedText ) ) { // FIXME: bad usage of empty() ? $s = $this->prefix( $this->mTextform ); $s = str_replace( '_', ' ', $s ); $this->mPrefixedText = $s; @@ -675,93 +659,33 @@ class Title { * @access public */ function getFullURL( $query = '' ) { - global $wgContLang, $wgServer, $wgScript, $wgMakeDumpLinks, $wgArticlePath; + global $wgContLang, $wgServer; if ( '' == $this->mInterwiki ) { - return $wgServer . $this->getLocalUrl( $query ); - } elseif ( $wgMakeDumpLinks && $wgContLang->getLanguageName( $this->mInterwiki ) ) { - $baseUrl = str_replace( '$1', "../../{$this->mInterwiki}/$1", $wgArticlePath ); - $baseUrl = str_replace( '$1', $this->getHashedDirectory() . '/$1', $baseUrl ); + $url = $wgServer . $this->getLocalUrl( $query ); } else { $baseUrl = $this->getInterwikiLink( $this->mInterwiki ); - } - $namespace = $wgContLang->getNsText( $this->mNamespace ); - if ( '' != $namespace ) { - # Can this actually happen? Interwikis shouldn't be parsed. - $namespace .= ':'; - } - $url = str_replace( '$1', $namespace . $this->mUrlform, $baseUrl ); - if( $query != '' ) { - if( false === strpos( $url, '?' ) ) { - $url .= '?'; - } else { - $url .= '&'; + $namespace = $wgContLang->getNsText( $this->mNamespace ); + if ( '' != $namespace ) { + # Can this actually happen? Interwikis shouldn't be parsed. + $namespace .= ':'; } - $url .= $query; - } - if ( '' != $this->mFragment ) { - $url .= '#' . $this->mFragment; - } - return $url; - } - - /** - * Get a relative directory for putting an HTML version of this article into - */ - function getHashedDirectory() { - global $wgMakeDumpLinks, $wgInputEncoding; - $dbkey = $this->getDBkey(); - - # Split into characters - if ( $wgInputEncoding == 'UTF-8' ) { - preg_match_all( '/./us', $dbkey, $m ); - } else { - preg_match_all( '/./s', $dbkey, $m ); - } - $chars = $m[0]; - $length = count( $chars ); - $dir = ''; - - for ( $i = 0; $i < $wgMakeDumpLinks; $i++ ) { - if ( $i ) { - $dir .= '/'; + $url = str_replace( '$1', $namespace . $this->mUrlform, $baseUrl ); + if( $query != '' ) { + if( false === strpos( $url, '?' ) ) { + $url .= '?'; + } else { + $url .= '&'; + } + $url .= $query; } - if ( $i >= $length ) { - $dir .= '_'; - } elseif ( ord( $chars[$i] ) > 32 ) { - $dir .= strtolower( $chars[$i] ); - } else { - $dir .= sprintf( "%02X", ord( $chars[$i] ) ); + if ( '' != $this->mFragment ) { + $url .= '#' . $this->mFragment; } } - return $dir; - } - - function getHashedFilename() { - $dbkey = $this->getPrefixedDBkey(); - $mainPage = Title::newMainPage(); - if ( $mainPage->getPrefixedDBkey() == $dbkey ) { - return 'index.html'; - } - - $dir = $this->getHashedDirectory(); - - # Replace illegal charcters for Windows paths with underscores - $friendlyName = strtr( $dbkey, '/\\*?"<>|~', '_________' ); - - # Work out lower case form. We assume we're on a system with case-insensitive - # filenames, so unless the case is of a special form, we have to disambiguate - $lowerCase = $this->prefix( ucfirst( strtolower( $this->getDBkey() ) ) ); - - # Make it mostly unique - if ( $lowerCase != $friendlyName ) { - $friendlyName .= '_' . substr(md5( $dbkey ), 0, 4); - } - # Handle colon specially by replacing it with tilde - # Thus we reduce the number of paths with hashes appended - $friendlyName = str_replace( ':', '~', $friendlyName ); - return "$dir/$friendlyName.html"; + wfRunHooks( 'GetFullURL', array( &$this, &$url, $query ) ); + return $url; } /** @@ -773,40 +697,42 @@ class Title { * @access public */ function getLocalURL( $query = '' ) { - global $wgLang, $wgArticlePath, $wgScript, $wgMakeDumpLinks, $wgServer, $action; + global $wgArticlePath, $wgScript, $wgServer, $wgRequest; if ( $this->isExternal() ) { - return $this->getFullURL(); - } - - $dbkey = wfUrlencode( $this->getPrefixedDBkey() ); - if ( $wgMakeDumpLinks ) { - $url = str_replace( '$1', wfUrlencode( $this->getHashedFilename() ), $wgArticlePath ); - } elseif ( $query == '' ) { - $url = str_replace( '$1', $dbkey, $wgArticlePath ); + $url = $this->getFullURL(); } else { - global $wgActionPaths; - if( !empty( $wgActionPaths ) && - preg_match( '/^(.*&|)action=([^&]*)(&(.*)|)$/', $query, $matches ) ) { - $action = urldecode( $matches[2] ); - if( isset( $wgActionPaths[$action] ) ) { - $query = $matches[1]; - if( isset( $matches[4] ) ) $query .= $matches[4]; - $url = str_replace( '$1', $dbkey, $wgActionPaths[$action] ); - if( $query != '' ) $url .= '?' . $query; - return $url; + $dbkey = wfUrlencode( $this->getPrefixedDBkey() ); + if ( $query == '' ) { + $url = str_replace( '$1', $dbkey, $wgArticlePath ); + } else { + global $wgActionPaths; + $url = false; + if( !empty( $wgActionPaths ) && + preg_match( '/^(.*&|)action=([^&]*)(&(.*)|)$/', $query, $matches ) ) + { + $action = urldecode( $matches[2] ); + if( isset( $wgActionPaths[$action] ) ) { + $query = $matches[1]; + if( isset( $matches[4] ) ) $query .= $matches[4]; + $url = str_replace( '$1', $dbkey, $wgActionPaths[$action] ); + if( $query != '' ) $url .= '?' . $query; + } + } + if ( $url === false ) { + if ( $query == '-' ) { + $query = ''; + } + $url = "{$wgScript}?title={$dbkey}&{$query}"; } } - if ( $query == '-' ) { - $query = ''; + + if ($wgRequest->getText('action') == 'render') { + $url = $wgServer . $url; } - $url = "{$wgScript}?title={$dbkey}&{$query}"; } - - if ($action == 'render') - return $wgServer . $url; - else - return $url; + wfRunHooks( 'GetLocalURL', array( &$this, &$url, $query ) ); + return $url; } /** @@ -917,13 +843,13 @@ class Title { } /** - * Is $wgUser perform $action this page? + * Can $wgUser perform $action this page? * @param string $action action that permission needs to be checked for * @return boolean * @access private */ function userCan($action) { - $fname = 'Title::userCanEdit'; + $fname = 'Title::userCan'; wfProfileIn( $fname ); global $wgUser; @@ -931,11 +857,14 @@ class Title { wfProfileOut( $fname ); return false; } + // XXX: This is the code that prevents unprotecting a page in NS_MEDIAWIKI + // from taking effect -ævar if( NS_MEDIAWIKI == $this->mNamespace && !$wgUser->isAllowed('editinterface') ) { wfProfileOut( $fname ); return false; } + if( $this->mDbkeyform == '_' ) { # FIXME: Is this necessary? Shouldn't be allowed anyway... wfProfileOut( $fname ); @@ -977,6 +906,13 @@ class Title { wfProfileOut( $fname ); return false; } + + if( $action == 'create' ) { + if( ( $this->isTalkPage() && !$wgUser->isAllowed( 'createtalk' ) ) || + ( !$this->isTalkPage() && !$wgUser->isAllowed( 'createpage' ) ) ) { + return false; + } + } wfProfileOut( $fname ); return true; @@ -1218,7 +1154,6 @@ class Title { return; } - $now = wfTimestampNow(); $dbw =& wfGetDB( DB_MASTER ); $success = $dbw->update( 'page', array( /* SET */ @@ -1569,7 +1504,7 @@ class Title { * @return mixed true on success, message name on failure * @access public */ - function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) { + function isValidMoveOperation( &$nt, $auth = true ) { global $wgUser; if( !$this or !$nt ) { return 'badtitletext'; @@ -1581,7 +1516,6 @@ class Title { return 'immobile_namespace'; } - $fname = 'Title::move'; $oldid = $this->getArticleID(); $newid = $nt->getArticleID(); @@ -1621,7 +1555,7 @@ class Title { * @access public */ function moveTo( &$nt, $auth = true, $reason = '' ) { - $err = $this->isValidMoveOperation( $nt, $auth, $reason ); + $err = $this->isValidMoveOperation( $nt, $auth ); if( is_string( $err ) ) { return $err; } @@ -1680,6 +1614,7 @@ class Title { $u->doUpdate(); } + global $wgUser; wfRunHooks( 'TitleMoveComplete', array( &$this, &$nt, &$wgUser, $pageid, $redirid ) ); return true; } @@ -1706,7 +1641,6 @@ class Title { $newid = $nt->getArticleID(); $oldid = $this->getArticleID(); $dbw =& wfGetDB( DB_MASTER ); - $links = $dbw->tableName( 'links' ); # Delete the old redirect. We don't save it to history since # by definition if we've got here it's rather uninteresting. @@ -1956,8 +1890,6 @@ class Title { global $wgContLang,$wgUser; $titlekey = $this->getArticleId(); - $sk =& $wgUser->getSkin(); - $parents = array(); $dbr =& wfGetDB( DB_SLAVE ); $categorylinks = $dbr->tableName( 'categorylinks' ); @@ -1990,8 +1922,7 @@ class Title { $parents = $this->getParentCategories(); if($parents != '') { - foreach($parents as $parent => $current) - { + foreach($parents as $parent => $current) { if ( array_key_exists( $parent, $children ) ) { # Circular reference $stack[$parent] = array(); @@ -2063,7 +1994,7 @@ class Title { * @param Title $title * @return bool */ - function equals( &$title ) { + function equals( $title ) { return $this->getInterwiki() == $title->getInterwiki() && $this->getNamespace() == $title->getNamespace() && $this->getDbkey() == $title->getDbkey(); @@ -2080,14 +2011,12 @@ class Title { /** * Should a link should be displayed as a known link, just based on its title? * - * Currently, a self-link with a fragment, special pages and image pages are in - * this category. Special pages never exist in the database. Some images do not - * have description pages in the database, but the description page contains - * useful history information that the user may want to link to. + * Currently, a self-link with a fragment and special pages are in + * this category. Special pages never exist in the database. */ function isAlwaysKnown() { return $this->isExternal() || ( 0 == $this->mNamespace && "" == $this->mDbkeyform ) - || NS_SPECIAL == $this->mNamespace || NS_IMAGE == $this->mNamespace; + || NS_SPECIAL == $this->mNamespace; } /** @@ -2110,7 +2039,6 @@ class Title { return; } - $arr = array(); $toucharr = array(); while( $row = $dbw->fetchObject( $res ) ) { $toucharr[] = $row->pl_from;