Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline neigel  
#1 Оставлено : 1 марта 2021 г. 9:24:48(UTC)
neigel

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.12.2014(UTC)
Сообщений: 91
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 2 раз в 2 постах
Здравствуйте!

Дошли руки поковыряться в причинах, по которым в случае ошибок в консоль выводятся кракозябры или вопросы.

Имеем:
Код:
$ echo $LANG
ru_RU.UTF-8


Русский язык, UTF-8, 2021й год (вывод date прикладывать не буду)

Код:

$ sudo  strace -e trace=openat /opt/cprocsp/sbin/amd64/cpconfig -hardware media -add hdimage -name hdimage 2>&1 
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/tls/haswell/x86_64/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/tls/haswell/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/tls/x86_64/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/tls/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/haswell/x86_64/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/haswell/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/x86_64/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libcapi10.so.4", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/librdrsup.so.4", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/etc/opt/cprocsp/config64.ini", O_RDONLY) = 3
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/librdrric.so", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/LC_MESSAGES/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/../../ru_RU.UTF-8/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/librdrric.cat", O_RDONLY) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/librdrcpfkc.so", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/librdrsup.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/librdrsup.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/librdrsup.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/LC_MESSAGES/librdrsup.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/../../ru_RU.UTF-8/librdrsup.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/librdrsup.cat", O_RDONLY) = 3
openat(AT_FDCWD, "/opt/cprocsp/lib/amd64/librdrrutoken.so", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/librdrrutoken.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/librdrrutoken.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/librdrrutoken.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/LC_MESSAGES/librdrrutoken.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/../../ru_RU.UTF-8/librdrrutoken.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/librdrrutoken.cat", O_RDONLY) = 3
Adding new media:
Nick name: hdimage
Name device: hdimage
openat(AT_FDCWD, "/opt/cprocsp/share/locale/ru_RU.cp1251/LC_MESSAGES/csp_error_messages.cat", O_RDONLY) = 3
Adding hdimage failed

Error code:-2146435049
��������� ���������� ������ � ������ ������ ����������.

+++ exited with 23 +++


Ой, а почему это у нас csp_error_messages.cat ищется не как все остальные каталоги сообщений, а сразу в /opt/cprocsp и в кодировке cp1251 (при установленной UTF-8)? Неужели кто-то захардкодил путь до .cat файла?

Воспроизведено на билде 11998.

Заклинаю вас делать сначала catopen("csp_error_messages.cat") и только в случае неудачи прочесывать уже свои пути.

Похожие проблемы, кстати, есть в модулях librdrjacarta.so, в librdresmart.so и librdresmartgost.so - не уверен правда, что это вашей сборки библиотеки. Тем не менее, было бы неплохо, чтобы вы попросили и их авторов поправить это.

P.S.: Эта команда cpconfig не отрабатывает при работе postinst скрипта в пакета lsb-cprocsp-kc1 и lsb-cprocsp-kc2 , это нормально?

Отредактировано пользователем 1 марта 2021 г. 17:11:37(UTC)  | Причина: Не указана

Online Андрей Русев  
#2 Оставлено : 1 марта 2021 г. 19:15:56(UTC)
Андрей Русев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 750

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Здравствуйте.
Спасибо за ошибку, поправили. Для справки: она не там, где вы думали, а в приложении cpconfig. Можете провести аналогичный эксперимент с csptest, например:
Код:
root@test-x64-astra212:~# echo $LANG
ru_RU.UTF-8
root@test-x64-astra212:~# strace -e trace=open /opt/cprocsp/bin/amd64/csptest -keys -cont not_exists -silent
...
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 5
open("/opt/cprocsp/share/locale/ru_RU.cp1251/LC_MESSAGES/csp_error_messages.cat", O_RDONLY) = 6
../../../../CSPbuild/CSP/samples/csptest/ctkey.c:1165:AcquireContext("not_exists")
Error 0x80090016: Набор ключей не существует
Total: SYS: 0,010 sec USR: 0,110 sec UTC: 0,260 sec
[ErrorCode: 0x80090016]

Всё это объясняется наследием API совместимого с Windows, некоторые детали тут:
http://cpdn.cryptopro.ru...runk/html/encodings.html
Официальная техподдержка. Официальная база знаний.
Offline neigel  
#3 Оставлено : 1 марта 2021 г. 23:51:12(UTC)
neigel

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.12.2014(UTC)
Сообщений: 91
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 2 раз в 2 постах
Автор: Андрей Русев Перейти к цитате
Здравствуйте.
Для справки: она не там, где вы думали,


А я ничего не говорил о том, где я думал она есть =)

