Go Back   vb.org Archive > vBulletin Article Depository > Read An Article > vBulletin 3 Articles

Reply
 
Thread Tools
Integrate or bridge with MediaWiki
HolisticEarth
Join Date: Apr 2006
Posts: 14

 

Winnipeg, MB, CAN
Show Printable Version Email this Page Subscription
HolisticEarth HolisticEarth is offline 04-13-2006, 10:00 PM

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:
  • Allows you to run MediaWiki with your vBulletin user database
  • Disallows users with invalid username characters
  • Disallows users who are not part of specified usergroups
  • Sets users to sysop status in MediaWiki if they are part of a specified admin usergroup
  • Removes users from sysop status in MediaWiki if they no longer are a part of a specified admin usergroup
  • For same-database setups, allows easy installation

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.
  • No-login required (automatic) integration
  • Option: User profile field points to, or has option to link to vBulletin profile
  • To register, link the user to vBulletin's registration script on the login pages

How to:
  1. Install Reynaldovb's Restrict usernames to alphanumeric and underscore plugin, and disallow both spaces and underscores
  2. Optional: On boards that already have existing users, somehow have their usernames changed so that they are only alphanumeric. This is required if you wish your users to be able to login and edit the wiki using their vBulletin username. The reason you have to do this is because MediaWiki has some Restrictions on what can go in a page title, and as usernames have to be passed as page titles, they also have to adhere to the same restrictions. If you do not change the usernames, I have included a check to not allow users to login if their username contains non-alphanumeric characters.
  3. Open your wiki/LocalSettings.php file
  4. Insert the following code at the end of the file, before the ?>:
    PHP Code:
    # vBulletin integration script
    require_once("AuthPlugin_vBulletin.php");
    // if vBulletin and MediaWiki are not installed on the same database
    // change these values to reflect your vBulletin database information
    $wgAuth = new AuthPlugin_vBulletin($wgDBserver$wgDBuser$wgDBpassword$wgDBname"vb_"); 
    If you are running vBulletin and MediaWiki in the same database, then it already uses the connection information.
    If you are not running vBulletin and MediaWiki in the same database, please change the strings to reflect your vBulletin database information.
    In either case, the last value is whatever your vBulletin table prefix is.
  5. Insert this code below the require_once( "includes/DefaultSettings.php" ); at the top of the LocalSettings.php file:
    PHP Code:
    # Disabling new user registrations
    $wgWhitelistAccount = array ( "sysop" => 1"developer" => );
    # Disabling anonymous edits
    $wgGroupPermissions['*']['createaccount'] = false;
    $wgGroupPermissions['*']['read'] = false;
    $wgGroupPermissions['*']['edit'] = false;
    $wgWhitelistRead = array ("Special:Userlogin"); 
    This prevents people from registering new accounts on the wiki, requiring people to register on vBulletin. It also prevents anonymous edits. This code may only work on MediaWiki 1.5.x and above, but I am unsure.
  6. Download the AuthPlugin_vBulletin.php file and put it in your main wiki directory, ie: /wiki/AuthPlugin_vBulletin.php

Please let me know if this was helpful, or if you can expand on this code.
Attached Files
File Type: php AuthPlugin_vBulletin.php (7.4 KB, 490 views)
Reply With Quote
  #62  
Old 04-17-2008, 07:41 PM
blue_asterisk blue_asterisk is offline
 
Join Date: Mar 2007
Posts: 3
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I can confirm that I got this working on vb3.6.7 with mediawiki 1.11svn
http://www.mediawiki.org/wiki/Extens...rs_Integration
Reply With Quote
  #63  
Old 05-15-2008, 08:06 PM
Mancia Mancia is offline
 
Join Date: Apr 2007
Location: Argentina, Buenos Aires
Posts: 5
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Anyone got this working for vBulletin 3.7?

or any other integration between mediawiki and vB 3.7?
Reply With Quote
  #64  
Old 05-16-2008, 06:01 PM
Elenna Elenna is offline
 
Join Date: Jan 2006
Location: St. Charles, MO
Posts: 422
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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?
Reply With Quote
  #65  
Old 05-20-2008, 08:29 AM
pelicanparts pelicanparts is offline
 
Join Date: Nov 2001
Posts: 25
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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
Reply With Quote
  #66  
Old 05-21-2008, 05:09 AM
Smitty's Avatar
Smitty Smitty is offline
 
Join Date: Sep 2002
Location: Southern Ohio
Posts: 385
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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!
Reply With Quote
  #67  
Old 05-21-2008, 05:40 AM
pelicanparts pelicanparts is offline
 
Join Date: Nov 2001
Posts: 25
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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
Reply With Quote
  #68  
Old 05-29-2008, 08:19 PM
Elenna Elenna is offline
 
Join Date: Jan 2006
Location: St. Charles, MO
Posts: 422
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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.
Reply With Quote
  #69  
Old 05-30-2008, 04:15 AM
pelicanparts pelicanparts is offline
 
Join Date: Nov 2001
Posts: 25
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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;
--------------- Added [DATE]1212125151[/DATE] at [TIME]1212125151[/TIME] ---------------

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 {


	
?>
Reply With Quote
  #70  
Old 05-30-2008, 01:25 PM
Elenna Elenna is offline
 
Join Date: Jan 2006
Location: St. Charles, MO
Posts: 422
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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
Reply With Quote
  #71  
Old 05-30-2008, 09:44 PM
pelicanparts pelicanparts is offline
 
Join Date: Nov 2001
Posts: 25
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Turn off error reporting by deleting or commenting out lines 2 and 3. That's just a warning message, nothing serious there.

-Wayne
Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 08:31 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.08117 seconds
  • Memory Usage 2,343KB
  • Queries Executed 26 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (2)bbcode_code
  • (2)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)modsystem_article
  • (1)navbar
  • (4)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (4)pagenav_pagelink
  • (11)post_thanks_box
  • (11)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (11)post_thanks_postbit_info
  • (10)postbit
  • (1)postbit_attachment
  • (11)postbit_onlinestatus
  • (11)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_attachment
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete