Итак, обещанный хак... Два в одном

Слова народные (идея - некто
quzax),
исправления и дополнения мои

----------------------------------------------------------
- Уровни модераторов
- Доступ модераторов к отдельным функциям Админцентра
----------------------------------------------------------
!!!!! СОВЕТУЮ ПРОЧИТАТЬ ВНИМАТЕЛЬНО!!!!!
!!!!! ОТ ЭТОГО ЗАВИСИТ НАПРЯМУЮ !!!!!
!!!!! БЕЗОПАСНОСТЬ ФОРУМА !!!!!
НЕ ЗАБЫВАЙТЕ СДЕЛАТЬ КОПИИ РЕДАКТИРУЕМЫХ ФАЙЛОВ!
----------------------------------------------------------
[B]admincenter.cgi[/B]
----------------------------------------------------------
Находим:
<br>if (($membercode eq "ad") && ($inpassword eq $password) && ($inmembername eq $membername)) {<br>
и заменяем на:
<br>if (($membercode eq "ad" || $membercode eq "m1" || $membercode eq "m2") && ($inpassword eq $password) && ($inmembername eq $membername)) {<br>
здесь m1 и m2 - уровни модераторов (не забываем, что в настоящее время уровень mo - так что если не менять ничего в других скриптах, то уровня становится три)
------------------------------------------------------
[B]setmembers.cgi[/B]
------------------------------------------------------
Заменяем:
<br>if (($membercode eq "ad") && ($inpassword eq $password) && ($inmembername eq $membername)) {<br>
на:
<br>if (($membercode eq "ad" || $membercode eq "m1" || $membercode eq "m2") && ($inpassword eq $password) && ($inmembername eq $membername)) {<p>if ($membercode eq "ad") {$admintestpassed = "true";}<br>
в этом случае дается доступ ко всем настройкам участников в админке модерам первого и второго класса... мой совет делать немного не так и выделить конкретные процедуры, к которым дать доступ (например не стоит модерам участников удалять......
для этого нужно поставить (кроме указанного выше) код
<br> if (($membercode eq "ad") && ($inpassword eq $password) && ($inmembername eq $membername)) { <br>
на каждую процедуру, к которой дается доступ (не забыть добавить
<br> }<br> else{<br> print qq~<br><tr><td bgcolor=#333333 colspan=2><font face=verdana size=3 color=#FFFFFF><b>Нет прав доступа к процедуре:</b></td></tr><br><tr><td bgcolor=#EEEEEE valign=middle align=center colspan=2><font face=verdana color=#333333 size=3><b>Данное действие разрешено только Администраторам!</b></td></tr></table></td></tr></table><br> ~;<br>}<br>
перед фигурной скобкой в конце процедуры (каждой разрешаемой)...
Далее:
<br>$memberstateoutput = qq~<select name="membercode"><option value="me">Участник<option value="banned">Изгнанный<option value="ad">Администратор<option value="mo">Модератор</select>~;<br> <p>$memberstateoutput =~ s/value=\"$membercode\"/value=\"$membercode\" selected/g;<br>
в оригинале хака было предложено заменить на:
<br>if ($admintestpassed eq "true") { <br> $memberstateoutput = qq~<select name="membercode"><option value="me">Участник<option value="banned">Изгнанный<option value="ad">Администратор<option value="mo">Модератор<option value="m1">Модератор 1<option value="m2">Модератор 2</select>~;<p> $memberstateoutput =~ s/value=\"$membercode\"/value=\"$membercode\" selected/g;<br>} else {<br> $memberstateoutput = $membercode;<br>}<br>
однако, после того, как я сделал это, модераторы, которым разрешен доступ к редактированию профилей участников стали после редактирования обнулять их или свой статус до "Участник"... что особо неприятно для самих модераторов
(если кто подскажет, почему так происходит - рассказывайте)
А для остальных:
делаем по-другому....
<br>$memberstateoutput = qq~<select name="membercode"><option value="me">Участник<option value="banned">Изгнанный<option value="ad">Администратор<option value="mo">Модератор</select>~;<br> <p>$memberstateoutput =~ s/value=\"$membercode\"/value=\"$membercode\" selected/g;<p>
не удаляем, а просто добавляем в него еще два уровня модераторов.... т.е. код:
<br><option value="m1">Модератор 1<option value="m2">Модератор 2<br>
и после этого самое главное....
если все оставить, как есть модераторы двух уровней получат доступ ко всей инфе о юзверях, в том числе к паролям!!!, а также смогут сменить себе статус вплоть до админского...
так что некоторую информацию немешало бы все-таки скрыть....
Мой выход (может, есть и попроще, но я не монстр в перле... причем совершенно не монстр):
Вместо кода:
<br><tr><br> <td bgcolor=#FFFFFF><font face=verdana color=#333333 size=1><b>Пароль:</b></td><br> <td bgcolor=#FFFFFF><input type=text size=20 name="password" value="$password"></td><br> </tr><br>
добавить проверку:
<br> ~;<br> if (($membercode eq "ad") && ($inpassword eq $password) && ($inmembername eq $membername)) {<br> print qq~ <br><tr><br> <td bgcolor=#FFFFFF><font face=verdana color=#333333 size=1><b>Пароль:</b></td><br> <td bgcolor=#FFFFFF><input type=text size=20 name="password" value="$password"></td><br></tr> <br>~;<br>}<br>else {<br><tr><br> <td bgcolor=#FFFFFF style="visibility: hidden;"><font face=verdana color=#333333 size=1><b>Пароль:</b></td><br> <td bgcolor=#FFFFFF><input type=text size=20 name="password" value="$password"></td><br></tr> <br>~;<br>}<br>
то есть скрываем строку таблицы в случае, если статус не админский....
точно также необходимо поступить и со строкой таблицы, выводящей статусы участников... и др. информацию, которую нужно скрыть от модеров...
--------------------------------------------------------
[B]setforums.cgi[/B]
--------------------------------------------------------
код...
<br>if (($membercode eq "ad") && ($inpassword eq $password) && ($inmembername eq $membername)) {<br>
если есть желание дать модерам первого уровня доступ к настройкам форумов, заменить на этот:
<br>if (($membercode eq "ad" || $membercode eq "m1") && ($inpassword eq $password) && ($inmembername eq $membername)) {<br>
-----------------------
принцип по-моему понятен... можно открывать и другие разделы админки... например бан по айпишнику....
Вроде все выложил правильно....
Если че не так - пишите сюды....
у меня все работает...
------------------
ПС... не забудьте добавить в topic.cgi новые уровни, кроме уже имеющегося mo... иначе модераторы первого и второго уровня не будут отображаться в топиках соответствующим образом... думаю это просто и разжевывать не стоит.... 
(Сообщение отредактировал JESUS 3 нояб. 2003 14:45)