Advertisement
Inquisitor

Ace editor for OWS

Sep 5th, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 6.67 KB | None | 0 0
  1. @Echo Off
  2. :: Список разрешённых расширений вместе с типом подсветки синтаксиса
  3. 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
  4. :: БД для хранения позиции курсора в открытом документе
  5. Set DB=%__ServerRoot%\data\editor.db
  6.  
  7. Set StartedAt=%Time%
  8. :: Данные get/post в переменные
  9. Set Data=%*
  10. :Next
  11. For /F "tokens=1,* delims=;" %%A In ("%Data%") Do (
  12.     For /F "tokens=1,2 delims==" %%C In ("%%A") Do (Set $%%C=%%D)
  13.     If Not "%%B"=="" Set Data=%%B&GoTo :Next
  14. )
  15.  
  16. :: Читаем данные из печенек
  17. If Not Defined H-Cookie Set "H-Cookie=dummy"
  18. Set H-Cookie|Findstr /C:"<" /C:">" /C:"&" /C:"|" /C:^"\^"^" /C:"(" /C:")" /C:"\^">nul&&(Call HTTP302Header err_badcookie&Exit)
  19. For %%A In ("%H-Cookie:;=" "%") Do For /F "tokens=1,* delims== " %%A In ("%%~A") Do Set "C-%%A=%%B"
  20.  
  21. :: Проверка прав доступа
  22. If Not Defined C-Code Set "LoginStatus=err_nosession" & GoTo :Back
  23. For %%A In (User Access) Do Set "%%A="
  24. For /F "tokens=1-3 delims=|" %%A In ('Call GetUserInfo %H-REMOTE_ADDR% %C-Code%') Do (
  25.     Set "User=%%A"
  26.     Set "Access=%%B"
  27.     Set "LastSeen=%%C"
  28. )
  29. If Not Defined Access Set "LoginStatus=err_nosession" & GoTo :Back
  30. If %Access% LSS 7 Set "LoginStatus=err_noaccess" & GoTo :Back
  31.  
  32. Set PathPrefix=%__ServerRoot%\%__Folder%
  33. :: Разрешаем редактирование файлов в директории сервера, если позволяет доступ и указан флаг
  34. If Defined $root If %Access% GEQ 8 (
  35.     Set "PathPrefix=%__ServerRoot%\"
  36.     Set $root=true
  37. )
  38.  
  39. :: Сохраняем позицию курсора для этого файла
  40. If "%$task%"=="cursor" (
  41.     Call HTTP200Header
  42.     For %%A In ($hash $row $column) Do If Not Defined %%A GoTo :Die
  43.     Echo CREATE TABLE IF NOT EXISTS `CursorPosition` ^(^
  44.         `hash` TEXT PRIMARY KEY NOT NULL,^
  45.         `row` SMALLINT,^
  46.         `column` SMALLINT^
  47.     ^);|sqlite3 "%DB%"
  48.     Echo INSERT OR REPLACE INTO `CursorPosition` ^(hash, row, column^) VALUES ^('%$hash%', '%$row%', '%$column%'^);|sqlite3 "%DB%"
  49.     Exit
  50. )
  51.  
  52. :: Если файл невалиден, падаем с ошибкой
  53. If Not Defined $file GoTo :Die
  54. If Not Exist "%PathPrefix%%$file:/=\%" GoTo :Die
  55. :: Проверка на выход в директорию уровнем выше
  56. Set $file|grep -E "[\/][.]{2}[\/]">nul&&(
  57.     Echo [%Date% %Time:~,8%] [IP:%H-REMOTE_ADDR%] tried to edit file outside wwwroot [path:"%$file%"]>>"%__ServerRoot%\%__AccessLogFile%"
  58.     GoTo :Die
  59. )
  60. :: Защита от выстрела в ногу
  61. If /I "%$file%"=="/manage/editor.bat" GoTo :Die
  62. :: Определение режима подсветки синтаксиса
  63. For %%A In (%$file:.= %) Do Set Ext=%%A
  64. If "%$file%"=="%Ext%" Set Ext=none
  65. Set "Mode="
  66. For %%A In (%FTypes[]%) Do (For /F "tokens=1,2 delims=:" %%A In ("%%A") Do (If /I "%Ext%"=="%%A" Set Mode=%%B))
  67. :: Разрешаем редактировать админу даже не поддерживаемые файлы как plaintext
  68. If Defined $root If %Access% GEQ 8 If Not Defined Mode Set Mode=plain_text
  69. If Not Defined Mode GoTo :Die
  70. :: Хэшируем имя файла для получения уникального идентификатора
  71. For /F "delims=" %%A In ('md5 -d"%$root%%$file:/=\%"') Do (Set "FileHash=%%A")
  72. :: Проверяем, сохранена ли для файла позиция курсора
  73. Set "Position="
  74. For /F "eol= tokens=1,2 delims=|" %%A In ('Echo Select `row`^, `column` FROM `CursorPosition` WHERE `hash` like "%FileHash%"^;^|sqlite3 "%DB%"') Do (
  75.     Set Position=CursorRow:%%A;CursorColumn:%%B;
  76. )
  77.  
  78. :: Перезапись скрипта отредактированной версией и создание резервной копии
  79. If "%$task%"=="replace" If Defined $input-script-file (
  80.     If Exist "%PathPrefix%%$file:/=\%.bak" Del "%PathPrefix%%$file:/=\%.bak"
  81.     Copy /B "%PathPrefix%%$file:/=\%" "%PathPrefix%%$file:/=\%.bak">nul
  82.     :: Обрабатываем ситуацию с ошибкой доступа
  83.     Del "%PathPrefix%%$file:/=\%">nul
  84.     If Exist "%PathPrefix%%$file:/=\%" Set "$input-script-file=" & GoTo :Status
  85.     Type "%__ServerRoot%\%$input-script-file%"|dos2unix>"%PathPrefix%%$file:/=\%"
  86.     Echo [%Date% %Time:~,8%] User "%User%" [IP:%H-REMOTE_ADDR%] [Access:%Access%] edited "%$file%">>"%__ServerRoot%\%__FManagerLogFile%"
  87. )
  88.  
  89. For /F "delims=" %%A In ('GetLocalPath "%~dp0"') Do Set "LocalPath=%%A"
  90. :: Обработка статуса операции
  91. :Status
  92. Set "Status="
  93. If Defined $input-script-file Set "Status=Status:Файл сохранен;"
  94. If "%$task%"=="replace" If Not Defined $input-script-file Set "Status=Status:Ошибка сохранения;"
  95. rem Call RecompileTemplates
  96. :: Выводим страницу
  97. Call HTTP200Header
  98. Call Include HTMLHeader "Title:Редактор скриптов"
  99. Call Include Menu "cpanel:true;login:true;Username:%User%;Self:;Code:%C-Code%"
  100. Call Include Editor#textarea "RootAccess:%$root%;Name:%$file%"
  101. :: Пишем содержимое редактируемого файла в textarea редактора, попутно эскейпя угловые скобки
  102. Type "%PathPrefix%%$file:/=\%"|dos2unix|recode utf-8..html||^
  103. Type "%PathPrefix%%$file:/=\%"|recode cp1251..html
  104. Call Include Editor#controls "%Position%%Status%Mode:%Mode%;RootAccess:%$root%;FileHash:%FileHash%;Code:%C-Code%!!%$file%"
  105. For /F "delims=" %%A In ('LoadTimer %StartedAt%') Do (Set ExecTime=%%A)
  106. Call Include Footer "PerformanceData:%ExecTime%;ExecutableName:%~nx0;ServerVersion:%__OWS_version%"
  107. Call Include HTMLEnd
  108. Exit
  109.  
  110. :Back
  111. :: Логгируем ошибки и редиректим на главную
  112. If "%LoginStatus%"=="err_noaccess" Echo [%Date% %Time:~,8%] [IP:%H-REMOTE_ADDR%] tried to execute "%~nx0" with access level "%Access%">>"%__ServerRoot%\%__AccessLogFile%"
  113. 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%"
  114. If "%LoginStatus%"=="err_nosession" Call HTTP302Header-nosession
  115. If "%LoginStatus%"=="err_noaccess" Call HTTP302Header err_noaccess
  116. Exit
  117.  
  118. :Die
  119. :: Логгируем некорректное обращение к скрипту и выходим
  120. Echo [%Date% %Time:~,8%] Attempt to execute "%~nx0" in unusual way [IP:%H-REMOTE_ADDR%]>>"%__ServerRoot%\%__AccessLogFile%"
  121. Echo HTTP/1.0 403 Forbidden
  122. Echo Server: OWS/%__OWS_version%
  123. Echo Content-Type: text/html;charset=UTF-8
  124. Echo Connection: close
  125. Echo.
  126. Echo Forbidden
  127. Exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement