Skip to content

Commit

Permalink
Добавление функций работы с файловой системой из БСП для безопасного …
Browse files Browse the repository at this point in the history
…запуска приложений и удаление файлов временного хранилища
  • Loading branch information
thvvmas committed Oct 1, 2024
1 parent 4e29a12 commit 82dcce4
Show file tree
Hide file tree
Showing 10 changed files with 660 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
КонецЕсли;

УдалитьФайлы(НовыйФайл);
пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(НовыйФайл);
Исключение
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';",
ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Expand Down Expand Up @@ -1023,15 +1023,18 @@
ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """";
КонецЕсли;

ЗапуститьПриложение(ИтоговаяКоманда, , Истина, КодВозврата);
ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы();
ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина;

УдалитьФайлы(ИмяФайлаСкрипта);
Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды);

Check warning on line 1029 in src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L1029

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

пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта);

Если ЭтоExpect Тогда
УдалитьФайлы(ИмяСлужебногоФайла);
пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяСлужебногоФайла);
КонецЕсли;

Если КодВозврата <> 0 Тогда
Если Результат.КодВозврата <> 0 Тогда
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки,
"не удалось выполнить команду системы, код возврата", КодВозврата);
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
Expand Down Expand Up @@ -1204,11 +1207,14 @@
ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """";
КонецЕсли;

ЗапуститьПриложение(ИтоговаяКоманда, , Истина, КодВозврата);
ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы();
ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина;

Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды);

Check warning on line 1213 in src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L1213

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

УдалитьФайлы(ИмяФайлаСкрипта);
пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта);

Если КодВозврата <> 0 Тогда
Если Результат.КодВозврата <> 0 Тогда
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки,
"не удалось выполнить команду системы, код возврата", КодВозврата);
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
Expand Down Expand Up @@ -1285,7 +1291,7 @@
ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляCurl(ПараметрыСоединения,
ПутьЛокальногоФайла, ПутьФайлаНаСервере);
Иначе
ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляExpect(ПараметрыСоединения,
ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляCurl(ПараметрыСоединения,
ПутьЛокальногоФайла, ПутьФайлаНаСервере);
КонецЕсли;
ИначеЕсли ИмяУстановленнойУтилиты = ИмяУтилитыSshpass Тогда
Expand All @@ -1296,7 +1302,7 @@
ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляSshpass(ПараметрыСоединения,
ПутьЛокальногоФайла, ПутьФайлаНаСервере);
Иначе
ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляExpect(ПараметрыСоединения,
ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляSshpass(ПараметрыСоединения,
ПутьЛокальногоФайла, ПутьФайлаНаСервере);
КонецЕсли;
ИначеЕсли ИмяУстановленнойУтилиты = ИмяУтилитыExpect Тогда
Expand Down Expand Up @@ -1325,12 +1331,18 @@
ИмяФайлаПроверки = ПолучитьИмяВременногоФайла("txt");

Check warning on line 1331 in src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L1331

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

КомандаПроверки = СтрШаблон("command -v %1 > %2", ИмяУтилиты, ИмяФайлаПроверки);
ЗапуститьПриложение(КомандаПроверки);

ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки);
ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку();
Если ТекущаяСтрока <> Неопределено Тогда
РезультатПроверки = Истина;
ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы();
ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина;

Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(КомандаПроверки, ПараметрыЗапускаКоманды);

Check warning on line 1338 in src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L1338

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

Если Результат.КодВозврата = 0 Тогда
ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки);
ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку();
Если ТекущаяСтрока <> Неопределено Тогда
РезультатПроверки = Истина;
КонецЕсли;
КонецЕсли;

Возврат РезультатПроверки;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,25 @@

#Область МетодыАналогиБСП

// Аналог метода БСП. Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь).
// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно.
//
// Параметры:
// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если
// нужно проверить строку соединения не текущей информационной базы.
//
// Возвращаемое значение:
// Булево - Истина, если файловая.
//
Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт

Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда
СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы();
КонецЕсли;
Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1;

