From 222b01f5169f1c7e69762e0e8904c24f78f71882 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 28 Jul 2010 11:52:48 +0200 Subject: update to MediaWiki 1.16.0 --- includes/extauth/MediaWiki.php | 141 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 includes/extauth/MediaWiki.php (limited to 'includes/extauth/MediaWiki.php') diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php new file mode 100644 index 00000000..7d6a3c71 --- /dev/null +++ b/includes/extauth/MediaWiki.php @@ -0,0 +1,141 @@ + 'mysql', + * 'DBserver' => 'localhost', + * 'DBname' => 'wikidb', + * 'DBuser' => 'quasit', + * 'DBpassword' => 'a5Cr:yf9u-6[{`g', + * 'DBprefix' => '', + * ); + * + * All fields must be present. These mean the same things as $wgDBtype, + * $wgDBserver, etc. This implementation is quite crude; it could easily + * support multiple database servers, for instance, and memcached, and it + * probably has bugs. Kind of hard to reuse code when things might rely on who + * knows what configuration globals. + * + * If either wiki uses the UserComparePasswords hook, password authentication + * might fail unexpectedly unless they both do the exact same validation. + * There may be other corner cases like this where this will fail, but it + * should be unlikely. + * + * @ingroup ExternalUser + */ +class ExternalUser_MediaWiki extends ExternalUser { + private $mRow, $mDb; + + protected function initFromName( $name ) { + # We might not need the 'usable' bit, but let's be safe. Theoretically + # this might return wrong results for old versions, but it's probably + # good enough. + $name = User::getCanonicalName( $name, 'usable' ); + + if ( !is_string( $name ) ) { + return false; + } + + return $this->initFromCond( array( 'user_name' => $name ) ); + } + + protected function initFromId( $id ) { + return $this->initFromCond( array( 'user_id' => $id ) ); + } + + private function initFromCond( $cond ) { + global $wgExternalAuthConf; + + $class = 'Database' . $wgExternalAuthConf['DBtype']; + $this->mDb = new $class( + $wgExternalAuthConf['DBserver'], + $wgExternalAuthConf['DBuser'], + $wgExternalAuthConf['DBpassword'], + $wgExternalAuthConf['DBname'], + false, + 0, + $wgExternalAuthConf['DBprefix'] + ); + + $row = $this->mDb->selectRow( + 'user', + array( + 'user_name', 'user_id', 'user_password', 'user_email', + 'user_email_authenticated' + ), + $cond, + __METHOD__ + ); + if ( !$row ) { + return false; + } + $this->mRow = $row; + + return true; + } + + # TODO: Implement initFromCookie(). + + public function getId() { + return $this->mRow->user_id; + } + + public function getName() { + return $this->mRow->user_name; + } + + public function authenticate( $password ) { + # This might be wrong if anyone actually uses the UserComparePasswords hook + # (on either end), so don't use this if you those are incompatible. + return User::comparePasswords( $this->mRow->user_password, $password, + $this->mRow->user_id ); + } + + public function getPref( $pref ) { + # FIXME: Return other prefs too. Lots of global-riddled code that does + # this normally. + if ( $pref === 'emailaddress' + && $this->row->user_email_authenticated !== null ) { + return $this->mRow->user_email; + } + return null; + } + + public function getGroups() { + # FIXME: Untested. + $groups = array(); + $res = $this->mDb->select( + 'user_groups', + 'ug_group', + array( 'ug_user' => $this->mRow->user_id ), + __METHOD__ + ); + foreach ( $res as $row ) { + $groups[] = $row->ug_group; + } + return $groups; + } + + # TODO: Implement setPref(). +} -- cgit v1.2.2