diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" index 90f3a03..28930a3 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" @@ -1085,6 +1085,12 @@ УспешныеКодыВозврата.Добавить(УстановленныйКодВозврата); КонецЕсли; + // При ошибке аутентификации ibcmd запрашивает пароль в консоли: без ввода команда зависает + Если ПараметрыЗапуска.Найти("<") = Неопределено Тогда + ПараметрыЗапуска.Добавить("<"); + ПараметрыЗапуска.Добавить(?(ЭтоWindows, "NUL", "/dev/null")); + КонецЕсли; + КомандаВыполнения = ПутьКПриложению; Лог.Отладка("Запуск: %1 %2", КомандаВыполнения, СтрСоединить(ПараметрыЗапуска, " ")); @@ -1213,8 +1219,8 @@ Лог.Отладка("Значение параметра %1 передается через переменную среды %2", ИмяПараметра, ИмяПеременнойСреды); ПеременныеСредыКоманды.Вставить(ИмяПеременнойСреды, Значение); - МассивПараметров.Добавить(СтрШаблон("%1=%2", ИмяПараметра, - СлужебныйIbcmdRunner.ШаблонПеременнойСреды(ИмяПеременнойСреды, ЭтоWindows))); + Подстановка = ОбернутьВКавычки(СлужебныйIbcmdRunner.ШаблонПеременнойСреды(ИмяПеременнойСреды, ЭтоWindows)); + МассивПараметров.Добавить(СтрШаблон("%1=%2", ИмяПараметра, Подстановка)); КонецПроцедуры @@ -1336,7 +1342,7 @@ СтрокаДляЗаписи = ""; ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПараметров, Кодировка); Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл - СтрокаДляЗаписи = ?(СтрокаДляЗаписи = "", "", Символы.ПС) + СокрЛП(ВыбранныйФайл); + СтрокаДляЗаписи = СтрокаДляЗаписи + ?(СтрокаДляЗаписи = "", "", Символы.ПС) + СокрЛП(ВыбранныйФайл); КонецЦикла; ЗаписьТекста.ЗаписатьСтроку(СокрЛП(СтрокаДляЗаписи), ""); ЗаписьТекста.Закрыть(); diff --git a/tests/ibcmdrunner-test.os b/tests/ibcmdrunner-test.os index 06a3878..0638662 100644 --- a/tests/ibcmdrunner-test.os +++ b/tests/ibcmdrunner-test.os @@ -38,6 +38,9 @@ СписокТестов.Добавить("ТестДолжен_ЗагрузитьВыбранныйФайлКонфигурации"); СписокТестов.Добавить("ТестДолжен_ВернутьНомерВерсии"); СписокТестов.Добавить("ТестДолжен_СоздатьПустуюФайловуюБазу"); + СписокТестов.Добавить("ТестДолжен_ПередатьВсеВыбранныеФайлы"); + СписокТестов.Добавить("ТестДолжен_ПередатьПараметрыАвторизацииСоСпецсимволами"); + СписокТестов.Добавить("ТестДолжен_ЗавершитьсяОшибкойПриЗапросеПароля"); Если ВерсияПлатформыБольше("8.3.21") Тогда СписокТестов.Добавить("ТестДолжен_СоздатьФайловуюБазуИзАрхива"); @@ -586,6 +589,33 @@ КонецПроцедуры +Процедура ТестДолжен_ПередатьВсеВыбранныеФайлы() Экспорт + + // Дано + УстановитьПараметрыВременнойИБ(); + КаталогВыгрузки = ПолныйПутьШаблонаДанных("1.0", "files"); + УправлениеИБ.СоздатьИБИзФайловКонфигурации(КаталогВыгрузки); + УправлениеИБ.УстановитьПараметрыАвторизацииИБ(""); // в ИБ из файлов нет пользователей + + ВыбранныеФайлы = Новый Массив; + ВыбранныеФайлы.Добавить("Missing.xml"); + ВыбранныеФайлы.Добавить("Configuration.xml"); + + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить(КаталогВыгрузки); + ПараметрыМетода.Добавить(ВыбранныеФайлы); + ПараметрыМетода.Добавить(""); + ПараметрыМетода.Добавить(Истина); + + // Тогда: первый файл списка дошёл до ibcmd, и она сообщила, что его нет + Ожидаем.Что(УправлениеИБ) + .Метод("ЗагрузитьВыбранныеФайлыКонфигурации", ПараметрыМетода) + .ВыбрасываетИсключение("Missing.xml"); + + УдалитьФайлы(ВременныйКаталог); + +КонецПроцедуры + Процедура ТестДолжен_ВернутьНомерВерсии() Экспорт // Когда @@ -634,6 +664,49 @@ КонецПроцедуры +Процедура ТестДолжен_ПередатьПараметрыАвторизацииСоСпецсимволами() Экспорт + + // Когда + Пользователь = "user & (x) ^ %PATH% $HOME"; + ТекстОшибки = ТекстОшибкиАутентификации(Пользователь, "pass & word"); + + // Тогда: ibcmd называет пользователя в ошибке, значит имя дошло целиком + Утверждения.ПроверитьИстину(СтрНайти(ТекстОшибки, Пользователь) > 0, + "Имя пользователя должно дойти до ibcmd целиком: " + ТекстОшибки); + +КонецПроцедуры + +Процедура ТестДолжен_ЗавершитьсяОшибкойПриЗапросеПароля() Экспорт + + // Когда: ibcmd запрашивает пароль в консоли + ТекстОшибки = ТекстОшибкиАутентификации("admin", "admin"); + + // Тогда + Утверждения.ПроверитьИстину(ЗначениеЗаполнено(ТекстОшибки), + "Команда должна завершиться ошибкой, а не ждать ввода пароля"); + +КонецПроцедуры + +Функция ТекстОшибкиАутентификации(Пользователь, Пароль) + + // В пустой ИБ нет пользователей: аутентификация заведомо не проходит + УстановитьПараметрыВременнойИБ(); + УправлениеИБ.СоздатьИБ(); + УправлениеИБ.УстановитьПараметрыАвторизацииИБ(Пользователь, Пароль); + + ТекстОшибки = ""; + Попытка + УправлениеИБ.ВыгрузитьКонфигурациюВФайл(ОбъединитьПути(ВременныйКаталог, "1Cv8.cf")); + Исключение + ТекстОшибки = ОписаниеОшибки(); + КонецПопытки; + + УдалитьФайлы(ВременныйКаталог); + + Возврат ТекстОшибки; + +КонецФункции + Функция ПолучитьПутьКIBCMD() Возврат ПолучитьПеременнуюСреды("IBCMD_PATH", РасположениеПеременнойСреды.Процесс); КонецФункции