Автор: Андрей Русев Перейти к цитате

а в приложении cpconfig.


и поэтому она воспроизводится у вас в примере с другой программой csptest? =) Логично =)

Я думаю, что простой поиск по строке "csp_error_messages.cat" говорит о том, что проблема в librdrsup.so и в утилите inittest =)

Повторяю, посмотрите ещё на то, как вызывается catopen в librdrjacarta.so, в librdresmart.so и в librdresmartgost.so.

Если смотреть то, как они открывают свои каталоги сообщений, то получается, что libjacarta пытается открыть каталог без расширения ".cat", а librdresmart.so и librdresmartgost.so пытаются открыть его в текущей директории. Это выяснили случайно: когда пытались раздербанить ваш /opt/cprocsp по стандартным каталогам.

Отредактировано пользователем 2 марта 2021 г. 16:33:27(UTC)  | Причина: Не указана

Online Андрей Русев  
#4 Оставлено : 2 марта 2021 г. 17:58:15(UTC)
Андрей Русев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 750

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Цитата:
Заклинаю вас делать сначала catopen("csp_error_messages.cat")
Цитата:
А я ничего не говорил о том, где я думал она есть =)

Вот, где вы думаете, что есть проблема. А какую вы решаете задачу и на какой ОС?
Официальная техподдержка. Официальная база знаний.
Offline neigel  
#5 Оставлено : 2 марта 2021 г. 20:03:39(UTC)
neigel

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.12.2014(UTC)
Сообщений: 91
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 2 раз в 2 постах
Автор: Андрей Русев Перейти к цитате
Цитата:
Заклинаю вас делать сначала catopen("csp_error_messages.cat")
Цитата:
А я ничего не говорил о том, где я думал она есть =)

Вот, где вы думаете, что есть проблема.


Я продолжаю настаивать на том, что вызывая catopen вы подсовываете абсолютный путь. Этому свидетельствует то, что строка в бинаре находится как %s/cat_error_messages.cat - то есть вы чем-то типа sprintf заменяете %s на /opt/cprocsp/share/locale. Вместо того, чтобы делать так, я полагаю, необходимо сначала сделать catopen("csp_error_messages.cat") без указания какого-либо пути, и если получен -1, то искать уже с путём.

Автор: Андрей Русев Перейти к цитате
А какую вы решаете задачу и на какой ОС?


Linux Debian (amd64 и armhf). Хочу написать скрипт, который перепаковывает ваши deb'ы в нечто более удобоваримое и генерирует репозиторий, с правильными зависимостями и родными для debian'а концепциями, и избавиться от помойки под названием /opt. Это не в обиду вам, но я ещё ни разу не видел софтину, которая ставится в /opt и не напоминает помойку =) А если учесть, что вы добываете пакеты конвертацией через alien, то никаких шансов получить что-то дельное не может быть - особенно беда с гуевыми пакетами, которые после установки на чистую систему не могут запуститься, так как кучи гуевых библиотек может не быть в системе, потому что зависимости у вас не прописаны.

Так вот: в принципе всё озвученное получилось сделать, но проблемы всплыли только с двумя вышеозначенными библиотеками ридеров и csp_error_messages.cat - librdresmartgost.so и librdrsup.so не пытаются искать свои каталоги в системных путях, потому что сразу пытаются указать путь. А librdrjacarta когда ищет в системных путях забывает поставить расширение .cat, но это хотя бы можно решить создав ссылку на ейный каталог без расширения =) Вся остальная кагорта librdr* всё делает по науке в этом вопросе. И это правильно, потому что система сама ищет такой каталог сообщений, который соответствует установленной локали - а вы с себя весь геморрой по определению локали и соответствующего ей пути снимаете, и не рискуете ошибиться так, как у вас получилось.

