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/vB.php | 140 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 includes/extauth/vB.php (limited to 'includes/extauth/vB.php') diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php new file mode 100644 index 00000000..23523665 --- /dev/null +++ b/includes/extauth/vB.php @@ -0,0 +1,140 @@ +, versions 3.5 and up. It calls no functions or + * code, only reads from the database. Example lines to put in + * LocalSettings.php: + * + * $wgExternalAuthType = 'ExternalUser_vB'; + * $wgExternalAuthConf = array( + * 'server' => 'localhost', + * 'username' => 'forum', + * 'password' => 'udE,jSqDJ<""p=fI.K9', + * 'dbname' => 'forum', + * 'tableprefix' => '', + * 'cookieprefix' => 'bb' + * ); + * + * @ingroup ExternalUser + */ +class ExternalUser_vB extends ExternalUser { + private $mDb, $mRow; + + protected function initFromName( $name ) { + return $this->initFromCond( array( 'username' => $name ) ); + } + + protected function initFromId( $id ) { + return $this->initFromCond( array( 'userid' => $id ) ); + } + + protected function initFromCookie() { + # Try using the session table. It will only have a row if the user has + # an active session, so it might not always work, but it's a lot easier + # than trying to convince PHP to give us vB's $_SESSION. + global $wgExternalAuthConf; + if ( !isset( $wgExternalAuthConf['cookieprefix'] ) ) { + $prefix = 'bb'; + } else { + $prefix = $wgExternalAuthConf['cookieprefix']; + } + if ( !isset( $_COOKIE["{$prefix}sessionhash"] ) ) { + return false; + } + + $db = $this->getDb(); + + $row = $db->selectRow( + array( 'session', 'user' ), + $this->getFields(), + array( + 'session.userid = user.userid', + 'sessionhash' => $_COOKIE["{$prefix}sessionhash"] + ), + __METHOD__ + ); + if ( !$row ) { + return false; + } + $this->mRow = $row; + + return true; + } + + private function initFromCond( $cond ) { + $db = $this->getDb(); + + $row = $db->selectRow( + 'user', + $this->getFields(), + $cond, + __METHOD__ + ); + if ( !$row ) { + return false; + } + $this->mRow = $row; + + return true; + } + + private function getDb() { + global $wgExternalAuthConf; + return new Database( + $wgExternalAuthConf['server'], + $wgExternalAuthConf['username'], + $wgExternalAuthConf['password'], + $wgExternalAuthConf['dbname'], + false, 0, + $wgExternalAuthConf['tableprefix'] + ); + } + + private function getFields() { + return array( 'user.userid', 'username', 'password', 'salt', 'email', + 'usergroupid', 'membergroupids' ); + } + + public function getId() { return $this->mRow->userid; } + public function getName() { return $this->mRow->username; } + + public function authenticate( $password ) { + # vBulletin seemingly strips whitespace from passwords + $password = trim( $password ); + return $this->mRow->password == md5( md5( $password ) + . $this->mRow->salt ); + } + + public function getPref( $pref ) { + if ( $pref == 'emailaddress' && $this->mRow->email ) { + # TODO: only return if validated? + return $this->mRow->email; + } + return null; + } + + public function getGroups() { + $groups = array( $this->mRow->usergroupid ); + $groups = array_merge( $groups, explode( ',', $this->mRow->membergroupids ) ); + $groups = array_unique( $groups ); + return $groups; + } +} -- cgit v1.2.3-54-g00ecf