barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 26 декабря 2018 г.

Wireshark: ищем в дампе траффика soap-запрос по значению одного из тегов

Задача

Нужно в дампе траффика найти soap-запрос по заданному значению некоторого тега (имя тега в поиске не участвует, только значение).

Решение

Используем фильтра xml.cdata == "{искомое значение}"

вторник, 4 декабря 2018 г.

КриптоПро JCP 2: ошибка ru.CryptoPro.JCP.tools.SelfTester.run SelfTester's test №16 failed

Проблема

Есть приложение, использующее КриптоПро JCP 2 для подписания XML. После развертывания на новом сервере при попытке подписания падает ошибка:
04-Dec-2018 18:21:54.093 WARNING [SelfTester] ru.CryptoPro.JCP.tools.SelfTester.run SelfTester's test №16 failed
 ru.CryptoPro.JCP.tools.SelfTesterException: Error during store working
at ru.CryptoPro.JCP.tools.SelfTests$TestDigestStore.run(Unknown Source)
at ru.CryptoPro.JCP.tools.SelfTester.b(Unknown Source)
at ru.CryptoPro.JCP.tools.SelfTester.a(Unknown Source)
at ru.CryptoPro.JCP.tools.SelfTester.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: ru.CryptoPro.JCP.tools.SelfTesterException: Error during store working
at ru.CryptoPro.JCP.tools.SelfTests.testDigestStore(Unknown Source)
... 5 more
Caused by: ru.CryptoPro.JCP.tools.CPVerify.CPVerifyException: Error during store working
at ru.CryptoPro.JCP.tools.CPVerify.DigestStoreDefault.<init>(Unknown Source)
... 6 more  
При последующих попытках падает:
SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available
ru.CryptoPro.JCP.tools.SelfTesterException: SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available
Причина

У пользователя, от имени которого работает приложение, не было прав на запись в директорию /var/opt/cprocsp/tmp. После выдачи прав стала падать ошибка "Permission denied" при попытке работы с какими-то файлами в этой папке, имена файлов начинаются с ".". У этих файлов владельцем был root, поэтому ошибка закономерна. После удаления этих файлов все заработало.

пятница, 9 ноября 2018 г.

soapUI и кириллица в теле POST-запроса к REST-сервису

Проблема

Нужно из soapUI (запускается под Windows 10) вызвать REST-сервис, передав ему в теле POST-запроса некий XML, содержащий кириллицу. При попытке сделать это получаю от сервиса ответ о наличии некорректного UTF8-байта в запросе.

Решение

В bin-директории soapUI открываем файл SoapUI-x.x.x.vmoptions (где x.x.x. - номер версии soapUI) и добавляем туда опцию:
-Dfile.encoding=UTF8
Перезапускаем soapUI. В поле Media Type запроса добавляем постфикс "; charset=UTF-8". Успех, запрос уходит с корркетным Content-Type заголовком, в котором указана используемая кодировка UTF-8, а также с корректно закодированным в UTF-8 телом.

пятница, 6 апреля 2018 г.

Java: залогировать стек текущего потока

Задача

Залогировать стек текущего потока.

Решение

Немного неочевидное, т.к. Thread имеет метод dumpStack(), который печатает стек в поток ошибок, а нам надо задействовать логгер. Получилось так:
        StringWriter strWr = new StringWriter();
        PrintWriter writer = new PrintWriter(strWr);
        new Throwable().printStackTrace(writer);
        logger.severe(strWr.toString());

вторник, 3 апреля 2018 г.

Oracle Weblogic: ALTER SESSION-команды в Init SQL

Задача - в качестве Init SQL необходимо выполнить 2 ALTER SESSION-команды
Решение - ALTER SESSION-команды в Init SQL заворачиваем в анонимный PL/SQL-блок, а внутри него каждую команду - в execute immediate:
SQL BEGIN execute immediate('alter session set ...');execute immediate('alter session set ...'); END;

Oracle: посчитать число индексов по char/varchar-колонкам

SELECT COUNT(DISTINCT i.INDEX_NAME)
FROM dba_ind_columns i
    JOIN dba_tab_columns c
        ON (c.TABLE_NAME = i.TABLE_NAME AND c.OWNER = i.TABLE_OWNER AND c.COLUMN_NAME = i.COLUMN_NAME)
WHERE
    (UPPER(c.DATA_TYPE) LIKE 'VARCHAR%'
        OR UPPER(c.DATA_TYPE) LIKE 'CHAR%')