Index: trunk/extensions/TitleBlacklist/TitleBlacklist.php |
— | — | @@ -19,7 +19,7 @@ |
20 | 20 | // Sources of TitleBlacklist |
21 | 21 | define( 'TBLSRC_MSG', 0 ); //For internal usage |
22 | 22 | define( 'TBLSRC_LOCALPAGE', 1 ); //Local wiki page |
23 | | -define( 'TBLSRC_URL', 2 ); //Load blacklist from URL |
| 23 | +define( 'TBLSRC_URL', 2 ); //Load blacklist from URL |
24 | 24 | define( 'TBLSRC_FILE', 3 ); //Load from file |
25 | 25 | $wgTitleBlacklistSources = array(); |
26 | 26 | |
— | — | @@ -52,4 +52,5 @@ |
53 | 53 | $wgHooks['getUserPermissionsErrors'][] = 'TitleBlacklistHooks::userCan'; |
54 | 54 | $wgHooks['AbortMove'][] = 'TitleBlacklistHooks::abortMove'; |
55 | 55 | $wgHooks['UploadVerification'][] = 'TitleBlacklistHooks::verifyUpload'; |
| 56 | + $wgHooks['EditFilter'][] = 'TitleBlacklistHooks::validateBlacklist'; |
56 | 57 | } |
\ No newline at end of file |
Index: trunk/extensions/TitleBlacklist/TitleBlacklist.hooks.php |
— | — | @@ -57,4 +57,28 @@ |
58 | 58 | } |
59 | 59 | return true; |
60 | 60 | } |
| 61 | + |
| 62 | + public static function validateBlacklist( $editor, $text, $section, $error ) { |
| 63 | + global $wgTitleBlacklist; |
| 64 | + $title = $editor->mTitle; |
| 65 | + if( $title->getNamespace() != NS_MEDIAWIKI && $title->getDbKey() != 'Titleblacklist' ) |
| 66 | + return true; |
| 67 | + |
| 68 | + $bl = $wgTitleBlacklist->parseBlacklist( $text ); |
| 69 | + $ok = $wgTitleBlacklist->validate( $bl ); |
| 70 | + if( count( $ok ) == 0 ) { |
| 71 | + $wgTitleBlacklist->invalidate(); |
| 72 | + return true; |
| 73 | + } |
| 74 | + |
| 75 | + $errmsg = wfMsgExt( 'titleblacklist-invalid', array( 'parsemag' ), count( $ok ) ); |
| 76 | + $errlines = '* <tt>' . implode( "</tt>\n* <tt>", array_map( 'wfEscapeWikiText', $ok ) ) . '</tt>'; |
| 77 | + $error = '<div class="errorbox">' . |
| 78 | + $errmsg . |
| 79 | + "\n" . |
| 80 | + $errlines . |
| 81 | + "</div>\n" . |
| 82 | + "<br clear='all' />\n"; |
| 83 | + return true; |
| 84 | + } |
61 | 85 | } |
\ No newline at end of file |
Index: trunk/extensions/TitleBlacklist/TitleBlacklist.list.php |
— | — | @@ -22,6 +22,7 @@ |
23 | 23 | $this->mBlacklist = $cachedBlacklist; |
24 | 24 | return; |
25 | 25 | } |
| 26 | + |
26 | 27 | $sources = $wgTitleBlacklistSources; |
27 | 28 | $sources[] = array( 'type' => TBLSRC_MSG ); |
28 | 29 | $this->mBlacklist = array(); |
— | — | @@ -108,7 +109,7 @@ |
109 | 110 | public function getHttp( $url ) { |
110 | 111 | global $messageMemc, $wgDBname, $wgTitleBlacklistCaching; |
111 | 112 | $key = "title_blacklist_source:" . md5( $url ); |
112 | | - $warnkey = "{$wgDBname}:titleblacklistwarning:"; |
| 113 | + $warnkey = "{$wgDBname}:titleblacklistwarning:" . md5( $url ); |
113 | 114 | $result = $messageMemc->get( $key ); |
114 | 115 | $warn = $messageMemc->get( $warnkey ); |
115 | 116 | if ( !is_string( $result ) || ( !$warn && !mt_rand( 0, $wgTitleBlacklistCaching['warningchance'] ) ) ) { |
— | — | @@ -118,6 +119,23 @@ |
119 | 120 | } |
120 | 121 | return $result; |
121 | 122 | } |
| 123 | + |
| 124 | + public function invalidate() { |
| 125 | + global $wgMemc, $wgDBname; |
| 126 | + $wgMemc->delete( "{$wgDBname}:title_blacklist_entries" ); |
| 127 | + } |
| 128 | + |
| 129 | + public function validate( $blacklist ) { |
| 130 | + $badEntries = array(); |
| 131 | + foreach( $blacklist as $e ) { |
| 132 | + wfSuppressWarnings(); |
| 133 | + $regex = $e->getRegex(); |
| 134 | + if( preg_match( "/{$regex}/u", '' ) === false ) |
| 135 | + $badEntries[] = $e->getRaw(); |
| 136 | + wfRestoreWarnings(); |
| 137 | + } |
| 138 | + return $badEntries; |
| 139 | + } |
122 | 140 | } |
123 | 141 | |
124 | 142 | class TitleBlacklistEntry { |
— | — | @@ -137,7 +155,10 @@ |
138 | 156 | if( $user->isAllowed( 'tboverride' ) ) { |
139 | 157 | return true; |
140 | 158 | } |
141 | | - if( preg_match( "/^{$this->mRegex}$/s" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() ) ) { |
| 159 | + wfSuppressWarnings(); |
| 160 | + $match = preg_match( "/^{$this->mRegex}$/s" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() ); |
| 161 | + wfRestoreWarnings(); |
| 162 | + if( $match ) { |
142 | 163 | if( isset( $this->mParams['autoconfirmed'] ) && $user->isAllowed( 'autoconfirmed' ) ) { |
143 | 164 | return true; |
144 | 165 | } |
Index: trunk/extensions/TitleBlacklist/TitleBlacklist.i18n.php |
— | — | @@ -21,6 +21,7 @@ |
22 | 22 | 'titleblacklist-forbidden-upload' => " |
23 | 23 | '''A file named \"\$2\" cannot be uploaded''' <br /> |
24 | 24 | It matches the following blacklist entry: '''''\$1'''''", |
| 25 | + '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:', |
25 | 26 | ), |
26 | 27 | |
27 | 28 | 'ar' => array( |
— | — | @@ -138,11 +139,34 @@ |
139 | 140 | 'oc' => array( |
140 | 141 | 'titleblacklist' => "# Aquò es un títol mes en lista negra |
141 | 142 | # Cada títol qu'indica aicí lo còde regex es interdich a la creacion e a l'edicion |
142 | | -# Utilizatz « \" » per escriure de comentaris", |
| 143 | +# Utilizatz « # » per escriure de comentaris", |
143 | 144 | '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>", |
144 | 145 | '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>", |
145 | 146 | 'titleblacklist-forbidden-upload' => "'''Un fichièr nomenat « $2 » pòt pas èsser telecargat.''' <br /> Dins la lista negra, correspond a l'expression racionala : '''''$1'''''", |
146 | 147 | ), |
| 148 | +/** Russian (Русский) |
| 149 | + * @author VasilievVV |
| 150 | + */ |
| 151 | +'ru' => array( |
| 152 | + 'titleblacklist' => |
| 153 | +"# Это список запрещённый названий |
| 154 | +# Любая статья, название которой попадает под этот список, не может быть создана |
| 155 | +# Используйте « # » для комментариев |
| 156 | +", |
| 157 | + 'titleblacklist-forbidden-edit' => " |
| 158 | +<div align=\"center\" style=\"border: 1px solid #f88; padding: 0.5em; margin-bottom: 3px; font-size: 95%; width: auto;\"> |
| 159 | +'''Страница с названием \"\$2\" не может быть создана''' <br /> |
| 160 | +Она попадает под следующую запись списка запрещенных названий: '''''\$1''''' |
| 161 | +</div>", |
| 162 | + 'titleblacklist-forbidden-move' => "<span class=\"error\"> |
| 163 | +'''Страница с названием \"\$2\" не может быть перемещена''' <br /> |
| 164 | +Она попадает под следующую запись списка запрещенных названий: '''''\$1''''' |
| 165 | +</span>", |
| 166 | + 'titleblacklist-forbidden-upload' => " |
| 167 | +'''Файл с названием \"\$2\" не может быть загружен''' <br /> |
| 168 | +Он попадает под следующую запись списка запрещенных названий: '''''\$1'''''", |
| 169 | + 'titleblacklist-invalid' => '{{PLURAL:$1|Следующая строка|Следующие строки}} в списке запрещенный названий {{PLURAL:$1|не является правильным регулярным выражением|не являются правильными регулярными выражениями}}. Пожалуйста, исправьте {{PLURAL:$1|её|их}} перед сохранением:', |
| 170 | + ), |
147 | 171 | |
148 | 172 | ); |
149 | 173 | |