Исправления для модуля "DokuWiki integration" + обновление DokuWiki

Исправляем досадный баг с совпадающими именами и id-шниками сессий у DokuWiki и LiveStreet. Выглядело это так что сайт переставал отвечать на запросы пока не очистим куки или пока не разорвем сессию. (кстати тут и вина PHP есть т.к. ее поведение при возникновении этой ситуации не очень забавное, надо бы багрепорт оформить)
Обновляем DokuWiki до последней стабильной версии.

Нам понадобятся:
0. LiveStreet 0.4.2
1. Плагин DokuWiki integration
2. Свежая и стабильная сборка DokuWiki (на данный момент это Release 2011-05-25 «Rincewind»)

Последовательность:
1. Устанавливаете плагин «DokuWiki integration».
2. Переименовываете папку wiki в wiki_old
3. Создаем папку wiki и копируем в нее свежую DokuWiki
4. В папке wiki удаляем папки conf и data
5. Копируем в папку wiki папки conf и data из папки wiki_old
6. В папку wiki/inc/auth/ копируем файл livestreet.class.php из папки wiki_old/inc/auth/
7. В папку wiki/lib/tpl/ копируем папку livestreet из папки wiki_old/lib/tpl/
8. В файл wiki/doku.php в самом начале после "<?php" добавляем
if ($_SERVER['REQUEST_METHOD'] == 'GET' && !$_SERVER['HTTP_REFERER'])
{
        $_SERVER['HTTP_REFERER'] = 'http://' . $_SERVER['HTTP_HOST'] .'/wiki/';
}

9. Правим файл wiki/inc/load.php

Если не внести эту правку, то при открытии http://nash_site.com/wiki/ получаем ошибку «Fatal error: Class 'PluginCtrlenter' not found in ля-ля/www/engine/classes/Engine.class.php on line 401» (Ctrlenter это плагин который у меня в LiveStreet грузится первым)
livestreet_dokuwiki_xdebug
т.к. классы LiveStreet будет пытаться подгрузить DokuWiki и LiveStreet не запуститься

находим
spl_autoload_register('load_autoload');

заменяем на это

//--spl_autoload_register('load_autoload');

До (в этом месте внес изменение в инструкцию //BEGIN)

/**
 * spl_autoload_register callback

Добавляем

load_autoload("");

(в этом месте внес изменение в инструкцию //END)

В функции load_autoload
находим
if(isset($classes[$name])){
        require_once($classes[$name]);
        return;
    }

и заменяем на это

/*if(isset($classes[$name])){
        require_once($classes[$name]);
        return;
    }*/
foreach ($classes as $aclasses) {
	require_once($aclasses);
    }

10. Правим файл wiki/lib/plugins/config/admin.php
В функции _restore_session после
if (!headers_sent()) {

добавляем
session_name("DokuWiki");
    if (version_compare(PHP_VERSION, '5.2.0', '>')) {
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
    }else{
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
    }

11. Правим файл wiki/inc/auth.php
В функции auth_createToken после
$token = md5(mt_rand());

добавляем
session_name("DokuWiki");
    if (version_compare(PHP_VERSION, '5.2.0', '>')) {
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
    }else{
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
    }

В функции auth_logoff после
global $conf;
    global $USERINFO;
    global $INFO, $ID;
    global $auth;

добавляем
session_name("DokuWiki");
    if (version_compare(PHP_VERSION, '5.2.0', '>')) {
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
    }else{
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
    }

12. Правим файл wiki/inc/common.php
В функции send_redirect после
if (isset($MSG) && count($MSG) && !defined('NOSESSION')){
        //reopen session, store data and close session again

добавляем
session_name("DokuWiki");
    if (version_compare(PHP_VERSION, '5.2.0', '>')) {
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()),true);
    }else{
        session_set_cookie_params(0,DOKU_REL,'',($conf['securecookie'] && is_ssl()));
    }


Папку wiki_old можете удалить если вам из нее ничего не надо.

Описанное решение я протестировал примерно с неделю более ошибок с сессиями не обнаружено.

Вот и все. :) В итоге мы получили обновленную DokWiki и исправили досадный баг с совпадающими именами и id-шниками сессий у DokuWiki и LiveStreet.
С точки зрения DokuWiki это и не баг совсем т.к. она сама по себе хорошо живет а баг вылез из-за интеграции DokuWiki и LiveStreet т.к. разработчик DokuWiki не указывал имя сессии когда ее открывал он-то надеялся что оно еще такое как он при запуске задал. :)

UPD: обновил инструкцию

7 комментариев

avatar
Спасибо, очень нужная статья.
Однако у меня не получается добиться результата.
Если взять пункт 9 как контрольную точку, то вместо
«Fatal error: Class 'PluginCtrlenter' not found in ля-ля/www/engine/classes/Engine.class.php on line 401»
у меня в логах
«PHP Fatal error: Class 'ModulePlugin' not found in /engine/classes/Engine.class.php on line 162»

Подскажите, с чем это может быть связано?
  • Lexx
  • 0
avatar
9-ый пункт выполнил?

Какая версия LiveStreet и DokuWiki у тебя?
avatar
0.4.2
dokuwiki_plugin_ls_1.0 (2009-12-25c «Lemming»)
с оф сайта DokuWiki dokuwiki-2011-05-25a “Rincewind”

после выполнения 8-го пункта 2 ошибки в логах
PHP Notice: Undefined index: HTTP_REFERER
PHP Fatal error: Class 'ModulePlugin' not found in /engine/classes/Engine.class.php on line 162
после выполнения 9-го пункта
PHP Notice: Undefined index: HTTP_REFERER
PHP Fatal error: Class 'DokuWiki_Plugin' not found in .wiki/lib/plugins/action.php on line 15
avatar
Перепроверил инструкцию

шаг с
//--spl_autoload_register('load_autoload');

Подправил

и
load_autoload("");

добавляем не вместо
//--spl_autoload_register('load_autoload');


а ниже блока
require_once(DOKU_INC.'inc/blowfish.php');
require_once(DOKU_INC.'inc/actions.php');
require_once(DOKU_INC.'inc/changelog.php');
require_once(DOKU_INC.'inc/common.php');
require_once(DOKU_INC.'inc/confutils.php');
require_once(DOKU_INC.'inc/pluginutils.php');
require_once(DOKU_INC.'inc/plugin.php');
require_once(DOKU_INC.'inc/events.php');
require_once(DOKU_INC.'inc/form.php');
require_once(DOKU_INC.'inc/fulltext.php');
require_once(DOKU_INC.'inc/html.php');
require_once(DOKU_INC.'inc/httputils.php');
require_once(DOKU_INC.'inc/indexer.php');
require_once(DOKU_INC.'inc/infoutils.php');
require_once(DOKU_INC.'inc/io.php');
require_once(DOKU_INC.'inc/mail.php');
require_once(DOKU_INC.'inc/media.php');
require_once(DOKU_INC.'inc/pageutils.php');
require_once(DOKU_INC.'inc/parserutils.php');
require_once(DOKU_INC.'inc/search.php');
require_once(DOKU_INC.'inc/subscription.php');
require_once(DOKU_INC.'inc/template.php');
require_once(DOKU_INC.'inc/toolbar.php');
require_once(DOKU_INC.'inc/utf8.php');
require_once(DOKU_INC.'inc/auth.php');


Пробуй ;)
avatar
всё получилось, спасибо)
avatar
Подскажите для LS 0.5 Плагин DokuWiki integration есть в природе?
avatar
если адаптировать самому… то да, в теории все должно работать, возможно исправление некоторых несовместимостей.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.