diff options
Diffstat (limited to 'extensions/SpamBlacklist/SpamBlacklistHooks.php')
-rw-r--r-- | extensions/SpamBlacklist/SpamBlacklistHooks.php | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/extensions/SpamBlacklist/SpamBlacklistHooks.php b/extensions/SpamBlacklist/SpamBlacklistHooks.php new file mode 100644 index 00000000..530df16a --- /dev/null +++ b/extensions/SpamBlacklist/SpamBlacklistHooks.php @@ -0,0 +1,163 @@ +<?php + +/** + * Hooks for the spam blacklist extension + */ +class SpamBlacklistHooks { + /** + * Hook function for EditFilterMerged + * + * @param $editPage EditPage + * @param $text string + * @param $hookErr string + * @param $editSummary string + * @return bool + */ + static function filterMerged( $editPage, $text, &$hookErr, $editSummary ) { + global $wgTitle; + if( is_null( $wgTitle ) ) { + # API mode + # wfSpamBlacklistFilterAPIEditBeforeSave already checked the blacklist + return true; + } + + $spamObj = BaseBlacklist::getInstance( 'spam' ); + $title = $editPage->mArticle->getTitle(); + $ret = $spamObj->filter( $title, $text, '', $editSummary, $editPage ); + if ( $ret !== false ) { + $editPage->spamPageWithContent( $ret ); + } + // Return convention for hooks is the inverse of $wgFilterCallback + return ( $ret === false ); + } + + /** + * Hook function for APIEditBeforeSave + * + * @param $editPage EditPage + * @param $text string + * @param $resultArr array + * @return bool + */ + static function filterAPIEditBeforeSave( $editPage, $text, &$resultArr ) { + $spamObj = BaseBlacklist::getInstance( 'spam' ); + $title = $editPage->mArticle->getTitle(); + $ret = $spamObj->filter( $title, $text, '', '', $editPage ); + if ( $ret!==false ) { + $resultArr['spamblacklist'] = implode( '|', $ret ); + } + // Return convention for hooks is the inverse of $wgFilterCallback + return ( $ret === false ); + } + + /** + * Verify that the user can send emails + * + * @param $user User + * @param $hookErr array + * @return bool + */ + public static function userCanSendEmail( &$user, &$hookErr ) { + /** @var $blacklist EmailBlacklist */ + $blacklist = BaseBlacklist::getInstance( 'email' ); + if ( $blacklist->checkUser( $user ) ) { + return true; + } + + $hookErr = array( 'spam-blacklisted-email', 'spam-blacklisted-email-text', null ); + + return false; + } + + /** + * Processes new accounts for valid email addresses + * + * @param $user User + * @param $abortError + * @return bool + */ + public static function abortNewAccount( $user, &$abortError ) { + /** @var $blacklist EmailBlacklist */ + $blacklist = BaseBlacklist::getInstance( 'email' ); + if ( $blacklist->checkUser( $user ) ) { + return true; + } + + $abortError = wfMessage( 'spam-blacklisted-email-signup' )->escaped(); + return false; + } + + /** + * Hook function for EditFilter + * Confirm that a local blacklist page being saved is valid, + * and toss back a warning to the user if it isn't. + * + * @param $editPage EditPage + * @param $text string + * @param $section string + * @param $hookError string + * @return bool + */ + static function validate( $editPage, $text, $section, &$hookError ) { + $thisPageName = $editPage->mTitle->getPrefixedDBkey(); + + if( !BaseBlacklist::isLocalSource( $editPage->mTitle ) ) { + wfDebugLog( 'SpamBlacklist', "Spam blacklist validator: [[$thisPageName]] not a local blacklist\n" ); + return true; + } + + $type = BaseBlacklist::getTypeFromTitle( $editPage->mTitle ); + if ( $type === false ) { + return true; + } + + $lines = explode( "\n", $text ); + + $badLines = SpamRegexBatch::getBadLines( $lines, BaseBlacklist::getInstance( $type ) ); + if( $badLines ) { + wfDebugLog( 'SpamBlacklist', "Spam blacklist validator: [[$thisPageName]] given invalid input lines: " . + implode( ', ', $badLines ) . "\n" ); + + $badList = "*<code>" . + implode( "</code>\n*<code>", + array_map( 'wfEscapeWikiText', $badLines ) ) . + "</code>\n"; + $hookError = + "<div class='errorbox'>" . + wfMessage( 'spam-invalid-lines' )->numParams( $badLines )->text() . "<br />" . + $badList . + "</div>\n" . + "<br clear='all' />\n"; + } else { + wfDebugLog( 'SpamBlacklist', "Spam blacklist validator: [[$thisPageName]] ok or empty blacklist\n" ); + } + + return true; + } + + /** + * Hook function for ArticleSaveComplete + * Clear local spam blacklist caches on page save. + * + * @param $article Article + * @param $user User + * @param $text string + * @param $summary string + * @param $isminor + * @param $iswatch + * @param $section + * @return bool + */ + static function articleSave( &$article, &$user, $text, $summary, $isminor, $iswatch, $section ) { + if( !BaseBlacklist::isLocalSource( $article->getTitle() ) ) { + return true; + } + global $wgMemc, $wgDBname; + + // This sucks because every Blacklist needs to be cleared + foreach ( BaseBlacklist::getBlacklistTypes() as $type => $class ) { + $wgMemc->delete( "$wgDBname:{$type}_blacklist_regexes" ); + } + return true; + } +} |