Validate MediaWiki:TitleBlacklist and delete it from cache before saving

This commit is contained in:
Victor Vasiliev 2007-12-23 09:47:36 +00:00
parent b4340da579
commit e0c312c5fd
4 changed files with 74 additions and 4 deletions

View file

@ -57,4 +57,28 @@ class TitleBlacklistHooks {
}
return true;
}
public static function validateBlacklist( $editor, $text, $section, $error ) {
global $wgTitleBlacklist;
$title = $editor->mTitle;
if( $title->getNamespace() != NS_MEDIAWIKI && $title->getDbKey() != 'Titleblacklist' )
return true;
$bl = $wgTitleBlacklist->parseBlacklist( $text );
$ok = $wgTitleBlacklist->validate( $bl );
if( count( $ok ) == 0 ) {
$wgTitleBlacklist->invalidate();
return true;
}
$errmsg = wfMsgExt( 'titleblacklist-invalid', array( 'parsemag' ), count( $ok ) );
$errlines = '* <tt>' . implode( "</tt>\n* <tt>", array_map( 'wfEscapeWikiText', $ok ) ) . '</tt>';
$error = '<div class="errorbox">' .
$errmsg .
"\n" .
$errlines .
"</div>\n" .
"<br clear='all' />\n";
return true;
}
}

View file

@ -21,6 +21,7 @@ It matches the following blacklist entry: '''''\$1'''''
'titleblacklist-forbidden-upload' => "
'''A file named \"\$2\" cannot be uploaded''' <br />
It matches the following blacklist entry: '''''\$1'''''",
'titleblacklist-invalid' => 'The following {{PLURAL:$1|line|lines}} in the title blacklist {{PLURAL:$1|is|are}} invalid; please correct {{PLURAL:$1|it|them}} before saving:',
),
'ar' => array(
@ -138,11 +139,34 @@ Het voldoet aan de volgende reguliere expressie op de zwarte lijst: '''''\$1''''
'oc' => array(
'titleblacklist' => "# Aquò es un títol mes en lista negra
# Cada títol qu'indica aicí lo còde regex es interdich a la creacion e a l'edicion
# Utilizatz « \" » per escriure de comentaris",
# Utilizatz « # » per escriure de comentaris",
'titleblacklist-forbidden-edit' => "<div align=\"center\" style=\"border: 1px solid #f88; padding: 0.5em; margin-bottom: 3px; font-size: 95%; width: auto;\"> '''La pagina intitolada « \$2 » pòt pas èsser creada.''' <br /> Dins la lista negra, correspond a l'expression racionala : '''''\$1''''' </div>",
'titleblacklist-forbidden-move' => "<span class=\"error\"> '''La page intitolada « \$2 » pòt pas èsser deplaçada a « \$3 ».''' <br /> Dins la lista negra, correspond a l'expression racionala : '''''\$1''''' </span>",
'titleblacklist-forbidden-upload' => "'''Un fichièr nomenat « $2 » pòt pas èsser telecargat.''' <br /> Dins la lista negra, correspond a l'expression racionala : '''''$1'''''",
),
/** Russian (Русский)
* @author VasilievVV
*/
'ru' => array(
'titleblacklist' =>
"# Это список запрещённый названий
# Любая статья, название которой попадает под этот список, не может быть создана
# Используйте « # » для комментариев
",
'titleblacklist-forbidden-edit' => "
<div align=\"center\" style=\"border: 1px solid #f88; padding: 0.5em; margin-bottom: 3px; font-size: 95%; width: auto;\">
'''Страница с названием \"\$2\" не может быть создана''' <br />
Она попадает под следующую запись списка запрещенных названий: '''''\$1'''''
</div>",
'titleblacklist-forbidden-move' => "<span class=\"error\">
'''Страница с названием \"\$2\" не может быть перемещена''' <br />
Она попадает под следующую запись списка запрещенных названий: '''''\$1'''''
</span>",
'titleblacklist-forbidden-upload' => "
'''Файл с названием \"\$2\" не может быть загружен''' <br />
Он попадает под следующую запись списка запрещенных названий: '''''\$1'''''",
'titleblacklist-invalid' => '{{PLURAL:$1|Следующая строка|Следующие строки}} в списке запрещенный названий {{PLURAL:$1|не является правильным регулярным выражением|не являются правильными регулярными выражениями}}. Пожалуйста, исправьте {{PLURAL:$1|её|их}} перед сохранением:',
),
);

View file

@ -22,6 +22,7 @@ class TitleBlacklist {
$this->mBlacklist = $cachedBlacklist;
return;
}
$sources = $wgTitleBlacklistSources;
$sources[] = array( 'type' => TBLSRC_MSG );
$this->mBlacklist = array();
@ -108,7 +109,7 @@ class TitleBlacklist {
public function getHttp( $url ) {
global $messageMemc, $wgDBname, $wgTitleBlacklistCaching;
$key = "title_blacklist_source:" . md5( $url );
$warnkey = "{$wgDBname}:titleblacklistwarning:";
$warnkey = "{$wgDBname}:titleblacklistwarning:" . md5( $url );
$result = $messageMemc->get( $key );
$warn = $messageMemc->get( $warnkey );
if ( !is_string( $result ) || ( !$warn && !mt_rand( 0, $wgTitleBlacklistCaching['warningchance'] ) ) ) {
@ -118,6 +119,23 @@ class TitleBlacklist {
}
return $result;
}
public function invalidate() {
global $wgMemc, $wgDBname;
$wgMemc->delete( "{$wgDBname}:title_blacklist_entries" );
}
public function validate( $blacklist ) {
$badEntries = array();
foreach( $blacklist as $e ) {
wfSuppressWarnings();
$regex = $e->getRegex();
if( preg_match( "/{$regex}/u", '' ) === false )
$badEntries[] = $e->getRaw();
wfRestoreWarnings();
}
return $badEntries;
}
}
class TitleBlacklistEntry {
@ -137,7 +155,10 @@ class TitleBlacklistEntry {
if( $user->isAllowed( 'tboverride' ) ) {
return true;
}
if( preg_match( "/^{$this->mRegex}$/s" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() ) ) {
wfSuppressWarnings();
$match = preg_match( "/^{$this->mRegex}$/s" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() );
wfRestoreWarnings();
if( $match ) {
if( isset( $this->mParams['autoconfirmed'] ) && $user->isAllowed( 'autoconfirmed' ) ) {
return true;
}

View file

@ -19,7 +19,7 @@ $wgExtensionFunctions[] = 'efInitTitleBlacklist';
// Sources of TitleBlacklist
define( 'TBLSRC_MSG', 0 ); //For internal usage
define( 'TBLSRC_LOCALPAGE', 1 ); //Local wiki page
define( 'TBLSRC_URL', 2 ); //Load blacklist from URL
define( 'TBLSRC_URL', 2 ); //Load blacklist from URL
define( 'TBLSRC_FILE', 3 ); //Load from file
$wgTitleBlacklistSources = array();
@ -52,4 +52,5 @@ function efSetupTitleBlacklistHooks() {
$wgHooks['getUserPermissionsErrors'][] = 'TitleBlacklistHooks::userCan';
$wgHooks['AbortMove'][] = 'TitleBlacklistHooks::abortMove';
$wgHooks['UploadVerification'][] = 'TitleBlacklistHooks::verifyUpload';
$wgHooks['EditFilter'][] = 'TitleBlacklistHooks::validateBlacklist';
}