1 Внешнее подписание сообщений
Стандартная библиотека подписывала сообщение ЭП-ОВ в момент его отправки в СМЭВ с помощью установленного рядом КриптоПро JCP. В расширенной библиотеке реализована возможность передать для отправки содержимое сообщения и его подпись, а также время формирования (для GetRequestRequest и GetResponseRequest). Это позволяет использовать любой внешний механизм подписания, а также несколько различных подписей одним приложением.
В ru.voskhod.smev.client.api.services.template.WSTemplate добавлены перегруженные методы, содержащие подпись сообщения:
SMEVMessage get(QueryInformation query, Element signature) throws SMEVException; SMEVMetadata send(SMEVMessage message, Element signature) throws SMEVException; void ack(SMEVMetadata metadata, boolean accepted, Element signature) throws SMEVException; |
В ru.voskhod.smev.client.api.types.message.system.processing.QueryInformation добавлено поле XMLGregorianCalendar timestamp;
Что необходимо для внешнего подписания GetRequestRequest и GetResponseRequest.
Примеры использования:
- Получение ответа из очереди (GetResponseRequest)
//ru.voskhod.smev.client.api.util.Utils - класс клиента СМЭВ
XMLGregorianCalendar timestamp = Utils.getNow();
//timestamp используется для создания конверта. //Необходим только если планируется внешнее подписание. //Если не задать, клиент при сборке сообщения для отправки обновит дату //на текущую и подпись станет невалидной. QueryInformation queryInformation = QueryInformation(nodeId, namespaceURI, rootElementLocalName, type, timestamp);
//получение конверта для подписания GetResponseRequest requestRequest = new MessageMapperImpl().createGetResponseRequest(queryInformation);
... подписание запроса Element xmldSigSignatureType = ...;
//отправка запроса wsTemplate.get(queryInformation, xmldSigSignatureType); |
- Отправка запроса (SendRequestRequest)
//формируем элемент для содержимого MessagePrimaryContent запроса
Element content = ...;
//Формируем запрос List<Element> businessProcessMetaData = ...; RequestContent requestContent = new RequestContent(content, personalSign, attachments, businessProcessMetaData); SMEVMessage smevMessage = new SMEVMessage(smevMetadata, requestContent); SendRequestRequest requestRequest = new MessageMapperImpl().createSendRequestRequest(smevMessage);
...подписание запроса Element xmldSigSignatureType = ...;
//отправка запроса wsTemplate.send(smevMessage, xmldSigSignatureType); |
2 Получение подписи отправителя из входящего сообщения
Содержимое подписи отправителя SenderInformationSystemSignature в полученном сообщении СМЭВ ранее было недоступно. Добавлена возможность его получить для дальнейшей обработки, например, для визуализации штампа с данными сертификата.
В ru.voskhod.smev.client.api.types.message.system.SmevContext добавлено поле Element senderInformationSystemSignature;
Пример получения:
SMEVMessage response = ... получение сообщения из СМЭВ; response.getSMEVMetadata().getSmevContext().getSenderInformationSystemSignature(); |
3 Исправление ошибки совпадения имен вложений во временной папке
Ранее вложения сохранялись в одной временной папке. Поэтому при использовании в сообщениях файлов с одинаковыми именами, они перезаписывались в ней. После доработки файлы сохраняются в отдельных подпапках с учетом messageId сообщения.
Путь строится следующим образом:
- Вложение MTOM - localStorage/messageId/id
- Вложение на FTP - localStorage/messageId/FileName
4 Корректная обработка статусных сообщений СМЭВ
Для схем СМЭВ версии 1.1 и 1.2 реализована обработка сообщений с асинхронными статусами обработки (AsyncProcessingStatus/StatusCategory). До доработки при любом статусе возвращалось SMEVMessage.SMEVMetadata.SMEVContext.SMEVStatus.REJECTED. Сейчас результат соответствует содержимому:
static { Map<String, SMEVStatus> mapping = new HashMap<>(); mapping.put("requestIsQueued", QUEUED); mapping.put("responseIsAcceptedBySmev", ACCEPTED); mapping.put("requestIsAcceptedBySmev", ACCEPTED); mapping.put("cancelled", REJECTED); mapping.put("requestIsRejectedBySmev", REJECTED); mapping.put("underProcessing", PROCESSING); mapping.put("responseIsDelivered", DELIVERED); mapping.put("messageIsArchived", ARCHIVED); mapping.put("messageIsDelivered", ARCHIVED); mapping.put("responseIsRejectedBySmev", REJECTED); mapping.put("doesNotExist", UNKNOWN); SMEVStatus.mapping = Collections.unmodifiableMap(mapping); } |
5 Обработка входящих сообщений с вложениями MTOM без подписи
6 Корректное сохранение на файловой системе конвертов сообщений с вложениями MTOM
До доработки, если было включено сохранение конвертов сообщений на файловой системе, при получении сообщения с вложением MTOM конверт сохранялся корректно, но содержимое вложения невозможно было прочитать.Сохранение конвертов включается при создании объекта ru.voskhod.smev.client.api.template.configuration.WSConfigurationImpl, если messageStorage не null (messageStorage содержит путь к папке).
Вложение MTOM из сообщения можно получить с помощью SMEVMessage.getData().getAttachments() (MTOMAttachment, поле content).
В рамках доработки в классе ru.voskhod.smev.client.api.types.message.attachment.MTOMAttachment у поля content тип изменен с DataHandler на byte[].