From 42f9d6469363f3ba6d009b05239d37f72691b7eb Mon Sep 17 00:00:00 2001 From: Alex Mryasov Date: Fri, 21 Aug 2026 23:48:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=BE=D0=B2=D1=8B=D1=85?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- antiflood/_antiflood.html | 28 +- auth/_auth_forgot.html | 26 +- auth/_auth_info.html | 50 ++-- auth/_auth_profile.html | 28 +- auth/_auth_setpwd.html | 18 +- auth/auth.p | 322 ++++++++++----------- auth/auth_mssql.sql | 4 +- auth/auth_mysql.sql | 104 +++---- auth/auth_oracle.sql | 4 +- auth/auth_pgsql.sql | 98 +++---- chat/js/slider/color.js | 2 +- img2/images.p | 46 +-- int2str/int2str.p | 232 +++++++-------- js_http_request/JSHttpRequest.p | 166 +++++------ js_http_request/_js_http_request_load.html | 12 +- js_http_request/_js_http_request_test.html | 6 +- mailto/mailto.p | 14 +- mdate/mdate.p | 2 +- mscroller/scroller.p | 68 ++--- 19 files changed, 615 insertions(+), 615 deletions(-) diff --git a/antiflood/_antiflood.html b/antiflood/_antiflood.html index 6fbcd1a..ceea7f4 100644 --- a/antiflood/_antiflood.html +++ b/antiflood/_antiflood.html @@ -1,61 +1,61 @@ -# . auto.p +# подключаем класс или его потомка. это можно сделать в корневом auto.p @USE antiflood.p ########################################################################### @main[][sUid;bShowForm] -# uid +# получаем uid $sUid[^antiflood:get[$form:uid]] $bShowForm(1) ^if(def $form:uid){ - ^rem{ *** $form:uid - *** } + ^rem{ *** пришло $form:uid - постят форму *** } ^try{ ^antiflood:exec{ - ^rem{ *** - *** } + ^rem{ *** проверяем все-ли в форме заполнено как надо *** } ^check[] - ^rem{ *** *** } + ^rem{ *** тут ваш код по добавлению пришедших данных куда вам больше хочется *** } ... -

.

+

Ваше сообщение было успешно добавлено.

$bShowForm(0) } }{ ^if($exception.type eq "antiflood"){ $exception.handled(1) -

.

+

Ваше сообщение уже было добавлено ранее.

$bShowForm(0) } ^if($exception.type eq "check"){ $exception.handled(1) -

.

+

Не заполнены обязательные поля формы.

} } }{ - ^rem{ *** $form:uid - *** } + ^rem{ *** если постят данные и нет $form:uid - это спамер *** } ^if(def $env:REQUEST_METHOD && ^env:REQUEST_METHOD.upper[] eq "POST"){ $response:status(404) } } ^if($bShowForm){ - ^rem{ *** - *** } + ^rem{ *** если надо - показываем форму *** }
- * :
+ * Имя:

E-mail:

- :
+ Сообщение:

- +
} #end @main[] @@ -64,6 +64,6 @@ ########################################################################### @check[] ^if(!def $form:name){ - ^throw[check; .] + ^throw[check;Не заполнены обязательные поля формы.] } #end @check[] diff --git a/auth/_auth_forgot.html b/auth/_auth_forgot.html index d1179a2..343b278 100644 --- a/auth/_auth_forgot.html +++ b/auth/_auth_forgot.html @@ -1,17 +1,17 @@ -# ! ! +# ВНИМАНИЕ! НЕ ЗАБУДЬТЕ УДАЛИТЬ ЭТОТ ФАЙЛ С РАБОЧЕГО САЙТА! @main[] -^rem{ *** sql *** } +^rem{ *** устанавливаем соединение с sql сервером *** } ^oSql.server{ - ^rem{ *** auth *** } + ^rem{ *** создаем объект класса auth *** } $auth[^auth::init[$cookie:CLASS;$form:fields;$.csql[$oSql]]] - <^;<^; + <^;<^; Информация о сессии - ^rem{ *** *** } + ^rem{ *** устанавливаем антикеширующие заголовки *** } ^auth.setExpireHeaders[] -

?

+

Забыли пароль?

$is_show_form(1) ^if(def $form:code){ @@ -23,12 +23,12 @@ $.[auth.passwd][$form:code] ] $is_show_form(0) -

'$form:name' '$form:code'.

-

.

+

Пользователю '$form:name' успешно установлен новый пароль '$form:code'.

+

Настоятельно рекомендуется зайти в профайл и изменить его.

}{ $exception.handled(1) $errors[^auth.decodeError[]] -

: ^errors.menu{$errors.name}[, ].

+

При активации нового пароля возникли следующие проблемы: ^errors.menu{$errors.name}[, ].

} } @@ -44,11 +44,11 @@ ] $is_show_form(0) -

, '$form:[auth.name]'.

+

На ваш электронный адрес выслана ссылка, зайдя по которой вы установете новый пароль пользователю '$form:[auth.name]'.

}{ $exception.handled(1) $errors[^auth.decodeError[]] -

: ^errors.menu{$errors.name}[, ].

+

При создании нового пароля возникли следующие проблемы: ^errors.menu{$errors.name}[, ].

} } @@ -56,11 +56,11 @@ ^untaint[html]{
- :
+ Логин:

E-mail:

- +
} } diff --git a/auth/_auth_info.html b/auth/_auth_info.html index 651c059..6e273e8 100644 --- a/auth/_auth_info.html +++ b/auth/_auth_info.html @@ -1,64 +1,64 @@ -# ! ! +# ВНИМАНИЕ! НЕ ЗАБУДЬТЕ УДАЛИТЬ ЭТОТ ФАЙЛ С РАБОЧЕГО САЙТА! @main[] -^rem{ *** sql *** } +^rem{ *** устанавливаем соединение с sql сервером *** } ^oSql.server{ - ^rem{ *** auth *** } + ^rem{ *** создаем объект класса auth *** } $auth[^auth::init[$cookie:CLASS;$form:fields;$.csql[$oSql]]] ^if(def $form:[auth.logout] || (def $form:[auth.logon] && $auth.is_logon)){ - ^rem{ *** logon/logout external redirect *** } + ^rem{ *** при logon/logout делаем external redirect на себя *** } $response:location[http://${env:SERVER_NAME}^request:uri.match[\?.*][]{}?^math:random(100)] } - ^rem{ *** *** } + ^rem{ *** устанавливаем антикеширующие заголовки *** } ^auth.setExpireHeaders[] - ^if($auth.is_logon){ }{} >^;>^;
+ ^if($auth.is_logon){Изменить параметры}{Регистрация} >^;>^;
^if(!$auth.is_logon){ - ^rem{ *** - *** } + ^rem{ *** если пользователь не залогинен - выводим форму для логина *** } ^auth.htmlFormLogon[ $.target_url[./_auth_info.html] ] ^if(def $form:[auth.logon]){ -

?
.

+

Забыли пароль?
Воспользуйтесь данной формой для того чтобы установить себе новый пароль.

} } - ^rem{ *** *** } + ^rem{ *** информация о сессии *** }

- :
- : $auth.init_type
- : $auth.session.session_id
- : $auth.session.sid
- : $auth.session.uid
- : $auth.session.dt_access
+ Информация о сессии:
+ Тип инициализации: $auth.init_type
+ Идентификатор сессии: $auth.session.session_id
+ Сессионная кука: $auth.session.sid
+ Пользовательская кука: $auth.session.uid
+ Дата последнего доступа: $auth.session.dt_access

- ^rem{ *** , *** } + ^rem{ *** информация о группах, зарегистрированных в системе *** }

- :
+ Группы:
^auth.groups.menu{$auth.groups.name}[
]

^if($auth.is_logon){ - ^rem{ *** *** } + ^rem{ *** информация о пользователе *** }

- :
- : $auth.user.name
+ Информация о пользователе:
+ Логин: $auth.user.name
Email: $auth.user.email
- : ^auth.user.groups.menu{$auth.user.groups.name}[, ]
- : $auth.user.dt_register
- : $auth.user.dt_logon + Состоит в группах: ^auth.user.groups.menu{$auth.user.groups.name}[, ]
+ Дата регистрации: $auth.user.dt_register
+ Дата последнего логина: $auth.user.dt_logon

}{ -

: $auth.last_name

+

Последний раз подключался пользователь: $auth.last_name

} - ^rem{ *** . *** } + ^rem{ *** выводим форму для логаута. если пользователь не залогинен форма показана не будет *** } ^auth.htmlFormLogout[$.target_url[./_auth_info.html]] } diff --git a/auth/_auth_profile.html b/auth/_auth_profile.html index 91b3a82..ada955a 100644 --- a/auth/_auth_profile.html +++ b/auth/_auth_profile.html @@ -1,53 +1,53 @@ -# ! ! +# ВНИМАНИЕ! НЕ ЗАБУДЬТЕ УДАЛИТЬ ЭТОТ ФАЙЛ С РАБОЧЕГО САЙТА! @main[] -^rem{ *** sql *** } +^rem{ *** устанавливаем соединение с sql сервером *** } ^oSql.server{ - ^rem{ *** auth. $form:fields -. /logout *** } + ^rem{ *** создаем объект класса auth. на этой странице мы не передаем классу $form:fields сл-но. тут логин/logout произойти не может *** } $auth[^auth::init[$cookie:CLASS;;$.csql[$oSql]]] - ^rem{ *** *** } + ^rem{ *** выдаем антикеширующие заголовки *** } ^auth.setExpireHeaders[] - <^;<^; + <^;<^; Информация о сессии -

^if($auth.is_logon){ }{}

+

^if($auth.is_logon){Изменение параметров}{Регистрация}