В принципе, поскольку я не пользуюсь ни esmart'ом, ни jacarta'ой, то мне пофиг, но это очевидные косяки, который фиксятся двумя строками кода. Можно было бы решить это бинарно запатчив соответствующие строки в .so-шках, но тогда поедут ваши контрольные суммы.

Ещё в процессе перепаковки dpkg-shlibs выдает кучу варнигов о том, что ваши бинари зазря слинкованы с некоторыми системными .so-шками, потому что никаких функций из них не импортируют. Если интересно, могу скинуть эти логи, чтобы вы у себя build-скрипты поправили. Раньше, когда я работал в почтовом ящике, нас за такое били канделябрами на сертификации по НДВ.

Отредактировано пользователем 2 марта 2021 г. 20:24:40(UTC)  | Причина: Не указана

Online Андрей Русев  
#6 Оставлено : 9 марта 2021 г. 9:19:49(UTC)
Андрей Русев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 750

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 169 раз в 133 постах
Цитата:
я полагаю, необходимо сначала сделать catopen("csp_error_messages.cat")

Вы ошибаетесь, и я пояснил выше почему.
Выбор папки /opt соответствует стандарту FHS.
Проблема с зависимостями от пакетов понятна, но она заключается во фрагментированности Linux, а не нашем дистрибутиве.
О каких родных для debian концепциях речь?
Кажется всё, что вам реально нужно было сделать, это метапакет, который зависел бы от GUI/PCSC-пакетов в вашей ОС и от CSP.
jacarta и esmart - это не наши пакеты, нарекания по ним партнёры устраняют очень медленно или никогда.

Отредактировано пользователем 9 марта 2021 г. 9:21:38(UTC)  | Причина: Не указана

Официальная техподдержка. Официальная база знаний.
Offline neigel  
#7 Оставлено : 9 марта 2021 г. 16:28:26(UTC)
neigel

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.12.2014(UTC)
Сообщений: 91
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 2 раз в 2 постах
Автор: Андрей Русев Перейти к цитате
Цитата:
я полагаю, необходимо сначала сделать catopen("csp_error_messages.cat")

Вы ошибаетесь, и я пояснил выше почему.


Если вы про ссылку выше, то вообще говоря смысл кодировки CP_ACP под Unix мало понятен. Windows API определяет её как "The system default Windows ANSI code page": что это такое под Unix'ом - одному богу (и, возможно, вам) известно. Однако коли речь идет о сообщениях, выводимых юзеру, то вряд ли он будет ожидать их в чем-нибудь окромя $LANG.

Тем не менее, допустим, что в ваших словах есть какая-то логика, которую мне не дано понять. Но почему тогда у всех ваших загружаемых модулей имеются собственнные каталоги сообщений и все они (кроме librdrjacarta.so и librdresmart*.so) следуют именно тому поведению, что сначала вызывают, например, catopen("librdrrutoken.cat") и только потом ищут свой каталог сообщений в /opt/cprocsp/share/locale? Это опять же легко видеть, если запустить из-под strace и почитать, какие файлы пытаются открываться. То есть тут имеется противоречие с любой логикой, которая может стоять за существующей процедеруй открытия "csp_error_messages.cat".

Вот, кстати, кусочек из лога выше:
Код:

openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/usr/share/locale/ru/LC_MESSAGES/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/../../ru_RU.UTF-8/librdrric.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/opt/cprocsp/share/locale/default/LC_MESSAGES/librdrric.cat", O_RDONLY) = 3


Автор: Андрей Русев Перейти к цитате

Выбор папки /opt соответствует стандарту FHS.


Повторюсь, это не вам в укор было. В /opt никогда никто не ставился, не организовав помойку. Будь хоть сам Intel - результат один.

Автор: Андрей Русев Перейти к цитате

