Mantis + Dokuwiki + Subversion + Active Directory - Part 3

整合 Dokuwiki, 並使用 Mantis 的認證系統, 以讓 Mantis 裡面個別的 Issue, Project 可以有自己的 Wiki.

1. 設定 Mantis Wiki 整合

#
# 編輯 config_inc.php 以打開 wiki 整合功能
#
cd /var/www/html/mantis
cp config_inc.php config_inc.php.`date +"%Y%m%d%H%M%S"`
sed -i 's/?>//g' config_inc.php
cat << EOF >> config_inc.php
    # Dokuwiki
    \$g_wiki_enable = ON;
    \$g_wiki_engine = 'dokuwiki';
    \$g_wiki_root_namespace = 'mantis';
    \$g_wiki_engine_url = \$t_protocol . '://' . \$t_host . '/' . \$g_wiki_engine . '/';
?>
EOF

2. 安裝 Dokuwiki

#
# 假設:
# 1. Dokuwiki 版本是 2012-01-25a, 檔名是 dokuwiki-2012-01-25a.tgz
#
cd ~
wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2012-01-25a.tgz
cd /var/www/html
tar -xvzf ~/dokuwiki-2012-01-25a.tgz
mv dokuwiki-2012-01-25a dokuwiki
chown -R apache.apache dokuwiki

2. 設定 Dokuwiki

  • 用瀏覽器打開 Dokuwiki 網址: https://<mantis 的 hostname or ip>/dokuwiki/install.php
  • 填入必要資訊
  • 按 "儲存" 結束設定

Wiki Install  

3. 移除 install.php

#
# 移除 install.php
#
rm -f /var/www/html/dokuwiki/install.php

4. 安裝 WYSIWYG

  • 取得 WYSIWYG 下載網址
    • 以瀏覽器打開網址 http://www.dokuwiki.org
    • 找到需要的 Plugins (Fckglite plugin) (注意!! 要留意 Plugin 有無相容於目前安裝的 Dokuwiki 版本), 並複製檔案的網址連結

Wiki Get Plugins 1  

Wiki Get Plugins 2  

Wiki Get Plugins 3

