@main[]
^rem{
Не разношу этот файл в кучу мелких, так как это упростит дальнейшую "установку" на сервер
TODO пофиксить отставшиеся строчки с прямым запросов к xdoc
}
$charset[windows-1251]
# $charset[utf-8]
$response:content-type[
$.value[text/xml]
$.charset[$charset]
]
$dbname[you_db_name]
^rem{
^if(def $request:body){
^proc[]
}{
}
}
# ^log[$request:body]
# default values
$access[forbidden]
# Жрем данные из XML
# Создаем XML из говна которое пришло
$XmlRoot[request]
# { - проблемы с приемом XML в кодировке utf-8
$xRequest[^xdoc::create{^taint[as-is][$request:body]}]
$mode[^xRequest.selectString[string($XmlRoot/mode)]]
# режим определения прав доступа
^if($mode eq 'autorization'){
$login[^xRequest.selectString[string($XmlRoot/login)]]
$password[^xRequest.selectString[string($XmlRoot/password)]]
^check_password[$login;$password]
}{
^rem{ авторизация по сравнению с хэшом }
$key[^xRequest.selectString[string($XmlRoot/key)]]
^check_hashfile[$key]
}
# если разрешено что-то делать
^if($access eq 'allow'){
$cmd[^get_xml_string[cmd]]
# режим получения данных
^if($mode eq 'get'){
^if($cmd eq 'ShowTables'){
$tables[^show_tables[]]
}
$table_name[^get_xml_string[table_name]]
^if($cmd eq 'TablesData' && def $table_name){
$table_data[^get_table_data[$table_name]]
}
$custom_query[^get_xml_string[query]]
^if($cmd eq 'CustomQuery' && def $custom_query){
$custom_request_data[^get_custom_table_data[$custom_query]]
}
}
# режим установки данных
^if($mode eq 'set'){
$query[^get_xml_string[query]]
$query_int[^get_xml_string[query_int]]
^if($cmd eq 'update' && def $query){
$query[^void_query[$query;$query_int]]
# ^log[$query]
}
}
}
# ответ (наш ответ голливуду или болливуду, что еще круче)
$_response[
^access[]
^if(def $key){ }
$tables
$table_data
$query
$custom_request_data
]
# ^log[$_response]
$result[$_response]
# получить строку из xml
@get_xml_string[var]
$result[^xRequest.selectString[string($XmlRoot/$var)]]
# пустой sql-запрос
@void_query[query;query_int][$last_id]
^try{
^dbconnect{
^void:sql{
^taint[as-is][$query]
}
# используется для получения последнего id после INSERT (TODO в многопользовательском режиме возможны проблемы)
^if(def $query_int){
$last_id(
^int:sql{
^taint[as-is][$query_int]
}
)
}
}
$result[
^if($last_id){$last_id}
]
}{
$exception.handled(1)
$result[
$exception.type
$exception.comment
]
}
# данные произвольного sql-запроса
@get_custom_table_data[sql_query][$tTable;$tColumns]
^try{
^dbconnect{
$tTable[^table::sql{
^taint[as-is][$sql_query]
}]
}
$result[
$tColumns[^tTable.columns[]]
^tColumns.menu{
$tColumns.column
}
^tTable.menu{
^tColumns.menu{
$tTable.[$tColumns.column] |
}
}
^rem{ если колонок нет }
^if($tColumns == 0 && $tTable == 0){
Result
void |
}
]
}{
$result[
$exception.handled(1)
exception.type
exception.comment
SQL-query
$exception.type |
$exception.comment |
$sql_query |
]
}
# данные таблицы
@get_table_data[table_name]
^dbconnect{
$tDescribe[^table::sql{
DESCRIBE $table_name
}]
$tData[^table::sql{
SELECT
^tDescribe.menu{$tDescribe.Field}[,]
FROM
$table_name
}]
}
$result[
^tDescribe.menu{
$sField[$tDescribe.Field]
$sField
}
^tData.menu{
^tDescribe.menu{
^process{^$tData.$tDescribe.Field} |
}
}
]
# показывает таблицы базы данных
@show_tables[]
^dbconnect{
$tTables[^table::sql{
SHOW TABLES
}]
}
$result[
^tTables.menu{
$tTables.Tables_in_$dbname
}
]
# значения: forbidden | allow
@access[]
# проверка ключа из клиента на соответствие с ключом в хэшфайле
@check_hashfile[key][$hAccess]
$hAccess[^hashfile::open[hashfile/access]]
^if(def $key && def $hAccess.[$key]){ $access[allow] }
# считать пользователя из хэшфайла
@read_hashfile[key][$hAccess]
$hAccess[^hashfile::open[hashfile/access]]
^if(def $key && def $hAccess.[$key]){ $result[$hAccess.[$key]] }
@write_hashfile_key[key;login][$hAccess]
$hAccess[^hashfile::open[hashfile/access]]
$hAccess.$key[
$.value[$login]
$.expires(0.5)
]
# событие, когда приходят пароль и логин
@check_password[login;password][$tPasses]
^if(def $login && def $password){
$tPasses[^get_passes[]]
^if(^tPasses.locate[login;$login]){
^if($tPasses.password eq $password){
$access[allow]
$key[^math:uid64[]] ^rem{ пишем уникальный ключ для доступа в рамках сессии }
^write_hashfile_key[$key;$login]
}
}
}
# Таблица логинов и паролей (ip - возможно в будущем)
# добавить ^Math:crypt[] в фин. версии
@get_passes[]
$result[^table::create{login password rights
admin test 777
}]
@log[message][$date_now]
$date_now[^date::now[]]
$message[
^date_now.sql-string[] ${message}]
^message.save[append;/log/port.HttpDoor.query.txt]