|
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. |