$is_show_form(1) ^if(def $form:do){ ^if($auth.is_logon){ ^try{ - ^rem{ *** *** } + ^rem{ *** сохраняем параметры существующего пользователя *** } ^auth.updateUser[$form:fields] -

.

+

Параметры пользователя сохранены.

$is_show_form(0) }{ $exception.handled(1) $errors[^auth.decodeError[]] -

: ^errors.menu{$errors.name}[, ].

+

При сохранении новых параметров пользователя возникли следующие проблемы: ^errors.menu{$errors.name}[, ].

} }{ ^try{ - ^rem{ *** *** } + ^rem{ *** регистрация нового пользователя *** } ^auth.insertUser[$form:fields] - ^rem{ *** - *** } + ^rem{ *** если регистрация прошла успешно - логиним пользователя *** } ^auth.logon[ $form:fields $.[auth.logon][do] ] -

.

+

Пользователь успешно зарегистрирован.

$is_show_form(0) }{ $exception.handled(1) $errors[^auth.decodeError[]] -

: ^errors.menu{$errors.name}[, ].

+

При регистрации нового пользователя возникли следующие проблемы: ^errors.menu{$errors.name}[, ].

} } } ^if($is_show_form){ - ^rem{ *** / *** } + ^rem{ *** если надо показываем форму регистрации/изменения параметров *** } ^auth.htmlFormProfile[ $.fields[$form:fields] $.target_url[./_auth_profile.html] diff --git a/auth/_auth_setpwd.html b/auth/_auth_setpwd.html index c9ae759..00f11bd 100644 --- a/auth/_auth_setpwd.html +++ b/auth/_auth_setpwd.html @@ -1,15 +1,15 @@ -# ! ! +# ВНИМАНИЕ! НЕ ЗАБУДЬТЕ УДАЛИТЬ ЭТОТ ФАЙЛ С РАБОЧЕГО САЙТА! @main[] -<^;<^; -

Admin

+<^;<^; Информация о сессии +

Назначение нового пароля пользователю Admin

#^if(!def $env:REMOTE_ADDR || !^env.REMOTE_ADDR.match[^^127\.]){^throw[auth;Permission denied]} ^if(def $form:code && def $form:do){ - ^rem{ *** sql *** } + ^rem{ *** устанавливаем соединение с sql сервером *** } ^oSql.server{ - ^rem{ *** auth *** } + ^rem{ *** создаем объект класса auth *** } $auth[^auth::init[$cookie:CLASS;;$.csql[$oSql]]] $admin_id(3) @@ -22,16 +22,16 @@ auser_id = $admin_id } ^auth.clearUserSessions[$admin_id;$auth.session.session_id] -

Admin $form:code

+

Пользователю Admin успешно установлен пароль $form:code

} }{ - ^rem{ *** *** } + ^rem{ *** показываем форму *** } $password[^math:md5[^math:random(1000)]]
- :
+ Новый пароль:

- +
} diff --git a/auth/auth.p b/auth/auth.p index 0d95a67..7e0c71d 100644 --- a/auth/auth.p +++ b/auth/auth.p @@ -1,66 +1,66 @@ ########################################################################### # $Id: auth.p,v 1.84 2009-08-22 23:38:28 misha Exp $ # -# auth +# КЛАСС auth # -# , auth.uid auth.sid -# auth.uid - , -# auth.sid - -# asession +# Класс предназначен для установления сессии работы, состояние запоминается в куках auth.uid и auth.sid +# auth.uid - кука пользователя, которая дается на определенный срок и продляется при каждом новом сеансе работы +# auth.sid - кука сессии +# все выданые куки пишутся в таблицу asession # -# : -# $init_type - int, -# -1 - , -# 0 - -# 1 - -# 2 - sid sid , sid, -# 3 - sid uid , , sid, uid, . -# $status int, . - -# $session hash, +# СВОЙСТВА ОБЪЕКТА: +# $init_type - int, тип инициализации сессии произошел +# -1 - еще не знаем, включены куки у этого пользователя или нет +# 0 - продолжение текущей сессии +# 1 - обновили в базе дату +# 2 - в базе sid не соответствовало sid в куках, выдали новый sid, обновили базу +# 3 - sid и uid в базе не соответствовали тому, что в куках, выбрали новый sid, uid, обновили базу. +# $status int, статус последней операции. сразу после конструирования объекта - результат логина +# $session hash, информация о текущей сессии # [ session_id, sid, uid, dt_access, dt_logon, dt_logout ] -# $groups table, +# $groups table, информация о всех группах # [ group_id, name, description, rights, is_default ] -# $user hash, , +# $user hash, параметры пользователя, если он подключен # [ user_id, name, email, dt_register, dt_logon, dt_logout, rights, event_type, connections_limit, groups ] -# $is_logon int, (1) (0) -# $last_name string, ( $icookie_data) +# $is_logon int, залогинен пользователь (1) или нет (0) +# $last_name string, имя последнего удачно залогиненого пользователя (берем из $icookie_data) # -# : -# @init[icookie_data;ilogon_data;params] , / asession -# def $logon_data.[auth.logon], ^logon[] -# def $logon_data.[auth.logout], ^logout[] -# $params -# @logon[logon_data] $logon_data.[auth.name] $logon_data.[auth.passwd], -# $logon_data.[auth.logon] -# @logout[] -# @insertUser[user_data] , -# $logon_data.[auth.name], $logon_data.[auth.email] $logon_data.[auth.passwd] -# -# @updateUser[user_data] , -# $logon_data.[auth.name], $logon_data.[auth.email] $logon_data.[auth.passwd] +# МЕТОДЫ ОБЪЕКТА: +# @init[icookie_data;ilogon_data;params] инициализирует сессию, обновляя/добавляя запись в таблицу asession +# если def $logon_data.[auth.logon], то идет вызов ^logon[] +# если def $logon_data.[auth.logout], то идет вызов ^logout[] +# $params определяет поведение класса +# @logon[logon_data] логин пользователя с $logon_data.[auth.name] и $logon_data.[auth.passwd], +# если определена $logon_data.[auth.logon] +# @logout[] отключение текущего пользователя +# @insertUser[user_data] добавляет в базу информацию о пользователе, записывая параметры +# $logon_data.[auth.name], $logon_data.[auth.email] и $logon_data.[auth.passwd] +# возвращает статусы +# @updateUser[user_data] обновляет в базе информацию о текущем пользователе, записывая параметры +# $logon_data.[auth.name], $logon_data.[auth.email] и $logon_data.[auth.passwd] # @makeRandomID[] make random code using ^math:md5[] # @makeSessionID[] make random session code -# @saveParam[sParamName;sParamValue;iExpires] ( , - ) -# @setTemporaryPasswd[email;name] ( -# ) . -# - . -# @setPasswdFromTemporary[email;name;code] email[/name]/code [new_passwd] -# passwd -# @getUser[hParams] -# @getAllUsers[] -# @getGroups[] -# @getUserGroups[sUserList] , -# @getGroupUsers[iGroupId] -# @getACL[object_list;user_list] ACL () -# @getFullACL[object_list] ACL , -# @getRightsToObject[object;thread;acl;is_owner] -# @setExpireHeaders[date] Last-Modified, Expires +# @saveParam[sParamName;sParamValue;iExpires] сохраняет значение (по умолчанию в куках, если надо иное - перекрыть) +# @setTemporaryPasswd[email;name] вставляет в базу сгенерированный временный пароль (чтобы его активировать +# нужно подтверждение) и возвращает его. Если пользователя с таким адресом +# нет - возвращает пустое значение. +# @setPasswdFromTemporary[email;name;code] проверяет комбинацию email[/name]/code [new_passwd] и в случае совпадения +# переписывает его в passwd +# @getUser[hParams] достает из БД информацию о пользователе по заданым параметрам +# @getAllUsers[] достает из БД список всех пользователей +# @getGroups[] достает из БД список групп +# @getUserGroups[sUserList] возвращает список групп, в которых состоят пользователи +# @getGroupUsers[iGroupId] возвращает список пользователей для заданой группы с их правами +# @getACL[object_list;user_list] достает из БД ACL списка пользователей (групп) на объекты +# @getFullACL[object_list] возвращает ACL пользователя и групп, в которых он состоит на объекты +# @getRightsToObject[object;thread;acl;is_owner] вычисляет эффективные права пользователя на объект +# @setExpireHeaders[date] ставит заданную дату в Last-Modified, иначе ставит Expires # @xmlFormLogon[hParams] print xml for logon form # @xmlFormLogout[hParams] print xml for logout form # @htmlFormLogon[hParams] print html for logon form # @htmlFormLogout[hParams] print html for logout form # @cryptPassword[sPassword] crypt password using ^math:crypt[] -# @isValidPassword[sPassword;sPasswordCrypted] bool +# @isValidPassword[sPassword;sPasswordCrypted] проверяет пароль и возвращает bool @@ -87,22 +87,22 @@ $rights_hash[^hash::create[]] ########################################################################### # constructor -# $icookie_data cookie ($cookie:CLASS) -# $ilogon_data, logon/logout -# $ilogon_data $form:fields , logon/logout -# $params - , . ( ): -# $.is_groups_disabled(0) - -# $.is_delay_groups(0) - -# $.session_lifetime(14) - asession, -# $.cookie_sid_lifetime(0) - , , (0 - ) -# $.cookie_uid_lifetime(365) - , , -# $.timeout(15) - , dt_access asession, -# $.event_lifetime(7) - aevent_log, -# $.event_min_count(30) - , -# $.new_user_event_type(147) - +# в качестве $icookie_data обычно передаются все cookie ($cookie:CLASS) +# если определена $ilogon_data, то при инициализации идет попытка logon/logout пользователя +# обычно в $ilogon_data стОит передавать $form:fields со странички, с которой осуществляется logon/logout +# $params - хеш, определяющий поведение класса. возможные ключи (в скобках указаны значения по умолчанию): +# $.is_groups_disabled(0) - не доставать группы +# $.is_delay_groups(0) - не доставать полный список групп пока он не потребуется +# $.session_lifetime(14) - время хранения записей в табличке asession, дней +# $.cookie_sid_lifetime(0) - время, на которое ставится сессионная кука, дней (0 - сессионная кука) +# $.cookie_uid_lifetime(365) - время, на которое ставится пользовательская кука, дней +# $.timeout(15) - время, через которое мы обновляем поле dt_access в asession, минут +# $.event_lifetime(7) - время хранения записей в табличке aevent_log, дней +# $.event_min_count(30) - количество последних хранящихся записей событий для каждого пользователя, записей +# $.new_user_event_type(147) - какие события у вновь создаваемых пользователей будем писать в лог @init[icookie_data;ilogon_data;params] -# $icookie_data - . +# если нам не передали $icookie_data - то данные берем из кук. $cookie_data[^if(def $icookie_data){$icookie_data}{$cookie:CLASS}] $logon_data[^hash::create[$ilogon_data]] @@ -111,7 +111,7 @@ $logon_data[^hash::create[$ilogon_data]] ^self.initSession[$cookie_data] -# +# инициализируем пользователя ^try{ ^self.logon[$logon_data] }{ @@ -127,7 +127,7 @@ $logon_data[^hash::create[$ilogon_data]] ########################################################################### -# , +# НЕ ПЕРЕКРЫВАТЬ, иначе переменные не будут видны из родительского класса @declareVars[params] $now[^date::now[]] $last_name[] @@ -154,7 +154,7 @@ $user[ ^self.initErrorTable[] -# , sql +# нам ОБЯЗАТЕЛЬНО должны передать объект, через который будут делаться все sql запросы $oSql[^if(def $params.oSql){$params.oSql}{$params.csql}] ^if(!def $oSql){ ^throw[auth;Initialization failure. ^$.oSql or ^$.csql option MUST be specified.] @@ -165,17 +165,17 @@ $csql[$oSql] $EVENT[^events.menu{$.[$events.name][$events.id]}] $ERROR[^errors.menu{$.[$errors.name][$errors.id]}] -# - +# если нам не нужны группы - можно отключить их $is_groups_disabled(^params.is_groups_disabled.int(0)) -# ( $is_delay_groups) - +# если полный список групп пока не нужен (определен флаг $is_delay_groups) - не достаем их ^if($is_groups_disabled || ^params.is_delay_groups.int(0)){ $groups[^table::create{}] }{ ^self.getGroups[] } -# logon logon_data.[auth.persistent] +# если идет logon то запоминаем значение пришеднее в logon_data.[auth.persistent] ^if(def $logon_data.[auth.logon]){ $is_persistent(^if(^logon_data.[auth.persistent].int(0)){1}{0}) ^self.saveParam[auth.persistent;$is_persistent;365] @@ -183,25 +183,25 @@ $is_groups_disabled(^params.is_groups_disabled.int(0)) $is_persistent(^cookie_data.[auth.persistent].int(0)) } -# asession () +# время хранения записей в табличке asession (дней) $session_lifetime(^params.session_lifetime.int(14)) -# , (, 0 - , persistent, ) +# время, на которое ставится сессионная кука (дней, 0 - сессионная, если установлен persistent, то ставим на год ) $cookie_sid_lifetime(^params.cookie_sid_lifetime.double(^if($is_persistent){365}{0})) -# , () +# время, на которое ставится пользовательская кука (дней) $cookie_uid_lifetime(^params.cookie_uid_lifetime.double(365)) -# , dt_access asession () +# время, через которое мы обновляем поле dt_access в таблице asession (минут) $timeout(^params.timeout.int(15)) -# aevent_log () +# время жизни записей в табличке aevent_log (дней) $event_lifetime(^params.event_lifetime.int(7)) -# +# сколько минимально последних записей мы храним по каждому пользователю $event_min_count(^params.event_min_count.int(30)) -# event_type, : // +# event_type, который автоматически прописывается новым юзерам: пишем логин/логаут/изменение имени $new_user_event_type(^params.new_user_event_type.int($EVENT.update_user + $EVENT.logon + $EVENT.logout + $EVENT.change_name)) ^if($params.additional_fields is "table"){ @@ -214,25 +214,25 @@ $new_user_event_type(^params.new_user_event_type.int($EVENT.update_user + $EVENT ########################################################################### -# , +# события, которые у нас бывают @getEvents[] $result[^table::create{id name description is_editable 1 logon Login 1 2 logout Logout 1 -4 request_password 1 -8 change_password 1 -16 change_name 1 -32 change_email email 1 -64 change_rights -128 update_user -256 insert_user +4 request_password Запрос пароля 1 +8 change_password Изменение пароля 1 +16 change_name Изменение логина 1 +32 change_email Изменение email 1 +64 change_rights Изменение прав +128 update_user Изменение пользователя +256 insert_user Добавление пользователя }] #end @getEvents[] ########################################################################### -# , 16 +# коды ошибок, думаю 16 бит должно хватить @getErrors[] $result[^table::create{id name 1 not_logged @@ -250,14 +250,14 @@ $result[^table::create{id name ########################################################################### -# $cookie_data +# инициализация сессии на основании $cookie_data @initSession[cookie_data][last_sessions;valid_session;sid;uid] $valid_session[^hash::create[]] ^if(def $cookie_data.[cookie] || def $cookie_data.[auth.uid]){ ^if(def $cookie_data.[auth.uid]){ - ^rem{ *** auid, . , *** } - ^rem{ *** - , sid , *** } - ^rem{ *** sid ( ) - . *** } + ^rem{ *** достаем все записи с auid, который пришел от пользователя. записей может быть несколько, *** } + ^rem{ *** но актуальная только одна - та, у которой наша sid или, *** } + ^rem{ *** если от юзера не пришла sid (новая сессия) - самая последняя. *** } $last_sessions[^oSql.table{ SELECT asession_id AS session_id, @@ -308,20 +308,20 @@ $session[$valid_session] ########################################################################### -# logon_data, , -# - asession_id -# $init_type = 0 - +# если задана logon_data, то попытка логина с задаными параметрами, +# иначе - попытка установить связь по текущей asession_id +# если $init_type = 0 - у нас продолжение секущей сессии @logon[logon_data][_type;_user] ^self.initStatus(0) $_type[auth.logon] ^try{ ^if($init_type >= 0 && $init_type < 3){ - ^rem{ *** $session.user_id *** } + ^rem{ *** достаем информацию о текущем юзере по $session.user_id *** } $_user[^self.getUser[ $.user_id(^session.user_id.int(0)) ]] ^if($init_type == 2){ - ^rem{ *** , ... ... *** } + ^rem{ *** ни фига не помню, зачем я это делаю... надо разобраться... *** } ^oSql.void{ UPDATE asession @@ -334,13 +334,13 @@ $_type[auth.logon] $_user[] }{ ^if(def $logon_data.[auth.logon]){ - ^rem{ *** logon - *** } + ^rem{ *** если при этом идет logon - то надо отлогинить текущего юзера *** } ^self.logout[] } } } ^if($init_type >= 0 && def $logon_data.[auth.logon] && def $logon_data.[auth.name] && def $logon_data.[auth.passwd]){ - ^rem{ *** logon - / *** } + ^rem{ *** если идет logon - достаем информацию о пользователе по введенным имени/паролю *** } $_user[^self.getUser[ $.name[$logon_data.[auth.name]] $.password[$logon_data.[auth.passwd]] @@ -349,7 +349,7 @@ $_type[auth.logon] ^self.addErrorCode[user_not_found] ^throw[$_type;errors] } - ^rem{ *** *** } + ^rem{ *** обновляем информацию о сессии и пользователе в базе *** } ^oSql.void{ UPDATE asession @@ -403,7 +403,7 @@ $last_name[$cookie_data.[auth.name]] ########################################################################### -# +# завершение текущей авторизированой сессии пользователя @logout[] ^if($session){ ^oSql.void{ @@ -425,7 +425,7 @@ $last_name[$cookie_data.[auth.name]] WHERE auser_id = $user.user_id } - ^rem{ *** *** } + ^rem{ *** пишем в лог об этом событии *** } ^self.logEvent[$user]($EVENT.logout) } } @@ -483,7 +483,7 @@ $result[^table::create{code name}] ########################################################################### -# 1 $name +# возвращает 1 если в последней операции произошла ошибка $name @isError[sErrorName] $result(^if($status & $ERROR.$sErrorName){1}{0}) #end @isError[] @@ -491,8 +491,8 @@ $result(^if($status & $ERROR.$sErrorName){1}{0}) ########################################################################### -# event_type -# - +# запись логов в соответствии с event_type +# если у данного пользователя установлен бит на протоколирование текущего события - добавляем в лог запись @logEvent[user;event_type;status;content][user_id;event;exist;keep_events;addon] ^if($user && $user.event_type & $event_type){ $event($event_type) @@ -527,7 +527,7 @@ $result(^if($status & $ERROR.$sErrorName){1}{0}) '^self.getStationAddr[]${addon}^if(def $content){, $content}' )} - ^rem{ *** now() - $event_lifetime, $event_min_count *** } + ^rem{ *** надо удалить все сообщения старее чем now() - $event_lifetime, но оставить не меньше чем $event_min_count *** } $keep_events[^oSql.table{ SELECT aevent_log_id AS id @@ -601,7 +601,7 @@ $result[] ########################################################################### -# +# добавление нового пользователя @insertUser[user_data][_type] $_type[auth.insert] ^self.initStatus(0) @@ -649,10 +649,10 @@ $_type[auth.insert] ] ^try{ - ^rem{ *** *** } + ^rem{ *** загружаем полный список групп *** } ^self.getGroups[] - ^rem{ *** , is_default *** } + ^rem{ *** включаем вновь добавленного пользователя в группы, у которых установлен флаг is_default *** } ^groups.menu{ ^if($groups.is_default){ ^oSql.void{INSERT INTO auser_to_auser ( @@ -665,7 +665,7 @@ $_type[auth.insert] } } }{ - ^rem{ *** - () *** } + ^rem{ *** если не удалось добавить пользователя в группы - ну и хрен с ними (пока) *** } $exception.handled(1) } ^self.postInsert[$new_user.user_id;$user_data] @@ -685,7 +685,7 @@ $_type[auth.insert] ########################################################################### -# +# метод выполняется после успешного добавления нового пользователя @postInsert[iUserId;hUser] #end @postInsert[] @@ -724,7 +724,7 @@ $result[] ########################################################################### -# +# изменение параметров пользователя @updateUser[user_data][_type;_event_type;_comment;_user] $_type[auth.update] ^self.initStatus(0) @@ -798,14 +798,14 @@ $_type[auth.update] ########################################################################### -# +# метод выполняется после успешного изменения параметров пользователя @postUpdate[iUserId;hUser] #end @postUpdate[] ########################################################################### -# email/name -# email/name ( ) , +# генерит и запоминает новый пароль для пользователя с заданым email/name +# в случае наличия пользователя с этим email/name (причем валидным) возвращает пароль, иначе возвращает пустую строку @setTemporaryPasswd[email;name][_type;_exist;_user] $result[] $_type[auth.set_temporary_password] @@ -867,7 +867,7 @@ $_type[auth.set_temporary_password] ########################################################################### -# $email[/$name]/$code +# для пользователя с заданной комбинацией $email[/$name]/$code делает временный пароль в постоянным @setPasswdFromTemporary[email;name;code][_exist;_stat;_user] $_type[auth.set_password_from_temporary] ^self.initStatus(0) @@ -924,7 +924,7 @@ $_type[auth.set_password_from_temporary] ########################################################################### -# asession +# метод апдейтит запись в таблице asession @updateSession[uid;sid;session_id] ^oSql.void{ DELETE FROM @@ -934,7 +934,7 @@ $_type[auth.set_password_from_temporary] ^if(def $session_id){AND asession_id != ^session_id.int(0)} } ^if(def $session_id){ - ^rem{ *** *** } + ^rem{ *** апдейтим запись в базе *** } ^oSql.void{ UPDATE asession @@ -952,7 +952,7 @@ $_type[auth.set_password_from_temporary] $.dt_access[^now.sql-string[]] ] }{ - ^rem{ *** *** } + ^rem{ *** добавляем запись в базу *** } ^oSql.void{INSERT INTO asession ( auid, sid, @@ -980,9 +980,9 @@ $_type[auth.set_password_from_temporary] ########################################################################### -# -# auth.uid.updated , (7 ), -# , auth.uid, auth.uid... +# метод пишет сессионные параметры пользователю +# смысл парметра auth.uid.updated в том, что он выдается на достаточно небольшой период (7 дней), и если вдруг он +# уже устарел, то заново сохраняем его и auth.uid, таким образом не нужно каждый раз сохранять auth.uid... @updateSessionParams[sid;uid;is_force_set_uid] ^if(def $is_force_set_uid || !def $cookie_data.[auth.uid.updated] || $cookie_data.[auth.uid] ne $uid){ ^self.saveParam[auth.uid;$uid;$cookie_uid_lifetime] @@ -1003,7 +1003,7 @@ $result[^math:md5[^now.sql-string[]^math:random(1000000)]] ########################################################################### -# +# метод возвращает информацию о компьютере посетителя @getStationAddr[] $result[^if(def $env:REMOTE_ADDR){$env:REMOTE_ADDR}{NULL}:^if(def $env:HTTP_X_FORWARDED_FOR){$env:HTTP_X_FORWARDED_FOR}{NULL}] #end @getStationAddr[] @@ -1020,8 +1020,8 @@ $result[^self.getStationAddr[]=^self.makeRandomID[]] ########################################################################### -# asession .. -# +# у каждого пользователя сохраняем самую последнюю запись в asession т.к. по ней мы +# сможет восстановить его сессию после долгого перерыва и получить дату последнего визита @clearSession[date_diff][cleared_users;deleted_sessions;uid;cnt;ids;tmp] # clear expired non authorized sessions @@ -1047,7 +1047,7 @@ $cleared_users[^oSql.table{ COUNT(*) > 1 }] ^if($cleared_users){ - ^rem{ *** , *** } + ^rem{ *** достаем сессии, которые надо будет удалять *** } $deleted_sessions[^oSql.table{ SELECT asession_id AS id, @@ -1248,8 +1248,8 @@ $result[] ########################################################################### -# root -# $sUserList +# достает ид БД список групп в которых состоят пользователи с их правами на root +# если не задали $sUserList то возвращаем данные о принадлежности к группам для текущего пользователя @getUserGroups[sUserList] $result[^oSql.table{ SELECT @@ -1300,7 +1300,7 @@ $result[^oSql.table{ ########################################################################### -# Access Control List (ACL) (, ) +# достает из БД Access Control List (ACL) списка пользователей (групп, овнера) на объекты @getACL[sObjectList;sUserList] $result[^oSql.table{ SELECT @@ -1331,13 +1331,13 @@ $result[^oSql.table{ ########################################################################### -# ACL , +# возвращает информацию о ACL пользователя и групп, в которых он состоит на объекты @getFullACL[object_list][obj_list;acl] $obj_list[^if($object_list is "table" && $object_list){^object_list.menu{$object_list.id}[,]}{$object_list}] ^self.loadUserGroups[] -^rem{ *** owner auser_id = 1 *** } +^rem{ *** у объекта owner auser_id = 1 *** } $acl[^self.getACL[$obj_list;1,^user.groups.menu{$user.groups.group_id,}$user.user_id]] $result[ $.user[^acl.select($acl.auser_type_id == $USER_ID)] @@ -1360,57 +1360,57 @@ $result[] ########################################################################### -# , -# , -# $object [table/hash] ($object.id, $object.parent_id, $object.irf) -# $thread [table] ( - , ) -# $acl [hash] , , , , +# Вычисляет эффективные права текущего пользователя на объект, рекурсивно вызывая себя при необходимости +# Полученые права сохраняет в хеше, чтобы повторно не считать их +# в $object [table/hash] должен быть сам объект ($object.id, $object.parent_id, $object.irf) +# в $thread [table] должны быть все его родители (с такими-же полями, как минимум) +# в $acl [hash] должны быть права юзера, овнера, групп, в которых он состоит, на все объекты треда @getRightsToObject[object;thread;acl;is_owner][parent_rights;level_user_acl;level_group_acl;level_owner_acl;level_rights] ^if($object){ ^if($rights_hash.[$object.id]){ - ^rem{ *** - *** } + ^rem{ *** если права есть в хеше - забираем их *** } $result($rights_hash.[$object.id]) }{ ^if($thread){ ^if(^object.irf.int(0)){ - ^rem{ *** irf 0 - , *** } - ^rem{ *** locate - root *** } + ^rem{ *** если у объекта irf не равен 0 - вычисляем права на родителя, вызывая себя рекурсивно *** } + ^rem{ *** если locate не находит очередного родителя - значит достаем права данные на root *** } $parent_rights(^self.getRightsToObject[^if(^thread.locate[id;$object.parent_id]){$thread.fields};$thread;$acl;$is_owner]) }{ - ^rem{ *** irf 0 ( ) - *** } + ^rem{ *** irf равен 0 (все замаскировано) - права можно не считать *** } $parent_rights(0) } - ^rem{ *** , (+ ) *** } + ^rem{ *** вычисляем права, данные на текущий объект пользователю (+ как овнеру) и группам в которых он состоит *** } $level_rights(0) $level_user_acl[^acl.user.select($acl.user.object_id == $object.id)] ^if($level_user_acl){ - ^rem{ *** , *** } + ^rem{ *** если есть право данное непосредственно пользователю, то это право перекрывает право данное через группы *** } $level_rights($level_rights | $level_user_acl.rights) }{ - ^rem{ *** , *** } + ^rem{ *** добавляем права, данные ему через членство в группах *** } $level_group_acl[^acl.group.select($acl.group.object_id == $object.id)] ^level_group_acl.menu{$level_rights($level_rights | $level_group_acl.rights)} } - ^rem{ *** owner-, $is_owner *** } + ^rem{ *** добавляем его права как owner-а, если установлен флаг $is_owner *** } ^if($is_owner){ $level_owner_acl[^acl.owner.select($acl.owner.object_id == $object.id)] ^level_owner_acl.menu{$level_rights($level_rights | $level_owner_acl.rights)} } - ^rem{ *** , ( irf ) *** } + ^rem{ *** к правам пришедших от родителя добавляем права, данные на этот объект (с учетом irf объекта) *** } $result(($parent_rights & ^object.irf.int(0)) | $level_rights) - ^rem{ *** , , *** } + ^rem{ *** кладем посчитаное значение в хеш, чтобы не считать еще раз, если понадобится *** } ^self.addRightsToHash[rights_hash;$object.id;$result] }{ - ^rem{ *** , . ... *** } + ^rem{ *** не передали информацию о треде, а он нам нужен. посчитать ничего не можем... *** } ^throw[auth;Thread with objects MUST be defined.] } } }{ - ^rem{ *** object, root - *** } + ^rem{ *** не задан object, значит просят права на root - отдаем их *** } ^if($rights_hash.[0]){ - ^rem{ *** - *** } + ^rem{ *** если права есть в хеше - забираем их *** } $result($rights_hash.[0]) }{ ^if($user.rights){ @@ -1500,10 +1500,10 @@ $hParam[^hash::create[$hParam]] > $hParam.addon - - - - + + + + } #end @xmlFormLogon[] @@ -1525,7 +1525,7 @@ $hParam[^hash::create[$hParam]] $hParam.addon $user.name - + } } @@ -1549,10 +1549,10 @@ $_hParams[^hash::create[$hParams]] - - + + - + $_hParams.post_addon } @@ -1572,12 +1572,12 @@ $hParam[^hash::create[$hParam]] } > - :
+ Логин:

