WebArea/Compat/DokuWiki/Fr

From TuxFamilyFAQ
Jump to navigationJump to search


Installer DokuWiki chez TuxFamily.org

Introduction

DokuWiki est un wiki léger qui facilite la conception d'une documentation. Il stocke ses articles dans des fichiers plutôt que dans une base de données.

Site officiel : http://wiki.splitbrain.org/wiki:dokuwiki

La version utilisée lors de la rédaction de cet article est la 2008-05-05.

Installation

  • Décompressez les fichiers, lancez le script install.php, c'est prêt !
  • (facultatif) Trouvez-vous un template, ou concevez-en un vous-même.
  • (facultatif) L'authentification de DokuWiki peut être gérée par un mécanisme externe.

Gérer l'authentification de DokuWiki avec FluxBB

L'authentification effectuée par DokuWiki peut être déportée sur une autre application. Dans notre cas, nous allons utilisé la base des utilisateurs du forum FluxBB.

FluxBB peut utiliser différents moteur de base de données, Mysql et Postgresql par exemple. Dans notre cas nous avons choisi Postgresql.

Le mécanisme d'authentification de DokuWiki passe par le répertoire inc/auth. Dans ce répertoire se trouve plusieurs fichiers .class.php, chacun d'eux représentant une méthode d'authentification. Comme nous utilisons une base de données Postgresl, nous allons définir une nouvelle classe dérivant de celle définie dans pgsql.class.php.

Il faut créer le fichier inc/auth/fluxbb.class.php :

<?php
/**
 * FluxBB auth backend with Postgresql support
 *
 * Uses external Trust mechanism to check against FluxBB's
 * user cookie. FluxBB's FORUM_ROOT must be defined correctly.
 *
 * @author    Andreas Gohr <andi@splitbrain.org>
 * @author    0xmathieu <oa.20.ultimat@spamgourmet.com>
 */

if(!defined('FORUM_ROOT')) define('FORUM_ROOT', DOKU_INC.'../forum/');
define('FORUM_DISABLE_CSRF_CONFIRM', 1);
require_once FORUM_ROOT.'include/common.php';
require_once DOKU_INC.'inc/auth/pgsql.class.php';

#dbg($GLOBALS);
#dbg($forum_user);

class auth_fluxbb extends auth_pgsql {

        /**
         * Constructor.
         *
         * Sets additional capabilities and config strings
         */
        function auth_fluxbb(){
                global $conf;
                $this->cando['external'] = true;
                $this->cando['logoff']   = true;

                $conf['passcrypt'] = 'sha1';

                // get global vars from fluxbb config
                global $db_host;
                global $db_name;
                global $db_username;
                global $db_password;
                global $db_prefix;

                // now set up the pgsql config strings
                if (empty($conf['auth'])) {
                        $conf['auth'] = array();
                        $conf['auth']['pgsql'] = array();
                }

                $cf = &$conf['auth']['pgsql'];
                $cf['server']   = $db_host;
                $cf['user']     = $db_username;
                $cf['password'] = $db_password;
                $cf['database'] = $db_name;

                $cf['checkPass']   = "SELECT u.password AS pass
                        FROM ${db_prefix}users AS u, ${db_prefix}groups AS g
                        WHERE u.group_id = g.g_id
                        AND u.username = '%{user}'
                        AND g.g_title   != 'Guest'";
                $cf['getUserInfo'] = "SELECT password AS pass, realname AS name, email AS mail, id, g_title as group
                                FROM ${db_prefix}users AS u, ${db_prefix}groups AS g
                                WHERE u.group_id = g.g_id
                                AND u.username = '%{user}'";
                $cf['getGroups']   = "SELECT g.g_title as group
                        FROM ${db_prefix}users AS u, ${db_prefix}groups AS g
                        WHERE u.group_id = g.g_id
                        AND u.username = '%{user}'";
                $cf['getUsers']    = "SELECT DISTINCT u.username AS user
                        FROM ${db_prefix}users AS u, ${db_prefix}groups AS g
                        WHERE u.group_id = g.g_id";
                $cf['FilterLogin'] = "u.username LIKE '%{user}'";
                $cf['FilterName']  = "u.realname LIKE '%{name}'";
                $cf['FilterEmail'] = "u.email LIKE '%{email}'";
                $cf['FilterGroup'] = "g.g_title LIKE '%{group}'";
                $cf['SortOrder']   = "ORDER BY u.username";
                $cf['addUser']     = "INSERT INTO ${db_prefix}users
                        (username, password, email, realname)
                        VALUES ('%{user}', '%{pass}', '%{email}', '%{name}')";
                $cf['addGroup']    = "INSERT INTO ${db_prefix}groups (g_title) VALUES ('%{group}')";
                $cf['addUserGroup']= "UPDATE ${db_prefix}users SET group_id=%{gid} WHERE id='%{uid}'";
                $cf['delGroup']    = "DELETE FROM ${db_prefix}groups WHERE g_id='%{gid}'";
                $cf['getUserID']   = "SELECT id FROM ${db_prefix}users WHERE username='%{user}'";
                $cf['updateUser']  = "UPDATE ${db_prefix}users SET";
                $cf['UpdateLogin'] = "username='%{user}'";
                $cf['UpdatePass']  = "password='%{pass}'";
                $cf['UpdateEmail'] = "email='%{email}'";
                $cf['UpdateName']  = "realname='%{name}'";
                $cf['UpdateTarget']= "WHERE id=%{uid}";
                $cf['delUserGroup']= "UPDATE ${db_prefix}users SET g_id=4 WHERE id=%{uid}";
                $cf['getGroupID']  = "SELECT g_id AS id FROM ${db_prefix}groups WHERE g_title='%{group}'";

                $cf['TablesToLock']= array("${db_prefix}users", "${db_prefix}users AS u",
                                "${db_prefix}groups", "${db_prefix}groups AS g");

                $cf['debug'] = 1;
                // call pgsql constructor
                $this->auth_pgsql();
        }