КонецФункции

// Аналог метода БСП. Возвращает Истина, если функциональная подсистема существует в конфигурации.
// Предназначена для реализации вызова необязательной подсистемы (условного вызова).
// У функциональной подсистемы снят флажок "Включать в командный интерфейс".
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,14 @@

КонецФункции

// См. пбп_ОбщегоНазначенияСервер.ИнформационнаяБазаФайловая.
Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт

Check warning on line 132 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебный/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебный/Ext/Module.bsl#L132

Добавьте описание возвращаемого значения функции

Check warning on line 132 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебный/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебный/Ext/Module.bsl#L132

Необходимо добавить описание всех параметров метода

Модуль = ПолучитьМодуль();
Возврат Модуль.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы);

КонецФункции

#Область ТекущееОкружение

// См. пбп_ОбщегоНазначенияСервер.ЭтоWindowsСервер.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,6 @@

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область МетодыАналогиБСП

// Аналог метода БСП.
Expand Down Expand Up @@ -143,8 +139,52 @@

КонецФункции

#Область ЗапускВнешнихПриложений

// Аналог метода БСП. Параметры:
// КомандаЗапуска - Строка
//
// Возвращаемое значение:
// Строка
//
Функция БезопаснаяСтрокаКоманды(КомандаЗапуска) Экспорт

Check warning on line 150 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl#L150

Необходимо добавить описание всех параметров метода

Результат = "";

Если ТипЗнч(КомандаЗапуска) = Тип("Строка") Тогда

ПроверитьСодержитНебезопасныеДействия(КомандаЗапуска);
Результат = КомандаЗапуска;

ИначеЕсли ТипЗнч(КомандаЗапуска) = Тип("Массив") Тогда

Если КомандаЗапуска.Количество() > 0 Тогда
ПроверитьСодержитНебезопасныеДействия(КомандаЗапуска[0]);
Результат = МассивВСтрокуКоманды(КомандаЗапуска);
Иначе
ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ожидалось, что первый элемент массива %1 будет командой или путем к исполняемому файлу.'"),
"КомандаЗапуска");
КонецЕсли;

Иначе
ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ожидалось, что значение %1 будет типа %2 или %3.'"),
"КомандаЗапуска", "Строка", "Массив");
КонецЕсли;

Возврат Результат

Check warning on line 176 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl#L176

Пропущена точка с запятой в конце выражения

КонецФункции

#КонецОбласти

#КонецОбласти // МетодыАналогиБСП

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ПолучитьМодуль()

#Если Клиент Тогда
Expand All @@ -159,4 +199,114 @@

КонецФункции

#Область МетодыАналогиБСП

#Если Не ВебКлиент И Не МобильныйКлиент Тогда

Функция СтрокаЗапускаКомандыWindows(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения) Экспорт

НаборКоманд = "";

Если ЗначениеЗаполнено(КодировкаИсполнения) Тогда

Если КодировкаИсполнения = "OEM" Тогда
КодировкаИсполнения = 437;
ИначеЕсли КодировкаИсполнения = "CP866" Тогда
КодировкаИсполнения = 866;
ИначеЕсли КодировкаИсполнения = "UTF8" Тогда
КодировкаИсполнения = 65001;
КонецЕсли;

Check warning on line 218 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl#L218

Синтаксическая конструкция вида "Если...Тогда...ИначеЕсли..." должна содержать ветвь "Иначе".

НаборКоманд = "(chcp " + Формат(КодировкаИсполнения, "ЧГ=") + ")";
КонецЕсли;

