userCannot( $title, $user, $action );
if ( $blacklisted instanceof TitleBlacklistEntry ) {
$result = array( $blacklisted->getErrorMessage( 'edit' ),
htmlspecialchars( $blacklisted->getRaw() ),
$title->getFullText() );
return false;
}
}
return true;
}
/**
* Display a notice if a user is only able to create or edit a page
* because they have tboverride (or autoconfirmed).
*
* @param Title $title
* @param integer $oldid
* @param array &$notices
*/
public static function displayBlacklistOverrideNotice( Title $title, $oldid, array &$notices ) {
$blacklisted = TitleBlacklist::singleton()->isBlacklisted(
$title,
$title->exists() ? 'edit' : 'create'
);
if ( $blacklisted ) {
$params = $blacklisted->getParams();
$msg = wfMessage(
isset( $params['autoconfirmed'] ) ?
'titleblacklist-autoconfirmed-warning' :
'titleblacklist-warning'
);
$notices['titleblacklist'] = $msg->rawParams(
htmlspecialchars( $blacklisted->getRaw() ) )->parseAsBlock();
}
return true;
}
/**
* AbortMove hook
*
* @param $old Title
* @param $nt Title
* @param $user User
* @param $err
* @return bool
*/
public static function abortMove( $old, $nt, $user, &$err ) {
$titleBlacklist = TitleBlacklist::singleton();
$blacklisted = $titleBlacklist->userCannot( $nt, $user, 'move' );
if ( !$blacklisted ) {
$blacklisted = $titleBlacklist->userCannot( $old, $user, 'edit' );
}
if ( $blacklisted instanceof TitleBlacklistEntry ) {
$err = wfMessage( $blacklisted->getErrorMessage( 'move' ),
$blacklisted->getRaw(),
$old->getFullText(),
$nt->getFullText() )->parse();
return false;
}
return true;
}
/**
* Check whether a user name is acceptable,
* and set a message if unacceptable.
*
* Used by abortNewAccount and centralAuthAutoCreate
*
* @return bool Acceptable
*/
private static function acceptNewUserName( $userName, $permissionsUser, &$err, $override = true, $log = false ) {
global $wgUser;
$title = Title::makeTitleSafe( NS_USER, $userName );
$blacklisted = TitleBlacklist::singleton()->userCannot( $title, $permissionsUser,
'new-account', $override );
if ( $blacklisted instanceof TitleBlacklistEntry ) {
$message = $blacklisted->getErrorMessage( 'new-account' );
$err = wfMessage( $message, $blacklisted->getRaw(), $userName )->parse();
if ( $log ) {
self::logFilterHitUsername( $wgUser, $title, $blacklisted->getRaw() );
}
return false;
}
return true;
}
/**
* AbortNewAccount hook
*
* @param User $user
*/
public static function abortNewAccount( $user, &$message ) {
global $wgUser, $wgRequest;
$override = $wgRequest->getCheck( 'wpIgnoreTitleBlacklist' );
return self::acceptNewUserName( $user->getName(), $wgUser, $message, $override, true );
}
/** CentralAuthAutoCreate hook */
public static function centralAuthAutoCreate( $user, $userName ) {
$message = ''; # Will be ignored
$anon = new User;
return self::acceptNewUserName( $userName, $anon, $message );
}
/**
* EditFilter hook
*
* @param $editor EditPage
*/
public static function validateBlacklist( $editor, $text, $section, &$error ) {
global $wgUser;
$title = $editor->mTitle;
if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDBkey() == 'Titleblacklist' ) {
$blackList = TitleBlacklist::singleton();
$bl = $blackList->parseBlacklist( $text, 'page' );
$ok = $blackList->validate( $bl );
if ( count( $ok ) == 0 ) {
return true;
}
$errmsg = wfMessage( 'titleblacklist-invalid' )->numParams( count( $ok ) )->text();
$errlines = '* ' . implode( "
\n* ", array_map( 'wfEscapeWikiText', $ok ) ) . '
';
$error = Html::openElement( 'div', array( 'class' => 'errorbox' ) ) .
$errmsg .
"\n" .
$errlines .
Html::closeElement( 'div' ) . "\n" .
Html::element( 'br', array( 'clear' => 'all' ) ) . "\n";
// $error will be displayed by the edit class
return true;
} elseif ( !$section ) {
# Block redirects to nonexistent blacklisted titles
$retitle = Title::newFromRedirect( $text );
if ( $retitle !== null && !$retitle->exists() ) {
$blacklisted = TitleBlacklist::singleton()->userCannot( $retitle, $wgUser, 'create' );
if ( $blacklisted instanceof TitleBlacklistEntry ) {
$error = Html::openElement( 'div', array( 'class' => 'errorbox' ) ) .
wfMessage( 'titleblacklist-forbidden-edit',
$blacklisted->getRaw(),
$retitle->getFullText() )->escaped() .
Html::closeElement( 'div' ) . "\n" .
Html::element( 'br', array( 'clear' => 'all' ) ) . "\n";
}
}
return true;
}
return true;
}
/**
* ArticleSaveComplete hook
*
* @param Article $article
*/
public static function clearBlacklist( &$article, &$user,
$text, $summary, $isminor, $iswatch, $section )
{
$title = $article->getTitle();
if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDBkey() == 'Titleblacklist' ) {
TitleBlacklist::singleton()->invalidate();
}
return true;
}
/** UserCreateForm hook based on the one from AntiSpoof extension */
public static function addOverrideCheckbox( &$template ) {
global $wgRequest, $wgUser;
if ( TitleBlacklist::userCanOverride( $wgUser, 'new-account' ) ) {
$template->addInputItem( 'wpIgnoreTitleBlacklist',
$wgRequest->getCheck( 'wpIgnoreTitleBlacklist' ),
'checkbox', 'titleblacklist-override' );
}
return true;
}
/**
* Logs the filter username hit to Special:Log if
* $wgTitleBlacklistLogHits is enabled.
*
* @param User $user
* @param Title $title
* @param string $entry
*/
public static function logFilterHitUsername( $user, $title, $entry ) {
global $wgTitleBlacklistLogHits;
if ( $wgTitleBlacklistLogHits ) {
$logEntry = new ManualLogEntry( 'titleblacklist', 'hit-username' );
$logEntry->setPerformer( $user );
$logEntry->setTarget( $title );
$logEntry->setParameters( array(
'4::entry' => $entry,
) );
$logid = $logEntry->insert();
$logEntry->publish( $logid );
}
}
}