Yardım:Özel sayfalar/Örnek kaynak
Görünüm
Özel Sayfaların Kaynağı
[değiştir | kaynağı değiştir]Normalde özel sayfaların kaynağının görülmesinin yasak olmasına karşın, sadece denetçilerin görebildiği bu sayfanın kaynağı aşağıda sadece örnek olarak gösterilmiştir:
<table border=0 cellpadding=5>
<form name="checkuser" action="/wiki/index.php/Special:CheckUser" method=post>
<tr><td>
IP:
</td><td>
<input type="text" name="ip" value="" width=50 /> <input type="submit" name="subip" value="OK" />
</td></tr>
</form>
<form name="checkuser" action="/wiki/index.php/Special:CheckUser" method=post>
<tr><td>
User:
</td><td>
<input type="text" name="user" value="" width=50 /> <input type="submit" name="subuser" value="OK" />
</td></tr>
</form>
</table><div class="printfooter">
Retrieved from "<a href="http://wikitest.dyndns.org/wiki/index.php/Special:CheckUser">http://wikitest.dyndns.org/wiki/index.php/Special:CheckUser</a>"</div>
<!-- /bodytext -->
<!-- catlinks -->
<div id='catlinks' class='catlinks catlinks-allhidden'></div> <!-- /catlinks -->
<div class="visualClear"></div>
</div>
<!-- /bodyContent -->
</div>
<!-- /content -->
<!-- header -->
<div id="mw-head" class="noprint">
<!-- 0 -->
<div id="p-personal" class="">
<h5>Personal tools</h5>
<ul>
<li id="pt-userpage"><a href="/wiki/index.php/User:Westnest" title="Your user page [.]" accesskey=".">Westnest</a></li>
<li id="pt-mytalk"><a href="/wiki/index.php/User_talk:Westnest" title="Your talk page [n]" accesskey="n">My talk</a></li>
<li id="pt-preferences"><a href="/wiki/index.php/Special:Preferences" title="Your preferences">My preferences</a></li>
<li id="pt-watchlist"><a href="/wiki/index.php/Special:Watchlist" title="The list of pages you are monitoring for changes [l]" accesskey="l">My watchlist</a></li>
<li id="pt-mycontris"><a href="/wiki/index.php/Special:Contributions/Westnest" title="List of your contributions [y]" accesskey="y">My contributions</a></li>
<li id="pt-logout"><a href="/wiki/index.php?title=Special:UserLogout&returnto=Special:CheckUser" title="Log out">Log out</a></li>
</ul>
</div>
<?php
if ( !defined( 'MEDIAWIKI' ) ) {
echo "CheckUser extension\n";
exit( 1 );
}
# Add messages
global $wgMessageCache, $wgCheckUserMessages;
foreach( $wgCheckUserMessages as $key => $value ) {
$wgMessageCache->addMessages( $wgCheckUserMessages[$key], $key );
}
class CheckUser extends UnlistedSpecialPage
{
function CheckUser() {
SpecialPage::SpecialPage('CheckUser', 'checkuser');
}
function execute( $par ) {
global $wgRequest, $wgOut, $wgTitle, $wgUser;
if ( !in_array( 'checkuser', $wgUser->getRights() ) ) {
$wgOut->setArticleRelated( false );
$wgOut->setRobotpolicy( 'noindex,nofollow' );
$wgOut->errorpage( 'nosuchspecialpage', 'nospecialpagetext' );
return;
}
$this->setHeaders();
$ip = $wgRequest->getText( 'ip' );
$user = $wgRequest->getText( 'user' );
$subip = $wgRequest->getBool( 'subip' );
$subuser = $wgRequest->getBool( 'subuser' );
$this->doTop( $ip, $user );
if ( $subip ) {
$this->doIPRequest( $ip );
} else if ( $subuser ) {
$this->doUserRequest( $user );
} else {
$this->showLog();
}
}
function doTop( $ip, $user ) {
global $wgOut, $wgTitle;
$action = $wgTitle->escapeLocalUrl();
$encIp = htmlspecialchars( $ip );
$encUser = htmlspecialchars( $user );
$wgOut->addHTML( <<<EOT
<table border=0 cellpadding=5>
<form name="checkuser" action="$action" method=post>
<tr><td>
IP:
</td><td>
<input type="text" name="ip" value="$encIp" width=50 /> <input type="submit" name="subip" value="OK" />
</td></tr>
</form>
<form name="checkuser" action="$action" method=post>
<tr><td>
User:
</td><td>
<input type="text" name="user" value="$encUser" width=50 /> <input type="submit" name="subuser" value="OK" />
</td></tr>
</form>
</table>
);
}
function doIPRequest( $ip ) {
global $wgUser, $wgOut, $wgLang, $wgDBname;
$fname = 'CheckUser::doIPRequest';
if ( !$this->addLogEntry( $wgLang->timeanddate( wfTimestampNow() ) . ' ' .
$wgUser->getName() . ' got edits for ' . htmlspecialchars( $ip ) . ' on ' . $wgDBname ))
{
$wgOut->addHTML( '<p>Unable to add log entry</p>' );
}
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->select( 'recentchanges', array( '*' ), $this->getIpConds( $dbr, $ip ), $fname,
array( 'ORDER BY' => 'rc_timestamp DESC' ) );
if ( !$dbr->numRows( $res ) ) {
$s = "No results\n";
} else {
global $IP;
require_once( $IP.'/includes/RecentChange.php' );
require_once( $IP.'/includes/ChangesList.php' );
if ( in_array( 'newfromuser', array_map( 'strtolower', get_class_methods( 'ChangesList' ) ) ) ) {
// MW >= 1.6
$list = ChangesList::newFromUser( $wgUser );
} else {
// MW < 1.6
$sk =& $wgUser->getSkin();
$list = new ChangesList( $sk );
}
$s = $list->beginRecentChangesList();
$counter = 1;
while ( ($row = $dbr->fetchObject( $res ) ) != false ) {
$rc = RecentChange::newFromRow( $row );
$rc->counter = $counter++;
$s .= $list->recentChangesLine( $rc, false );
}
$s .= $list->endRecentChangesList();
}
$wgOut->addHTML( $s );
$dbr->freeResult( $res );
}
/**
* Since we have stuff stored in text format, this only works easily
* for some simple cases, such as /16 and /24.
* @param Database $db
* @param string $ip
* @return array conditions
*/
function getIpConds( $db, $ip ) {
// haaaack
if( preg_match( '#^(\d+)\.(\d+)\.(\d+)\.(\d+)/(\d+)$#', $ip, $matches ) ) {
list( $junk, $a, $b, $c, $d, $bits ) = $matches;
if( $bits == 32 ) {
$match = "$a.$b.$c.$d";
} elseif( $bits == 24 ) {
$match = "$a.$b.$c.%";
} elseif( $bits == 16 ) {
$match = "$a.$b.%";
} else {
// Other sizes not supported. /8 is too big
$match = $ip;
}
return array( 'rc_ip LIKE ' . $db->addQuotes( $match ) );
} else {
return array( 'rc_ip' => $ip );
}
}
function doUserRequest( $user ) {
global $wgOut, $wgTitle, $wgLang, $wgUser, $wgDBname;
$fname = 'CheckUser::doUserRequest';
$userTitle = Title::newFromText( $user, NS_USER );
if( !is_null( $userTitle ) ) {
// normalize the username
$user = $userTitle->getText();
}
if ( !$this->addLogEntry( $wgLang->timeanddate( wfTimestampNow() ) . ' ' .
$wgUser->getName() . ' got IPs for ' . htmlspecialchars( $user ) . ' on ' . $wgDBname ) )
{
$wgOut->addHTML( '<p>Unable to add log entry</p>' );
}
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->select( 'recentchanges', array( 'DISTINCT rc_ip' ), array( 'rc_user_text' => $user ), $fname );
if ( !$dbr->numRows( $res ) ) {
$s = "No results\n";
} else {
$s = '<ul>';
while ( ($row = $dbr->fetchObject( $res ) ) != false ) {
$s .= '<li><a href="' . $wgTitle->escapeLocalURL( 'ip=' . urlencode( $row->rc_ip ) ) . '">' .
htmlspecialchars( $row->rc_ip ) . '</a></li>';
}
$s .= '</ul>';
}
$wgOut->addHTML( $s );
}
function showLog() {
global $wgCheckUserLog;
if( $wgCheckUserLog === false || !file_exists( $wgCheckUserLog ) ) {
# No log
return;
} else {
global $wgRequest, $wgOut;
if( $wgRequest->getVal( 'log' ) == 1 ) {
# Show the log
list( $limit, $offset ) = wfCheckLimits();
$log = $this->tail( $wgCheckUserLog, $limit, $offset );
if( !!$log ) {
$scroller = wfViewPrevNext( $offset, $limit,
Title::makeTitle( NS_SPECIAL, 'CheckUser' ),
'log=1',
count( $log ) < $limit );
$output = implode( "\n", $log );
$wgOut->addHTML( "$scroller\n<ul>$output</ul>\n$scroller\n" );
} else {
$wgOut->addHTML( "<p>The log contains no items.</p>" );
}
} else {
# Hide the log, show a link
global $wgTitle, $wgUser;
$skin = $wgUser->getSkin();
$link = $skin->makeKnownLinkObj( $wgTitle, 'Show log', 'log=1' );
$wgOut->addHTML( "<p>$link</p>" );
}
}
}
function tail( $filename, $limit, $offset ) {
//wfSuppressWarnings();
$file = fopen( $filename, "rt" );
//wfRestoreWarnings();
if( $file === false ) {
return false;
}
$filePosition = filesize( $filename );
if( $filePosition == 0 ) {
return array();
}
$lines = array();
$bufSize = 1024;
$lineCount = 0;
$total = $offset + $limit;
$leftover = '';
do {
if( $filePosition < $bufSize ) {
$bufSize = $filePosition;
}
$filePosition -= $bufSize;
fseek( $file, $filePosition );
$buffer = fread( $file, $bufSize );
$parts = explode( "\n", $buffer );
$num = count( $parts );
if( $num > 0 ) {
if( $lineCount++ > $offset ) {
$lines[] = $parts[$num - 1] . $leftover;
if( $lineCount > $total ) {
return $lines;
}
}
}
for( $i = $num - 2; $i > 0; $i-- ) {
if( $lineCount++ > $offset ) {
$lines[] = $parts[$i];
if( $lineCount > $total ) {
fclose( $file );
return $linMAes;
}
}
}
if( $num > 1 ) {
$leftover = $parts[0];
} else {
$leftover = '';
break;
}
} while( $filePosition > 0 );
if( $lineCount++ > $offset ) {
$lines[] = $leftover;
}
fclose( $file );
return $lines;
}
function addLogEntry( $entry ) {
global $wgUser, $wgCheckUserLog;
if ( $wgCheckUserLog === false ) {
// No log required, this is not an error
return true;
}
$f = fopen( $wgCheckUserLog, 'a' );
if ( !$f ) {
return false;
}
if ( !fwrite( $f, "<li>$entry</li>\n" ) ) {
return false;
}
fclose( $f );
return true;
}
}
?>
<!-- /0 -->
<div id="left-navigation">
<!-- 0 -->
<div id="p-namespaces" class="vectorTabs">
<h5>Namespaces</h5>
<ul>
<li id="ca-special" class="selected"><a href="/wiki/index.php/Special:CheckUser" ><span>Special page</span></a></li>
</ul>
</div>
<!-- /0 -->
<!-- 1 -->
<div id="p-variants" class="vectorMenu emptyPortlet">
<h5><span>Variants</span><a href="#"></a></h5>
<div class="menu">
<ul>
</ul>
</div>
</div>
<!-- /1 -->
</div>
<div id="right-navigation">
<!-- 0 -->
<div id="p-views" class="vectorTabs emptyPortlet">
<h5>Views</h5>
<ul>
</ul>
</div>