Integrate or bridge with MediaWiki
by
14 Apr 2006
Do you want to use vBulletin's user database with your MediaWiki? You might like this. I have taken Kai Backman's MediaWiki Spoiler (click to open)
I'm sorry to be late to the thread, but I've actually been running an integrated vBulletin/MediaWiki system for quite some time. I just today got another request from someone wanting to have the code, and realized it might be easier to just post it ..
MediaWiki has a facility for creating Authentication plugins that let you do the integration pretty easily. They were non-documented when I started with the hack, but once you find the correct template everything was smooth sailing. There are a few comments about the code - People still need to log on to MediaWiki once, after that they are cookied. - MediaWiki has a smaller namespace for usernames than vBulletin, on a large board you might have clashes. I'm assuming it's not a security problem, but it might be an inconvenience. - You need to clean up the user properties pages of things like changing names and stuff (they aren't automatically dropped). - The Wiki will create only those users who actually log on - The $usergroupid clauses determine who can create an account, you need to change these clauses to suit your own board. Have fun! Add this snippet to you LocalSettings.php. Insert your vBulletin DB information: Code:
require_once("AuthPlugin_vBulletin.php"); $wgAuth = new AuthPlugin_vBulletin(<hostname>, <vb_username>, <vb_password>, <vb_dbName); Code:
<?php /** * Authentication plugin interface. Instantiate a subclass of AuthPlugin * and set $wgAuth to it to authenticate against some external tool. * * The default behavior is not to do anything, and use the local user * database for all authentication. A subclass can require that all * accounts authenticate externally, or use it only as a fallback; also * you can transparently create internal wiki accounts the first time * someone logs in who can be authenticated externally. * * This interface is new, and might change a bit before 1.4.0 final is * done... * * @package MediaWiki */ require_once("includes/AuthPlugin.php"); class AuthPlugin_vBulletin extends AuthPlugin { // Persistent DB connection var $vb_database; function AuthPlugin_vBulletin($host, $username, $password, $dbname) { $this->vb_database = mysql_pconnect($host, $username, $password); mysql_select_db($dbname, $this->vb_database); } /** * Check whether there exists a user account with the given name. * The name will be normalized to MediaWiki's requirements, so * you might need to munge it (for instance, for lowercase initial * letters). * * @param string $username * @return bool * @access public */ function userExists( $username ) { $username = addslashes($username); $vb_find_user_query = "SELECT usergroupid FROM user WHERE LOWER(username)=LOWER('" . $username . "')"; $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database); if(mysql_num_rows($vb_find_result) == 1) { $vb_user_info = mysql_fetch_array($vb_find_result); $usergroupid = $vb_user_info['usergroupid']; // Only registered and admins. Banned and unregistered don't belong here. if($usergroupid == "2" || $usergroupid == "5" || $usergroupid == "6" || $usergroupid == "7") return true; } else return false; } /** * Check if a username+password pair is a valid login. * The name will be normalized to MediaWiki's requirements, so * you might need to munge it (for instance, for lowercase initial * letters). * * @param string $username * @param string $password * @return bool * @access public */ function authenticate( $username, $password ) { $username = addslashes($username); $vb_find_user_query = "SELECT password, salt, usergroupid FROM user WHERE LOWER(username)=LOWER('" . $username . "')"; $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database); if(mysql_num_rows($vb_find_result) == 1) { $vb_user_info = mysql_fetch_array($vb_find_result); $usergroupid = $vb_user_info['usergroupid']; // Only registered and admins. Banned and unregistered don't belong here. if($usergroupid == "2" || $usergroupid == "5" || $usergroupid == "6" || $usergroupid == "7") if(md5(md5($password) . $vb_user_info['salt']) == $vb_user_info['password']) return true; } return false; } /** * Return true if the wiki should create a new local account automatically * when asked to login a user who doesn't exist locally but does in the * external auth database. * * If you don't automatically create accounts, you must still create * accounts in some way. It's not possible to authenticate without * a local account. * * This is just a question, and shouldn't perform any actions. * * @return bool * @access public */ function autoCreate() { return true; } /** * Return true to prevent logins that don't authenticate here from being * checked against the local database's password fields. * * This is just a question, and shouldn't perform any actions. * * @return bool * @access public */ function strict() { return true; } /** * When creating a user account, optionally fill in preferences and such. * For instance, you might pull the email address or real name from the * external user database. * * The User object is passed by reference so it can be modified; don't * forget the & on your function declaration. * * @param User $user * @access public */ function initUser( &$user ) { $vb_find_user_query = "SELECT password, salt FROM user WHERE LOWER(username)=LOWER('" . addslashes($user->mName) . "')"; $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database); if(mysql_num_rows($vb_find_result) == 1) { $vb_user_info = mysql_fetch_array($vb_find_result); $user->mEmail = $vb_user_info['email']; } else { // ERROR? } } } ?> Close
Working on: vBulletin 3.5.4 and MediaWiki 1.6.3 Features:
Possible Future Features: These are possible features for inclusion in the how-to in the future. They have not been investigated for their feasibility, but are here to let you know they have been requested and I am thinking about them. If you know how to add the features, please let us know.
How to:
Please let me know if this was helpful, or if you can expand on this code. |