summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/AbuseFilter/includes/Views/AbuseFilterViewExamine.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/AbuseFilter/includes/Views/AbuseFilterViewExamine.php')
-rw-r--r--www/wiki/extensions/AbuseFilter/includes/Views/AbuseFilterViewExamine.php219
1 files changed, 219 insertions, 0 deletions
diff --git a/www/wiki/extensions/AbuseFilter/includes/Views/AbuseFilterViewExamine.php b/www/wiki/extensions/AbuseFilter/includes/Views/AbuseFilterViewExamine.php
new file mode 100644
index 00000000..73cb2d10
--- /dev/null
+++ b/www/wiki/extensions/AbuseFilter/includes/Views/AbuseFilterViewExamine.php
@@ -0,0 +1,219 @@
+<?php
+
+class AbuseFilterViewExamine extends AbuseFilterView {
+ public static $examineType = null;
+ public static $examineId = null;
+
+ public $mCounter, $mSearchUser, $mSearchPeriodStart, $mSearchPeriodEnd;
+ public $mTestFilter;
+
+ function show() {
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'abusefilter-examine' ) );
+ $out->addWikiMsg( 'abusefilter-examine-intro' );
+
+ $this->loadParameters();
+
+ // Check if we've got a subpage
+ if ( count( $this->mParams ) > 1 && is_numeric( $this->mParams[1] ) ) {
+ $this->showExaminerForRC( $this->mParams[1] );
+ } elseif ( count( $this->mParams ) > 2
+ && $this->mParams[1] == 'log'
+ && is_numeric( $this->mParams[2] )
+ ) {
+ $this->showExaminerForLogEntry( $this->mParams[2] );
+ } else {
+ $this->showSearch();
+ }
+ }
+
+ function showSearch() {
+ $RCMaxAge = $this->getConfig()->get( 'RCMaxAge' );
+ $min = wfTimestamp( TS_ISO_8601, time() - $RCMaxAge );
+ $max = wfTimestampNow();
+ $formDescriptor = [
+ 'SearchUser' => [
+ 'label-message' => 'abusefilter-test-user',
+ 'type' => 'user',
+ 'default' => $this->mSearchUser,
+ ],
+ 'SearchPeriodStart' => [
+ 'label-message' => 'abusefilter-test-period-start',
+ 'type' => 'datetime',
+ 'default' => $this->mSearchPeriodStart,
+ 'min' => $min,
+ 'max' => $max,
+ ],
+ 'SearchPeriodEnd' => [
+ 'label-message' => 'abusefilter-test-period-end',
+ 'type' => 'datetime',
+ 'default' => $this->mSearchPeriodEnd,
+ 'min' => $min,
+ 'max' => $max,
+ ],
+ ];
+ $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
+ $htmlForm->setWrapperLegendMsg( 'abusefilter-examine-legend' )
+ ->addHiddenField( 'submit', 1 )
+ ->setSubmitTextMsg( 'abusefilter-examine-submit' )
+ ->setMethod( 'get' )
+ ->prepareForm()
+ ->displayForm( false );
+
+ if ( $this->mSubmit ) {
+ $this->showResults();
+ }
+ }
+
+ function showResults() {
+ $changesList = new AbuseFilterChangesList( $this->getSkin(), $this->mTestFilter );
+ $output = $changesList->beginRecentChangesList();
+ $this->mCounter = 1;
+
+ $pager = new AbuseFilterExaminePager( $this, $changesList );
+
+ $output .= $pager->getNavigationBar() .
+ $pager->getBody() .
+ $pager->getNavigationBar();
+
+ $output .= $changesList->endRecentChangesList();
+
+ $this->getOutput()->addHTML( $output );
+ }
+
+ function showExaminerForRC( $rcid ) {
+ // Get data
+ $dbr = wfGetDB( DB_REPLICA );
+ $rcQuery = RecentChange::getQueryInfo();
+ $row = $dbr->selectRow(
+ $rcQuery['tables'],
+ $rcQuery['fields'],
+ [ 'rc_id' => $rcid ],
+ __METHOD__,
+ [],
+ $rcQuery['joins']
+ );
+ $out = $this->getOutput();
+ if ( !$row ) {
+ $out->addWikiMsg( 'abusefilter-examine-notfound' );
+ return;
+ }
+
+ if ( !ChangesList::userCan( RecentChange::newFromRow( $row ), Revision::SUPPRESSED_ALL ) ) {
+ $out->addWikiMsg( 'abusefilter-log-details-hidden-implicit' );
+ return;
+ }
+
+ self::$examineType = 'rc';
+ self::$examineId = $rcid;
+
+ $vars = AbuseFilter::getVarsFromRCRow( $row );
+ $out->addJsConfigVars( 'wgAbuseFilterVariables', $vars->dumpAllVars( true ) );
+ $this->showExaminer( $vars );
+ }
+
+ function showExaminerForLogEntry( $logid ) {
+ // Get data
+ $dbr = wfGetDB( DB_REPLICA );
+ $row = $dbr->selectRow(
+ 'abuse_filter_log',
+ [ 'afl_filter', 'afl_deleted', 'afl_var_dump' ],
+ [ 'afl_id' => $logid ],
+ __METHOD__
+ );
+ $out = $this->getOutput();
+
+ if ( !$row ) {
+ $out->addWikiMsg( 'abusefilter-examine-notfound' );
+ return;
+ }
+
+ self::$examineType = 'log';
+ self::$examineId = $logid;
+
+ if ( !SpecialAbuseLog::canSeeDetails( $row->afl_filter ) ) {
+ $out->addWikiMsg( 'abusefilter-log-cannot-see-details' );
+ return;
+ }
+
+ if ( $row->afl_deleted && !SpecialAbuseLog::canSeeHidden() ) {
+ $out->addWikiMsg( 'abusefilter-log-details-hidden' );
+ return;
+ }
+
+ if ( SpecialAbuseLog::isHidden( $row ) === 'implicit' ) {
+ $rev = Revision::newFromId( $row->afl_rev_id );
+ if ( !$rev->userCan( Revision::SUPPRESSED_ALL, $this->getUser() ) ) {
+ $out->addWikiMsg( 'abusefilter-log-details-hidden-implicit' );
+ return;
+ }
+ }
+ $vars = AbuseFilter::loadVarDump( $row->afl_var_dump );
+ $out->addJsConfigVars( 'wgAbuseFilterVariables', $vars->dumpAllVars( true ) );
+ $this->showExaminer( $vars );
+ }
+
+ function showExaminer( $vars ) {
+ $output = $this->getOutput();
+ $output->enableOOUI();
+
+ if ( !$vars ) {
+ $output->addWikiMsg( 'abusefilter-examine-incompatible' );
+ return;
+ }
+
+ if ( $vars instanceof AbuseFilterVariableHolder ) {
+ $vars = $vars->exportAllVars();
+ }
+
+ $html = '';
+
+ $output->addModules( 'ext.abuseFilter.examine' );
+
+ // Add test bit
+ if ( $this->getUser()->isAllowed( 'abusefilter-modify' ) ) {
+ $tester = Xml::tags( 'h2', null, $this->msg( 'abusefilter-examine-test' )->parse() );
+ $tester .= AbuseFilter::buildEditBox( $this->mTestFilter, 'wpTestFilter', false );
+ $tester .= AbuseFilter::buildFilterLoader();
+ $html .= Xml::tags( 'div', [ 'id' => 'mw-abusefilter-examine-editor' ], $tester );
+ $html .= Xml::tags( 'p',
+ null,
+ new OOUI\ButtonInputWidget(
+ [
+ 'label' => $this->msg( 'abusefilter-examine-test-button' )->text(),
+ 'id' => 'mw-abusefilter-examine-test'
+ ]
+ ) .
+ Xml::element( 'div',
+ [
+ 'id' => 'mw-abusefilter-syntaxresult',
+ 'style' => 'display: none;'
+ ], '&#160;'
+ )
+ );
+ }
+
+ // Variable dump
+ $html .= Xml::tags(
+ 'h2',
+ null,
+ $this->msg( 'abusefilter-examine-vars' )->parse()
+ );
+ $html .= AbuseFilter::buildVarDumpTable( $vars, $this->getContext() );
+
+ $output->addHTML( $html );
+ }
+
+ function loadParameters() {
+ $request = $this->getRequest();
+ $this->mSearchPeriodStart = $request->getText( 'wpSearchPeriodStart' );
+ $this->mSearchPeriodEnd = $request->getText( 'wpSearchPeriodEnd' );
+ $this->mSubmit = $request->getCheck( 'submit' );
+ $this->mTestFilter = $request->getText( 'testfilter' );
+
+ // Normalise username
+ $searchUsername = $request->getText( 'wpSearchUser' );
+ $userTitle = Title::newFromText( $searchUsername, NS_USER );
+ $this->mSearchUser = $userTitle ? $userTitle->getText() : '';
+ }
+}