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 #3
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');
 }
 function getQueryInfo()
 {
     $conds = $this->mConds;
     $info = array('tables' => array('abuse_filter_log', 'abuse_filter'), 'fields' => '*', 'conds' => $conds, 'join_conds' => array('abuse_filter' => array('LEFT JOIN', 'af_id=afl_filter')));
     if (!$this->mForm->canSeeHidden()) {
         $db = $this->mDb;
         $info['conds'][] = SpecialAbuseLog::getNotDeletedCond($db);
     }
     return $info;
 }
 function formatValue($name, $value)
 {
     $lang = $this->getLanguage();
     $row = $this->mCurrentRow;
     switch ($name) {
         case 'af_id':
             return Linker::link(SpecialPage::getTitleFor('AbuseFilter', intval($value)), $lang->formatNum(intval($value)));
         case 'af_public_comments':
             return Linker::link(SpecialPage::getTitleFor('AbuseFilter', intval($row->af_id)), htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false));
         case 'af_actions':
             $actions = explode(',', $value);
             $displayActions = array();
             foreach ($actions as $action) {
                 $displayActions[] = AbuseFilter::getActionDisplay($action);
             }
             return htmlspecialchars($lang->commaList($displayActions));
         case 'af_enabled':
             $statuses = array();
             if ($row->af_deleted) {
                 $statuses[] = $this->msg('abusefilter-deleted')->parse();
             } elseif ($row->af_enabled) {
                 $statuses[] = $this->msg('abusefilter-enabled')->parse();
             } else {
                 $statuses[] = $this->msg('abusefilter-disabled')->parse();
             }
             global $wgAbuseFilterIsCentral;
             if ($row->af_global && $wgAbuseFilterIsCentral) {
                 $statuses[] = $this->msg('abusefilter-status-global')->parse();
             }
             return $lang->commaList($statuses);
         case 'af_hidden':
             $msg = $value ? 'abusefilter-hidden' : 'abusefilter-unhidden';
             return $this->msg($msg)->parse();
         case 'af_hit_count':
             $count_display = $this->msg('abusefilter-hitcount')->numParams($value)->parse();
             if (SpecialAbuseLog::canSeeDetails($row->af_id, $row->af_hidden)) {
                 $link = Linker::linkKnown(SpecialPage::getTitleFor('AbuseLog'), $count_display, array(), array('wpSearchFilter' => $row->af_id));
             } else {
                 $link = "";
             }
             return $link;
         case 'af_timestamp':
             $userLink = Linker::userLink($row->af_user, $row->af_user_text) . Linker::userToolLinks($row->af_user, $row->af_user_text);
             $user = $row->af_user_text;
             return $this->msg('abusefilter-edit-lastmod-text')->rawParams($lang->timeanddate($value, true), $userLink, $lang->date($value, true), $lang->time($value, true), $user)->parse();
         case 'af_group':
             return AbuseFilter::nameGroup($value);
             break;
         default:
             throw new MWException("Unknown row type {$name}!");
     }
 }
 function formatValue($name, $value)
 {
     $lang = $this->getLanguage();
     $row = $this->mCurrentRow;
     switch ($name) {
         case 'af_id':
             return Linker::link(SpecialPage::getTitleFor('AbuseFilter', intval($value)), $lang->formatNum(intval($value)));
         case 'af_public_comments':
             return Linker::link(SpecialPage::getTitleFor('AbuseFilter', intval($row->af_id)), $this->getOutput()->parseInline($value));
         case 'af_actions':
             $actions = explode(',', $value);
             $displayActions = array();
             foreach ($actions as $action) {
                 $displayActions[] = AbuseFilter::getActionDisplay($action);
             }
             return htmlspecialchars($lang->commaList($displayActions));
         case 'af_enabled':
             $statuses = array();
             if ($row->af_deleted) {
                 $statuses[] = wfMsgExt('abusefilter-deleted', 'parseinline');
             } elseif ($row->af_enabled) {
                 $statuses[] = wfMsgExt('abusefilter-enabled', 'parseinline');
             } else {
                 $statuses[] = wfMsgExt('abusefilter-disabled', 'parseinline');
             }
             global $wgAbuseFilterIsCentral;
             if ($row->af_global && $wgAbuseFilterIsCentral) {
                 $statuses[] = wfMsgExt('abusefilter-status-global', 'parseinline');
             }
             return $lang->commaList($statuses);
         case 'af_hidden':
             $msg = $value ? 'abusefilter-hidden' : 'abusefilter-unhidden';
             return wfMsgExt($msg, 'parseinline');
         case 'af_hit_count':
             $count_display = wfMsgExt('abusefilter-hitcount', array('parseinline'), $lang->formatNum($value));
             // @todo FIXME: makeKnownLinkObj() is deprecated.
             if (SpecialAbuseLog::canSeeDetails($row->af_id, $row->af_hidden)) {
                 $link = Linker::makeKnownLinkObj(SpecialPage::getTitleFor('AbuseLog'), $count_display, 'wpSearchFilter=' . $row->af_id);
             } else {
                 $link = "";
             }
             return $link;
         case 'af_timestamp':
             $userLink = Linker::userLink($row->af_user, $row->af_user_text) . Linker::userToolLinks($row->af_user, $row->af_user_text);
             $user = $row->af_user_text;
             return wfMsgExt('abusefilter-edit-lastmod-text', array('replaceafter', 'parseinline'), array($lang->timeanddate($value, true), $userLink, $lang->date($value, true), $lang->time($value, true), $user));
         default:
             throw new MWException("Unknown row type {$name}!");
     }
 }