DokuWiki

It's better when it's simple

Outils pour utilisateurs

Outils du site


fr:tips:integrate_with_phpbb

Intégration avec le Forum phpBB

phpBB v2 avec dokuwiki v2008-05-05

Afin de clarifier ce que l'on trouve dans la page version "anglaise" de ce tips voici ce qui fonctionne :

Nommer le contenu du fichier ci-dessous phpbb.class.php puis mettez-le dans le répertoire inc/auth/

<?php
/**
 * PHPBB authentication backend
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author FatherNitwit
 */
 
define('DOKU_AUTH', dirname(__FILE__));
require_once(DOKU_AUTH.'/basic.class.php');
$location = DOKU_AUTH.'/../../'; // add by lolo
 
define("IN_LOGIN", true);
define('IN_PHPBB', true);
$phpbb_root_path = $location.'../phpBB2/';
$dlang = $lang;	#phpbb uses $lang too..
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$lang = $dlang;
 
 
// we only accept page ids for auth_plain
if(isset($_REQUEST['u']))
  $_REQUEST['u'] = cleanID($_REQUEST['u']);
if(isset($_REQUEST['acl_user']))
  $_REQUEST['acl_user'] = cleanID($_REQUEST['acl_user']);
 
class auth_phpbb extends auth_basic {
	var $userdata;
 
    /**
     * Constructor
     *
     * Carry out sanity checks to ensure the object is
     * able to operate. Set capabilities.
     *
     */
    function auth_phpbb() {
		global $user_ip;
        $this->success = true;
		$this->cando['logoff'] = true;
		//$this->cando['getGroups'] = true;
		$this->cando['external'] = true;
		//
		// Set page ID for session management
		//
		$this->userdata = session_pagestart($user_ip, PAGE_LOGIN);
		init_userprefs($this->userdata);
		//
		// End session management
		//
    }
 
	function trustExternal($user,$pass,$sticky=false){
		$sticky ? $sticky = true : $sticky = false;
		if($this->userdata['session_logged_in']) {
			//already logged in...
		} else {
			if(!$this->checkPass2($user,$pass,$sticky)) {
				return;
			}
		}
		global $USERINFO;
		$USERINFO = $this->getUserData($this->userdata['username']);
 
		$_SERVER['REMOTE_USER'] = $this->userdata['username'];
		$_SESSION[$conf['title']]['auth']['user'] = $this->userdata['username'];
		$_SESSION[$conf['title']]['auth']['pass'] = "__";
		$_SESSION[$conf['title']]['auth']['buid'] = auth_browseruid();
		$_SESSION[$conf['title']]['auth']['info'] = $USERINFO;
		/*var_dump($_SESSION[$conf['title']]['auth']);
		die("fff");*/
	}
 
    function checkPass($user,$pass){
		return($this->checkPass2($user,$pass,0));
	}
    function checkPass2($user,$pass,$auto){
		global $user_ip;
		global $db;
 
		$sql = "SELECT user_id, username, user_password, user_active, user_level, user_login_tries, user_last_login_try
			FROM " . USERS_TABLE . "
			WHERE username = '" . str_replace("\\'", "''", $user) . "'";
		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Error in obtaining userdata', '', __LINE__, __FILE__, $sql);
		}
 
		if( $row = $db->sql_fetchrow($result) )
		{
			if( md5($pass) == $row['user_password'] && $row['user_active'] ) {
 
				$this->userdata = session_begin($row['user_id'], $user_ip, PAGE_INDEX, FALSE, $auto, 0);
 
				if( !$this->userdata )
				{
					message_die(CRITICAL_ERROR, "Couldn't start session : login", "", __LINE__, __FILE__);
				}
				return(true);
			}
		}
		msg($lang['badlogin'],-1);
		return(false);
    }
 
    /**
     * Return user info
     *
     * Returns info about the given user needs to contain
     * at least these fields:
     *
     * name string  full name of the user
     * mail string  email addres of the user
     * grps array   list of groups the user is in
     *
     */
    function getUserData($user){
		global $conf;
		if($this->userdata['session_logged_in']) {
			global $db;
			//ok, figure out what groups they are in
			$sql = "SELECT g.group_name, ug.user_pending 
				FROM " . GROUPS_TABLE . " g, " . USER_GROUP_TABLE . " ug
				WHERE ug.user_id = " . $this->userdata['user_id'] . "  
					AND ug.group_id = g.group_id
					AND g.group_single_user <> " . TRUE . "
				ORDER BY g.group_name, ug.user_id";
			if ( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Error getting users group information', '', __LINE__, __FILE__, $sql);
			}
			$groups = array($conf['defaultgroup']);
			while( $row = $db->sql_fetchrow($result) ) {
				if(!$row['user_pending'])
					$groups[] = $row['group_name'];
			}
 
			return(array('name' => $user, 
						 'mail' => $this->userdata['user_email'], 
						 'grps' => $groups
						 )
				   );
		}
		return(false);
    }
 
	function logOff(){
		if( $this->userdata['session_logged_in'] )
		{
			session_end($this->userdata['session_id'], $this->userdata['user_id']);
		}
	}
 
	/*
	I didnt get this working...
	function retrieveGroups($start=0,$limit=0) {
		die("hi g");
		$sql = "SELECT g.group_name 
			FROM " . GROUPS_TABLE . " g
				AND g.group_single_user <> " . TRUE;
		if($limit != 0)
			$sql = $sql . " LIMIT $start,$limit";
		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Error getting group information', '', __LINE__, __FILE__, $sql);
		}
		$groups = array("User");
		while( $row = $db->sql_fetchrow($result) ) {
			$groups[] = $row['group_name'];
		}
		return $groups;
  }*/
 
}

Modifiez si besoin la variable $location.'../phpBB2/'; par le nom du répertoire de votre forum.

Ensuite aller dans l'administration manager du DokuWiki, puis aller au niveau des configurations d'authentification, choisir phpbb.class.php, et choisissez ensuite le groupe par défaut du forum ex: user (pour les utilisateurs par défaut de l'ensemble du forum); puis choisissez le nom du superUtilisateur du DokuWiki parmi un des utilisateurs du forum.

lolo 09/09/2008

fr/tips/integrate_with_phpbb.txt · Dernière modification : 2008-09-09 16:54 de 84.103.17.92

Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki