htmlbook.ru - настольная книга администратора

Файловый Архив

  • Неограниченное количество категорий и суб-категорий
  • Настройки прав доступа по группам
  • Настройки прав доступа по каждой категории
  • Предпросмотр медиа файлов: FLV, IFLV, F4A, F4V, MP4, MP3, MOV и других...
  • Мультизагрузка файлов - SWFUploader
  • Добавление файлов с сервера
Подробности и история обновлений продукта в этой теме
Loading

Go Back   форум vBSupport.org > > >
Register Изображения Меню vBsupport Files Manager Аллея Звёзд Реклама на форуме Search Today's Posts Mark Forums Read
  • Мемберка
  • Администраторам
  • Premoderation
  • For English speaking users
  • Изменения в правах
  • Каталог Фрилансеров
Пароли на скачивание файлов в Member Area меняются автоматически каждый день
Если вам нужно скачать какой то скрипт, за паролем ко мне в ЛС
привет какирам kerk
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Не можете скачать вложение?
Изменения в правах групп пользователей
внимательно читаем эту и эту темы
Короткая версия - тут
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

 
 
Old  
krotozer
Простоузер
Default [4.1.x] Перенос БД с IPB 2.1.6 на vBulletin 4.1.4 4

Встала задача перенести базу данных с форума IPB версии 2.1.6 на vBulletin (версия 4.1.4). ImpEX, мягко говоря, спотыкается. Конвертация базы данных IPB в новую версию - не помогает. Приходится в свободное от работы время писать свой конвертер.

Перенос тем, постов, разделов - вопрос десятый. А вот перенос юзеров обламывается из-за различия алгоритмов хэширования паролей. Пароли не изымешь, а менять их без массовых обид не получится. Значит нужно научить vBulletin логике хэширования IPB. Делюсь решением:

Копание в коде форумов выявило сами алгоритмы:

Invision Power Board 2.1.6:
PHP Code:
$hash md5md5($salt) . md5($password) ); 
Где $salt - набор из пяти случайных печатных символов.

vBulletin 4.1.4:
PHP Code:
$hash md5md5($password) . $salt ); 
Где $salt - набор из тридцати случайных печатных символов.

Чтобы научить vBulletin логике IPB, нужно внести правки в файлы:

Файл class_dm_user.php :

1:

Ищем:

PHP Code:
define('SALT_LENGTH'30); 
Заменяем:

PHP Code:
define('SALT_LENGTH'5); 
2:

Ищем:

PHP Code:
    function hash_password($password$salt)
    {
        
// if the password is not already an md5, md5 it now
        
if ($password == '')
        {
        }
        else if (!
$this->verify_md5($password))
        {
            
$password md5($password);
        }

        
// hash the md5'd password with the salt
        
return md5($password $salt);
    } 
Заменяем:

PHP Code:
    function hash_password($password$salt)
    {
        
// if the password is not already an md5, md5 it now
        
if ($password == '')
        {
        }
        else if (!
$this->verify_md5($password))
        {
            
$password md5($password);
        }

        
// hash the md5'd password with the salt
        
return md5(md5($salt) . $password );
    } 
3:

Ищем:

PHP Code:
            if ($password == md5(md5($this->fetch_field('username')) . $salt)) 
Заменяем:

PHP Code:
            if ($password == md5(md5($salt) . md5($this->fetch_field('username')))) 
Файл functions_login.php :

Ищем:

PHP Code:
            $vbulletin->userinfo['password'] != iif($password AND !$md5passwordmd5(md5($password) . $vbulletin->userinfo['salt']), '') AND
            
$vbulletin->userinfo['password'] != iif($md5passwordmd5($md5password $vbulletin->userinfo['salt']), '') AND
            
