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

Reply via email to