Wiki Get Plugins 4    

  • 安裝 WYSIWYG 插件
    • 以瀏覽器打開網址 https://<mantis 的 hostname or ip>/dokuwiki
    • 按 "登入", 出現登入畫面後, 輸入尚一個步驟設定的帳號與密碼 (例如 MantisAdmin) 登入
    • 進入插件管理器, 貼上上面步驟複製的 Fckglite plugin 下載網址 (http://www.mturner.org/fckgLite/data/media/current/fckgLite.tgz) 後, 按 "下載"
Wiki Home  
 
Wiki Admin Login  
 
Wiki Management
 
Wiki Manage Plugins   
 
Wiki Download Plugins  
 
Wiki Plugins Installed  

5. 設定 Dokuwiki 使用外部認證 (Mantis)

編輯 /var/www/html/dokuwiki/conf/local.protected.php

#
# 設定 local.protected.php
#
cd /var/www/html/dokuwiki/conf
cat << EOF > local.protected.php
<?php 
    define( 'MANTIS_ROOT', '/var/www/html/mantis/' );
    define( 'MANTIS_URL', 'https://<Mantis 的 Hostname or IP>/mantis/' );
    require_once( MANTIS_ROOT . 'core.php' );
?>
EOF
chown apache.apache local.protected.php

編輯 /var/www/html/dokuwiki/conf/acl.auth.php

#
# 設定 acl.auth.php
#
cd /var/www/html/dokuwiki/conf
cp acl.auth.php acl.auth.php.`date +"%Y%m%d%H%M%S"`
cat << EOF > acl.auth.php
# acl.auth.php
# <?php exit()?>
# Don't modify the lines above
#
# Access Control Lists
#
# Auto-generated by install script
# Date: Tue, 27 Dec 2011 06:35:00 +0000
:
*    @VIEWER        1
*    @REPORTER      2
*    @UPDATER       4
*    @DEVELOPER     8
*    @MANAGER       16
*    @ADMINISTRATOR 16
*    @ALL           0
EOF
chown apache.apache acl.auth.php

編輯 /var/www/html/dokuwiki/inc/auth/mantis.class.php

#
# 設定 mantis.class.php
#
cd /var/www/html/dokuwiki/inc/auth
cat << EOF > mantis.class.php 
<?php
/**
 * Mantis auth backend
 *
 * Uses external Trust mechanism to check against Mantis'
 * user cookie.
 * 13/12/2009 ~ @Tiago Gomes:
 * added modifications to make possible to set project related user rights.(http://www.mantisbt.org/bugs/view.php?id=8249)
 * added modifications so that mantis support logging in/out from DokuWiki's login page (http://www.mantisbt.org/bugs/view.php?id=8277)
 * 
 *
 * @author    Victor Boctor (http://www.futureware.biz)
 * 
 */
require_once( MANTIS_ROOT . 'core.php' );
 
#dbg(\$GLOBALS);
 
class auth_mantis extends auth_basic {
    /**
     * Constructor.
     *
     * Sets additional capabilities and config strings
     */
    function auth_mantis(){
        \$this->cando['external'] = true;
 
        \$this->cando['logoff' ] = true; // module has a logoff method
    }
    
    /**
     * Authenticates the user using Mantis APIs.
     */
    function trustExternal(\$user,\$pass,\$sticky=false){
        global \$USERINFO;
        global \$conf;
 
        \$ValidUser = false;
 
        // Manage HTTP authentication with Negotiate protocol enabled
        \$user = auth_prepare_username(\$user);
	\$pass = auth_prepare_password(\$pass);
        // This is necessary in all cases where Authorization HTTP header is always set
	if(auth_is_user_authenticated())
	{
	    \$user='';
	}
 
        // Has a user name been provided?
        if ( !empty ( \$user ) )
        {   
            // User name provided, so login via form in progress...
            // Are the specified user name and password valid?
            if ( auth_attempt_login ( \$user, \$pass, \$sticky ) )
            {   
                // Credential accepted...
                \$_SERVER['REMOTE_USER'] = \$user; // Set the user name (makes things work...)
                \$ValidUser = true; // Report success.
            }
            else
            {   
                // Invalid credentials              
                        if ( !\$silent )
                {   
                    msg ( \$lang [ 'badlogin' ], -1 );
                }
                
                \$ValidUser = false;
            }
        }
        else
        {   
            // No user name provided.
            // Is a user already logged in?
            if ( auth_is_user_authenticated ( ) )
            {   
                // Yes, a user is logged in, so set the globals...
                // is it a media display or a page?
                if (isset(\$_REQUEST['media'])) {
                    //media
                    \$t_project_name = explode( ':', getNS( getID("media",false) ) );
                } else {
                    // normal page
                    \$t_project_name = explode( ':', getNS( getID() ) );
                }
                \$t_project_id = project_get_id_by_name( \$t_project_name[1] );
                \$t_access_level = access_get_project_level( \$t_project_id );
                \$t_access_level_string = strtoupper( MantisEnum::getLabel( config_get( 'access_levels_enum_string' ),  \$t_access_level ) ); // mantis 1.2.0rc
                // \$t_access_level_string = strtoupper( get_enum_to_string( config_get( 'access_levels_enum_string' ),  \$t_access_level ) ); 
                \$t_access_level_string_ex = strtoupper( \$t_project_name[1] ) . '_' . \$t_access_level_string;
 
                \$USERINFO['grps'] = array( \$t_access_level_string, \$t_access_level_string_ex );
                \$USERINFO[ 'pass' ] = current_user_get_field ( 'password' );
                \$USERINFO[ 'name' ] = current_user_get_field ( 'username' );
                \$USERINFO[ 'mail' ] = current_user_get_field ( 'email' );
                
                \$_SERVER[ 'REMOTE_USER' ] = \$USERINFO[ 'name' ];
                \$_SESSION[ \$conf[ 'title' ]][ 'auth' ][ 'user' ] = \$USERINFO[ 'name' ];
                \$_SESSION[ \$conf[ 'title' ]][ 'auth' ][ 'info' ] = \$USERINFO;
                
                \$ValidUser = true;
            }
            else
            {   
                \$ValidUser = false;
            }
        }
        
        // Is there a valid user login?
        if ( true != \$ValidUser )
        {   
            // No, so make sure any existing authentication is revoked.
            auth_logoff ( );
        }
        
        return \$ValidUser;
    }
    /**
     * Logout from Mantis
     */
    function logOff(){
        auth_logout();
    }
}
EOF
chown apache.apache mantis.class.php

編輯 /var/www/html/dokuwiki/lib/plugins/mantis/syntax.php

mkdir -p /var/www/html/dokuwiki/lib/plugins/mantis
cd /var/www/html/dokuwiki/lib/plugins/mantis
cp syntax.php syntax.php.`date +"%Y%m%d%H%M%S"`
cat << EOF > syntax.php
<?php
/**
 * Mantis Plugin: Hyperlinks references to Mantis Issues
 * 
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Victor Boctor (http://www.futureware.biz)
 */
 
 
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
 
/**
 * A plug-in that hyper links references to Mantis issues.  References
 * to Mantis issues should use the following format: ~~Mantis:123~~.
 *
 * All DokuWiki plugins to extend the parser/rendering mechanism
 * need to inherit from this class
 */
class syntax_plugin_mantis extends DokuWiki_Syntax_Plugin {
 
    /**
     * return some info
     */
    function getInfo(){
        return array(
            'author' => 'Victor Boctor',
            'email'  => 'vboctor at users . sourceforge . net',
            'date'   => '2006-05-18',
            'name'   => 'Mantis Issues Plugin',
            'desc'   => 'Support References to Mantis Issues',
            'url'    => 'http://www.futureware.biz',
        );
    }
 
    /**
     * What kind of syntax are we?
     */
    function getType(){
        return 'substition';  # typo is intentional
    }
   
    /**
     * What about paragraphs?
     */
    function getPType(){
        return 'normal';
    }
 
    /**
     * Where to sort in?
     */ 
    function getSort(){
        return 156;
    }
 
 
    /**
     * Connect pattern to lexer
     */
    function connectTo(\$mode) {
        \$this->Lexer->addSpecialPattern('~~Mantis:[0-9]+~~', \$mode, 'plugin_mantis');
    }
 
 
    /**
     * Handle the match
     */
    function handle(\$match, \$state, \$pos, &\$handler){
        \$match = substr( \$match, 9, -2 ); // strip "~~Mantis:" from start and "~~" from end
        return array( strtolower( \$match ) );
    }
 
    /**
     * Create output
     */
    function render(\$format, &\$renderer, \$data) {
        if ( \$format == 'xhtml' ) {
			\$renderer->externallink( MANTIS_URL . 'view.php?id=' . \$data[0], \$data[0] );
            return true;
        }
        return false;
    }
}
EOF
chown apache.apache syntax.php

編輯 /var/www/html/dokuwiki/conf/local.php

cd /var/www/html/dokuwiki/conf
cp local.php local.php.`date +"%Y%m%d%H%M%S"`
sed -i 's/@admin/@ADMINISTRATOR/g' local.php
cat << EOF >> local.php
\$conf['authtype'] = 'mantis';
\$conf['defaultgroup'] = 'VIEWER';
EOF

5. 測試

Site Wiki

Wiki Site  

Project Wiki

Wiki Project  

Issue Wiki

Wiki Issue  

建立 Wiki 內容

Wiki Edit Content  

Wiki 內容

 Wiki Content