| Current File : /home/jvzmxxx/wiki1/extensions/Flow/includes/SpamFilter/AbuseFilter.php |
<?php
namespace Flow\SpamFilter;
use Flow\Model\AbstractRevision;
use IContextSource;
use Status;
use Title;
class AbuseFilter implements SpamFilter {
/**
* @var string
*/
protected $group;
/**
* @param string $group The abuse filter group to use
*/
public function __construct( $group ) {
$this->group = $group;
}
/**
* Set up AbuseFilter for Flow extension
*
* @param array $emergencyDisable optional AbuseFilter emergency disable values
*/
public function setup( array $emergencyDisable = array() ) {
global
$wgAbuseFilterValidGroups,
$wgAbuseFilterEmergencyDisableThreshold,
$wgAbuseFilterEmergencyDisableCount,
$wgAbuseFilterEmergencyDisableAge;
if ( !$this->enabled() ) {
return;
}
// if no Flow-specific emergency disable threshold given, use defaults
$emergencyDisable += array(
'threshold' => $wgAbuseFilterEmergencyDisableThreshold['default'],
'count' => $wgAbuseFilterEmergencyDisableCount['default'],
'age' => $wgAbuseFilterEmergencyDisableAge['default'],
);
// register Flow's AbuseFilter filter group
if ( !in_array( $this->group, $wgAbuseFilterValidGroups ) ) {
$wgAbuseFilterValidGroups[] = $this->group;
// AbuseFilter emergency disable values for Flow
$wgAbuseFilterEmergencyDisableThreshold[$this->group] = $emergencyDisable['threshold'];
$wgAbuseFilterEmergencyDisableCount[$this->group] = $emergencyDisable['count'];
$wgAbuseFilterEmergencyDisableAge[$this->group] = $emergencyDisable['age'];
}
}
/**
* @param IContextSource $context
* @param AbstractRevision $newRevision
* @param AbstractRevision|null $oldRevision
* @param Title $title
* @return Status
*/
public function validate( IContextSource $context, AbstractRevision $newRevision, AbstractRevision $oldRevision = null, Title $title ) {
$vars = \AbuseFilter::getEditVars( $title );
$vars->addHolders( \AbuseFilter::generateUserVars( $context->getUser() ), \AbuseFilter::generateTitleVars( $title , 'ARTICLE' ) );
$vars->setVar( 'ACTION', $newRevision->getChangeType() );
/*
* This should not roundtrip to Parsoid; AbuseFilter checks will be
* performed upon submitting new content, and content is always
* submitted in wikitext. It will only be transformed once it's being
* saved to DB.
*/
$vars->setLazyLoadVar( 'new_wikitext', 'FlowRevisionContent', array( 'revision' => $newRevision ) );
$vars->setLazyLoadVar( 'new_size', 'length', array( 'length-var' => 'new_wikitext' ) );
/*
* This may roundtrip to Parsoid if content is stored in HTML.
* Since the variable is lazy-loaded, it will not roundtrip unless the
* variable is actually used.
*/
$vars->setLazyLoadVar( 'old_wikitext', 'FlowRevisionContent', array( 'revision' => $oldRevision ) );
$vars->setLazyLoadVar( 'old_size', 'length', array( 'length-var' => 'old_wikitext' ) );
return \AbuseFilter::filterAction( $vars, $title, $this->group );
}
/**
* Checks if AbuseFilter is installed.
*
* @return bool
*/
public function enabled() {
return class_exists( 'AbuseFilter' ) && (bool) $this->group;
}
/**
* Additional lazy-load methods for dealing with AbstractRevision objects,
* to delay processing data until/if variables are actually used.
*
* @return array
*/
public function lazyLoadMethods() {
return array(
/**
* @param string $method: Method to generate the variable
* @param \AbuseFilterVariableHolder $vars
* @param array $parameters Parameters with data to compute the value
* @param mixed &$result Result of the computation
*/
'FlowRevisionContent' => function ( \AbuseFilterVariableHolder $vars, $parameters ) {
if ( !isset( $parameters['revision'] ) ) {
return '';
}
$revision = $parameters['revision'];
if ( $revision instanceof AbstractRevision ) {
return $revision->getContentInWikitext();
} else {
return '';
}
}
);
}
}