mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/TitleBlacklist
synced 2024-11-27 15:30:48 +00:00
Validate MediaWiki:TitleBlacklist and delete it from cache before saving
This commit is contained in:
parent
b4340da579
commit
e0c312c5fd
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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|её|их}} перед сохранением:',
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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';
|
||||
}
|
Loading…
Reference in a new issue