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'); }
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); }
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); }