function doLookup()
 {
     $periodStart = $this->mPeriodStart;
     $periodEnd = $this->mPeriodEnd;
     $filter = $this->mPage->mFilter;
     $conds = array('afl_filter' => $filter);
     $dbr = wfGetDB(DB_SLAVE);
     if ($periodStart) {
         $conds[] = 'afl_timestamp>' . $dbr->addQuotes($dbr->timestamp($periodStart));
     }
     if ($periodEnd) {
         $conds[] = 'afl_timestamp<' . $dbr->addQuotes($dbr->timestamp($periodEnd));
     }
     // Database query.
     $res = $dbr->select('abuse_filter_log', '*', $conds, __METHOD__);
     $results = array();
     foreach ($res as $row) {
         if (!$row->afl_actions) {
             continue;
         }
         $actions = explode(',', $row->afl_actions);
         $reversibleActions = array('block', 'blockautopromote', 'degroup');
         $currentReversibleActions = array_intersect($actions, $reversibleActions);
         if (count($currentReversibleActions)) {
             $results[] = array('id' => $row->afl_id, 'actions' => $currentReversibleActions, 'user' => $row->afl_user_text, 'userid' => $row->afl_user, 'vars' => AbuseFilter::loadVarDump($row->afl_var_dump), 'title' => Title::makeTitle($row->afl_namespace, $row->afl_title), 'action' => $row->afl_action, 'timestamp' => $row->afl_timestamp);
         }
     }
     return $results;
 }
 public function execute()
 {
     $params = $this->extractRequestParams();
     $this->requireOnlyOneParameter($params, 'vars', 'rcid', 'logid');
     // "Anti-DoS"
     if (!$this->getUser()->isAllowed('abusefilter-modify')) {
         $this->dieUsageMsg('permissiondenied');
     }
     if ($params['vars']) {
         $vars = FormatJson::decode($params['vars'], true);
     } elseif ($params['rcid']) {
         $dbr = wfGetDB(DB_SLAVE);
         $row = $dbr->selectRow('recentchanges', '*', array('rc_id' => $params['rcid']), __METHOD__);
         if (!$row) {
             $this->dieUsageMsg(array('nosuchrcid', $params['rcid']));
         }
         $vars = AbuseFilter::getVarsFromRCRow($row);
     } elseif ($params['logid']) {
         $dbr = wfGetDB(DB_SLAVE);
         $row = $dbr->selectRow('abuse_filter_log', '*', array('afl_id' => $params['logid']), __METHOD__);
         if (!$row) {
             $this->dieUsage("There is no abuselog entry with the id ``{$params['logid']}''", 'nosuchlogid');
         }
         $vars = AbuseFilter::loadVarDump($row->afl_var_dump);
     }
     if (AbuseFilter::checkSyntax($params['filter']) !== true) {
         $this->dieUsage('The filter has invalid syntax', 'badsyntax');
     }
     $result = AbuseFilter::checkConditions($params['filter'], $vars);
     $this->getResult()->addValue(null, $this->getModuleName(), array('result' => $result));
 }
 function showExaminerForLogEntry($logid)
 {
     global $wgOut;
     // Get data
     $dbr = wfGetDB(DB_SLAVE);
     $row = $dbr->selectRow('abuse_filter_log', '*', array('afl_id' => $logid), __METHOD__);
     if (!$row) {
         $wgOut->addWikiMsg('abusefilter-examine-notfound');
         return;
     }
     $vars = AbuseFilter::loadVarDump($row->afl_var_dump);
     $this->showExaminer($vars);
 }
 function showExaminerForLogEntry($logid)
 {
     // Get data
     $dbr = wfGetDB(DB_SLAVE);
     $row = $dbr->selectRow('abuse_filter_log', '*', array('afl_id' => $logid), __METHOD__);
     if (!$row) {
         $this->getOutput()->addWikiMsg('abusefilter-examine-notfound');
         return;
     }
     self::$examineType = 'log';
     self::$examineId = $logid;
     if (!SpecialAbuseLog::canSeeDetails($row->afl_filter)) {
         $this->getOutput()->addWikiMsg('abusefilter-log-cannot-see-details');
         return;
     }
     if ($row->afl_deleted && !SpecialAbuseLog::canSeeHidden()) {
         $this->getOutput()->addWikiMsg('abusefilter-log-details-hidden');
         return;
     }
     $vars = AbuseFilter::loadVarDump($row->afl_var_dump);
     $this->showExaminer($vars);
 }
 public function execute()
 {
     $user = $this->getUser();
     $errors = $this->getTitle()->getUserPermissionsErrors('abusefilter-log', $user);
     if (count($errors)) {
         $this->dieUsageMsg($errors[0]);
         return;
     }
     $params = $this->extractRequestParams();
     $prop = array_flip($params['prop']);
     $fld_ids = isset($prop['ids']);
     $fld_filter = isset($prop['filter']);
     $fld_user = isset($prop['user']);
     $fld_ip = isset($prop['ip']);
     $fld_title = isset($prop['title']);
     $fld_action = isset($prop['action']);
     $fld_details = isset($prop['details']);
     $fld_result = isset($prop['result']);
     $fld_timestamp = isset($prop['timestamp']);
     $fld_hidden = isset($prop['hidden']);
     $fld_revid = isset($prop['revid']);
     if ($fld_ip && !$user->isAllowed('abusefilter-private')) {
         $this->dieUsage('You don\'t have permission to view IP addresses', 'permissiondenied');
     }
     if ($fld_details && !$user->isAllowed('abusefilter-log-detail')) {
         $this->dieUsage('You don\'t have permission to view detailed abuse log entries', 'permissiondenied');
     }
     // Match permissions for viewing events on private filters to SpecialAbuseLog (bug 42814)
     if ($params['filter'] && !(AbuseFilterView::canViewPrivate() || $user->isAllowed('abusefilter-log-private'))) {
         // A specific filter parameter is set but the user isn't allowed to view all filters
         if (!is_array($params['filter'])) {
             $params['filter'] = array($params['filter']);
         }
         foreach ($params['filter'] as $filter) {
             if (AbuseFilter::filterHidden($filter)) {
                 $this->dieUsage('You don\'t have permission to view log entries for private filters', 'permissiondenied');
             }
         }
     }
     $result = $this->getResult();
     $this->addTables('abuse_filter_log');
     $this->addFields('afl_timestamp');
     $this->addFields('afl_rev_id');
     $this->addFields('afl_deleted');
     $this->addFields('afl_filter');
     $this->addFieldsIf('afl_id', $fld_ids);
     $this->addFieldsIf('afl_user_text', $fld_user);
     $this->addFieldsIf('afl_ip', $fld_ip);
     $this->addFieldsIf(array('afl_namespace', 'afl_title'), $fld_title);
     $this->addFieldsIf('afl_action', $fld_action);
     $this->addFieldsIf('afl_var_dump', $fld_details);
     $this->addFieldsIf('afl_actions', $fld_result);
     if ($fld_filter) {
         $this->addTables('abuse_filter');
         $this->addFields('af_public_comments');
         $this->addJoinConds(array('abuse_filter' => array('LEFT JOIN', 'af_id=afl_filter')));
     }
     $this->addOption('LIMIT', $params['limit'] + 1);
     $this->addWhereRange('afl_timestamp', $params['dir'], $params['start'], $params['end']);
     $db = $this->getDB();
     $notDeletedCond = SpecialAbuseLog::getNotDeletedCond($db);
     if (isset($params['user'])) {
         $u = User::newFromName($params['user']);
         if ($u) {
             // Username normalisation
             $params['user'] = $u->getName();
             $userId = $u->getId();
         } elseif (IP::isIPAddress($params['user'])) {
             // It's an IP, sanitize it
             $params['user'] = IP::sanitizeIP($params['user']);
             $userId = 0;
         }
         if (isset($userId)) {
             // Only add the WHERE for user in case it's either a valid user (but not necessary an existing one) or an IP
             $this->addWhere(array('afl_user' => $userId, 'afl_user_text' => $params['user']));
         }
     }
     $this->addWhereIf(array('afl_filter' => $params['filter']), isset($params['filter']));
     $this->addWhereIf($notDeletedCond, !SpecialAbuseLog::canSeeHidden($user));
     $title = $params['title'];
     if (!is_null($title)) {
         $titleObj = Title::newFromText($title);
         if (is_null($titleObj)) {
             $this->dieUsageMsg(array('invalidtitle', $title));
         }
         $this->addWhereFld('afl_namespace', $titleObj->getNamespace());
         $this->addWhereFld('afl_title', $titleObj->getDBkey());
     }
     $res = $this->select(__METHOD__);
     $count = 0;
     foreach ($res as $row) {
         if (++$count > $params['limit']) {
             // We've had enough
             $ts = new MWTimestamp($row->afl_timestamp);
             $this->setContinueEnumParameter('start', $ts->getTimestamp(TS_ISO_8601));
             break;
         }
         if (SpecialAbuseLog::isHidden($row) && !SpecialAbuseLog::canSeeHidden($user)) {
             continue;
         }
         $canSeeDetails = SpecialAbuseLog::canSeeDetails($row->afl_filter);
         $entry = array();
         if ($fld_ids) {
             $entry['id'] = intval($row->afl_id);
             $entry['filter_id'] = '';
             if ($canSeeDetails) {
                 $entry['filter_id'] = $row->afl_filter;
             }
         }
         if ($fld_filter) {
             $entry['filter'] = $row->af_public_comments;
         }
         if ($fld_user) {
             $entry['user'] = $row->afl_user_text;
         }
         if ($fld_ip) {
             $entry['ip'] = $row->afl_ip;
         }
         if ($fld_title) {
             $title = Title::makeTitle($row->afl_namespace, $row->afl_title);
             ApiQueryBase::addTitleInfo($entry, $title);
         }
         if ($fld_action) {
             $entry['action'] = $row->afl_action;
         }
         if ($fld_result) {
             $entry['result'] = $row->afl_actions;
         }
         if ($fld_revid && !is_null($row->afl_rev_id)) {
             $entry['revid'] = '';
             if ($canSeeDetails) {
                 $entry['revid'] = $row->afl_rev_id;
             }
         }
         if ($fld_timestamp) {
             $ts = new MWTimestamp($row->afl_timestamp);
             $entry['timestamp'] = $ts->getTimestamp(TS_ISO_8601);
         }
         if ($fld_details) {
             $entry['details'] = array();
             if ($canSeeDetails) {
                 $vars = AbuseFilter::loadVarDump($row->afl_var_dump);
                 if ($vars instanceof AbuseFilterVariableHolder) {
                     $entry['details'] = $vars->exportAllVars();
                 } else {
                     $entry['details'] = array_change_key_case($vars, CASE_LOWER);
                 }
             }
         }
         if ($fld_hidden) {
             $val = SpecialAbuseLog::isHidden($row);
             if ($val) {
                 $entry['hidden'] = $val;
             }
         }
         if ($entry) {
             $fit = $result->addValue(array('query', $this->getModuleName()), null, $entry);
             if (!$fit) {
                 $ts = new MWTimestamp($row->afl_timestamp);
                 $this->setContinueEnumParameter('start', $ts->getTimestamp(TS_ISO_8601));
                 break;
             }
         }
     }
     $result->setIndexedTagName_internal(array('query', $this->getModuleName()), 'item');
 }
