getSkin(), 'log' ); $this->setHeaders(); $this->outputHeader( 'abusefilter-log-summary' ); $this->loadParameters(); $wgOut->setPageTitle( wfMsg( 'abusefilter-log' ) ); $wgOut->setRobotPolicy( "noindex,nofollow" ); $wgOut->setArticleRelated( false ); $wgOut->enableClientCache( false ); global $wgScriptPath; $wgOut->addExtensionStyle( $wgScriptPath . "/extensions/AbuseFilter/abusefilter.css?$wgAbuseFilterStyleVersion" ); // Are we allowed? $errors = $this->getTitle()->getUserPermissionsErrors( 'abusefilter-log', $wgUser, true, array( 'ns-specialprotected' ) ); if ( count( $errors ) ) { // Go away. $wgOut->showPermissionsErrorPage( $errors, 'abusefilter-log' ); return; } $detailsid = $wgRequest->getIntOrNull( 'details' ); $hideid = $wgRequest->getIntOrNull( 'hide' ); if ( $parameter ) { $detailsid = $parameter; } if ( $detailsid ) { $this->showDetails( $detailsid ); } elseif ( $hideid ) { $this->showHideForm( $hideid ); } else { // Show the search form. $this->searchForm(); // Show the log itself. $this->showList(); } } function loadParameters() { global $wgRequest; $this->mSearchUser = $wgRequest->getText( 'wpSearchUser' ); $t = Title::newFromText( trim( $this->mSearchUser ) ); if ( $t ) { $this->mSearchUser = $t->getText(); // Username normalisation } else { $this->mSearchUser = null; } $this->mSearchTitle = $wgRequest->getText( 'wpSearchTitle' ); $this->mSearchFilter = null; if ( self::canSeeDetails() ) { $this->mSearchFilter = $wgRequest->getIntOrNull( 'wpSearchFilter' ); } } function searchForm() { global $wgOut; $output = Xml::element( 'legend', null, wfMsg( 'abusefilter-log-search' ) ); $fields = array(); // Search conditions $fields['abusefilter-log-search-user'] = Xml::input( 'wpSearchUser', 45, $this->mSearchUser ); if ( self::canSeeDetails() ) { $fields['abusefilter-log-search-filter'] = Xml::input( 'wpSearchFilter', 45, $this->mSearchFilter ); } $fields['abusefilter-log-search-title'] = Xml::input( 'wpSearchTitle', 45, $this->mSearchTitle ); $form = Xml::hidden( 'title', $this->getTitle()->getPrefixedText() ); $form .= Xml::buildForm( $fields, 'abusefilter-log-search-submit' ); $output .= Xml::tags( 'form', array( 'method' => 'get', 'action' => $this->getTitle()->getLocalURL() ), $form ); $output = Xml::tags( 'fieldset', null, $output ); $wgOut->addHTML( $output ); } function showHideForm( $id ) { global $wgOut, $wgUser; if ( !$wgUser->isAllowed( 'abusefilter-hide-log' ) ) { $wgOut->addWikiMsg( 'abusefilter-log-hide-forbidden' ); return; } $dbr = wfGetDB( DB_SLAVE ); $row = $dbr->selectRow( array( 'abuse_filter_log', 'abuse_filter' ), '*', array( 'afl_id' => $id ), __METHOD__, array(), array( 'abuse_filter' => array( 'LEFT JOIN', 'af_id=afl_filter' ) ) ); if ( !$row ) { return; } $formInfo = array( 'logid' => array( 'type' => 'info', 'default' => $id, 'label-message' => 'abusefilter-log-hide-id', ), 'reason' => array( 'type' => 'text', 'label-message' => 'abusefilter-log-hide-reason', ), 'hidden' => array( 'type' => 'toggle', 'default' => $row->afl_deleted, 'label-message' => 'abusefilter-log-hide-hidden', ), ); $form = new HTMLForm( $formInfo ); $form->setTitle( $this->getTitle() ); $form->setWrapperLegend( wfMsgExt( 'abusefilter-log-hide-legend', 'parsemag' ) ); $form->addHiddenField( 'hide', $id ); $form->setSubmitCallback( array( $this, 'saveHideForm' ) ); $form->show(); } function saveHideForm( $fields ) { global $wgRequest, $wgOut; $logid = $wgRequest->getVal( 'hide' ); $dbw = wfGetDB( DB_MASTER ); $dbw->update( 'abuse_filter_log', array( 'afl_deleted' => $fields['hidden'] ), array( 'afl_id' => $logid ), __METHOD__ ); $logPage = new LogPage( 'suppress' ); $action = $fields['hidden'] ? 'hide-afl' : 'unhide-afl'; $logPage->addEntry( $action, $this->getTitle( $logid ), $fields['reason'] ); $wgOut->redirect( SpecialPage::getTitleFor( 'AbuseLog' )->getFullURL() ); return true; } function showList() { global $wgOut; // Generate conditions list. $conds = array(); if ( $this->mSearchUser ) { $user = User::newFromName( $this->mSearchUser ); if ( !$user ) { $conds[] = 'afl_ip=afl_user_text'; $conds['afl_user'] = 0; $conds['afl_user_text'] = $this->mSearchUser; } else { $conds['afl_user'] = $user->getId(); $conds['afl_user_text'] = $user->getName(); } } if ( $this->mSearchFilter ) { $conds['afl_filter'] = $this->mSearchFilter; } $searchTitle = Title::newFromText( $this->mSearchTitle ); if ( $this->mSearchTitle && $searchTitle ) { $conds['afl_namespace'] = $searchTitle->getNamespace(); $conds['afl_title'] = $searchTitle->getDBkey(); } $pager = new AbuseLogPager( $this, $conds ); $wgOut->addHTML( $pager->getNavigationBar() . Xml::tags( 'ul', null, $pager->getBody() ) . $pager->getNavigationBar() ); } function showDetails( $id ) { if ( !self::canSeeDetails() ) { return; } $dbr = wfGetDB( DB_SLAVE ); $row = $dbr->selectRow( array( 'abuse_filter_log', 'abuse_filter' ), '*', array( 'afl_id' => $id ), __METHOD__, array(), array( 'abuse_filter' => array( 'LEFT JOIN', 'af_id=afl_filter' ) ) ); if ( !$row ) { return; } if ( $row->afl_deleted && !self::canSeeHidden() ) { global $wgOut; $wgOut->addWikiMsg( 'abusefilter-log-details-hidden' ); return; } $output = ''; $output .= Xml::element( 'legend', null, wfMsg( 'abusefilter-log-details-legend', $id ) ); $output .= Xml::tags( 'p', null, $this->formatRow( $row, false ) ); // Load data $vars = AbuseFilter::loadVarDump( $row->afl_var_dump ); // Diff, if available if ( $vars->getVar( 'action' )->toString() == 'edit' ) { $old_wikitext = $vars->getVar( 'old_wikitext' )->toString(); $new_wikitext = $vars->getVar( 'new_wikitext' )->toString(); $diffEngine = new DifferenceEngine( $this->mSearchTitle ); $diffEngine->showDiffStyle(); $formattedDiff = $diffEngine->generateDiffBody( $old_wikitext, $new_wikitext ); static $colDescriptions = "