The Arcive of Official vBulletin Modifications Site.It is not a VB3 engine, just a parsed copy! |
|
Integrate or bridge with MediaWiki
Do you want to use vBulletin's user database with your MediaWiki? You might like this. I have taken Kai Backman's MediaWiki authentication plugin idea, fixed coding errors, and expanded greatly on it. 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. |
#62
|
|||
|
|||
I can confirm that I got this working on vb3.6.7 with mediawiki 1.11svn
http://www.mediawiki.org/wiki/Extens...rs_Integration |
#63
|
|||
|
|||
Anyone got this working for vBulletin 3.7?
or any other integration between mediawiki and vB 3.7? |
#64
|
|||
|
|||
Update: This seems to work well with vBulletin 3.7 and MW 1.12.
Has anyone found a way to have it automatically log the user in? |
#65
|
|||
|
|||
It seems that the later versions of MediaWiki no longer require no spaces in the usernames? So, the restriction in this extension is no longer required (apparently). Hence, I replaced this line:
$this->searchpattern = "/[^a-zA-Z0-9]+/"; with this line: $this->searchpattern = "/[\#\<\>\[\]\|\{\}/"; So far so good. I will be now working on some additional features, like the auto-logon from vB. -Wayne |
#66
|
||||
|
||||
Thanks, pelicanparts. I have the 'Pro' version ElfMage was selling. As far as I can tell, ElfMage has 'left the premises' so to speak. Maybe I'll be able to apply some of your information to the Pro version so your information is appreciated very much!
|
#67
|
|||
|
|||
I'm working on it tonight - I've got it able to read the vB cookies, and it should work for autologon - it's just a matter of getting the details just right. I'll post my code here when I'm done.
-Wayne |
#68
|
|||
|
|||
Hi Wayne!
Were you able to make any headway on what you're working on? I would sincerely love to have it automatically log my members in again. |
#69
|
|||
|
|||
Yes, I was, and it is currently working. I will post it soon...
-Wayne --------------- Added [DATE]1212124788[/DATE] at [TIME]1212124788[/TIME] --------------- Add to end of LocalSettings.php. Change 123456789 to your vB license number. Change pelicanparts.com to your domain. Make sure that in cookie settings in vBulletin's admin control panel, you set the cookie domain to be your domain, not blank. In my case I set it to be pelicanparts.com Code:
# vBulletin integration script require_once("D:/Wiki/extensions/AuthPlugin_vBulletin/AuthPlugin_vBulletin.php"); $wgCookieDomain = "pelicanparts.com"; define('COOKIE_SALT', '123456789'); ### VB LICENSE NUMBER, FROM LINE 37 OF FUNCTIONS $wgAuth = new Auth_remoteuser(); $wgShowExceptionDetails = true; Here's the code, still rough and with test messages printing. Replace VBULLETINDATABASE with the name of your vb database Replace MYSQLLOGIN with your mysql logon name Replace MYSQLPASSWORD with your mysql password name That does it, this does work on my site right now, I think the only thing I'm missing is sending people to vb for account creation... -Wayne Code:
<?php ini_set('display_errors', '1'); error_reporting(E_ALL); /** * 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... * * AuthPlugin extension by Daniel Gravenor c/o HolisticEarth.org * AuthPlugin original by Kai Backman * * @package MediaWiki */ require_once("includes/AuthPlugin.php"); $wgHooks['UserLogout'][] = 'fnMyVBLOGOUTHook'; class Auth_remoteuser extends AuthPlugin { //WAYNE'S STUFF FROM http://www.raskas.be/blog/2006/11/17/mediawiki-remote-user-authentication/ function Auth_remoteuser() { global $wgExtensionFunctions; if (!isset($wgExtensionFunctions)) { $wgExtensionFunctions = array(); } else if (!is_array($wgExtensionFunctions)) { $wgExtensionFunctions = array( $wgExtensionFunctions ); } //print "TEST: REMOTE HOOK2\n"; array_push($wgExtensionFunctions, 'Auth_remote_user_hook'); //print "DONE2\n"; return; } // Create a persistent DB connection var $vb_database; function AuthPlugin_vBulletin($host, $username, $password, $dbname, $prefix) { global $wgCookiePrefix; global $exp; global $wgCookiePath; global $wgCookieDomain; global $wgCookieSecure; global $wgUser; global $wgRequest; global $_REQUEST; $this->vb_database = mysql_pconnect($host, $username, $password); mysql_select_db($dbname, $this->vb_database); $this->vb_prefix = $prefix; // set the usergroups for those who can edit the wiki $this->allowed_usergroups = Array(2, 5, 6, 7); // set the usergroups for the administrators $this->admin_usergroups = Array(6, 9); $this->user_rights = Array("sysop"); // search pattern to only accept alphanumeric or underscore characters in usernames // if they have illegal characters, their name cannot exist, period $this->searchpattern = "/[\#\<\>\[\]\|\{\}/"; //print_r($_COOKIE); //print "Content-type: text/html\n\n"; //print "bbsessionhash:" . $_COOKIE["bbsessionhash"] . "<br>\n"; //print "bblastvisit:" . $_COOKIE["bblastvisit"] . "<br>\n"; //print "bblastactivity:" . $_COOKIE["bblastactivity"] . "<br>\n"; //print "bbuserid:" . $_COOKIE["bbuserid"] . "<br>\n"; //print "bbpassword:" . $_COOKIE["bbpassword"] . "<br>\n"; } /** * 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 ) { print "Content-type: text/html TEST1\n\n"; // if no illegal characters are found in their username, then check to see if they exist if (!preg_match($this->searchpattern, $username)) { $username = addslashes($username); $vb_find_user_query = "SELECT usergroupid FROM " . $this->vb_prefix . "user WHERE LOWER(username)=LOWER('" . $username . "')"; $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database); // make sure that there is only one person with the username if (mysql_num_rows($vb_find_result) == 1) { $vb_userinfo = mysql_fetch_assoc($vb_find_result); mysql_free_result($vb_find_result); // Only registered and admins. Banned and unregistered don't belong here. if (in_array($vb_userinfo['usergroupid'], $this->allowed_usergroups)) { return TRUE; } } } // if no one is registered with that username, or there are more than 1 entries // or they have illegal characters return FALSE (they do not exist) 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 ) { $searchpattern = "/[\#\<\>\[\]\|\{\}]/"; $dbh = mysql_pconnect("localhost", "MYSQL-LOGON", "MYSQL-PASSWORD"); mysql_select_db("VBULLETINDBNAME", $dbh); print "Content-type: text/html TEST2\n\n"; // if their name does not contain any illegal characters, let them try to login if (!preg_match($searchpattern, $username)) { print "TEST2A\n"; $username = addslashes($username); $vb_find_user_query = "SELECT password, salt, usergroupid FROM VBULLETINDATABASE.user WHERE LOWER(username)=LOWER('" . $username . "')"; $vb_find_result = mysql_query($vb_find_user_query, $dbh); if (mysql_num_rows($vb_find_result) == 1) { print "FOUND!\n"; $vb_userinfo = mysql_fetch_assoc($vb_find_result); mysql_free_result($vb_find_result); // Only registered and admins. Banned and unregistered don't belong here. $valid_usergroup_array = array(2, 5, 6, 7); print "TEST2B\n"; if (in_array($vb_userinfo['usergroupid'], $valid_usergroup_array)) { if(md5(md5($password) . $vb_userinfo['salt']) == $vb_userinfo['password']) { print "AUTH TRUE: NOW WE NEED TO UPDATE VBULLETIN WITH THE LOGIN INFORMATION? OR NOT?\n"; return true; } } } } return false; } /** * When a user logs in, 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 updateUser( &$user ) { print "Content-type: text/html TEST3\n\n"; # Override this and do something $dbh = mysql_pconnect("localhost", "MYSQL-LOGON", "MYSQL-PASSWORD"); mysql_select_db("VBULLETINDATABASE", $dbh); $vb_find_user_query = "SELECT usergroupid, membergroupids FROM VBULLETINDATABASE.user WHERE LOWER(username)=LOWER('" . addslashes($user->mName) . "')"; $vb_find_result = mysql_query($vb_find_user_query, $dbh) or print("Could not find username"); if(mysql_num_rows($vb_find_result) == 1) { $vb_userinfo = mysql_fetch_assoc($vb_find_result); mysql_free_result($vb_find_result); // go through the users member groups to see if one of them is administrative $user_membergroups = explode(",", $vb_userinfo['membergroupids']); $admin_secondary = FALSE; for ($x = 0; $x < count($user_membergroups); $x++) { if (in_array($user_membergroups[$x], $this->admin_usergroups)) $admin_secondary = TRUE; } if (in_array($vb_userinfo['usergroupid'], $this->admin_usergroups) || $admin_secondary === TRUE) { // if a user is not a sysop, make them a sysop if (!in_array("sysop", $user->getEffectiveGroups())) { $user->addGroup('sysop'); return TRUE; } } // if the user is not an administrator, but they were, and they are still a sysop, remove their sysop status if (!in_array($vb_userinfo['usergroupid'], $this->admin_usergroups) && $admin_secondary === FALSE) { if (in_array("sysop", $user->getEffectiveGroups())) { $user->removeGroup('sysop'); 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 ) { print "Content-type: text/html TEST4\n\n"; $vb_find_user_query = "SELECT email, usergroupid FROM " . $this->vb_prefix . "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_userinfo = mysql_fetch_assoc($vb_find_result); mysql_free_result($vb_find_result); $user->mEmail = $vb_userinfo['email']; $user->mEmailAuthenticated = wfTimestampNow(); } } } // END CLASS function Auth_remote_user_hook() { global $wgUser; global $wgRequest; global $_REQUEST; global $wgCookiePrefix; global $exp; global $wgCookiePath; global $wgCookieDomain; global $wgCookieSecure; //print_r($_COOKIE); //print "REMOTE HOOK77"; // For a few special pages, don't do anything. $title = $wgRequest->getVal('title') ; if ($title == 'Special:Userlogout' || $title == 'Special:Userlogin') { //print "TEST101\n"; return; } // Do nothing if session is valid $wgUser = User::newFromSession(); if ($wgUser->isLoggedIn()) { //print "TEST102\n"; return; // User is already logged in and not anonymous. } //print "TEST: WGUSER\n" . $_COOKIE["bbsessionhash"]; $test = new Auth_remoteuser(); $wgAuth = $test->AuthPlugin_vBulletin("localhost", "MYSQL-LOGON", "MYSQL-PASSWORD", "VBULLETINDATABASE", "VBULLETINDATABASE."); if ($_COOKIE["bbsessionhash"] != "") { //print "TEST: IS INT, CONNECT TO DB\n"; $dbh = mysql_pconnect("localhost", "MYSQL-LOGON", "MYSQL-PASSWORD"); mysql_select_db("VBULLETINDATABASE", $dbh); $vb_find_user_query = "SELECT password, salt, usergroupid, username FROM VBULLETINDATABASE.user WHERE userid IN (select userid from session where sessionhash = '" . $_COOKIE["bbsessionhash"] . "');"; $vb_find_result = mysql_query($vb_find_user_query, $dbh); //print "SQL: $vb_find_user_query\n"; if (mysql_num_rows($vb_find_result) == 1) { //print "FOUND"; $vb_userinfo = mysql_fetch_assoc($vb_find_result); mysql_free_result($vb_find_result); // Only registered and admins. Banned and unregistered don't belong here. //print "USERNAME: " . $vb_userinfo['username'] ."\n"; setcookie( $wgCookiePrefix.'wikidbUserName', $vb_userinfo['username'], $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); // NEED TO FIX THIS TO BE CONSISTENT $valid_usergroup_array = array(2, 5, 6, 7); if (in_array($vb_userinfo['usergroupid'], $valid_usergroup_array)) { //print "TEST33\n"; //if(md5($vb_userinfo['password'] . COOKIE_SALT) == $_COOKIE["bbpassword"]) // { //print "LOGGED INTO vB, NOW LOG INTO WIKI";\ // THIS ROUTINE IS CALLED, AND THEN THE PAGE IS REFRESHED $username = $vb_userinfo['username']; $u = User::newFromName( $username ); if (is_null($u)) { # Invalid username or some other error -- force login, just return //print "INVALID"; return; } $wgUser = $u; if ($u->getId() != 0) { $_REQUEST['wpName'] = $username; # also return, but user is know. set Cookies, et al $wgUser->setCookies(); $wgUser->saveSettings(); //print "TEST103\n"; return; #include 'includes/SpecialUserlogin.php'; #$form = new LoginForm( $wgRequest ); #$form->initUser( $wgUser ); #$wgUser->saveSettings(); #return true; } //print "TEST77:" . md5(md5($_COOKIE["bbpassword"])) ; //print "<br>PWD: " . md5($vb_userinfo['password'] . COOKIE_SALT) ."<br> TEST44:" . $_COOKIE["bbpassword"] . "\n"; // } } } } // Ok, now we need to create a user. //print "Location: http://forums.pelicanparts.com/newreply.php?do=newreply&noquote=1&p=3801901\n\n"; return; // $loginForm = new LoginForm($params); // $result = $loginForm->authenticateUserData(); // if ($result != LoginForm::SUCCESS) { // error_log('Unexpected REMOTE_USER authentication failure.'); // return; // } } function fnMyVBLOGOUTHook(&$user) { global $wgCookiePrefix; global $exp; global $wgCookiePath; global $wgCookieDomain; global $wgCookieSecure; //print "LOGOUT HOOK"; setcookie('bbsessionhash', '', $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); setcookie('bblastvisit', '', $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); setcookie('bblastactivity', '', $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); setcookie('bbuserid', '', $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); setcookie('bbpassword', '', $exp, $wgCookiePath, $wgCookieDomain, $wgCookieSecure ); return true; } #class AuthPlugin_vBulletin extends AuthPlugin { ?> |
#70
|
|||
|
|||
Thank you, Wayne!
I get the following error: Notice: Undefined index: bbsessionhash in /(path)/wiki/AuthPlugin_vBulletin.php on line 290 Also, would it be possible to make variables for the database name, sql username, and password, instead of manually putting them in each connection string? I'm not asking you to do it, I'm curious if it's possible - if it is, then I can work on that |
#71
|
|||
|
|||
Turn off error reporting by deleting or commenting out lines 2 and 3. That's just a warning message, nothing serious there.
-Wayne |
Thread Tools | |
|
|
X vBulletin 3.8.12 by vBS Debug Information | |
---|---|
|
|
More Information | |
Template Usage:
Phrase Groups Available:
|
Included Files:
Hooks Called:
|