Kullanıcı:Westnest/checkuser.php.js
Görünüm
Bu sayfaya eklediğiniz kodlar hesabınızı tehlike altına sokacak kötü amaçlı içerik barındırabilir. Başka bir sayfada yer alan betikleri "mw.loader.load", "importScript" veya "iusc" gibi yöntemlerle kullanmadan önce, bu yöntemle içeriği başkaları tarafından kontrol edilebilecek uzaktaki bir betiği dinamik olarak yüklemiş olacağınızı bilmeniz gerekir. Sayfaya eklediğiniz kodun güvenli olup olmadığından emin değilseniz, Köy Çeşmesi'nde deneyimli kullanıcılara danışabilirsiniz. Kod, sayfa önizlemesinde de çalıştırılacaktır. |
<?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;
}
}
?>