これを適用するには、DokuWiki 2007-06-26b用のパッケージをダウンロードするか次のステップに従って下さい。
Note that it does not function any more after the merge of the requireall branch on 2010-03-12.
inc/auth/ ディレクトリに 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); $phpEx = substr(strrchr(__FILE__, '.'), 1); global $phpbb_root_path; 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(); } } ?>
inc/init.php ファイルから次の行を探して下さい。
$_REQUEST = array_merge($_GET,$_POST);
それをコメントアウトするために行頭に//を追加して下さい。
//$_REQUEST = array_merge($_GET,$_POST);
これは、phpBBが$_REQUESTをクッキーで使用するためです。
inc/utf8.phpにはすでにphpBBによって定義された次の関数があります。
なので、これらの関数の前後に
if(!defined('IN_PHPBB')) { ... }
を追加し、phpBBを使わなくなった時にDokuWikiがこれらの関数を定義するようにしましょう。
変更前:
function utf8_strlen($string){ return strlen(utf8_decode($string)); }
変更後:
if(!defined('IN_PHPBB')){ function utf8_strlen($string){ return strlen(utf8_decode($string)); } }
最後の問題は、DokuWiki と phpBB が同じcacheクラスを持っている事です。そこで、DokuWikiのクラスの名前を変更します。inc/cache.php ファイルの中で次の行を探して下さい。
class cache {
そして、次のように変更して下さい。:
class wiki_cache {
変更前:
function cache($key,$ext) {
変更後:
function wiki_cache($key,$ext) {
変更前:
class cache_parser extends cache {
変更後:
class cache_parser extends wiki_cache {
変更前:
parent::cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
変更後:
parent::wiki_cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
cacheクラスの名前を変更した(上記参照)ので、このクラスが呼び出される feed.php でも、RSS/Atom フィードが生成されるように名前を変更しましょう。
変更前:
$cache = new cache($key, '.feed');
変更後:
$cache = new wiki_cache($key, '.feed');
もしこれを変更しないと “XML Parsing Error” が発生します。
phpBBとDokuWikiの日付フォーマットとタイムゾーンを同期するため、inc/common.php ファイルの dformat() 関数を変更しましょう。(コメントセクションにあるように、この修正を行うと逆にエラーが発生する可能性があります。)
変更前:
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); }
変更後:
function dformat($dt=null){ global $user; if(is_null($dt)) $dt = time(); $dt = (int) $dt; return $user->format_date($dt); }
DokuWikiはphpBB3の日付設定を使用します。
最後にすることは、今までの変更を適用することです。conf/local.protected.php ファイルはDokuWikiが操作しないので最も良い場所です。もしこのファイルがない場合は、新たに作成して下さい。そして、ファイルに次の記述を追加して下さい。
<?php /* * phpBB3 */ define('IN_PHPBB', true); $phpbb_root_path = 'phpBB3/'; $conf['authtype'] = 'phpbb3'; ?>
$phpbb_root_path はDokuWikiのディレクトリから見たphpBBの相対パスです。例えば、DokuWikiを”var/user/dokuwiki“に、phpBBを”var/user/forum/“というように、phpBBをDokuWikiと同じ階層にインストールしたのであれば、$php_root_path は../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のACP (admin control panel)でのcookieを正しく設定することが重要です。例えば、cookieの設定が間違っていると、まずphpBB3にログインし、あるページをロードするとDokuWikiから強制的にログアウトさせられます。
もし、phpBB3を”www.yourdomain.com/phpBB3/“に、DokuWikiを”www.yourdomain.com/dokuwiki/“にインストールしている場合は、phpBB3のACPで“cookie 設定”の“cookie パス”を”/phpBB3/“と設定してはいけません。正しくは、“cookie パス”には”/“と設定して下さい。 carstenfuchs [at] t [dash] online [dot] de
phpBB3のACPで他にチェックすることは、セキュリティ設定の“リファラ設定”です。もし、この設定が“ホストとスクリプトパス”になっていると、上記の間違ったcookieパスの設定のように、うまく動作しません。このため、“リファラ設定”では“ホストとスクリプトパス”または“なし”を選択して下さい。
Warning: require_once(../phpBB3/common.php) [function.require-once]: failed to open stream: No such file or directory in C:\www\DokuWiki-2008-05-05\inc\auth\phpbb3.class.php on line 18
I have a forum in: C:\www\phpBB3\ and DokuWiki in C:\www\dokuwiki-2008-05-05\ so I have this config file:
<?php /* * phpBB3 */ define('IN_PHPBB', true); $phpbb_root_path = '../phpBB3/'; $conf['authtype'] = 'phpbb3'; ?>
if(strpos($_SERVER['PHP_SELF'], "/lib/exe/") !== false) { $phpbb_root_path = '../../'.$phpbb_root_path; }
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; }
— Mauro Artizzu 2008/10/17 13:38
There were only a few errors I run into. All the functions mentioned below utf8.php (utf8_strlen, utf8_substr, utf8_strtolower, utf8_strtoupper, utf8_strpos) have to be excluded from being defined in DokuWiki, not only that one which is declared in this example. Same way to exclude with if(!defined('IN_PHPBB')). The last one I found was the name of the standard user group which has been changed since phpBB2 from “user” to “registered user”. I was updating my existing config from 2 to 3 and any other settings except that ones mentioned above could remain unchanged. gonzo99/27.02.2009
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:
I have phpBB 3.0.6 and i used the latest 5 versions of DokuWiki. Then i used this tutorial here, did everything 10 times but with no success.
The forum is at: http://192.168.69.87:4001/forum2/forum/
The wiki is at : http://192.168.69.87:4001/forum2/wiki/
– Settings in the phpBB-forums for cookies are:
Cookie-Domain: http://192.168.69.87:4001/forum2/forum/ – and – Cookie-Path: /
– Do we need to edit the “mysql.conf.php” file ? Because i get the error:
“User authentication is temporarily unavailable. If this situation persists, please inform your Wiki Admin.”
– Thanks for HELP !
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 { この下には、手順の一番上にある phpbb3.class.php のコードが続きます。