        /**
         * Just checks against the $forum_user variable
         */
        function trustExternal($user,$pass,$sticky=false){
                global $USERINFO;
                global $conf;
                global $lang;
                global $forum_user;
                global $forum_config;
                global $cookie_name;
                $sticky ? $sticky = true : $sticky = false; //sanity check

                // someone used the login form
                if(!empty($user)){
                        authenticate_user($user, $pass);
                        if (!$forum_user['is_guest']){
                                $expire = ($forum_user['save_pass'] == '1') ? time() + 31536000 : 0;
                                forum_setcookie($cookie_name, base64_encode($forum_user['id'].'|'.$forum_user['password']), $expire);
                        }else{
                                //invalid credentials - log off
                                msg($lang['badlogin'],-1);
                                auth_logoff();
                                return false;
                        }
                }

                if(isset($forum_user) && !$forum_user['is_guest']){
                        // okay we're logged in - set the globals
                        $USERINFO['pass'] = $forum_user['password'];
                        $USERINFO['name'] = $forum_user['realname'];
                        $USERINFO['mail'] = $forum_user['email'];
                        $USERINFO['grps'] = array($forum_user['g_title']);
                        if ($forum_user['g_id'] == FORUM_ADMIN)
                                $USERINFO['grps'][] = 'admin';

                        $_SERVER['REMOTE_USER'] = $forum_user['username'];
                        $_SESSION[DOKU_COOKIE]['auth']['user'] = $forum_user['username'];
                        $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
                        return true;
                }

                // to be sure
                auth_logoff();
                return false;
        }

        /**
         * remove fluxbb cookie on logout
         */
        function logOff(){
                global $forum_user;
                global $cookie_name;
                $forum_user = array();
                $forum_user['is_guest'] = true;
                forum_setcookie($cookie_name, base64_encode('1|'.random_key(8, true)), time() + 31536000);
        }
}

//To delete unwanted notices, by Cacatoes
//See http://fluxbb.org/forums/post/11507/#p11507
error_reporting(E_ALL ^ E_NOTICE);

Grossièrement cette classe dérive auth_pgsql qui elle même dérive auth_mysql, en interrogeant les tables de FluxBB.

La dernière ligne permet de repassé le niveau d'affichage d'erreur au niveau par défaut de DokuWiki, car l'inclusion du fichier FORUM_ROOT.include/common.php change ce comportement pour afficher toutes les erreurs.

Les scripts php définissant l'authentification Postgesql et Mysql n'ont pas été prévu pour être dérivé, donc il se produit une erreur lors de l'inclusion de ces fichiers. Pour corriger l'erreur il faut changer la ligne suivante dans les fichiers inc/auth/mysql.class.php et inc/auth/pgsql.class.php :

define('DOKU_AUTH', dirname(__FILE__));

par

if(!defined('DOKU_AUTH')) define('DOKU_AUTH', dirname(__FILE__));

Jusqu'à maintenant, nous avons défini une nouvelle méthode d'authentification mais ne l'avons pas utilisée. Pour ce faire, il faut éditer le fichier conf/local.protected.php :

$conf['authtype']='fluxbb';
define('FORUM_ROOT','/data/web/chemin_absolu_de_votre_espace_web_tuxfamily.org/htdocs/repertoire_d'installation_de_fluxbb/');

Peaufiner l'intégration

  • Vous pouvez changer le lien "Connexion" de DokuWiki pour que celui-ci rebascule vers le forum, l'avantage est de laisser le forum gérer la procédure d'inscription, le désavantage étant de perdre la redirection automatique vers la page du wiki en cours de visualisation.

Pour cela, éditer le fichier inc/template.php de Dokuwiki,

  • Trouvez la fonction tpl_actionlink, au case 'login' après le else, remplacez la variable $ID par le chemin relatif vers votre forum :
       }else{
         tpl_link(wl("../forum/login.php",'do=login&sectok='.getSecurityToken()),
                  $pre.(($inner)?$inner:$lang['btn_login']).$suf,
                  'class="action login" rel="nofollow"');

Trucs et astuces

La datation de votre dokuwiki est fausse ?

Si vous constatez que l'horodatage des modifications de votre dokuwiki se plante d'une heure, c'est tout simplement parce que la plupart des machines de tuxfamily ont leurs timezones réglées en GMT (bande de vendus à la perfide albion va ! ). Vous pouvez corriger cela en suivant : https://www.dokuwiki.org/start?id=fr:tips:timezone