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;
|
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' => "
|
'titleblacklist-forbidden-upload' => "
|
||||||
'''A file named \"\$2\" cannot be uploaded''' <br />
|
'''A file named \"\$2\" cannot be uploaded''' <br />
|
||||||
It matches the following blacklist entry: '''''\$1'''''",
|
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(
|
'ar' => array(
|
||||||
|
@ -138,11 +139,34 @@ Het voldoet aan de volgende reguliere expressie op de zwarte lijst: '''''\$1''''
|
||||||
'oc' => array(
|
'oc' => array(
|
||||||
'titleblacklist' => "# Aquò es un títol mes en lista negra
|
'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
|
# 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-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-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'''''",
|
'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;
|
$this->mBlacklist = $cachedBlacklist;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sources = $wgTitleBlacklistSources;
|
$sources = $wgTitleBlacklistSources;
|
||||||
$sources[] = array( 'type' => TBLSRC_MSG );
|
$sources[] = array( 'type' => TBLSRC_MSG );
|
||||||
$this->mBlacklist = array();
|
$this->mBlacklist = array();
|
||||||
|
@ -108,7 +109,7 @@ class TitleBlacklist {
|
||||||
public function getHttp( $url ) {
|
public function getHttp( $url ) {
|
||||||
global $messageMemc, $wgDBname, $wgTitleBlacklistCaching;
|
global $messageMemc, $wgDBname, $wgTitleBlacklistCaching;
|
||||||
$key = "title_blacklist_source:" . md5( $url );
|
$key = "title_blacklist_source:" . md5( $url );
|
||||||
$warnkey = "{$wgDBname}:titleblacklistwarning:";
|
$warnkey = "{$wgDBname}:titleblacklistwarning:" . md5( $url );
|
||||||
$result = $messageMemc->get( $key );
|
$result = $messageMemc->get( $key );
|
||||||
$warn = $messageMemc->get( $warnkey );
|
$warn = $messageMemc->get( $warnkey );
|
||||||
if ( !is_string( $result ) || ( !$warn && !mt_rand( 0, $wgTitleBlacklistCaching['warningchance'] ) ) ) {
|
if ( !is_string( $result ) || ( !$warn && !mt_rand( 0, $wgTitleBlacklistCaching['warningchance'] ) ) ) {
|
||||||
|
@ -118,6 +119,23 @@ class TitleBlacklist {
|
||||||
}
|
}
|
||||||
return $result;
|
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 {
|
class TitleBlacklistEntry {
|
||||||
|
@ -137,7 +155,10 @@ class TitleBlacklistEntry {
|
||||||
if( $user->isAllowed( 'tboverride' ) ) {
|
if( $user->isAllowed( 'tboverride' ) ) {
|
||||||
return true;
|
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' ) ) {
|
if( isset( $this->mParams['autoconfirmed'] ) && $user->isAllowed( 'autoconfirmed' ) ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ $wgExtensionFunctions[] = 'efInitTitleBlacklist';
|
||||||
// Sources of TitleBlacklist
|
// Sources of TitleBlacklist
|
||||||
define( 'TBLSRC_MSG', 0 ); //For internal usage
|
define( 'TBLSRC_MSG', 0 ); //For internal usage
|
||||||
define( 'TBLSRC_LOCALPAGE', 1 ); //Local wiki page
|
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
|
define( 'TBLSRC_FILE', 3 ); //Load from file
|
||||||
$wgTitleBlacklistSources = array();
|
$wgTitleBlacklistSources = array();
|
||||||
|
|
||||||
|
@ -52,4 +52,5 @@ function efSetupTitleBlacklistHooks() {
|
||||||
$wgHooks['getUserPermissionsErrors'][] = 'TitleBlacklistHooks::userCan';
|
$wgHooks['getUserPermissionsErrors'][] = 'TitleBlacklistHooks::userCan';
|
||||||
$wgHooks['AbortMove'][] = 'TitleBlacklistHooks::abortMove';
|
$wgHooks['AbortMove'][] = 'TitleBlacklistHooks::abortMove';
|
||||||
$wgHooks['UploadVerification'][] = 'TitleBlacklistHooks::verifyUpload';
|
$wgHooks['UploadVerification'][] = 'TitleBlacklistHooks::verifyUpload';
|
||||||
|
$wgHooks['EditFilter'][] = 'TitleBlacklistHooks::validateBlacklist';
|
||||||
}
|
}
|
Loading…
Reference in a new issue