Пожалуйста, помогите мне с mule esb и clamAV - PullRequest
0 голосов
/ 04 июля 2019

На самом деле с Mule ESB я использую SFTP-коннектор для передачи файлов и компонент Java, который реализует ClamAV для возможности их анализа.Меня беспокоит то, что я не могу восстановить файл, который находится в полезной нагрузке, для передачи методу сканирования, который ожидает InputStream, пока полезная нагрузка отправляет мне строку.Кто-нибудь когда-либо использовал ClamAV с Mule ESB

Спасибо

<flow name="ScanWithClamAvAndTransferFileOK">
        <sftp:inbound-endpoint connector-ref="SFTP" host="${sftp.host}" port="${sftp.port}" path="${sftp.path}" user="${sftp.user}" password="${sftp.password}" responseTimeout="30000" doc:name="Transfer file to SFTP Server"/>
        <component class="reporting.ClamAvTranformer" doc:name="Antivirus ClamAV"/>
        <file:outbound-endpoint path="/home/test" connector-ref="File" responseTimeout="10000" outputPattern="#[function:datestamp]-#[message.inboundProperties['originalFilename']]" doc:name="File"/>
    </flow>
public Object onCall(MuleEventContext eventContext) throws Exception {
        // TODO Auto-generated method stub
        MuleMessage message = eventContext.getMessage();
        byte[] reply = getReply((SftpInputStream) message.getPayload());
        return handleReply(reply);
    }

    private Object handleReply(byte[] reply) throws Exception{
        ResponseDTO response = new ResponseDTO();
        if (ClamAVClient.isCleanReply(reply)) {
            response.setResponseType("Scan réussi avec succès !");
        } else {
            response.setResponseType("Scan rejeté !");
            response.setMessage(byteToString(reply));
            //response.setResultType(ResultType.BUSINESS_FAULT.toString());
        }
        return response;
    }

    private byte[] getReply(InputStream stream) throws IllegalStateException{
        try {
            return clamAV.scan(stream);
        } catch (Exception e) {
            throw new IllegalStateException("Le fichier ne peut pas etre scanner, cause : "+e.getMessage(),e);
        }
    }

    private String byteToString(byte[] reply) throws Exception{
        return new String(reply, "UTF-8").trim();
    }

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

На самом деле проблема в том, что я вижу массив байтов в буфере на уровне полезной нагрузки, но я передаю объект методу сканирования Clamav, он возвращает ошибку о том, что объект нулевой:

enter image description here

У меня есть ошибка:

ОШИБКА 2019-07-04 10: 51: 30,873 [[report] .ScanWithClamAvAndTransferFileOK.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy:

Сообщение: java.lang.IllegalStateException: сканер неисправен, причина: нулевая.Компонент, вызвавший исключение: DefaultJavaComponent {ScanWithClamAvAndTransferFileOK.component.853887645}.

См. Изображение:

enter image description here

0 голосов
/ 04 июля 2019

Проблема здесь (я полагаю) в том, что, как только ClamAV использует InputStream, больше нечего передавать.У меня есть аналогичный случай использования, когда один InputStream получен, и это должно быть отсканировано с помощью ClamAV и передано в базу данных.Это было решено путем «многоадресной передачи» InputStream в два OutputStream, которые, в свою очередь, читаются двумя InputStreams, один идет в базу данных, другой - в ClamAV.Эти два потока затем должны быть прочитаны, чтобы продолжить поток.Если проверка на вирусы завершится неудачно, транзакция будет прервана и откатана, а все, что было отправлено в базу данных, будет удалено.

В вашем случае этот подход может быть немного сложным.Альтернативой может быть чтение InputStream в байтовый массив, а затем создание потоков из этого байтового массива, один для отправки в ClamAV, и, если он пройдет, один для передачи.Обратите внимание, что это будет означать, что весь файл будет храниться в памяти, поэтому убедитесь, что Mule достаточно.

...