Example #6
0
 public function execute()
 {
     global $wgUser;
     if (!$wgUser->isAllowed('abusefilter-log')) {
         $this->dieUsage('You don\'t have permission to view the abuse log', 'permissiondenied');
     }
     $params = $this->extractRequestParams();
     $prop = array_flip($params['prop']);
     $fld_ids = isset($prop['ids']);
     $fld_filter = isset($prop['filter']);
     $fld_user = isset($prop['user']);
     $fld_ip = isset($prop['ip']);
     $fld_title = isset($prop['title']);
     $fld_action = isset($prop['action']);
     $fld_details = isset($prop['details']);
     $fld_result = isset($prop['result']);
     $fld_timestamp = isset($prop['timestamp']);
     $fld_hidden = isset($prop['hidden']);
     if ($fld_ip && !$wgUser->isAllowed('abusefilter-private')) {
         $this->dieUsage('You don\'t have permission to view IP addresses', 'permissiondenied');
     }
     if ($fld_details && !$wgUser->isAllowed('abusefilter-log-detail')) {
         $this->dieUsage('You don\'t have permission to view detailed abuse log entries', 'permissiondenied');
     }
     $result = $this->getResult();
     $this->addTables('abuse_filter_log');
     $this->addFields('afl_timestamp');
     $this->addFieldsIf(array('afl_id', 'afl_filter'), $fld_ids);
     $this->addFieldsIf('afl_user_text', $fld_user);
     $this->addFieldsIf('afl_ip', $fld_ip);
     $this->addFieldsIf(array('afl_namespace', 'afl_title'), $fld_title);
     $this->addFieldsIf('afl_action', $fld_action);
     $this->addFieldsIf('afl_var_dump', $fld_details);
     $this->addFieldsIf('afl_actions', $fld_result);
     $this->addFieldsIf('afl_deleted', $fld_hidden);
     if ($fld_filter) {
         $this->addTables('abuse_filter');
         $this->addFields('af_public_comments');
         $this->addJoinConds(array('abuse_filter' => array('LEFT JOIN', 'af_id=afl_filter')));
     }
     $this->addOption('LIMIT', $params['limit'] + 1);
     $this->addWhereRange('afl_timestamp', $params['dir'], $params['start'], $params['end']);
     $db = $this->getDB();
     $notDeletedCond = SpecialAbuseLog::getNotDeletedCond($db);
     $this->addWhereIf(array('afl_user_text' => $params['user']), isset($params['user']));
     $this->addWhereIf(array('afl_filter' => $params['filter']), isset($params['filter']));
     $this->addWhereIf($notDeletedCond, !SpecialAbuseLog::canSeeHidden());
     $title = $params['title'];
     if (!is_null($title)) {
         $titleObj = Title::newFromText($title);
         if (is_null($titleObj)) {
             $this->dieUsageMsg(array('invalidtitle', $title));
         }
         $this->addWhereFld('afl_namespace', $titleObj->getNamespace());
         $this->addWhereFld('afl_title', $titleObj->getDBkey());
     }
     $res = $this->select(__METHOD__);
     $count = 0;
     foreach ($res as $row) {
         if (++$count > $params['limit']) {
             // We've had enough
             $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->afl_timestamp));
             break;
         }
         $entry = array();
         if ($fld_ids) {
             $entry['id'] = intval($row->afl_id);
             $entry['filter_id'] = intval($row->afl_filter);
         }
         if ($fld_filter) {
             $entry['filter'] = $row->af_public_comments;
         }
         if ($fld_user) {
             $entry['user'] = $row->afl_user_text;
         }
         if ($fld_ip) {
             $entry['ip'] = $row->afl_ip;
         }
         if ($fld_title) {
             $title = Title::makeTitle($row->afl_namespace, $row->afl_title);
             ApiQueryBase::addTitleInfo($entry, $title);
         }
         if ($fld_action) {
             $entry['action'] = $row->afl_action;
         }
         if ($fld_result) {
             $entry['result'] = $row->afl_actions;
         }
         if ($fld_timestamp) {
             $entry['timestamp'] = wfTimestamp(TS_ISO_8601, $row->afl_timestamp);
         }
         if ($fld_details) {
             $vars = AbuseFilter::loadVarDump($row->afl_var_dump);
             if ($vars instanceof AbuseFilterVariableHolder) {
                 $entry['details'] = $vars->exportAllVars();
             } else {
                 $entry['details'] = array_change_key_case($vars, CASE_LOWER);
             }
         }
         if ($fld_hidden) {
             $entry['hidden'] = $row->afl_deleted;
         }
         if ($entry) {
             $fit = $result->addValue(array('query', $this->getModuleName()), null, $entry);
             if (!$fit) {
                 $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->afl_timestamp));
                 break;
             }
         }
     }
     $result->setIndexedTagName_internal(array('query', $this->getModuleName()), 'item');
 }
 /**
  * @param $id
  * @return mixed
  */
 function showDetails($id)
 {
     $out = $this->getOutput();
     $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 (AbuseFilter::decodeGlobalName($row->afl_filter)) {
         $filter_hidden = null;
     } else {
         $filter_hidden = $row->af_hidden;
     }
     if (!self::canSeeDetails($row->afl_filter, $filter_hidden)) {
         $out->addWikiMsg('abusefilter-log-cannot-see-details');
         return;
     }
     if (self::isHidden($row) && !self::canSeeHidden()) {
         $out->addWikiMsg('abusefilter-log-details-hidden');
         return;
     }
     $output = Xml::element('legend', null, $this->msg('abusefilter-log-details-legend', $id)->text());
     $output .= Xml::tags('p', null, $this->formatRow($row, false));
     // Load data
     $vars = AbuseFilter::loadVarDump($row->afl_var_dump);
     // Diff, if available
     if ($vars && $vars->getVar('action')->toString() == 'edit') {
         $old_wikitext = $vars->getVar('old_wikitext')->toString();
         $new_wikitext = $vars->getVar('new_wikitext')->toString();
         $diffEngine = new DifferenceEngine($this->getContext());
         $diffEngine->showDiffStyle();
         // Note: generateDiffBody has been deprecated in favour of generateTextDiffBody in 1.21 but we can't use it for b/c
         $formattedDiff = $diffEngine->generateDiffBody($old_wikitext, $new_wikitext);
         $formattedDiff = $diffEngine->addHeader($formattedDiff, '', '');
         $output .= Xml::tags('h3', null, $this->msg('abusefilter-log-details-diff')->parse());
         $output .= $formattedDiff;
     }
     $output .= Xml::element('h3', null, $this->msg('abusefilter-log-details-vars')->text());
     // Build a table.
     $output .= AbuseFilter::buildVarDumpTable($vars);
     if (self::canSeePrivate()) {
         // Private stuff, like IPs.
         $header = Xml::element('th', null, $this->msg('abusefilter-log-details-var')->text()) . Xml::element('th', null, $this->msg('abusefilter-log-details-val')->text());
         $output .= Xml::element('h3', null, $this->msg('abusefilter-log-details-private')->text());
         $output .= Xml::openElement('table', array('class' => 'wikitable mw-abuselog-private', 'style' => 'width: 80%;')) . Xml::openElement('tbody');
         $output .= $header;
         // IP address
         $output .= Xml::tags('tr', null, Xml::element('td', array('style' => 'width: 30%;'), $this->msg('abusefilter-log-details-ip')->text()) . Xml::element('td', null, $row->afl_ip));
         $output .= Xml::closeElement('tbody') . Xml::closeElement('table');
     }
     $output = Xml::tags('fieldset', null, $output);
     $out->addHTML($output);
 }
