To get this to work with the most recent stable version of DokuWiki “Rincewind” and PHPBB only do the following steps marked with =Rincewind=
To get this to work with the RC version of DokuWiki “Angua RC1” and PHPBB only do the following steps marked with =Angua RC1=
To install this mod, you can:
inc/auth/phpbb3.class.phpinc/init.phpinc/utf8.phpinc/cache.phpfeed.php
=Rincewind= =Angua RC1=
Create a file in the inc/auth/ directory with the filename phpbb3.class.php and the following content:
<?php /** * phpBB3 authentication backend * * Uses external Trust mechanism to check against phpBB's * user cookie. phpBB's PHPBB_ROOT_PATH must be defined correctly. * * @author Markus Henn <brezelman@yahoo.de> */ define('IN_PHPBB', true); global $phpbb_root_path; global $db; global $cache; global $phpEx; global $user; global $config; global $conf; global $dbhost; global $dbport; global $dbname; global $dbuser; global $dbpasswd; global $table_prefix; global $phpbb_auth; $phpEx = substr(strrchr(__FILE__, '.'), 1); if(strpos($_SERVER['PHP_SELF'], "/lib/plugins/") !== false) { $phpbb_root_path = '../../../'.$phpbb_root_path; } if(strpos($_SERVER['PHP_SELF'], "/lib/exe/") !== false) { $phpbb_root_path = '../../'.$phpbb_root_path; } require_once(DOKU_INC.'inc/auth/mysql.class.php'); require_once($phpbb_root_path.'common.'.$phpEx); //config is loaded in common file, but $dbpasswd is unset there, too, so we have to reload it require($phpbb_root_path.'config.'.$phpEx); $user->session_begin(); //$auth will be used by DokuWiki, so copy phpBB's $auth to another variable $phpbb_auth = $auth; $phpbb_auth->acl($user->data); class auth_phpbb3 extends auth_mysql { function auth_phpbb3() { $this->cando['external'] = true; $this->cando['logoff'] = true; global $conf; // get global vars from phpBB config global $dbhost; global $dbport; global $dbname; global $dbuser; global $dbpasswd; global $table_prefix; // set group config vars $conf['defaultgroup'] = 'REGISTERED'; $conf['superuser'] = '@ADMINISTRATORS'; $conf['manager'] = '@GLOBAL_MODERATORS'; // now set up the mysql config strings $conf['auth']['mysql']['server'] = $dbhost.':'.$dbport; $conf['auth']['mysql']['user'] = $dbuser; $conf['auth']['mysql']['password'] = $dbpasswd; $conf['auth']['mysql']['database'] = $dbname; //unset $db* variables, so noone can hack them unset($dbpasswd); unset($dbuser); unset($dbhost); unset($dbport); unset($dbname); $conf['auth']['mysql']['TablesToLock']= array("{$table_prefix}users", "{$table_prefix}users AS u", "{$table_prefix}groups", "{$table_prefix}groups AS g", "{$table_prefix}user_group", "{$table_prefix}user_group AS ug"); $conf['auth']['mysql']['checkPass'] = "SELECT user_password AS pass FROM {$table_prefix}users WHERE username='%{user}'"; $conf['auth']['mysql']['getUserInfo'] = "SELECT user_password AS pass, username AS name, user_email AS mail FROM {$table_prefix}users WHERE username='%{user}'"; $conf['auth']['mysql']['getGroups'] = "SELECT group_name as `group` FROM {$table_prefix}groups g, {$table_prefix}users u, {$table_prefix}user_group ug WHERE u.user_id = ug.user_id AND g.group_id = ug.group_id AND u.username='%{user}'"; $conf['auth']['mysql']['getUsers'] = "SELECT DISTINCT username AS user FROM {$table_prefix}users AS u LEFT JOIN {$table_prefix}user_group AS ug ON u.user_id=ug.user_id LEFT JOIN {$table_prefix}groups AS g ON ug.group_id=g.group_id"; $conf['auth']['mysql']['FilterLogin'] = "username LIKE '%{user}'"; $conf['auth']['mysql']['FilterName'] = "username LIKE '%{name}'"; $conf['auth']['mysql']['FilterEmail'] = "user_email LIKE '%{email}'"; $conf['auth']['mysql']['FilterGroup'] = "group_name LIKE '%{group}'"; $conf['auth']['mysql']['SortOrder'] = "ORDER BY username"; $conf['auth']['mysql']['getUserID'] = "SELECT user_id AS id FROM {$table_prefix}users WHERE username='%{user}'"; $conf['auth']['mysql']['getGroupID'] = "SELECT group_id AS id FROM {$table_prefix}groups WHERE group_name='%{group}'"; /* $conf['auth']['mysql']['addUser'] = "INSERT INTO {$table_prefix}users (username, user_password, user_email) VALUES ('%{user}', '%{pass}', '%{email}')"; $conf['auth']['mysql']['addGroup'] = "INSERT INTO {$table_prefix}groups (group_name) VALUES ('%{group}')"; $conf['auth']['mysql']['addUserGroup']= "INSERT INTO {$table_prefix}user_group (user_id, group_id) VALUES ('%{uid}', '%{gid}')"; $conf['auth']['mysql']['updateUser'] = "UPDATE {$table_prefix}users SET"; $conf['auth']['mysql']['UpdateLogin'] = "username='%{user}'"; $conf['auth']['mysql']['UpdatePass'] = "user_password='%{pass}'"; $conf['auth']['mysql']['UpdateEmail'] = "user_email='%{email}'"; //$conf['auth']['mysql']['UpdateName'] = $conf['auth']['mysql']['UpdateLogin']; $conf['auth']['mysql']['UpdateTarget']= "WHERE user_id=%{uid}"; $conf['auth']['mysql']['delGroup'] = "DELETE FROM {$table_prefix}groups WHERE group_id='%{gid}'"; $conf['auth']['mysql']['delUser'] = "DELETE FROM {$table_prefix}users WHERE user_id='%{uid}'"; $conf['auth']['mysql']['delUserRefs'] = "DELETE FROM {$table_prefix}user_group WHERE user_id='%{uid}'"; $conf['auth']['mysql']['delUserGroup']= "DELETE FROM {$table_prefix}user_group WHERE user_id='%{uid}' AND group_id='%{gid}'"; */ // call mysql constructor $this->auth_mysql(); } function trustExternal($username, $password, $sticky = false) { global $USERINFO; global $conf; global $user; global $phpbb_auth; $sticky ? $sticky = true : $sticky = false; // sanity check // someone used the login form if(!empty($username)) { // run phpBB's login function define('IN_LOGIN', true); $login = $phpbb_auth->login($username, $password, $sticky); if($login['status'] != LOGIN_SUCCESS) { return false; } } if(!$user->data['is_registered']) { return false; } $USERINFO['name'] = $user->data['username']; $USERINFO['mail'] = $user->data['user_email']; if($this->_openDB()) { $USERINFO['grps'] = $this->_getGroups($USERINFO['name']); } $_SERVER['REMOTE_USER'] = $user->data['username']; $_SESSION[DOKU_COOKIE]['auth']['user'] = $user->data['username']; $_SESSION[DOKU_COOKIE]['auth']['pass'] = $user->data['user_password']; $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO; return true; } function logoff() { global $user; $user->session_kill(); } } ?>
=Rincewind= =Angua RC1=
In the file inc/init.php search for the following line:
$_REQUEST = array_merge($_GET,$_POST);
Comment it out by adding // in front of the line like this:
//$_REQUEST = array_merge($_GET,$_POST);
We have to do this because phpBB uses $_REQUEST for its cookies.
=Rincewind= =Angua RC1=
There are some functions in the file inc/utf8.php already defined by phpBB, these are:
So we only let DokuWiki define these functions if we're not using phpBB by adding an check around these function:
if(!defined('IN_PHPBB')) { ... }
replace:
function utf8_strlen($string){ return strlen(utf8_decode($string)); }
with:
if(!defined('IN_PHPBB')){ function utf8_strlen($string){ return strlen(utf8_decode($string)); } }
=Rincewind= =Angua RC1=
The last problem we have is that DokuWiki and phpBB both have a cache class. We can just rename this class in DokuWiki. To do so we open the file inc/cache.php and search for:
class cache {
replace this line with:
class wiki_cache {
Search for:
function cache($key,$ext) {
and replace it with:
function wiki_cache($key,$ext) {
Search for:
class cache_parser extends cache {
and replace it with:
class cache_parser extends wiki_cache {
Search for:
parent::cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
and replace it with:
parent::wiki_cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
=Rincewind= =Angua RC1=
Knowing we have just renamed the cache class (see above) and knowing this class is called in feed.php, we also need to rename the calling to make RSS/Atom feeds works. Find:
$cache = new cache($key, '.feed');
and replace with:
$cache = new wiki_cache($key, '.feed');
Otherwise you will have a very nice “XML Parsing Error”.
=Angua RC1=
Do Not do for Rincewind
Knowing we have just renamed the cache class (see above) and knowing this class is called in lib/exe/css.php, we also need to rename the calling to make skin works. Find:
// The generated script depends on some dynamic options $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$mediatype,'.css');
and replace with:
// The generated script depends on some dynamic options $cache = new wiki_cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$mediatype,'.css');
=Angua RC1=
Do Not do for Rincewind
Knowing we have just renamed the cache class (see above) and knowing this class is called in lib/exe/js.php, we also need to rename the calling to make javascript works. Find:
// The generated script depends on some dynamic options $cache = new cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'], '.js');
and replace with:
// The generated script depends on some dynamic options $cache = new wiki_cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'], '.js');
=Angua RC1=
Do Not do for Rincewind
Knowing we have just renamed the cache class (see above) and knowing this class is in inc/load.php, we also need to rename the name to make css and javascript works. Find:
'cache' => DOKU_INC.'inc/cache.php',
and replace with:
'wiki_cache' => DOKU_INC.'inc/cache.php',
Do Not do for Rincewind and Angua RC1
To synchronize phpBB3's and Dokuwiki's dateformat and timezone you have to change the function dformat() in inc/common.php.
Search for:
function dformat($dt=null,$format=''){ global $conf; if(is_null($dt)) $dt = time(); $dt = (int) $dt; if(!$format) $format = $conf['dformat']; $format = str_replace('%f',datetime_h($dt),$format); return strftime($format,$dt); }
and replace it with:
function dformat($dt=null){ global $user; if(is_null($dt)) $dt = time(); $dt = (int) $dt; return $user->format_date($dt); }
So Dokuwiki uses the date configurations of phpBB3.
=Rincewind= =Angua RC1=
The last thing we have to do is: enable it! The file conf/local.protected.php is the best location to do so, because DokuWiki doesn't touch this file. If the file doesn't exist, you have to create it. Add these lines:
<?php /* * phpBB3 */ define('IN_PHPBB', true); $phpbb_root_path = 'phpBB3/'; $conf['authtype'] = 'phpbb3'; ?>
$phpbb_root_path has to be the relative path to phpBB from the DokuWiki directory, e.g. if phpBB is installed on the same level as DokuWiki, e.g. DokuWiki in var/user/dokuwiki and phpBB in var/user/forum/, $php_root_path has to be set to ../forum/.
I did this, but it wouldn't authenticate me. I tried pasting it in local.php, and it worked just fine. Is there a step missing?
=Rincewind= =Angua RC1=
In order for the above integration to work well, it is important that the cookie settings in the phpBB3 ACP (admin control panel) are set right. For example, with wrong cookie settings, first logging in at your phpBB3 forum, then browsing your DokuWiki pages will forcibly log you out when you next load a page of your forum.
If your phpBB3 forum is installed at www.yourdomain.com/phpBB3/ and your DokuWiki is installed at www.yourdomain.com/dokuwiki/, then you should not set the “Cookie path” on the “Cookie Settings” page in the phpBB3 ACP to /phpBB3/ – that will cause the very behaviour mentioned in the example above. Instead, set the “Cookie path” to /, and it should work as expected. carstenfuchs [at] t [dash] online [dot] de
An other thing to check in the phpbb3 ACP is “Validate referrer” in the Security settings. If this setting is set to “Validate path too” the integration will not work and you will experience exactly the same issue that is described above in case of wrong cookie path. For this reason please set “Validate referrer” to “Validate host” or “none” but never to “Validate path”. Be care…
require_once(DOKU_INC.'inc/cache.php');
just after
require_once(DOKU_INC.'inc/init.php');
in feed.php or else php will throw wiki_cache unknown class error.
Cant you just make DokuWiki PLUG into the MySQL auth part of phpbb3? so what if you have to login twice!@
Worked fine for me (please note the phpbb cookies value and my subdomains) :
Problem:
[phpBB Debug] PHP Notice: in file /includes/session.php on line 2167: strtr() [function.strtr]: The second argument is not an array
When I check that line of code for errors this is what the code is:
return strtr(@gmdate($date_cache[$format]['format_long'], $gmepoch + $zone_offset), $date_cache[$format]['lang']);
Update - 2010 July 6th: I returned the date mod back to the original code and the error is fixed. Update2 - 2010 July 7th: The toolbar does NOT work and it just gives me a link to “Media Files”! I've tried all of the troubleshooting tips offered here and nothing fixes it. Any help?! Update3 - 2010 July7th: Make sure the permissions of the dokuwiki/lib/exe/js.php file are set to 755 otherwise the toolbar will not work!
<?php /** * phpBB3 authentication backend * * Uses external Trust mechanism to check against phpBB's * user cookie. phpBB's PHPBB_ROOT_PATH must be defined correctly. * * @author Markus Henn <brezelman@yahoo.de> */ define('IN_PHPBB', true); global $phpbb_root_path; global $db; global $cache; global $phpEx; global $user; global $config; global $conf; global $dbhost; global $dbport; global $dbname; global $dbuser; global $dbpasswd; global $table_prefix; global $phpbb_auth; $phpEx = substr(strrchr(__FILE__, '.'), 1); if(strpos($_SERVER['PHP_SELF'], "/lib/plugins/") !== false) { $phpbb_root_path = '../../../'.$phpbb_root_path; } if(strpos($_SERVER['PHP_SELF'], "/lib/exe/") !== false) { $phpbb_root_path = '../../'.$phpbb_root_path; } require_once(DOKU_INC.'inc/auth/mysql.class.php'); require_once($phpbb_root_path.'common.'.$phpEx); //config is loaded in common file, but $dbpasswd is unset there, too, so we have to reload it require($phpbb_root_path.'config.'.$phpEx); $user->session_begin(); //$auth will be used by DokuWiki, so copy phpBB's $auth to another variable $phpbb_auth = $auth; $phpbb_auth->acl($user->data); class auth_phpbb3 extends auth_mysql { HERE THE REST OF THE ORIGINAL phpbb3.class.php CODE FROM THE TOP OF THIS SIDE
* I don't really understand why it works now, so I haven't added it to the instructions in case it's a security risk. — Eivind 2010/09/12
Eivind, i have your problem totally. i did what you said. and so far it can run.but afther the integrate the login button in my dokuwiki is disappeared it always “logout” even you never login.so i try remove 'PHP_AUTH_USER' part in the auth.php. because i use a remote sever.but it wasn't work.so i even try change some syntax in phpbb.class.php.whatsoever how does remove the corresponding code in inc/auth.php exactly? —smith 26/01/2011 (just be my hero Eivind) Maybe try removing basic apache authentification if written in .htaccess???
The Page has been cleared up a bit by djSupport on 24/7/11 Mail me if there is any issues I hope it helps...