Kullanıcı:Westnest/checkuser.php

Vikipedi, özgür ansiklopedi

<?php

if ( !defined( 'MEDIAWIKI' ) ) {

   echo "CheckUser extension\n";
   exit( 1 );

}

  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

<form name="checkuser" action="$action" method=post> </form> <form name="checkuser" action="$action" method=post> </form>

IP:

<input type="text" name="ip" value="$encIp" width=50 /> <input type="submit" name="subip" value="OK" />

User:

<input type="text" name="user" value="$encUser" width=50 /> <input type="submit" name="subuser" value="OK" />

); }

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( '

Unable to add log entry

' );

}

$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( '

Unable to add log entry

' );

}

$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 = '

    '; while ( ($row = $dbr->fetchObject( $res ) ) != false ) { $s .= '
  • <a href="' . $wgTitle->escapeLocalURL( 'ip=' . urlencode( $row->rc_ip ) ) . '">' . htmlspecialchars( $row->rc_ip ) . '</a>
  • '; } $s .= '

';

} $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

    $output

\n$scroller\n" );

} else {

$wgOut->addHTML( "

The log contains no items.

" );

} } else { # Hide the log, show a link global $wgTitle, $wgUser; $skin = $wgUser->getSkin(); $link = $skin->makeKnownLinkObj( $wgTitle, 'Show log', 'log=1' );

$wgOut->addHTML( "

$link

" );

} } }

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, "

  • $entry
  • \n" ) ) { return false; } fclose( $f ); return true; } } ?>