saper has uploaded a new change for review. https://gerrit.wikimedia.org/r/92252
Change subject: Introduce AbuseFilterUser ...................................................................... Introduce AbuseFilterUser Modify behaviour of Abuse Filter special user by extra Experimental, see: http://thread.gmane.org/gmane.science.linguistics.wikipedia.technical/73503 Bug: 42345 Change-Id: I0c1e34e95bfd41a8f7ace8b51937035bf574edf1 --- M AbuseFilter.class.php M AbuseFilter.hooks.php M AbuseFilter.php A AbuseFilterUser.class.php 4 files changed, 185 insertions(+), 64 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/AbuseFilter refs/changes/52/92252/1 diff --git a/AbuseFilter.class.php b/AbuseFilter.class.php index 61939ce..6673c75 100644 --- a/AbuseFilter.class.php +++ b/AbuseFilter.class.php @@ -1225,7 +1225,7 @@ case 'block': global $wgUser, $wgAbuseFilterBlockDuration, $wgAbuseFilterAnonBlockDuration; - $filterUser = AbuseFilter::getFilterUser(); + $filterUser = AbuseFilterUser::getInstance(); // Create a block. $block = new Block; @@ -1264,7 +1264,7 @@ $log->addEntry( 'block', Title::makeTitle( NS_USER, $wgUser->getName() ), wfMessage( 'abusefilter-blockreason', $rule_desc )->inContentLanguage()->text(), - $logParams, self::getFilterUser() + $logParams, AbuseFilterUser::getInstance() ); $message = array( @@ -1273,7 +1273,7 @@ ); break; case 'rangeblock': - $filterUser = AbuseFilter::getFilterUser(); + $filterUser = AbuseFilterUser::getInstance(); $range = IP::sanitizeRange( $wgRequest->getIP() . '/16' ); @@ -1301,7 +1301,7 @@ $log = new LogPage( 'block' ); $log->addEntry( 'block', Title::makeTitle( NS_USER, $range ), wfMessage( 'abusefilter-blockreason', $rule_desc )->inContentLanguage()->text(), - $logParams, self::getFilterUser() + $logParams, AbuseFilterUser::getInstance() ); $message = array( @@ -1339,7 +1339,7 @@ implode( ', ', $groups ), '' ), - self::getFilterUser() + AbuseFilterUser::getInstance() ); } @@ -1642,38 +1642,6 @@ */ public static function filterMatchesKey( $filter = null ) { return wfMemcKey( 'abusefilter', 'stats', 'matches', $filter ); - } - - /** - * @return User - */ - public static function getFilterUser() { - $user = User::newFromName( wfMessage( 'abusefilter-blocker' )->inContentLanguage()->text() ); - $user->load(); - if ( $user->getId() && $user->mPassword == '' ) { - // Already set up. - return $user; - } - - // Not set up. Create it. - if ( !$user->getId() ) { - print 'Trying to create account -- user id is ' . $user->getId(); - $user->addToDatabase(); - $user->saveSettings(); - // Increment site_stats.ss_users - $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); - $ssu->doUpdate(); - } else { - // Take over the account - $user->setPassword( null ); - $user->setEmail( null ); - $user->saveSettings(); - } - - // Promote user so it doesn't look too crazy. - $user->addGroup( 'sysop' ); - - return $user; } /** diff --git a/AbuseFilter.hooks.php b/AbuseFilter.hooks.php index 42c362d..ab5cd27 100644 --- a/AbuseFilter.hooks.php +++ b/AbuseFilter.hooks.php @@ -500,35 +500,9 @@ $updater->addExtensionUpdate( array( 'addPgExtIndex', 'abuse_filter_log', 'abuse_filter_log_wiki', "(afl_wiki)" ) ); } - $updater->addExtensionUpdate( array( array( __CLASS__, 'createAbuseFilterUser' ) ) ); + $updater->addExtensionUpdate( array( array( 'AbuseFilterUser', 'createAbuseFilterUser' ) ) ); return true; - } - - /** - * Updater callback to create the AbuseFilter user after the user tables have been updated. - * @param $updater DatabaseUpdater - */ - public static function createAbuseFilterUser( $updater ) { - $user = User::newFromName( wfMessage( 'abusefilter-blocker' )->inContentLanguage()->text() ); - - if ( $user && !$updater->updateRowExists( 'create abusefilter-blocker-user' ) ) { - if ( !$user->getId() ) { - $user->addToDatabase(); - $user->saveSettings(); - # Increment site_stats.ss_users - $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); - $ssu->doUpdate(); - } else { - // Sorry dude, we need this account. - $user->setPassword( null ); - $user->setEmail( null ); - $user->saveSettings(); - } - $updater->insertUpdateRow( 'create abusefilter-blocker-user' ); - # Promote user so it doesn't look too crazy. - $user->addGroup( 'sysop' ); - } } /** diff --git a/AbuseFilter.php b/AbuseFilter.php index 1b0a55a..a8a2f8c 100644 --- a/AbuseFilter.php +++ b/AbuseFilter.php @@ -30,6 +30,7 @@ $wgAutoloadClasses['AbuseFilter'] = "$dir/AbuseFilter.class.php"; $wgAutoloadClasses['AbuseFilterParser'] = "$dir/AbuseFilter.parser.php"; $wgAutoloadClasses['AbuseFilterHooks'] = "$dir/AbuseFilter.hooks.php"; +$wgAutoloadClasses['AbuseFilterUser'] = "$dir/AbuseFilterUser.class.php"; $wgAutoloadClasses['SpecialAbuseLog'] = "$dir/special/SpecialAbuseLog.php"; $wgAutoloadClasses['SpecialAbuseFilter'] = "$dir/special/SpecialAbuseFilter.php"; $wgAutoloadClasses['AbuseLogHitFormatter'] = "$dir/AbuseLogHitFormatter.php"; diff --git a/AbuseFilterUser.class.php b/AbuseFilterUser.class.php new file mode 100644 index 0000000..9d6ee88 --- /dev/null +++ b/AbuseFilterUser.class.php @@ -0,0 +1,178 @@ +<?php + +/** + * Class representing artificial AbuseFilter user + */ + +class AbuseFilterUser extends User { + + + /** @name newFrom*() static factory methods */ + //@{ + + /** + * Static factory method for creation from username. + * + * This is slightly less efficient than newFromId(), so use newFromId() if + * you have both an ID and a name handy. + * + * @param string $name Username, validated by Title::newFromText() + * @param string|bool $validate Validate username. Takes the same parameters as + * User::getCanonicalName(), except that true is accepted as an alias + * for 'valid', for BC. + * + * @return User|bool User object, or false if the username is invalid + * (e.g. if it contains illegal characters or is an IP address). If the + * username is not present in the database, the result will be a user object + * with a name, zero user ID and default settings. + */ + public static function newFromName( $name, $validate = 'valid' ) { + if ( $validate === true ) { + $validate = 'valid'; + } + $name = self::getCanonicalName( $name, $validate ); + if ( $name === false ) { + return false; + } else { + // Create unloaded user object + $u = new AbuseFilterUser; + $u->mName = $name; + $u->mFrom = 'name'; + $u->setItemLoaded( 'name' ); + return $u; + } + } + + /** + * Static factory method for creation from a given user ID. + * + * @param int $id Valid user ID + * @return User The corresponding User object + */ + public static function newFromId( $id ) { + $u = new AbuseFilterUser; + $u->mId = $id; + $u->mFrom = 'id'; + $u->setItemLoaded( 'id' ); + return $u; + } + + /** + * Factory method to fetch whichever user has a given email confirmation code. + * This code is generated when an account is created or its e-mail address + * has changed. + * + * If the code is invalid or has expired, returns NULL. + * + * @param string $code Confirmation code + * @return User|null + */ + public static function newFromConfirmationCode( $code ) { + $dbr = wfGetDB( DB_SLAVE ); + $id = $dbr->selectField( 'user', 'user_id', array( + 'user_email_token' => md5( $code ), + 'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ), + ) ); + if ( $id !== false ) { + return AbuseFilterUser::newFromId( $id ); + } else { + return null; + } + } + + /** + * Create a new user object using data from session or cookies. If the + * login credentials are invalid, the result is an anonymous user. + * + * @param WebRequest $request Object to use; $wgRequest will be used if omitted. + * @return User object + */ + public static function newFromSession( WebRequest $request = null ) { + $user = new AbuseFilterUser; + $user->mFrom = 'session'; + $user->mRequest = $request; + return $user; + } + + /** + * Create a new user object from a user row. + * The row should have the following fields from the user table in it: + * - either user_name or user_id to load further data if needed (or both) + * - user_real_name + * - all other fields (email, password, etc.) + * It is useless to provide the remaining fields if either user_id, + * user_name and user_real_name are not provided because the whole row + * will be loaded once more from the database when accessing them. + * + * @param array $row A row from the user table + * @param array $data Further data to load into the object (see User::loadFromRow for valid keys) + * @return User + */ + public static function newFromRow( $row, $data = null ) { + $user = new AbuseFilterUser; + $user->loadFromRow( $row, $data ); + return $user; + } + + //@} + + /** + * AbuseFilterUser always operaters locally + * Do not use target user's IP address in rc_ip + * + * @since 1.22 + * @param WebRequest + * @return string + */ + public function getUserIP ($request = null) { + return ""; + } + + private function prepareUser() { + // Not set up. Create it. + if ( !$this->getId() ) { + print 'Trying to create account -- user id is ' . $this->getId(); + $this->addToDatabase(); + $this->saveSettings(); + // Increment site_stats.ss_thiss + $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); + $ssu->doUpdate(); + } else { + // Take over the account + $this->setPassword( null ); + $this->setEmail( null ); + $this->saveSettings(); + } + + // Promote this so it doesn't look too crazy. + $this->addGroup( 'sysop' ); + } + + /** + * @return User + */ + public static function getInstance() { + $user = AbuseFilterUser::newFromName( wfMessage( 'abusefilter-blocker' )->inContentLanguage()->text() ); + $user->load(); + if ( $user->getId() && $user->mPassword == '' ) { + // Already set up. + return $user; + } + $user->prepareUser(); + + return $user; + } + + /** + * Updater callback to create the AbuseFilter user after the user tables have been updated. + * @param $updater DatabaseUpdater + */ + public static function createAbuseFilterUser( $updater ) { + $user = AbuseFilterUser::newFromName( wfMessage( 'abusefilter-blocker' )->inContentLanguage()->text() ); + + if ( $user && !$updater->updateRowExists( 'create abusefilter-blocker-user' ) ) { + $user->prepareUser(); + $updater->insertUpdateRow( 'create abusefilter-blocker-user' ); + } + } +} -- To view, visit https://gerrit.wikimedia.org/r/92252 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0c1e34e95bfd41a8f7ace8b51937035bf574edf1 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/AbuseFilter Gerrit-Branch: master Gerrit-Owner: saper <[email protected]> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
