@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.typeexception.commentSQL-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]