Example #8
0
 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 = "<col class='diff-marker' />\n        <col class='diff-content' />\n        <col class='diff-marker' />\n        <col class='diff-content' />";
         $formattedDiff = "<table class='diff'>{$colDescriptions}<tbody>{$formattedDiff}</tbody></table>";
         $output .= Xml::tags('h3', null, wfMsgExt('abusefilter-log-details-diff', 'parseinline'));
         $output .= $formattedDiff;
     }
     $output .= Xml::element('h3', null, wfMsg('abusefilter-log-details-vars'));
     // Build a table.
     $output .= AbuseFilter::buildVarDumpTable($vars);
     if (self::canSeePrivate()) {
         // Private stuff, like IPs.
         $header = Xml::element('th', null, wfMsg('abusefilter-log-details-var')) . Xml::element('th', null, wfMsg('abusefilter-log-details-val'));
         $output .= Xml::element('h3', null, wfMsg('abusefilter-log-details-private'));
         $output .= Xml::openElement('table', array('class' => 'wikitable mw-abuselog-private', 'style' => 'width: 80%;')) . Xml::openElement('tbody');
         $output .= $header;
         // IP address
         $output .= Xml::tags('tr', null, Xml::element('td', array('style' => 'width: 30%;'), wfMsg('abusefilter-log-details-ip')) . Xml::element('td', null, $row->afl_ip));
         $output .= Xml::closeElement('tbody') . Xml::closeElement('table');
     }
     $output = Xml::tags('fieldset', null, $output);
     global $wgOut;
     $wgOut->addHTML($output);
 }