- :
-
-
- + Пароль:
+
+
+ } #end @htmlFormLogon[] @@ -1597,7 +1597,7 @@ $hParam[^hash::create[$hParam]] } > - + } } @@ -1623,12 +1623,12 @@ $_hParams[^hash::create[$hParams]]
* E-mail:

- ^if(!$is_logon){* }:
+ ^if(!$is_logon){* }Пароль:

- ^if(!$is_logon){* } :
+ ^if(!$is_logon){* }Подтверждение пароля:

- + $_hParams.post_addon } diff --git a/auth/auth_mssql.sql b/auth/auth_mssql.sql index b751412..85bc3ca 100644 --- a/auth/auth_mssql.sql +++ b/auth/auth_mssql.sql @@ -196,8 +196,8 @@ GO /* Insert DEFAULT data */ /*==============================================================*/ SET IDENTITY_INSERT auser ON; -INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (1, 'Owner', 'onwner', 'owner', ' ', 2, 16777215, 1, GETDATE()); -INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (2, 'Admins', 'group', 'group', ' ', 1, 16777215, 1, GETDATE()); +INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (1, 'Owner', 'onwner', 'owner', 'Владелец объектов', 2, 16777215, 1, GETDATE()); +INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (2, 'Admins', 'group', 'group', 'Все администрирующие пользователи', 1, 16777215, 1, GETDATE()); INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (3, 'admin', 'admin', 'misha@design.ru', '', 0, 16777215, 1, GETDATE()); INSERT INTO auser_to_auser (auser_id, parent_id) VALUES (3,2); SET IDENTITY_INSERT auser OFF; diff --git a/auth/auth_mysql.sql b/auth/auth_mysql.sql index 918c25d..a0f8988 100644 --- a/auth/auth_mysql.sql +++ b/auth/auth_mysql.sql @@ -18,7 +18,7 @@ drop table if exists auser_to_auser; /*==============================================================*/ /* Table: acl */ /*==============================================================*/ -/* */ +/* назначеные на объект права */ create table if not exists acl ( object_id INTEGER UNSIGNED not null default 0, @@ -27,9 +27,9 @@ create table if not exists acl unique (auser_id, object_id) ); -/* object_id - */; +/* object_id - связка с объектом */; -/* rights - - , - . */; +/* rights - младший байт - права на объект, старший - на свойства. */; /*==============================================================*/ /* Table: aevent_log */ @@ -46,15 +46,15 @@ create table if not exists aevent_log primary key (aevent_log_id) ); -/* auser_id - */; +/* auser_id - собственно про кого записываем */; -/* event_type - ( auser) */; +/* event_type - что за событие (описаны у auser) */; -/* stat - (, ) */; +/* stat - статус (например, пытались добавлять и ошибка) */; -/* dt - */; +/* dt - когда залогили */; -/* content - - ... */; +/* content - тут пишем что-то о событии... */; /*==============================================================*/ /* Index: ix_aevent_log_0 */ @@ -68,7 +68,7 @@ create index ix_aevent_log_0 on aevent_log /*==============================================================*/ /* Table: asession */ /*==============================================================*/ -/* , */ +/* сессии, по которым отслеживается залогиненость */ create table if not exists asession ( asession_id INTEGER UNSIGNED not null AUTO_INCREMENT, @@ -81,15 +81,15 @@ create table if not exists asession primary key (asession_id) ); -/* sid - , */; +/* sid - кука, выдающаяся на сессию */; -/* auid - , */; +/* auid - кука, выдающаяся на постоянку */; -/* dt_access - */; +/* dt_access - время последнего доступа */; -/* dt_logon - */; +/* dt_logon - время последнего логина */; -/* dt_logout - */; +/* dt_logout - время последнего логаута */; /*==============================================================*/ /* Index: ix_asession_0 */ @@ -119,22 +119,22 @@ create index ix_asession_2 on asession /*==============================================================*/ /* Table: auser */ /*==============================================================*/ -/* - owner (auser_type_id = 3) - , . - .. / , - - , - , - . - event_type - , : - 1 - , - 2 - , - 8 - , +/* пользователи и группы + есть такая фигня как owner (auser_type_id = 3) + его права меньше, чем права пользователя и права группы. + т.е. если пользователю/группе назначены права то мы не смотрим на овнера, + если не назначены - смотрим, он-ли овнер, и если он - берем эти права. + event_type - что записываем, битовая маска: + 1 - логин, + 2 - логаут, + 8 - смена пароля, 4 - request_password, - 16 - , - 32 - email, - 64 - , - 128 - , - 256 - - ... */ + 16 - смена имени, + 32 - смена email, + 64 - изменение прав пользователю, + 128 - изменение пользователя, + 256 - добавление пользователя + ... потом дальше придумаю */ create table if not exists auser ( auser_id INTEGER UNSIGNED not null AUTO_INCREMENT, @@ -156,33 +156,33 @@ create table if not exists auser unique (auser_type_id, name) ); -/* auser_type_id - (0 - , 1 - ) */; +/* auser_type_id - тип пользователя (0 - пользователь, 1 - группа) */; -/* rights - / */; +/* rights - права пользователя/группы на корень дерева */; -/* name - */; +/* name - имя для подключения */; -/* description - ( ) */; +/* description - описание (например для группы) */; -/* email - email */; +/* email - email пользователя */; -/* passwd - */; +/* passwd - пароль */; -/* new_passwd - ( , ) */; +/* new_passwd - новый пароль (если забыли, генериться и живет пока не подтвердят) */; -/* dt_register - / */; +/* dt_register - дата/время регистрации */; -/* dt_logon - / */; +/* dt_logon - дата/время последнего логина */; -/* dt_logout - / */; +/* dt_logout - дата/время последнего логаута */; -/* is_published - */; +/* is_published - разрешен доступ или нет */; -/* is_default - . 1 */; +/* is_default - для групп. если установлена в 1 то новый пользователь включается в группу */; -/* connections_limit - */; +/* connections_limit - количество одновременных подключений */; -/* event_type - , */; +/* event_type - битовая маска, что записываем в лог */; /*==============================================================*/ /* Index: ix_auser_0 */ @@ -225,12 +225,12 @@ create index ix_auser_3 on auser /*==============================================================*/ /* Table: auser_to_auser */ /*==============================================================*/ -/* +/* принадлежность пользователя группе - rights ( ): + rights (права пользователя на группу): 0 - User - 1 - Supervisory ( ) - 2 - Remove self ( ?) */ + 1 - Supervisory (может включать в группу кого угодно) + 2 - Remove self (а надо?) */ create table if not exists auser_to_auser ( auser_id INTEGER UNSIGNED not null default 0, @@ -238,11 +238,11 @@ create table if not exists auser_to_auser rights INTEGER UNSIGNED not null default 0 ); -/* auser_id - ( ) */; +/* auser_id - кто (ссылка на пользователя) */; -/* parent_id - ( ) */; +/* parent_id - в какую группу включен (ссылка на группу) */; -/* rights - , */; +/* rights - права, с которые пользователь имеет на группу */; /*==============================================================*/ /* Index: ix_auser_to_auser_0 */ @@ -258,7 +258,7 @@ create unique index ix_auser_to_auser_0 on auser_to_auser /*==============================================================*/ /* Insert default data */ /*==============================================================*/ -INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (1, 'Owner', 'onwner', 'owner', ' ', 2, 16777215, 1, NOW()); -INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (2, 'Admins', 'group', 'group', ' ', 1, 16777215, 1, NOW()); +INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (1, 'Owner', 'onwner', 'owner', 'Владелец объектов', 2, 16777215, 1, NOW()); +INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (2, 'Admins', 'group', 'group', 'Все администрирующие пользователи', 1, 16777215, 1, NOW()); INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (3, 'admin', 'admin', 'misha@design.ru', '', 0, 16777215, 1, NOW()); INSERT INTO auser_to_auser (auser_id, parent_id) VALUES (3,2); diff --git a/auth/auth_oracle.sql b/auth/auth_oracle.sql index 9c72aac..5db9a6a 100644 --- a/auth/auth_oracle.sql +++ b/auth/auth_oracle.sql @@ -243,8 +243,8 @@ CREATE UNIQUE INDEX "IX_AUSER_TO_AUSER_0" ON "AUSER_TO_AUSER" ( -INSERT INTO AUSER (AUSER_ID, NAME, PASSWD, EMAIL, DESCRIPTION, AUSER_TYPE_ID, RIGHTS, IS_PUBLISHED, DT_REGISTER) VALUES (1, 'Owner', 'onwner', 'owner', ' ', 2, 16777215, 1, SYSDATE); -INSERT INTO AUSER (AUSER_ID, NAME, PASSWD, EMAIL, DESCRIPTION, AUSER_TYPE_ID, RIGHTS, IS_PUBLISHED, DT_REGISTER) VALUES (2, 'Admins', 'group', 'group', ' ', 1, 16777215, 1, SYSDATE); +INSERT INTO AUSER (AUSER_ID, NAME, PASSWD, EMAIL, DESCRIPTION, AUSER_TYPE_ID, RIGHTS, IS_PUBLISHED, DT_REGISTER) VALUES (1, 'Owner', 'onwner', 'owner', 'Владелец объектов', 2, 16777215, 1, SYSDATE); +INSERT INTO AUSER (AUSER_ID, NAME, PASSWD, EMAIL, DESCRIPTION, AUSER_TYPE_ID, RIGHTS, IS_PUBLISHED, DT_REGISTER) VALUES (2, 'Admins', 'group', 'group', 'Все администрирующие пользователи', 1, 16777215, 1, SYSDATE); INSERT INTO AUSER (AUSER_ID, NAME, PASSWD, EMAIL, DESCRIPTION, AUSER_TYPE_ID, RIGHTS, IS_PUBLISHED, DT_REGISTER) VALUES (3, 'admin', 'admin', 'misha@design.ru', '', 0, 16777215, 1, SYSDATE); INSERT INTO AUSER_TO_AUSER (AUSER_ID, PARENT_ID) VALUES (3,2); diff --git a/auth/auth_pgsql.sql b/auth/auth_pgsql.sql index c608a71..517c332 100644 --- a/auth/auth_pgsql.sql +++ b/auth/auth_pgsql.sql @@ -6,7 +6,7 @@ /*==============================================================*/ /* Table: acl */ /*==============================================================*/ -/* */ +/* назначеные на объект права */ CREATE TABLE acl ( @@ -16,9 +16,9 @@ CREATE TABLE acl ); -/* object_id - */; +/* object_id - связка с объектом */; -/* rights - - , - . */; +/* rights - младший байт - права на объект, старший - на свойства. */; /*==============================================================*/ /* Index: ix_acl_0 */ @@ -44,15 +44,15 @@ CREATE TABLE aevent_log PRIMARY KEY (aevent_log_id) ); -/* auser_id - */; +/* auser_id - собственно про кого записываем */; -/* event_type - ( auser) */; +/* event_type - что за событие (описаны у auser) */; -/* stat - (, ) */; +/* stat - статус (например, пытались добавлять и ошибка) */; -/* dt - */; +/* dt - когда залогили */; -/* content - - ... */; +/* content - тут пишем что-то о событии... */; /*==============================================================*/ /* Index: ix_aevent_log_0 */ @@ -66,7 +66,7 @@ CREATE INDEX ix_aevent_log_0 ON aevent_log /*==============================================================*/ /* Table: asession */ /*==============================================================*/ -/* , */ +/* сессии, по которым отслеживается залогиненость */ CREATE TABLE asession ( asession_id SERIAL NOT NULL, @@ -79,15 +79,15 @@ CREATE TABLE asession PRIMARY KEY (asession_id) ); -/* sid - , */; +/* sid - кука, выдающаяся на сессию */; -/* auid - , */; +/* auid - кука, выдающаяся на постоянку */; -/* dt_access - */; +/* dt_access - время последнего доступа */; -/* dt_logon - */; +/* dt_logon - время последнего логина */; -/* dt_logout - */; +/* dt_logout - время последнего логаута */; /*==============================================================*/ /* Index: ix_asession_0 */ @@ -117,22 +117,22 @@ CREATE INDEX ix_asession_2 ON asession /*==============================================================*/ /* Table: auser */ /*==============================================================*/ -/* - owner (auser_type_id = 3) - , . - .. / , - - , - , - . - event_type - , : - 1 - , - 2 - , - 8 - , +/* пользователи и группы + есть такая фигня как owner (auser_type_id = 3) + его права меньше, чем права пользователя и права группы. + т.е. если пользователю/группе назначены права то мы не смотрим на овнера, + если не назначены - смотрим, он-ли овнер, и если он - берем эти права. + event_type - что записываем, битовая маска: + 1 - логин, + 2 - логаут, + 8 - смена пароля, 4 - request_password, - 16 - , - 32 - email, - 64 - , - 128 - , - 256 - - ... */ + 16 - смена имени, + 32 - смена email, + 64 - изменение прав пользователю, + 128 - изменение пользователя, + 256 - добавление пользователя + ... потом дальше придумаю */ CREATE TABLE auser ( auser_id SERIAL NOT NULL, @@ -154,33 +154,33 @@ CREATE TABLE auser UNIQUE (auser_type_id, name) ); -/* auser_type_id - (0 - , 1 - ) */; +/* auser_type_id - тип пользователя (0 - пользователь, 1 - группа) */; -/* rights - / */; +/* rights - права пользователя/группы на корень дерева */; -/* name - */; +/* name - имя для подключения */; -/* description - ( ) */; +/* description - описание (например для группы) */; -/* email - email */; +/* email - email пользователя */; -/* passwd - */; +/* passwd - пароль */; -/* new_passwd - ( , ) */; +/* new_passwd - новый пароль (если забыли, генериться и живет пока не подтвердят) */; -/* dt_register - / */; +/* dt_register - дата/время регистрации */; -/* dt_logon - / */; +/* dt_logon - дата/время последнего логина */; -/* dt_logout - / */; +/* dt_logout - дата/время последнего логаута */; -/* is_published - */; +/* is_published - разрешен доступ или нет */; -/* is_default - . 1 */; +/* is_default - для групп. если установлена в 1 то добавляемый пользователь включается в группу */; -/* connections_limit - */; +/* connections_limit - количество одновременных подключений */; -/* event_type - , */; +/* event_type - битовая маска, что записываем в лог */; /*==============================================================*/ /* Index: ix_auser_0 */ @@ -224,18 +224,18 @@ CREATE INDEX ix_auser_3 ON auser /*==============================================================*/ /* Table: auser_to_auser */ /*==============================================================*/ -/* */ +/* принадлежность пользователя группе */ CREATE TABLE auser_to_auser ( auser_id INT NOT NULL DEFAULT 0, parent_id INT NOT NULL DEFAULT 0, rights INT NOT NULL DEFAULT 0 ); -/* auser_id - ( ) */; +/* auser_id - кто (ссылка на пользователя) */; -/* parent_id - ( ) */; +/* parent_id - в какую группу включен (ссылка на группу) */; -/* rights - , */; +/* rights - права, с которые пользователь имеет на группу */; /*==============================================================*/ @@ -252,7 +252,7 @@ CREATE UNIQUE INDEX ix_auser_to_auser_0 ON auser_to_auser /*==============================================================*/ /* Insert DEFAULT data */ /*==============================================================*/ -INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (1, 'Owner', 'onwner', 'owner', ' ', 2, 16777215, 1, CURRENT_TIMESTAMP); -INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (2, 'Admins', 'group', 'group', ' ', 1, 16777215, 1, CURRENT_TIMESTAMP); +INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (1, 'Owner', 'onwner', 'owner', 'Владелец объектов', 2, 16777215, 1, CURRENT_TIMESTAMP); +INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (2, 'Admins', 'group', 'group', 'Все администрирующие пользователи', 1, 16777215, 1, CURRENT_TIMESTAMP); INSERT INTO auser (auser_id, name, passwd, email, description, auser_type_id, rights, is_published, dt_register) VALUES (3, 'admin', 'admin', 'misha@design.ru', '', 0, 16777215, 1, CURRENT_TIMESTAMP); INSERT INTO auser_to_auser (auser_id, parent_id) VALUES (3,2); diff --git a/chat/js/slider/color.js b/chat/js/slider/color.js index 1e22ccf..9f1815b 100644 --- a/chat/js/slider/color.js +++ b/chat/js/slider/color.js @@ -51,7 +51,7 @@ YAHOO.util.Color = new function() { var_b = var_2 } - r = var_r * 255 //rgb results = 0 255 + r = var_r * 255 //rgb results = 0 ÷ 255 g = var_g * 255 b = var_b * 255 diff --git a/img2/images.p b/img2/images.p index 91ae6f5..a87aa14 100644 --- a/img2/images.p +++ b/img2/images.p @@ -8,7 +8,7 @@ images $script_path[/../bin] $script_resize_name[nconvert] -# nconvert +# закоментировать следующие две строки если используется nconvert $script_path[/../cgi-bin] $script_resize_name[images.pl] @@ -20,11 +20,11 @@ $nconvert_path[/../bin] ################################################################################ -# $destination_path $image_name. -# jpeg, jpe, jpg, gif png . -# $destination_path, (/). -# $image_name, . -# $format[gif|jpg|jpeg|jpe|png], +# Сохраняет картинку в каталог $destination_path с именем $image_name. +# Проверяет является ли картинка jpeg, jpe, jpg, gif или png файлом. +# Если не задан путь $destination_path, картинка сохраняется в корневом каталоге (/). +# Если не указано имя файла $image_name, картинка сохраняется с текущим именем. +# Если указан $format[gif|jpg|jpeg|jpe|png], то картинка в него конвертируется ################################################################################ @save[image_file;destination_path;image_name;remove_meta;format][script;file_image] ^if($image_file && $image_file is "file"){ @@ -43,7 +43,7 @@ $nconvert_path[/../bin] ^file:delete[$destination_path/temp_$image_name] }{ $exception.handled(1) - $result(3) # + $result(3) # ошибка конвертирования } }{ ^image_file.save[binary;$destination_path/$image_name] @@ -51,28 +51,28 @@ $nconvert_path[/../bin] ^if($remove_meta){ $result(^remove_metadata[$destination_path/$image_name]) }{ - $result(0) # + $result(0) # сохранение завершено } }{ - $result(1) # + $result(1) # формат файла не поддерживается } }{ - $result(2) # + $result(2) # файл не определен } ### End @save[] ################################################################################ -# . , -# . -# $destination_path $image_name. -# $source_path, . -# $destination_path, $source_path. +# Изменяет размер картинки по ширине и высоте. Если задан только один размер, +# второй подгоняется пропорционально. +# Сохраняет результат изменения в каталог $destination_path с именем $image_name. +# Если не указан путь $source_path, картинка берется из корневого каталога. +# Если не указан путь $destination_path, картинка сохраняется в $source_path. ################################################################################ @resize[params][script;source_path;destination_path;file_image] ^if(def $params && $params is "hash"){ - $result(0) # + $result(0) # изменение размера завершено ^if(def $params.image_name){ ^try{ @@ -109,17 +109,17 @@ $nconvert_path[/../bin] } }{ ^switch[$exception.type]{ - ^case[image_file.missing]{$result(3)} # - ^case[script_file.missing]{$result(4)} # (images.pl|nconvert) - ^case[script.error]{$result(5)} # (images.pl|nconvert) + ^case[image_file.missing]{$result(3)} # исходный файл не найден + ^case[script_file.missing]{$result(4)} # скрипт (images.pl|nconvert) отсутствует + ^case[script.error]{$result(5)} # не получилось выполнить (images.pl|nconvert) скрипт } $exception.handled(1) } }{ - $result(2) # + $result(2) # не задано имя файла } }{ - $result(1) # + $result(1) # параметры не заданы } ### End @resize[] @@ -130,14 +130,14 @@ $result(0) ^try{ $file_image[^file::exec[$nconvert_path/nconvert;;-o;${env:DOCUMENT_ROOT}$path;-q;80;-rmeta;-rexifthumb;${env:DOCUMENT_ROOT}$path]] }{ - $result(4) # + $result(4) # ошибка удаления данных $exception.handled(1) } ### End @remove_metadata[] ################################################################################ -# , +# вспомогательный метод, удаляет слеши в конце строки если они есть ################################################################################ @_prepare_path[path] ^if(def $path){ diff --git a/int2str/int2str.p b/int2str/int2str.p index 4cbed1a..5fde7f6 100644 --- a/int2str/int2str.p +++ b/int2str/int2str.p @@ -1,80 +1,80 @@ @CLASS int2str -# . +# Методы класса можно использовать как статические. # # @int2str[i;gender;upper] -# . -# i - (int) -# gender - ( - m - f) -# upper - , +# Записываем число прописью. +# i - число (int) +# gender - род (мужской - m и женский - f) +# upper - если определена, пишем число с большой буквы # @money2str[amount] -# double : -# amount - . -# - , - . +# Записываем double в виде: число прописью рублей цифрой копеек +# amount - сколько денег. +# Целая часть - рубли, первые две цифры дробной части - копейки. # -# : +# Пример использования: # # $to_pay(123456.78) $to_pay_nds($to_pay/6) # -#

