From e0c312c5fd8b7a31837dec0df7511b99ac1d0b59 Mon Sep 17 00:00:00 2001 From: Victor Vasiliev Date: Sun, 23 Dec 2007 09:47:36 +0000 Subject: [PATCH] Validate MediaWiki:TitleBlacklist and delete it from cache before saving --- TitleBlacklist.hooks.php | 24 ++++++++++++++++++++++++ TitleBlacklist.i18n.php | 26 +++++++++++++++++++++++++- TitleBlacklist.list.php | 25 +++++++++++++++++++++++-- TitleBlacklist.php | 3 ++- 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/TitleBlacklist.hooks.php b/TitleBlacklist.hooks.php index f505f4ab..33e2d5e6 100644 --- a/TitleBlacklist.hooks.php +++ b/TitleBlacklist.hooks.php @@ -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 = '* ' . implode( "\n* ", array_map( 'wfEscapeWikiText', $ok ) ) . ''; + $error = '
' . + $errmsg . + "\n" . + $errlines . + "
\n" . + "
\n"; + return true; + } } \ No newline at end of file diff --git a/TitleBlacklist.i18n.php b/TitleBlacklist.i18n.php index 52525561..a85a24bf 100644 --- a/TitleBlacklist.i18n.php +++ b/TitleBlacklist.i18n.php @@ -21,6 +21,7 @@ It matches the following blacklist entry: '''''\$1''''' 'titleblacklist-forbidden-upload' => " '''A file named \"\$2\" cannot be uploaded'''
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' => "
'''La pagina intitolada « \$2 » pòt pas èsser creada.'''
Dins la lista negra, correspond a l'expression racionala : '''''\$1'''''
", 'titleblacklist-forbidden-move' => " '''La page intitolada « \$2 » pòt pas èsser deplaçada a « \$3 ».'''
Dins la lista negra, correspond a l'expression racionala : '''''\$1'''''
", 'titleblacklist-forbidden-upload' => "'''Un fichièr nomenat « $2 » pòt pas èsser telecargat.'''
Dins la lista negra, correspond a l'expression racionala : '''''$1'''''", ), +/** Russian (Русский) + * @author VasilievVV + */ +'ru' => array( + 'titleblacklist' => +"# Это список запрещённый названий +# Любая статья, название которой попадает под этот список, не может быть создана +# Используйте « # » для комментариев +", + 'titleblacklist-forbidden-edit' => " +
+'''Страница с названием \"\$2\" не может быть создана'''
+Она попадает под следующую запись списка запрещенных названий: '''''\$1''''' +
", + 'titleblacklist-forbidden-move' => " +'''Страница с названием \"\$2\" не может быть перемещена'''
+Она попадает под следующую запись списка запрещенных названий: '''''\$1''''' +
", + 'titleblacklist-forbidden-upload' => " +'''Файл с названием \"\$2\" не может быть загружен'''
+Он попадает под следующую запись списка запрещенных названий: '''''\$1'''''", + 'titleblacklist-invalid' => '{{PLURAL:$1|Следующая строка|Следующие строки}} в списке запрещенный названий {{PLURAL:$1|не является правильным регулярным выражением|не являются правильными регулярными выражениями}}. Пожалуйста, исправьте {{PLURAL:$1|её|их}} перед сохранением:', + ), ); diff --git a/TitleBlacklist.list.php b/TitleBlacklist.list.php index d81917ba..9193ac68 100644 --- a/TitleBlacklist.list.php +++ b/TitleBlacklist.list.php @@ -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; } diff --git a/TitleBlacklist.php b/TitleBlacklist.php index 6b35bcc4..276d0a2a 100644 --- a/TitleBlacklist.php +++ b/TitleBlacklist.php @@ -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'; } \ No newline at end of file