Проблема с зависимостями от пакетов понятна, но она заключается во фрагментированности Linux, а не нашем дистрибутиве.


Очень может быть. Тем не менее, смею полагать, что для большинства Debian-образных дистрибутивов можно более-менее малой кровью написать один набор скриптов и метаинфы для нативной запаковки. А принимая во внимание нарастающую популярность Ubuntu, существующую популярность Debian (как минимум в серверном сегменте) и закат CentOS, из которого, наверное, половина сбежит в Ubuntu, то это довольно приличная доля юзеров из тех, что пользуют Linux.

Автор: Андрей Русев Перейти к цитате

О каких родных для debian концепциях речь?


Уффф... да их много:
1) Файлы *.a и *.so, если у библиотеки версионированное SONAME используются только в -dev пакетах
1a) Файлы подключаемых модулей приложения (типа ваших ридеров) не ставятся в каталог, который находится в кэше динамического линкера - для этого в каталоге lib заводится отдельная директория приложения, в которой размещаются плагины.
2) Для выбора конкретного приложения, когда есть несколько вариантов (например, oauthapp и его гуёвый аналог), в дебианах используется система alternatives, а не химия в конфиге с бэкапом старого значения, которая ломается, если порядок деинсталяции не соответствует порядку инсталяции, кроме того, это позволяет юзеру, имеющему root-доступ легко переключать это уже в процессе эксплуатации системы, исходя из собственных нужд.
3) Вместо того, чтобы в postinst скриптах дергать cpconfig для того, чтобы добавить в конфиг, а в prerm скриптах удалять изменения, внесенные при установке, принято заводить соответсвующую директорию с суфиксом .d, в которую ставит свой файл каждый пакет, желающий что-то сконфигурить, и перегенерировать весь конфиг при установке или удалении пакета, который вносит изменения. Так вы избавляетесь от задачи следить за тем, что при удалении вы выполняете строго обратные действия (что у вас, кстати, не всегда соблюдается). Для локальных изменений конфигураций заводится файл с именем типа local и при перегенерации он запускается последним. Скрипт, который выполняет перегенерацию, может быть установлен base-пакетом. Впрочем, подобная концепция была в последние годы и во многих redhat'овских поделках использована, наконец-то.
4) Для динамических библиотек создаётся файл shlibs, чтобы при подготовке других пакетов, которые зависят от вашего продукта, зависимости могли вычисляться автоматически.
5) Целая кагорта замечаний может быть высказана в отношении init-скрипта /etc/init.d/cprocsp - главным образом его стоило бы разбить как минимум на часть, которая запускает КС2, и на часть, которая проверяет контрольные суммы. А ещё лучше в качестве альтернативы systemd юниты сделать, хотя понимаю, что не везде оно есть.
6) Нельзя из postinit-скрипта удалять файлы, которые установлены пакетом.
7-N) Список можно ещё продолжать, но проще почитать debian policy если интересно

Автор: Андрей Русев Перейти к цитате

Кажется всё, что вам реально нужно было сделать, это метапакет, который зависел бы от GUI/PCSC-пакетов в вашей ОС и от CSP.


Не все так просто. shlibs-файлы не сгенерятся таким образом. GUI-пакет для cloud не на всех версиях дистрибутива может быть установлен, потому что та версия webkit, которую вы используете в GUI-авторизовалке, уже разложилась не плесень и на липовый мёд. Кроме того, окромя GUI и PCSC у вас там тянется perl и даже TeX (для xer2pdf или как она там называется). А кроме того: судя по всему невозможно одновременно использоваться КС1 и КС2 - который из них должен тянуть метапакет? В общем, сначала я тоже думал сделать метапакет, но вскоре отказался от этой идеи.

Если хотите, я могу выложить результаты этой работы, авось вам пригодится.

Автор: Андрей Русев Перейти к цитате

jacarta и esmart - это не наши пакеты, нарекания по ним партнёры устраняют очень медленно или никогда.


Печально, что у вас такие партнёры, но, наверное, стоит им хотя бы сообщить об этой проблеме.

Отредактировано пользователем 9 марта 2021 г. 16:30:16(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.