Если Не ПустаяСтрока(ТекущийКаталог) Тогда
НаборКоманд = НаборКоманд + ?(ЗначениеЗаполнено(НаборКоманд), "&&", "") + "(cd /D """ + ТекущийКаталог + """)";
КонецЕсли;
НаборКоманд = НаборКоманд + ?(ЗначениеЗаполнено(НаборКоманд), "&&", "") + "(" + СокрЛП(СтрокаКоманды) + ")";

Возврат "cmd /S /C """ + НаборКоманд + """";

КонецФункции

#КонецЕсли

#Область БезопаснаяСтрокаКоманды

Функция СодержитНебезопасныеДействия(Знач СтрокаКоманды)

Возврат СтрНайти(СтрокаКоманды, "${") <> 0
Или СтрНайти(СтрокаКоманды, "$(") <> 0
Или СтрНайти(СтрокаКоманды, "`") <> 0
Или СтрНайти(СтрокаКоманды, "|") <> 0
Или СтрНайти(СтрокаКоманды, ";") <> 0
Или СтрНайти(СтрокаКоманды, "&") <> 0;

КонецФункции

Процедура ПроверитьСодержитНебезопасныеДействия(Знач КомандаЗапуска)
Если СодержитНебезопасныеДействия(КомандаЗапуска) Тогда
ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось запустить программу.
|Недопустимая строка команды
|%1
|
|Строка команды не должна содержать символы: ""${"", ""$("", ""`"", ""|"", "";"", ""&"".'"),
КомандаЗапуска);
КонецЕсли;
КонецПроцедуры

Функция МассивВСтрокуКоманды(КомандаЗапуска)

Check failure on line 259 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl#L259

Уменьшите цикломатическую сложность "МассивВСтрокуКоманды" с 26 до 20

Результат = Новый Массив;
НужныКавычки = Ложь;
Для Каждого Аргумент Из КомандаЗапуска Цикл

Если Результат.Количество() > 0 Тогда
Результат.Добавить(" ")

Check warning on line 266 in src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl

View check run for this annotation

sonar.openbsl.ru qa-bot / 1C: Project SubSystems Library Sonarqube Results

src/cf/CommonModules/пбп_ОбщегоНазначенияСлужебныйКлиентСервер/Ext/Module.bsl#L266

Пропущена точка с запятой в конце выражения
КонецЕсли;

НужныКавычки = Аргумент = Неопределено
Или ПустаяСтрока(Аргумент)
Или СтрНайти(Аргумент, " ")
Или СтрНайти(Аргумент, Символы.Таб)
Или СтрНайти(Аргумент, "&")
Или СтрНайти(Аргумент, "(")
Или СтрНайти(Аргумент, ")")
Или СтрНайти(Аргумент, "[")
Или СтрНайти(Аргумент, "]")
Или СтрНайти(Аргумент, "{")
Или СтрНайти(Аргумент, "}")
Или СтрНайти(Аргумент, "^")
Или СтрНайти(Аргумент, "=")
Или СтрНайти(Аргумент, ";")
Или СтрНайти(Аргумент, "!")
Или СтрНайти(Аргумент, "'")
Или СтрНайти(Аргумент, "+")
Или СтрНайти(Аргумент, ",")
Или СтрНайти(Аргумент, "`")
Или СтрНайти(Аргумент, "~")
Или СтрНайти(Аргумент, "$")
Или СтрНайти(Аргумент, "|");

Если НужныКавычки Тогда
Результат.Добавить("""");
КонецЕсли;

Результат.Добавить(СтрЗаменить(Аргумент, """", """"""));

Если НужныКавычки Тогда
Результат.Добавить("""");
КонецЕсли;

КонецЦикла;

Возврат СтрСоединить(Результат);

КонецФункции

#КонецОбласти // БезопаснаяСтрокаКоманды

#КонецОбласти // МетодыАналогиБСП

#КонецОбласти
23 changes: 23 additions & 0 deletions src/cf/CommonModules/пбп_ФайловаяСистема.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.16">
<CommonModule uuid="c1c50d3e-2a6a-46c5-bbf5-41918e2ad5bd">
<Properties>
<Name>пбп_ФайловаяСистема</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Файловая система</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>true</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>
Loading

0 comments on commit 82dcce4

Please sign in to comment.