: ^number_format[^to_pay.format[%.2f];,;.](2) .

-#

C : ^int2str:money2str($to_pay)

-#

: ^number_format[^to_pay_nds.format[%.2f];,;.](2) .

+#

Сумма предоплаты за услуги: ^number_format[^to_pay.format[%.2f];,;.](2) руб.

+#

Cумма прописью: ^int2str:money2str($to_pay)

+#

В том числе налог: ^number_format[^to_pay_nds.format[%.2f];,;.](2) руб.

# -# (c) 2003 +# (c) Виктор Смирнов 2003 # bugfix in method @money2str[]: PAF # little optimization: Misha v.3 # @auto[] -# . -# , (m) (f) . +# Таблица написания чисел. +# Там где нужно, указываем мужской (m) и женский (f) род числительного. $dstr[ - $.0[] + $.0[ноль] $.1[ - $.m[] - $.f[] + $.m[один] + $.f[одна] ] $.2[ - $.m[] - $.f[] + $.m[два] + $.f[две] ] - $.3[] - $.4[] - $.5[] - $.6[] - $.7[] - $.8[] - $.9[] + $.3[три] + $.4[четыре] + $.5[пять] + $.6[шесть] + $.7[семь] + $.8[восемь] + $.9[девять] - $.10[] - $.11[] - $.12[] - $.13[] - $.14[] - $.15[] - $.16[] - $.17[] - $.18[] - $.19[] + $.10[десять] + $.11[одиннадцать] + $.12[двенадцать] + $.13[тринадцать] + $.14[четырнадцать] + $.15[пятнадцать] + $.16[шестнадцать] + $.17[семнадцать] + $.18[восемнадцать] + $.19[девятнадцать] - $.20[] - $.30[] - $.40[] - $.50[] - $.60[] - $.70[] - $.80[] - $.90[] + $.20[двадцать] + $.30[тридцать] + $.40[сорок] + $.50[пятьдесят] + $.60[шестьдесят] + $.70[семьдесят] + $.80[восемьдесят] + $.90[девяносто] - $.100[] - $.200[] - $.300[] - $.400[] - $.500[] - $.600[] - $.700[] - $.800[] - $.900[] + $.100[сто] + $.200[двести] + $.300[триста] + $.400[четыреста] + $.500[пятьсот] + $.600[шестьсот] + $.700[семьсот] + $.800[восемьсот] + $.900[девятьсот] ] $lstr[ $.0[ @@ -82,68 +82,68 @@ $lstr[ ] $.1[ $.gender[f] - $.1[] - $.2[] - $.3[] - $.4[] + $.1[тысяча] + $.2[тысячи] + $.3[тысячи] + $.4[тысячи] - $.11[] - $.12[] - $.13[] - $.14[] - $.other[] + $.11[тысяч] + $.12[тысяч] + $.13[тысяч] + $.14[тысяч] + $.other[тысяч] ] $.2[ $.gender[m] - $.1[] - $.2[] - $.3[] - $.4[] + $.1[миллион] + $.2[миллиона] + $.3[миллиона] + $.4[миллиона] - $.11[] - $.12[] - $.13[] - $.14[] - $.other[] + $.11[миллионов] + $.12[миллионов] + $.13[миллионов] + $.14[миллионов] + $.other[миллионов] ] $.3[ $.gender[m] - $.1[] - $.2[] - $.3[] - $.4[] + $.1[миллиард] + $.2[миллиарда] + $.3[миллиарда] + $.4[миллирда] - $.11[] - $.12[] - $.13[] - $.14[] - $.other[] + $.11[миллиардов] + $.12[миллиардов] + $.13[миллиардов] + $.14[миллиардов] + $.other[миллиардов] ] ] $drub[ - $.1[] - $.2[] - $.3[] - $.4[] - $._default[] + $.1[рубль] + $.2[рубля] + $.3[рубля] + $.4[рубля] + $._default[рублей] ] $dcop[ - $.1[] - $.2[] - $.3[] - $.4[] - $._default[] + $.1[копейка] + $.2[копейки] + $.3[копейки] + $.4[копейки] + $._default[копеек] ] ############################# -# ( 0 999). -# i - -# gender - ( m - , f - ) +# Выводит число прописью (от 0 до 999). +# i - записываемое число +# gender - род ( m - мужской, f - женский ) # @sint2str[i;gender][a;b;c;d;res] -# , $dstr +# Обрабатываем числа, написание которых есть в хэше $dstr ^if(def $dstr.$i){ ^if($dstr.$i is string){ $result[$dstr.$i] @@ -155,7 +155,7 @@ $dcop[ $a($i-$i%100) $b($i%100) ^if($a > 0){ $result[$dstr.$a ] } -# $b > 0, $dstr +# Здесь $b > 0, иначе мы бы уже нашли наше число в хэше $dstr ^if(def $dstr.$b){ ^if($dstr.$b is string){ $result[${result}$dstr.$b] @@ -172,30 +172,30 @@ $dcop[ } ############################# -# () . -# i - int -# gender - ( m - , f - ) -# upper, . +# Выводит (положительное) число прописью. +# i - записываемое число типа int +# gender - род ( m - мужской, f - женский ) +# если определена upper, первую букву делаем заглавной. @int2str[i;gender;upper][n;k;g;d;fl] ^if($i == 0){ $result[^sint2str($i)[$gender]] }{ -# -# 0: $i = n0*1000 + x0, 0 0. -# xk, xk > 0. x0 gender, xk -# 10^(3*k). +# На шаге номер k нам нужно записать число 10^(3*k) в форме, зависящей +# от 2-х последних цифр числа nk, конечно, если nk > 0. +# И число xk, если xk > 0. Род числа x0 задается параметром gender, род числа xk равен +# роду числа 10^(3*k). $n($i) $k(0) $g[$gender] ^while($n > 0){ ^if( $n%1000 > 0 ){ -# , n*10^(3*k) 2 n -# . , +# сначала проверяем, есть ли особое написание для n*10^(3*k) по последним 2 знакам числа n +# потом по одному последнему знаку. если особого написания нет, берем написание по умолчанию $d($n%100) ^if(!def $lstr.$k.$d){ $d($n%10) } ^if(!def $lstr.$k.$d){ $d[other] } @@ -212,15 +212,15 @@ $dcop[ } ############################# -# (double) : -# -# amount - +# Записываем положительное число (double) в виде: +# количество рублей прописью с большой буквы и копеек цифрами +# amount - сколько денег будем записывать @money2str[amount][rub;cop;res] -# +#всего копеек $cop(100*$amount) -# , double +#округляем и преобразуем к целому числу, чтобы исключить радости double $cop(^math:round($cop)) -# +#все расчёты в целых числах $rub(^math:trunc($cop/100)) $cop($cop%100) $result[^int2str($rub)[m;upper] ^currency_name[$rub;$drub] $cop ^currency_name[$cop;$dcop]] @@ -228,6 +228,6 @@ $dcop[ ############################# @currency_name[value;names][_value] -# 10 20 /, +# Для числей от 10 до 20 нужно писать рублей/копеек, иначе в зависимости от последнего знака ^if($value%100 < 20){ $_value($value%100) }{ $_value($value%10) } $result[$names.$_value] diff --git a/js_http_request/JSHttpRequest.p b/js_http_request/JSHttpRequest.p index 6fff709..a8ba240 100644 --- a/js_http_request/JSHttpRequest.p +++ b/js_http_request/JSHttpRequest.p @@ -280,89 +280,89 @@ $result[^table::create{from to %7D ^} %7E ~ %A0 ^#A0 -%A7 -%A9 -%AB -%AE -%B0 -%B1 -%BB -%u0430 -%u0431 -%u0432 -%u0433 -%u0434 -%u0435 -%u0451 -%u0436 -%u0437 -%u0438 -%u0439 -%u043A -%u043B -%u043C -%u043D -%u043E -%u043F -%u0440 -%u0441 -%u0442 -%u0443 -%u0444 -%u0445 -%u0446 -%u0447 -%u0448 -%u0449 -%u044A -%u044B -%u044C -%u044D -%u044E -%u044F -%u0410 -%u0411 -%u0412 -%u0413 -%u0414 -%u0415 -%u0401 -%u0416 -%u0417 -%u0418 -%u0419 -%u041A -%u041B -%u041C -%u041D -%u041E -%u041F -%u0420 -%u0421 -%u0422 -%u0423 -%u0424 -%u0425 -%u0426 -%u0427 -%u0428 -%u0429 -%u042A -%u042B -%u042C -%u042D -%u042E -%u042F -%u2013 -%u2014 -%u201C -%u201D -%u201E -%u2026 -%u2030 -%u20AC -%u2116 -%u2122 +%A7 § +%A9 © +%AB « +%AE ® +%B0 ° +%B1 ± +%BB » +%u0430 а +%u0431 б +%u0432 в +%u0433 г +%u0434 д +%u0435 е +%u0451 ё +%u0436 ж +%u0437 з +%u0438 и +%u0439 й +%u043A к +%u043B л +%u043C м +%u043D н +%u043E о +%u043F п +%u0440 р +%u0441 с +%u0442 т +%u0443 у +%u0444 ф +%u0445 х +%u0446 ц +%u0447 ч +%u0448 ш +%u0449 щ +%u044A ъ +%u044B ы +%u044C ь +%u044D э +%u044E ю +%u044F я +%u0410 А +%u0411 Б +%u0412 В +%u0413 Г +%u0414 Д +%u0415 Е +%u0401 Ё +%u0416 Ж +%u0417 З +%u0418 И +%u0419 Й +%u041A К +%u041B Л +%u041C М +%u041D Н +%u041E О +%u041F П +%u0420 Р +%u0421 С +%u0422 Т +%u0423 У +%u0424 Ф +%u0425 Х +%u0426 Ц +%u0427 Ч +%u0428 Ш +%u0429 Щ +%u042A Ъ +%u042B Ы +%u042C Ь +%u042D Э +%u042E Ю +%u042F Я +%u2013 – +%u2014 — +%u201C “ +%u201D ” +%u201E „ +%u2026 … +%u2030 ‰ +%u20AC € +%u2116 № +%u2122 ™ }] #end @_getDecodeTable[] diff --git a/js_http_request/_js_http_request_load.html b/js_http_request/_js_http_request_load.html index 3d9905a..af58ed7 100644 --- a/js_http_request/_js_http_request_load.html +++ b/js_http_request/_js_http_request_load.html @@ -2,12 +2,12 @@ @main[] ^use[^file:find[JSHttpRequest.p]{JSHttpRequest.p}] ^try{ -# . +# декодируем пришедшие данные. результат получаем в виде хеша $hRequest[^JSHttpRequest:decodeRequest[]] ^if($hRequest.q eq "error"){^callUndefinedFunction[]} -# , , md5 ( q=xyz) +# делаем то, что требуется, в данном примере просто вычисляем md5 от пришедшей строки (в q=xyz) $hParserVariable[ $.q[$hRequest.q] $.md5[^math:md5[$hRequest.q]] @@ -28,12 +28,12 @@ $sDebugMessage[^sDebugMessage.match[(.+?)][]{^if(def $match.1){$match.1}{$sDebugMessage}}] } -# JavaScript. -# (bool/int/double/string/table/hash/date) +# возвращаем результаты в виде JavaScript. +# как вы видите классу можно скармливать прямо парсерные переменные (bool/int/double/string/table/hash/date) ^JSHttpRequest:printResponse[$sDebugMessage;$hParserVariable] -# -# log +# если вы раскомментируете последующую строчку то информация обо всех приходящих запросах будет +# записываться в log файл ^printDebugInfo[$hRequest] #end @main[] diff --git a/js_http_request/_js_http_request_test.html b/js_http_request/_js_http_request_test.html index 0852cd2..5015e99 100644 --- a/js_http_request/_js_http_request_test.html +++ b/js_http_request/_js_http_request_test.html @@ -154,12 +154,12 @@ ########################################################################### @_hash2js[hash] -# , hash of bool +# проверяем, а не hash ли это of bool ^if(^hash.foreach[;v]{^if($v is bool && $v;0;1)}){ -# - () +# если не он - возвращаем ассоциативный массив (хеш) $result[^{^hash.foreach[k;v]{'^taint[js][$k]': ^if($v is bool || $v is int || $v is double){^object2js($v)}{^object2js[$v]}}[, ]^}] }{ -# , , - +# если, таки, он - возвращаем нумерованый $result[^[^hash.foreach[key;]{'^taint[js][$key]'}[, ]^]] } diff --git a/mailto/mailto.p b/mailto/mailto.p index ef467e4..137d62b 100644 --- a/mailto/mailto.p +++ b/mailto/mailto.p @@ -1,10 +1,10 @@ -# $Id: mailto.p, v 1.05 2006/01/17 11:28:00 [wonder@nightmail.ru] Exp $ -# Slash Misha v.3 +# $Id: mailto.p, v 1.05 2006/01/17 11:28:00 Никита Козин [wonder@nightmail.ru] Exp $ +# Огромно спасибо Slash и Misha v.3 @CLASS mailto -# email +# Метод шифрует переданный ему email @print[email;params;type][params;data;_string;_encoded;i;_random] $data[^hash::create[]] $data.title[$email] @@ -19,14 +19,14 @@ $data.title[$email] $data.title[$params] } -^rem{ *** *** } +^rem{ *** Проверяем валидность переданного адреса *** } ^if(^email.pos[@] > 0 && ^email.match[^^\w+([.-]?\w+)+\@\w+([.-]?\w+)*\.[a-z]{2,4}^$][i]){ $_string[$data.title] }{ $_string[$email] } -^rem{ *** *** } +^rem{ *** Шифруем строку *** } $i(0) ^while($i < ^_string.length[]){ $_random(^math:random(5) + 3) @@ -34,7 +34,7 @@ $i(0) ^i.inc($_random) } -^rem{ *** $type *** } +^rem{ *** Возвращаем результат в зависимости от $type *** } ^switch[$type]{ ^case[xml]{ $result[^taint[xml][$_encoded]] @@ -46,7 +46,7 @@ $i(0) # end @print[] -# email +# метод шифрует все email в переданном тексте @crypt[body;type] $result[^body.match[<(a) href=["']mailto:(.+?)(\?subject=(.+?))?["'](.*?)>(.+?)][gi]{ ^self.print[$match.2][ diff --git a/mdate/mdate.p b/mdate/mdate.p index ac5e4e5..2be1586 100644 --- a/mdate/mdate.p +++ b/mdate/mdate.p @@ -1,4 +1,4 @@ -# $Id: mdate.p,v 1.1 2005/11/04 16:35:00 [wonder@nightmail.ru] Exp $ +# $Id: mdate.p,v 1.1 2005/11/04 16:35:00 Никита Козин [wonder@nightmail.ru] Exp $ @CLASS mDate diff --git a/mscroller/scroller.p b/mscroller/scroller.p index 82c9785..317f48c 100644 --- a/mscroller/scroller.p +++ b/mscroller/scroller.p @@ -7,23 +7,23 @@ scroller ########################################################################### -# . 2 . -# +# конструктор. первые 2 параметра обязательны. +# при инициализации расчитываются все параметры постраничной навигации -# : -# $items_count - -# $limit - -# $page_count - -# $current_page - N -# $current_page_number - -# $current_page_name - -# $offset - ( sql ) -# $direction - ( < 0 1 ) -# $first_page - N -# $last_page - N -# $form_name - ( "page") +# доступные поля: +# $items_count - количество записей +# $limit - количество записей на страницу +# $page_count - количество страниц +# $current_page - N текущей страницы +# $current_page_number - порядковый номер текущей страницы +# $current_page_name - название текущей страницы +# $offset - смещение для получение первой записи текущей страницы (надодля sql запросов) +# $direction - направление нумерации страниц ( < 0 то последняя страница имеет номер 1 ) +# $first_page - N первой страницы +# $last_page - N последней страницы +# $form_name - название элемента формы через который передается номер страницы (по умолчанию "page") -# : $my_scroller[^scroller::init[$total_items_count;50;page]] +# пример создания объекта: $my_scroller[^scroller::init[$total_items_count;50;page]] @init[items_count;items_per_page;form_name;direction;page][is_full_page] ^if(!def $items_count){ @@ -82,21 +82,21 @@ $page_count(^math:ceiling($self.items_count / $limit)) ########################################################################### -# html -# () -# $mode - . : html|xml -# $nav_count - ( 5) -# $separator - ( "") -# $tag_name - -# $tag_attr - -# $title - ( ": ") -# $left_divider - "" ( "") -# $right_divider - "" ( : "|") -# $back_name - "< " -# $forward_name - " >" -# $target_url - URL ( "./") +# выводит html постраничной навигации +# принимает параметры (хеш) +# $mode - тип вывода. сейчас умеет: html|xml +# $nav_count - количество отображаемых ссылок на страницы (по умолчанию 5) +# $separator - разделитель пропусков в страницах (по умолчанию "…") +# $tag_name - тег в котором все выводим +# $tag_attr - аттрибуты тега +# $title - заголовок постраничной навигации (по умолчанию "Страницы: ") +# $left_divider - разделитель между "Назад" и первой страницей (по умолчанию "") +# $right_divider - разделитель между последней страницей и "Дальше" (по умолчанию: "|") +# $back_name - "< Назад" +# $forward_name - "Дальше >" +# $target_url - URL куда мы будем переходить (по умолчанию "./") -# ( $scroller): +# пример вызова (после создания объекта $scroller): # ^my_scroller.print[ # $.mode[html] # $.target_url[./] @@ -121,12 +121,12 @@ $page_count(^math:ceiling($self.items_count / $limit)) $first_nav($last_nav - $nav_count) ^if($first_nav < 1){$first_nav(1)} } - $separator[^if(def $lparams.separator){$lparams.separator}{}] + $separator[^if(def $lparams.separator){$lparams.separator}{…}] $url_separator[^if(^lparams.target_url.pos[?]>=0){^taint[&]}{?}] ^if(def $lparams.tag_name){ <$lparams.tag_name $lparams.tag_attr> } - $title[^if(def $lparams.title){$lparams.title}{: }] + $title[^if(def $lparams.title){$lparams.title}{Страницы: }] ^if($mode eq "html"){ $title }{ @@ -135,7 +135,7 @@ $page_count(^math:ceiling($self.items_count / $limit)) ^if(def $lparams.right_divider){$lparams.right_divider} } ^if($current_page != $first_page){ - ^print_nav_item[back;^if(def $lparams.back_name){$lparams.back_name}{&larr^; };$lparams.target_url;$url_separator;^eval($current_page - $direction)] + ^print_nav_item[back;^if(def $lparams.back_name){$lparams.back_name}{&larr^; Назад};$lparams.target_url;$url_separator;^eval($current_page - $direction)] ^if($mode eq "html"){ ^if(def $lparams.left_divider){$lparams.left_divider} } @@ -164,7 +164,7 @@ $page_count(^math:ceiling($self.items_count / $limit)) ^if($mode eq "html"){ ^if(def $lparams.right_divider){$lparams.right_divider}{|} } - ^print_nav_item[forward;^if(def $lparams.forward_name){$lparams.forward_name}{ ^;&rarr^;};$lparams.target_url;$url_separator;^eval($current_page + $direction)] + ^print_nav_item[forward;^if(def $lparams.forward_name){$lparams.forward_name}{Дальше ^;&rarr^;};$lparams.target_url;$url_separator;^eval($current_page + $direction)] } ^if(def $lparams.tag_name){} } @@ -173,7 +173,7 @@ $page_count(^math:ceiling($self.items_count / $limit)) ########################################################################### -# +# выводит элемент постраничной навигации @print_nav_item[type;name;url;url_separator;page_num] ^if($mode eq "html"){ ^if($type eq "separator"){