$vbulletin->userinfo['password'] != iif($md5password_utfmd5($md5password_utf $vbulletin->userinfo['salt']), ''
Заменяем:

PHP Code:
            $vbulletin->userinfo['password'] != iif($password AND !$md5passwordmd5(md5($vbulletin->userinfo['salt']) . md5($password)), '') AND
            
$vbulletin->userinfo['password'] != iif($md5passwordmd5(md5($vbulletin->userinfo['salt']) . $md5password), '') AND
            
$vbulletin->userinfo['password'] != iif($md5password_utfmd5(md5($vbulletin->userinfo['salt']) . $md5password_utf), ''
Файл profile.php :

Ищем:

PHP Code:
        if (md5($vbulletin->userinfo['password'] . COOKIE_SALT) == $vbulletin->GPC[COOKIE_PREFIX 'password'] AND
            
$vbulletin->GPC[COOKIE_PREFIX 'userid'] == $vbulletin->userinfo['userid']
        )
        {
            
vbsetcookie('password'md5(md5($vbulletin->GPC['newpassword'] . $vbulletin->userinfo['salt']) . COOKIE_SALT), truetruetrue);
        } 
Заменяем:

PHP Code:
        if (md5($vbulletin->userinfo['password'] . COOKIE_SALT) == $vbulletin->GPC[COOKIE_PREFIX 'password'] AND
            
$vbulletin->GPC[COOKIE_PREFIX 'userid'] == $vbulletin->userinfo['userid']
        )
        {
            
vbsetcookie('password'md5(md5(md5($vbulletin->userinfo['salt']) . $vbulletin->GPC['newpassword']) . COOKIE_SALT), truetruetrue);
        } 
Хак работает - форум спокойно принимает пользователей из старой БД.

ЗЫ: Я знаю, что эта тема относится скорее к разделу http://vbsupport.org/forum/forumdisplay.php?f=57, но поссчитал это хаком, потому выложил тут. Если не прав - исправлюсь.
 
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
Old  
kerk
k0t
 
kerk's Avatar
Default 0

ок, сейчас будет работать в том виде, как исправления внесены, а дальше?
после обновления движка?
планируется каждый раз делать все перечисленные теложвижения?
или все же заставить узеров "вернуть" пасс через встроенную систему
 
Old  
krotozer
Простоузер
Default 0

Пока не решено. Проблема в том, что на форуме - свыше 250 000 пользователей. Есть "висячие" и/или заброшенные. Когда будем проводить "чистку рядов", выберем политику сохранности юзеров. Может тогда и обяжем народ менять пароли. А может и нет.

Форум не заставишь работать сразу с двумя алгоритмами. Точнее, заставить можно, но разве оно того стоит? Неужели форум обязательно обновлять буквально с каждой новой версией?

Скорее всего, поставлю логгер, который будет автоматом собирать и хэшировать пароли в отдельную таблицу. Пособираем пол годика, а потом просто скинем нарост из "мёртвых душ", оставив только тех, кто за это время авторизовался. А заставить их авторизоваться по-новой - просто: удаляем из БД все сессии и всё

Last edited by krotozer : 08-14-2011 at 08:55 PM.
 
Old  
TAIFUN
Человек
vBSSecurity
 
TAIFUN's Avatar
Default 0

Эм, поставить объяву на форум намного проще. IMO
 
Old  
krotozer
Простоузер
Default 0

Не тот контингент. Половина - ничего не читают, а просто сидят в своей теме, да общаются. Да и не хочу я обязывать людей специально вводить свои логины и пароли, ведь в правилах чётко сказано: "Администрация никогда и ни при каких обстоятельствах не потребует у вас логин и пароль, т.к. не нуждается в них.".
 
Old  
kerk
k0t
 
kerk's Avatar
Default 0

Quote:
Originally Posted by krotozer View Post
ни при каких обстоятельствах не потребует у вас логин и пароль, т.к. не нуждается в них
администрации пароли и не нужны, пользователь сам может восстановить пасс, для этого в вобле целая система есть
 
Old  
krotozer
Простоузер
Default 0

Quote:
Originally Posted by kerk View Post
администрации пароли и не нужны, пользователь сам может восстановить пасс, для этого в вобле целая система есть
Я же говорю: не стоит их ни к чему подобному принуждать. Нет желания "злить толпу") Тем более, что программа изменений и так растянута по времени. Там не только форум, но и CMS.
 
Old  
kerk
k0t
 
kerk's Avatar
Default 0

Quote:
Originally Posted by krotozer View Post
CMS, ради которой и выбрали vBulletin Suite.

ох эта "CMS" еще мозги съест...
 
Old  
krotozer
Простоузер
Default 5

Я приведу здесь ещё одну наработку по сабжу.
Однако, я не уверен, что эта информация кому-то поможет.
Зато позволит разобраться в одном из механизмов vBulletin.

Подтема: Перенос разделов.

У IPB 2.1.6 в БД ведущими полями являются:
id - содержит номер раздела;
parent_id - содержит id родительского раздела;
position - содержит индекс сортировки.
Даю замечания:
IPB 2.1.6 не позволяет создавать категории разделов внутри разделов! Только в корневом разделе. Эти категории в БД представляются как разделы - такие же, как и любые другие. Отличить их можно по parent_id, который равен -1 . Любой раздел с таким parent_id форум считает категорией. Те якобы категории, что отображаются внутри разделов, - не более чем название родительского раздела.

position - индексы в этом поле в БД могут и часто повторяются. Форум учитывает их уже после того, как отсеет записи по parent_id .
Теперь скажем про vBulletin 4.1.4:
Здесь категории и разделы - это практически одно и то же, но отображаются по-разному. Для форума категория - это параметр раздела. Т.е. параметр указывает на то, что это именно категория. Записывается это в поле options. Например, для раздела оно может быть таким: 97991, а для категории - таким: 97987.

В качестве id тут выступает forumid. В качестве parent_id тут - parentid. Указателем на корневой раздел так же является -1 . В качестве position тут - displayorder.

Но ещё тут есть очень хитрые поля: parentlist и childlist. Первый содержит индексы всех родительских разделов. Второй - индексы вложенных разделов. По ним форум определяет информацию для отображения разделов, а так же порядок их отображения. В поле displayorder при этом для всех разделов установлен индекс 1 .
Вот тут по-подробнее:
Формат parentlist такой: индексы, разделённые запятыми. Первым индексом всегда идёт ID текущего раздела. Последующими идут все разделы, в которые он вложен в порядке возрастания старшинства. Список всегда завершает терминатор -1. Обратите внимание! -1 здесь - это не указатель на корневой раздел, а лишь знак того, что список закончился!

Формат childlist такой: так же, как и parentlist, этот список начинается с ID текущего раздела, а заканчивается терминатором -1. Но между ними идёт список вложенных разделов по такому порядку: в первую очередь перебираются вложенности, а уж потом элементы списков разделов.

Поясню сказанное на примере. Для этого приведу структуру разделов:
{forumid} | {name} | {parentid}

171 | Категория-1 | -1
172 | Раздел-1 | 171
174 | Раздел-1-А | 172
175 | Раздел-1-Б | 172
173 | Раздел-2 | 171
176 | Раздел-2-А | 173
177 | Раздел-2-Б | 173
{parentlist} | {name} | {childlist}

171,-1 | Категория-1 | 171,172,174,175,173,176,177,-1
172,171,-1 | Раздел-1 | 172,174,175,-1
174,172,171,-1 | Раздел-1-А | 174,-1
175,172,171,-1 | Раздел-1-Б | 175,-1
173,171,-1 | Раздел-2 | 173,176,177,-1
176,173,171,-1 | Раздел-2-А | 176,-1
177,173,171,-1 | Раздел-2-Б | 177,-1
Теперь скажу, как сформировать эти списки:

Здесь удобно использовать рекурсию. Я приведу не полную функцию на PHP с комментариями, чтобы акцентировать внимание на алгоритме.

PHP Code:
# Перебираем весь массив таблицы разделов и устанавливаем везде childlist равным forumid для каждой записи.
Tree({массив разделов}, -1"-1");
# Перебираем весь массив таблицы разделов и в конце каждой записи childlist добавляем терминатор ",-1".

function Tree($arr$parent$parent_list) {

    foreach(
$arr as $string) {
        if(
$string['parentid'] == $parent) {

            
$this_parent_list $string['forumid'].','.$parent_list;
            
# Обновляем запись о текущем разделе в БД, подменяя parentlist на значение $this_parent_list.

            
$parent_items explode(','$string['parentlist']);
            foreach(
$parent_items as $parent_item) {
                if(
$parent_item != -&& $parent_item != $string['forumid']) {

                    
# Читаем childlist у записи с forumid равным $parent_item.
                    
$this_child_list = {прочитанный childlist}.','.$string['forumid'];
                    
# Обновляем эту запись, подменяя childlist на значение $this_child_list.

                
}
            }
            
Tree($arr$string['forumid'], $this_parent_list);
        }
    }

Вот такой код может заполнить эти списки, ориентируясь только на id, parent_id и position от IPB 2.1.6.
Теперь дам предостережения:
Если изменить таблицу разделов, то форум её не увидит. Необходимо "перестроить структуру разделов" в пункте панели администратора "обслуживание". А если по просту, обновить КЭШ. Однако, "перестроить" тут имеет особое значение.

Дело в том, что даже если составить для форума parentlist и childlist, то он их проигнорирует и после перестройки структуры отсортирует разделы по именам.

Чтобы он-таки принял порядок из IPB 2.1.6, необходимо транслировать значения position из IPB в поля displayorder у vBulletin и "перестроить структуру разделов".
Надеюсь, эти грабли пригодятся.
 
Old  
krotozer
Простоузер
Default 0

Люди, я вам нечаянно соврал!
На практике полной конвертации БД форума выяснилось, что эти списки parentlist и childlist таки оказывают существенное влияние на индексацию разделов форумом. Без них форум теряет связи между большей частью разделов. Т.е. они в базе данных присутствуют, но не доступны пользователю. Равно как и темы с постами в них.
 
 

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 10:23 AM.


Powered by vBulletin® Version 3.0.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.