parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

админский раздел по паролям

Larrikin 22.07.2003 02:44

В учевнике нету ничего про работу с парольными данными, поэтому пришлось изобретать самому... получился такой своеобразный класс
Как бы это, может кто че скажет, этот вариант вроде работает...
admin.p
@CLASS
admin
@load[]
@login[]
$date[^date::now[]]
<center>
Служебный вход. Посторонним вход воспрещен.
<br>
Пожалуйста, назовите свое имя и свой пароль
<br>
<form method="POST">
<font size="1">
Имя
</font>
<input name="user">
<font size="1">
Пароль
</font>
<input type="password" name="password">
<input type="submit" value=" Вход " name="post">
</form>
</center>
^if(def $form:post){
^if(def $form:user){
# Имя введено в форме
$admin[^table::load[admin.cfg]]
$exist[^admin.select($admin.nick eq $form:user)]
^if($exist){
$password[^math:crypt[$form:password;$exist.password]]
^if($exist.password eq $password){
# Свой
$session[^math:random(1000000000000000000)]
$sessionhash[$session]
# $sessionhash[^math:crypt[$session;^$apr1^$]]
$date_now[^date::now[]]
^MAIN:dbconnect{
^void:sql{
INSERT into session (sessionhash,
host,
userid,
username,
usergroup,
start,
lastactivity,
expired
)
VALUES ('$sessionhash',
'$env:REMOTE_ADDR',
'$exist.userid',
'$exist.nick',
'$exist.group',
'^date_now.sql-string[]',
'^date_now.sql-string[]',
'0'
)
}
}
$cookie:session[
$.value[$session]
$.expires[session]
]
$response:location[welcome.phtml]
}{
<center>
<font size=+3 color=red>
ДОСТУП ЗАПРЕЩЕН
</font>
</center>
<br>
# пишем логи подбора паролей
$sessionhash[0]
$connect_string[mysql://user:pass@localhost/db]
$date_now[^date::now[]]
^MAIN:dbconnect{
^void:sql{INSERT into session (sessionhash,
host,
userid,
username,
start,
lastactivity,
lastpage,
expired)
VALUES ('$sessionhash',
'$env:REMOTE_ADDR',
'0',
'$form:user',
'^date_now.sql-string[]',
'^date_now.sql-string[]',
'trypass: $form:password',
'^date_now.sql-string[]'
)
}
}
}
#Конец обработки чужого
}{
<center>
<font size=+3 color=red>
ДОСТУП ЗАПРЕЩЕН
</font>
</center>
<br>
}
}{
#Обработка пустого Username
<center>Поле Username обязательно для заполнения</center>
#Отображение хеша пароля при отсутствии ника
$crypted[^math:crypt[$form:password;^$apr1^$]] Hash пароля:<br>$crypted
}
}

@validate[]
$date_now[^date::now[]]
$old[^date::now(-0.005)]
^MAIN:dbconnect{
$session[
^table::sql{SELECT lastactivity,username,usergroup
FROM session
WHERE sessionhash='$cookie:session'
AND expired='0'
AND host='$env:REMOTE_ADDR'
LIMIT 1
}
]
}
^if($session){
$lastactivity[^date::create[$session.lastactivity]]
^if($lastactivity > $old){
#Авторизованый юзер со свежими cookie
$session.username
$page[$request:uri]
$uri[^page.split[/]]
^uri.menu{}
^uri.offset(-1)
^MAIN:dbconnect{
$access[
^table::sql{SELECT uri
FROM groupaccess
WHERE groupid='$session.usergroup'
AND uri ='$uri.piece'
LIMIT 1
}
]
}
^if($access){
#Авторизованый юзер со свежими cookie на разрешеной странице
^MAIN:dbconnect{
^void:sql{UPDATE session
SET lastactivity='^date_now.sql-string[]',
lastpage='$request:uri'
WHERE sessionhash='$cookie:session'
}
}
}{
#Запрещеный раздел
$response:location[./]
}
}{
#Юзер с устаревшим cookie
$response:location[./]
}
}{
#Юзер без cookie
$response:location[./]
}

@index[]
$user[^table::load[admin.cfg]]
$page[^table::load[sections.cfg]]
$group[^table::load[groups.cfg]]
<br>
^if(^group.locate[id;$session.usergroup]){
С возвращением, $group.name
<font size=+1>
<b>
$session.username
</b>
</font>
<br>
Вы можете посетить:
^MAIN:dbconnect{
$right[
^table::sql{SELECT uri
FROM groupaccess
WHERE groupid='$group.id'
}
]
}
^page.menu{
$1[$group.id $page.uri]
^if(^right.locate[uri;$page.uri]){
<br><br>
<a href=$page.uri>
<font size=+1>
$page.name
</font>
</a>
}
}
}{
# Юзер с неверной группой
Извините,
<font size=+1>
<b>
$session.username
</b>
</font>
- вас здесь не ждут больше!
<br>
<br>
Пройдите, пожалуйста, на
<a href=exit.phtml>
Выход
</a>
<br>
<br>
}

@permissions[]
$user[^table::load[admin.cfg]]
$page[^table::load[sections.cfg]]
$group[^table::load[groups.cfg]]
<form method="POST">
^group.menu{
<font size=+1>
$group.id <b>$group.name</b>
</font>
^user.menu{
^if($user.group eq $group.id){
$user.nick
}
}
<br>
^MAIN:dbconnect{
$right[
^table::sql{SELECT uri
FROM groupaccess
WHERE groupid='$group.id'
}
]
}
^page.menu{
$1[$group.id $page.uri]
^if(^right.locate[uri;$page.uri]){
<input type="submit" value="+ $page.name (Запретить)" name="$group.id $page.uri">
^if(def $form:$1){<b>-</b>
^MAIN:dbconnect{
^void:sql{DELETE from groupaccess
WHERE uri='$page.uri'
AND groupid='$group.id'
}
}
$response:location[$request:uri]
}
}{
<input type="submit" value="- $page.name (Разрешить)" name="$group.id $page.uri">
^if(def $form:$1){<b>+</b>
^MAIN:dbconnect{
^void:sql{INSERT into groupaccess (uri,groupid)
VALUES ('$page.uri','$group.id')
}
}
$response:location[$request:uri]
}
}
}[<br>]
}[<br><br>]
</form>

@exit[]
$date_now[^date::now[]]
^MAIN:dbconnect{
^void:sql{
UPDATE session SET expired='^date_now.sql-string[]'
WHERE expired='0'
}
}
$response:location[../]

@sessions[]
^MAIN:dbconnect{
$session[
^table::sql{SELECT id,
sessionhash,
userid,
usergroup,
host,
username,
lastactivity,
lastpage,
start,
expired
FROM session
ORDER by id DESC
}
]
}
<table border=1>
<tr>
<td>
<nobr>
id
</nobr>
</td>
<td>
<nobr>
sessionhash
</nobr>
</td>
<td>
<nobr>
userid
</nobr>
</td>
<td>
<nobr>
usergroup
</nobr>
</td>
<td>
<nobr>
host
</nobr>
</td>
<td>
<nobr>
username
</nobr>
</td>
<td>
<nobr>
start
</nobr>
</td>
<td>
<nobr>
lastactivity
</nobr>
</td>
<td>
<nobr>
lastpage
</nobr>
</td>
<td>
<nobr>
expired
</nobr>
</td>
</tr>
^session.menu{
<tr>
<td>
<nobr>
$session.id
</nobr>
</td>
<td>
<nobr>
$session.sessionhash
</nobr>
</td>
<td>
<nobr>
$session.userid
</nobr>
</td>
<td>
<nobr>
$session.usergroup
</nobr>
</td>
<td>
<nobr>
$session.host
</nobr>
</td>
<td>
<nobr>
$session.username
</nobr>
</td>
<td>
<nobr>
$session.start
</nobr>
</td>
<td>
<nobr>
$session.lastactivity
</nobr>
</td>
<td>
<nobr>
$session.lastpage
</nobr>
</td>
<td>
<nobr>
$session.expired
</nobr>
</td>
</tr>
}
<tr>
<td>
<nobr>
id
</nobr>
</td>
<td>
<nobr>
sessionhash
</nobr>
</td>
<td>
<nobr>
userid
</nobr>
</td>
<td>
<nobr>
usergroup
</nobr>
</td>
<td>
<nobr>
host
</nobr>
</td>
<td>
<nobr>
username
</nobr>
</td>
<td>
<nobr>
lastactivity
</nobr>
</td>
<td>
<nobr>
lastpage
</nobr>
</td>
<td>
<nobr>
start
</nobr>
</td>
<td>
<nobr>
expired
</nobr>
</td>
</tr>
</table>

в раздел admin кладется файл auto.p
auto.p
@USE
/classes/admin.p


@auto[]
$connect_string[mysql://db_user:db_user_password@localhost/db]
$locator[/cs/admin/]

@pagetitle[]
Homenet - CS - Управление сайтом -
$admin[^admin::load[]]
^admin.validate[]

И при генерации каждой странице в методе заголовка окна он проверяет права пользователя...

Другие файлы из раздела admin

admin.cfg
userid nick group password
1 Larrikin 1 $apr1$uzF7K1wf$hSbY78X5EVu8tWx1bdDcM0

example.phtml
@body_additional[]
Этот раздел тоже можно делать без потери проверки доступа

@body_main[]
Это страница просто для примера, на таких страницах размещается код управления содержимым сайта.

exit.phtml
@body_additional[]
Администрирование сайта Counter-Strike

@body_main[]
<br>
$admin[^admin::validate[]]
^admin.exit[]

groups.cfg
id name
1 Admin
2 Судья
3 Test

index.phtml
@USE
/classes/admin.p

@pagetitle[]
#Тут метод переопределен, чтобы на страницу попадать без проверки доступа можно было всем...
Homenet - CS - Управление сайтом - Login

@body[]
<br>
$admin[^admin::load[]]
^admin.login[]

permission.phtml
@body_main[]
<br>
$admin[^admin::validate[]]
^admin.permissions[]

sections.cfg
id uri name
1 welcome.phtml Welcome
2 example.phtml Example
3 permission.phtml Права
4 sessions.phtml Логи
5 exit.phtml Exit

sessions.phtml
@body_additional[]
Логи сессий

@body_main[]
$admin[^admin::validate[]]
^admin.sessions[]

welcome.phtml
@body_main[]
<br>
$admin[^admin::validate[]]
^admin.index[]