Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Echo Off
- :: Список разрешённых расширений вместе с типом подсветки синтаксиса
- Set FTypes[]=bat:batchfile, cmd:batchfile, css:css, htm:html, html:html, txt:plain_text, js:javascript, json:json, ini:ini, cfg:ini, template:html, none:plain_text
- :: БД для хранения позиции курсора в открытом документе
- Set DB=%__ServerRoot%\data\editor.db
- Set StartedAt=%Time%
- :: Данные get/post в переменные
- Set Data=%*
- :Next
- For /F "tokens=1,* delims=;" %%A In ("%Data%") Do (
- For /F "tokens=1,2 delims==" %%C In ("%%A") Do (Set $%%C=%%D)
- If Not "%%B"=="" Set Data=%%B&GoTo :Next
- )
- :: Читаем данные из печенек
- If Not Defined H-Cookie Set "H-Cookie=dummy"
- Set H-Cookie|Findstr /C:"<" /C:">" /C:"&" /C:"|" /C:^"\^"^" /C:"(" /C:")" /C:"\^">nul&&(Call HTTP302Header err_badcookie&Exit)
- For %%A In ("%H-Cookie:;=" "%") Do For /F "tokens=1,* delims== " %%A In ("%%~A") Do Set "C-%%A=%%B"
- :: Проверка прав доступа
- If Not Defined C-Code Set "LoginStatus=err_nosession" & GoTo :Back
- For %%A In (User Access) Do Set "%%A="
- For /F "tokens=1-3 delims=|" %%A In ('Call GetUserInfo %H-REMOTE_ADDR% %C-Code%') Do (
- Set "User=%%A"
- Set "Access=%%B"
- Set "LastSeen=%%C"
- )
- If Not Defined Access Set "LoginStatus=err_nosession" & GoTo :Back
- If %Access% LSS 7 Set "LoginStatus=err_noaccess" & GoTo :Back
- Set PathPrefix=%__ServerRoot%\%__Folder%
- :: Разрешаем редактирование файлов в директории сервера, если позволяет доступ и указан флаг
- If Defined $root If %Access% GEQ 8 (
- Set "PathPrefix=%__ServerRoot%\"
- Set $root=true
- )
- :: Сохраняем позицию курсора для этого файла
- If "%$task%"=="cursor" (
- Call HTTP200Header
- For %%A In ($hash $row $column) Do If Not Defined %%A GoTo :Die
- Echo CREATE TABLE IF NOT EXISTS `CursorPosition` ^(^
- `hash` TEXT PRIMARY KEY NOT NULL,^
- `row` SMALLINT,^
- `column` SMALLINT^
- ^);|sqlite3 "%DB%"
- Echo INSERT OR REPLACE INTO `CursorPosition` ^(hash, row, column^) VALUES ^('%$hash%', '%$row%', '%$column%'^);|sqlite3 "%DB%"
- Exit
- )
- :: Если файл невалиден, падаем с ошибкой
- If Not Defined $file GoTo :Die
- If Not Exist "%PathPrefix%%$file:/=\%" GoTo :Die
- :: Проверка на выход в директорию уровнем выше
- Set $file|grep -E "[\/][.]{2}[\/]">nul&&(
- Echo [%Date% %Time:~,8%] [IP:%H-REMOTE_ADDR%] tried to edit file outside wwwroot [path:"%$file%"]>>"%__ServerRoot%\%__AccessLogFile%"
- GoTo :Die
- )
- :: Защита от выстрела в ногу
- If /I "%$file%"=="/manage/editor.bat" GoTo :Die
- :: Определение режима подсветки синтаксиса
- For %%A In (%$file:.= %) Do Set Ext=%%A
- If "%$file%"=="%Ext%" Set Ext=none
- Set "Mode="
- For %%A In (%FTypes[]%) Do (For /F "tokens=1,2 delims=:" %%A In ("%%A") Do (If /I "%Ext%"=="%%A" Set Mode=%%B))
- :: Разрешаем редактировать админу даже не поддерживаемые файлы как plaintext
- If Defined $root If %Access% GEQ 8 If Not Defined Mode Set Mode=plain_text
- If Not Defined Mode GoTo :Die
- :: Хэшируем имя файла для получения уникального идентификатора
- For /F "delims=" %%A In ('md5 -d"%$root%%$file:/=\%"') Do (Set "FileHash=%%A")
- :: Проверяем, сохранена ли для файла позиция курсора
- Set "Position="
- For /F "eol= tokens=1,2 delims=|" %%A In ('Echo Select `row`^, `column` FROM `CursorPosition` WHERE `hash` like "%FileHash%"^;^|sqlite3 "%DB%"') Do (
- Set Position=CursorRow:%%A;CursorColumn:%%B;
- )
- :: Перезапись скрипта отредактированной версией и создание резервной копии
- If "%$task%"=="replace" If Defined $input-script-file (
- If Exist "%PathPrefix%%$file:/=\%.bak" Del "%PathPrefix%%$file:/=\%.bak"
- Copy /B "%PathPrefix%%$file:/=\%" "%PathPrefix%%$file:/=\%.bak">nul
- :: Обрабатываем ситуацию с ошибкой доступа
- Del "%PathPrefix%%$file:/=\%">nul
- If Exist "%PathPrefix%%$file:/=\%" Set "$input-script-file=" & GoTo :Status
- Type "%__ServerRoot%\%$input-script-file%"|dos2unix>"%PathPrefix%%$file:/=\%"
- Echo [%Date% %Time:~,8%] User "%User%" [IP:%H-REMOTE_ADDR%] [Access:%Access%] edited "%$file%">>"%__ServerRoot%\%__FManagerLogFile%"
- )
- For /F "delims=" %%A In ('GetLocalPath "%~dp0"') Do Set "LocalPath=%%A"
- :: Обработка статуса операции
- :Status
- Set "Status="
- If Defined $input-script-file Set "Status=Status:Файл сохранен;"
- If "%$task%"=="replace" If Not Defined $input-script-file Set "Status=Status:Ошибка сохранения;"
- rem Call RecompileTemplates
- :: Выводим страницу
- Call HTTP200Header
- Call Include HTMLHeader "Title:Редактор скриптов"
- Call Include Menu "cpanel:true;login:true;Username:%User%;Self:;Code:%C-Code%"
- Call Include Editor#textarea "RootAccess:%$root%;Name:%$file%"
- :: Пишем содержимое редактируемого файла в textarea редактора, попутно эскейпя угловые скобки
- Type "%PathPrefix%%$file:/=\%"|dos2unix|recode utf-8..html||^
- Type "%PathPrefix%%$file:/=\%"|recode cp1251..html
- Call Include Editor#controls "%Position%%Status%Mode:%Mode%;RootAccess:%$root%;FileHash:%FileHash%;Code:%C-Code%!!%$file%"
- For /F "delims=" %%A In ('LoadTimer %StartedAt%') Do (Set ExecTime=%%A)
- Call Include Footer "PerformanceData:%ExecTime%;ExecutableName:%~nx0;ServerVersion:%__OWS_version%"
- Call Include HTMLEnd
- Exit
- :Back
- :: Логгируем ошибки и редиректим на главную
- If "%LoginStatus%"=="err_noaccess" Echo [%Date% %Time:~,8%] [IP:%H-REMOTE_ADDR%] tried to execute "%~nx0" with access level "%Access%">>"%__ServerRoot%\%__AccessLogFile%"
- If "%LoginStatus%"=="err_nosession" Echo [%Date% %Time:~,8%] Can't validate session token [Code:"%C-Code%"] for access [IP:%H-REMOTE_ADDR%] to "%~nx0">>"%__ServerRoot%\%__AccessLogFile%"
- If "%LoginStatus%"=="err_nosession" Call HTTP302Header-nosession
- If "%LoginStatus%"=="err_noaccess" Call HTTP302Header err_noaccess
- Exit
- :Die
- :: Логгируем некорректное обращение к скрипту и выходим
- Echo [%Date% %Time:~,8%] Attempt to execute "%~nx0" in unusual way [IP:%H-REMOTE_ADDR%]>>"%__ServerRoot%\%__AccessLogFile%"
- Echo HTTP/1.0 403 Forbidden
- Echo Server: OWS/%__OWS_version%
- Echo Content-Type: text/html;charset=UTF-8
- Echo Connection: close
- Echo.
- Echo Forbidden
- Exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement