diff options
Diffstat (limited to 'includes/Title.php')
-rw-r--r-- | includes/Title.php | 211 |
1 files changed, 162 insertions, 49 deletions
diff --git a/includes/Title.php b/includes/Title.php index 255cc157bc38..35ae3e839102 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -88,13 +88,13 @@ class Title { # From a URL-encoded title /* static */ function newFromURL( $url ) { - global $wgLang, $wgServer; + global $wgLang, $wgServer, $wgIsMySQL, $wgIsPg; $t = new Title(); - $s = urldecode( $url ); # This is technically wrong, as anything - # we've gotten is already decoded by PHP. - # Kept for backwards compatibility with - # buggy URLs we had for a while... - $s = $url; + + # For compatibility with old buggy URLs. "+" is not valid in titles, + # but some URLs used it as a space replacement and they still come + # from some external search tools. + $s = str_replace( "+", " ", $url ); # For links that came from outside, check for alternate/legacy # character encoding. @@ -109,14 +109,20 @@ class Title { $t->mDbkeyform = str_replace( " ", "_", $s ); if( $t->secureAndSplit() ) { - # check that lenght of title is < cur_title size - $sql = "SHOW COLUMNS FROM cur LIKE \"cur_title\";"; - $cur_title_object = wfFetchObject(wfQuery( $sql, DB_READ )); + if ($wgIsMySQL) { + $sql = "SHOW COLUMNS FROM cur LIKE \"cur_title\";"; + $cur_title_object = wfFetchObject(wfQuery( $sql, DB_READ )); - preg_match( "/\((.*)\)/", $cur_title_object->Type, $cur_title_size); + preg_match( "/\((.*)\)/", $cur_title_object->Type, $cur_title_type); + $cur_title_size=$cur_title_type[1]; + } else { + /* midom:FIXME pg_field_type does not return varchar length + assume 255 */ + $cur_title_size=255; + } - if (strlen($t->mDbkeyform) > $cur_title_size[1] ) { + if (strlen($t->mDbkeyform) > $cur_title_size ) { return NULL; } @@ -182,11 +188,12 @@ class Title { # Missing characters: # * []|# Needed for link syntax # * % and + are corrupted by Apache when they appear in the path + # * % seems to work though # # Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but # this breaks interlanguage links - $set = " !\"$&'()*,\\-.\\/0-9:;<=>?@A-Z\\\\^_`a-z{}~\\x80-\\xFF"; + $set = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z{}~\\x80-\\xFF"; return $set; } @@ -228,8 +235,7 @@ class Title { # The URL contains $1, which is replaced by the title function getInterwikiLink( $key ) { - global $wgMemc, $wgDBname, $wgInterwikiExpiry; - static $wgTitleInterwikiCache = array(); + global $wgMemc, $wgDBname, $wgInterwikiExpiry, $wgTitleInterwikiCache; $k = "$wgDBname:interwiki:$key"; @@ -369,9 +375,6 @@ class Title { $n = $wgLang->getNsText( $this->mNamespace ); if ( "" != $n ) { $n .= ":"; } $u = str_replace( "$1", $n . $this->mUrlform, $p ); - if ( "" != $this->mFragment ) { - $u .= "#" . wfUrlencode( $this->mFragment ); - } return $u; } @@ -486,15 +489,20 @@ class Title { # Can $wgUser edit this page? function userCanEdit() { - + global $wgUser; if ( -1 == $this->mNamespace ) { return false; } + if ( NS_MEDIAWIKI == $this->mNamespace && !$wgUser->isSysop() ) { return false; } # if ( 0 == $this->getArticleID() ) { return false; } if ( $this->mDbkeyform == "_" ) { return false; } + # protect global styles and js + if ( NS_MEDIAWIKI == $this->mNamespace + && preg_match("/\\.(css|js)$/", $this->mTextform ) + && !$wgUser->isSysop() ) + { return false; } //if ( $this->isCssJsSubpage() and !$this->userCanEditCssJsSubpage() ) { return false; } # protect css/js subpages of user pages # XXX: this might be better using restrictions # XXX: Find a way to work around the php bug that prevents using $this->userCanEditCssJsSubpage() from working - global $wgUser; if( Namespace::getUser() == $this->mNamespace and preg_match("/\\.(css|js)$/", $this->mTextform ) and !$wgUser->isSysop() @@ -520,7 +528,7 @@ class Title { if( in_array( $name, $wgWhitelistRead ) ) return true; # Compatibility with old settings - if( $this->getNamespace() == NS_ARTICLE ) { + if( $this->getNamespace() == NS_MAIN ) { if( in_array( ":" . $name, $wgWhitelistRead ) ) return true; } return false; @@ -638,6 +646,7 @@ class Title { # Initialisation if ( $imgpre === false ) { $imgpre = ":" . $wgLang->getNsText( Namespace::getImage() ) . ":"; + # % is needed as well $rxTc = "/[^" . Title::legalChars() . "]/"; } @@ -668,7 +677,7 @@ class Title { $this->mNamespace = NS_MAIN; } else { # Namespace or interwiki prefix - if ( preg_match( "/^((?:i|x|[a-z]{2,3})(?:-[a-z0-9]+)?|[A-Za-z0-9_\\x80-\\xff]+?)_*:_*(.*)$/", $t, $m ) ) { + if ( preg_match( "/^(.+?)_*:_*(.*)$/", $t, $m ) ) { #$p = strtolower( $m[1] ); $p = $m[1]; $lowerNs = strtolower( $p ); @@ -716,8 +725,13 @@ class Title { return false; } - # "." and ".." conflict with the directories of those names - if ( $r === "." || $r === ".." ) { + # "." and ".." conflict with the directories of those namesa + if ( strpos( $r, "." ) !== false && + ( $r === "." || $r === ".." || + strpos( $r, "./" ) === 0 || + strpos( $r, "/./" !== false ) || + strpos( $r, "/../" !== false ) ) ) + { return false; } @@ -756,9 +770,10 @@ class Title { $retVal = array(); if ( wfNumRows( $res ) ) { while ( $row = wfFetchObject( $res ) ) { - $titleObj = Title::makeTitle( $row->cur_namespace, $row->cur_title ); - $wgLinkCache->addGoodLink( $row->cur_id, $titleObj->getPrefixedDBkey() ); - $retVal[] = $titleObj; + if ( $titleObj = Title::makeTitle( $row->cur_namespace, $row->cur_title ) ) { + $wgLinkCache->addGoodLink( $row->cur_id, $titleObj->getPrefixedDBkey() ); + $retVal[] = $titleObj; + } } } wfFreeResult( $res ); @@ -777,7 +792,7 @@ class Title { if ( wfNumRows( $res ) ) { while ( $row = wfFetchObject( $res ) ) { $titleObj = Title::makeTitle( $row->cur_namespace, $row->cur_title ); - $wgLinkCache->addGoodLink( $titleObj->getPrefixedDBkey(), $row->cur_id ); + $wgLinkCache->addGoodLink( $row->cur_id, $titleObj->getPrefixedDBkey() ); $retVal[] = $titleObj; } } @@ -927,7 +942,7 @@ class Title { $fname ); - RecentChange::notifyMove( $now, $this, $nt, $wgUser, $comment ); + RecentChange::notifyMoveOverRedirect( $now, $this, $nt, $wgUser, $comment ); # Swap links @@ -935,34 +950,51 @@ class Title { $linksToOld = $this->getLinksTo(); $linksToNew = $nt->getLinksTo(); - # Make function to convert Titles to IDs - $titleToID = create_function('$t', 'return $t->getArticleID();'); - - # Reassign links to old title - if ( count( $linksToOld ) ) { - $sql = "UPDATE links SET l_to=$newid WHERE l_from IN ("; - $sql .= implode( ",", array_map( $titleToID, $linksToOld ) ); - $sql .= ")"; - wfQuery( $sql, DB_WRITE, $fname ); - } - - # Reassign links to new title - if ( count( $linksToNew ) ) { - $sql = "UPDATE links SET l_to=$oldid WHERE l_from IN ("; - $sql .= implode( ",", array_map( $titleToID, $linksToNew ) ); - $sql .= ")"; + # Delete them all + $sql = "DELETE FROM links WHERE l_to=$oldid OR l_to=$newid"; + wfQuery( $sql, DB_WRITE, $fname ); + + # Reinsert + if ( count( $linksToOld ) || count( $linksToNew )) { + $sql = "INSERT INTO links (l_from,l_to) VALUES "; + $first = true; + + # Insert links to old title + foreach ( $linksToOld as $linkTitle ) { + if ( $first ) { + $first = false; + } else { + $sql .= ","; + } + $id = $linkTitle->getArticleID(); + $sql .= "($id,$newid)"; + } + + # Insert links to new title + foreach ( $linksToNew as $linkTitle ) { + if ( $first ) { + $first = false; + } else { + $sql .= ","; + } + $id = $linkTitle->getArticleID(); + $sql .= "($id, $oldid)"; + } + wfQuery( $sql, DB_WRITE, $fname ); } - # Note: the insert below must be after the updates above! - # Now, we record the link from the redirect to the new title. # It should have no other outgoing links... $sql = "DELETE FROM links WHERE l_from={$newid}"; wfQuery( $sql, DB_WRITE, $fname ); $sql = "INSERT INTO links (l_from,l_to) VALUES ({$newid},{$oldid})"; wfQuery( $sql, DB_WRITE, $fname ); - + + # Clear linkscc + LinkCache::linksccClearLinksTo( $oldid ); + LinkCache::linksccClearLinksTo( $newid ); + # Purge squid if ( $wgUseSquid ) { $urls = array_merge( $nt->getSquidURLs(), $this->getSquidURLs() ); @@ -1029,14 +1061,16 @@ class Title { ), $fname ); - # Miscellaneous updates + # Record in RC + RecentChange::notifyMoveToNew( $now, $this, $nt, $wgUser, $comment ); - RecentChange::notifyMove( $now, $this, $nt, $wgUser, $comment ); + # Purge squid and linkscc as per article creation Article::onArticleCreate( $nt ); # Any text links to the old title must be reassigned to the redirect $sql = "UPDATE links SET l_to={$newid} WHERE l_to={$oldid}"; wfQuery( $sql, DB_WRITE, $fname ); + LinkCache::linksccClearLinksTo( $oldid ); # Record the just-created redirect's linking to the page $sql = "INSERT INTO links (l_from,l_to) VALUES ({$newid},{$oldid})"; @@ -1140,5 +1174,84 @@ class Title { return true; } + # Get categories to wich belong this title and return an array of + # categories names. + function getParentCategories( ) + { + global $wgLang,$wgUser; + + #$titlekey = wfStrencode( $this->getArticleID() ); + $titlekey = $this->getArticleId(); + $cns = Namespace::getCategory(); + $sk =& $wgUser->getSkin(); + $parents = array(); + + # get the parents categories of this title from the database + $sql = "SELECT DISTINCT cur_id FROM cur,categorylinks + WHERE cl_from='$titlekey' AND cl_to=cur_title AND cur_namespace='$cns' + ORDER BY cl_sortkey" ; + $res = wfQuery ( $sql, DB_READ ) ; + + if(wfNumRows($res) > 0) { + while ( $x = wfFetchObject ( $res ) ) $data[] = $x ; + wfFreeResult ( $res ) ; + } else { + $data = ''; + } + return $data; + } + + # will get the parents and grand-parents + # TODO : not sure what's happening when a loop happen like: + # Encyclopedia > Astronomy > Encyclopedia + function getAllParentCategories(&$stack) + { + global $wgUser,$wgLang; + $result = ''; + + # getting parents + $parents = $this->getParentCategories( ); + + if($parents == '') + { + # The current element has no more parent so we dump the stack + # and make a clean line of categories + $sk =& $wgUser->getSkin() ; + + foreach ( array_reverse($stack) as $child => $parent ) + { + # make a link of that parent + $result .= $sk->makeLink($wgLang->getNSText ( Namespace::getCategory() ).":".$parent,$parent); + $result .= ' > '; + $lastchild = $child; + } + # append the last child. + # TODO : We should have a last child unless there is an error in the + # "categorylinks" table. + if(isset($lastchild)) { $result .= $lastchild; } + + $result .= "<br/>\n"; + + # now we can empty the stack + $stack = array(); + + } else { + # look at parents of current category + foreach($parents as $parent) + { + # create a title object for the parent + $tpar = Title::newFromID($parent->cur_id); + # add it to the stack + $stack[$this->getText()] = $tpar->getText(); + # grab its parents + $result .= $tpar->getAllParentCategories($stack); + } + } + + if(isset($result)) { return $result; } + else { return ''; }; + } + + } ?> |