This is an old revision of the document!
Table of Contents
phpBB 3 (authentication) integration
Features
- Completely using phpBB's authentication system, you don't have to login in DokuWiki again if you're already logged in in phpBB and vice versa. The same applies to log out of course.
- Using phpBB's groups for DokuWiki's access control list. Some default groups are already implemented (even if they are not displayed on DokuWiki's configuration page):
- REGISTERED: default group (replaces group user)
- ADMINISTRATORS: administrator/super user (replaces group admin)
- GLOBAL_MODERATORS: managers
Features missing
- User registration
- Full name display (phpBB doesn't have full name information in the user profile by default, username is displayed instead)
- Integration with Mediamanager, pictures are not shown in the wiki anymore (path problem?)1)
- Language support
Installation instructions
Add instructions for Weatherwax
To get this to work with the most Release Candidate version of DokuWiki “Adora Bell 10-09-2012” and PHPBB3 only do the following steps marked with =Adora Bell=
To get this to work with the most recent stable version of DokuWiki “Angua 25-01-2012” and PHPBB3 only do the following steps marked with =Angua=
To get this to work with the outdated version of DokuWiki “Rincewind” and PHPBB3 only do the following steps marked with =Rincewind=
To install this mod, you can:
- follow these steps:
- create
inc/auth/phpbb3.class.php
- edit
inc/init.php
- edit
inc/utf8.php
- edit
inc/cache.php
- edit
feed.php
- edit
lib/exe/css.php
=Angua= =Adora Belle= Do Not do for Rincewind - edit
lib/exe/js.php
=Angua= =Adora Belle= Do Not do for Rincewind - edit
inc/load.php
=Angua= =Adora Belle= Do Not do for Rincewind
Create inc/auth/phpbb3.class.php
=Angua= =Rincewind= =Adora Belle=
Create a file in the inc/auth/ directory with the filename phpbb3.class.php and the following content :
- phpbb3.class.php
<?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(); } } ?>
Since =Adora Belle= you have to change this part:
// call mysql constructor $this->auth_mysql();
By this :
// call mysql constructor $parent::__construct();
This is because the auth_mysql class is now in PHP5 and uses the new constructor.
Edit inc/init.php
=Angua= =Rincewind= =Adora Belle=
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.
Edit inc/utf8.php
=Angua= =Rincewind= =Adora Belle=
There are some functions in the file inc/utf8.php already defined by phpBB, these are:
- utf8_strlen
- utf8_substr
- utf8_strtolower
- utf8_strtoupper
- utf8_ucfirst
- utf8_strpos
- utf8_basename =Adora Belle=
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')) { ... }
Example: utf8_strlen
replace:
function utf8_strlen($string){ return strlen(utf8_decode($string)); }
with:
if(!defined('IN_PHPBB')){ function utf8_strlen($string){ return strlen(utf8_decode($string)); } }
Edit inc/cache.php
=Angua= =Rincewind= =Adora Belle=
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);
Edit feed.php
=Angua= =Rincewind= =Adora Belle=
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”.
Edit lib/exe/css.php
=Angua= =Adora Belle= Do Not do for Rincewind
=Angua=
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');
=Adora Belle=
Find:
// The generated script depends on some dynamic options $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$type,'.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.$type,'.css');
Edit lib/exe/js.php
=Angua= =Adora Belle= 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');
Edit inc/load.php
=Angua= =Adora Belle= 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',
Set configuration variables
=Angua= =Rincewind= =Adora Belle=
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:
- local.protected.php
<?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?
phpBB3 Settings
Cookie Settings
=Angua= =Rincewind= =Adora Belle=
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
Security Settings
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…
Credits
- Thanks to Nathan Brittles who gave me the basic ideas in a thread in the official phpBB (phpBB3) forum.
Comments / Problems
- I had some problems getting this integration to work, it would not authenticate. But, I found the problem: If $_SERVER['PHP_AUTH_USER'] is set on your server, it will try to log in with that. If you have that problem, you can either unset it, or remove the corresponding code in inc/auth.php.
- For German phpbb3: Dont use ÄÖÜ for Usernames, it will not authenticate! It is possible to restrict those usernames in phpbb3 registration settings. Use ASCII Usernames instead.
- Additional info provided for Adora Belle (fixed now for me with php 5.3) Regards, djSupport