Crate clamav_stream

Crate clamav_stream 

Source
Expand description

A ScannedStream sends the inner stream to clamav to scan its contents while passes it through to the stream consumer.

If a virus is detected by the clamav, it returns Err as stream chunk otherwise it just passes the inner stream through to the consumer.

§When the byte stream is clean

There are no deferences between consuming ScannedStream and its inner stream.

use clamav_stream::ScannedStream;

use bytes::Bytes;
use std::net::TcpStream;
use tokio::fs::File;
use tokio_stream::StreamExt;
use tokio_util::io::ReaderStream;

#[tokio::main]
async fn main() {
    let file = File::open("tests/clean.txt").await.unwrap();
    let mut input = ReaderStream::new(file);

    let addr = "localhost:3310"; // tcp address to clamav server.
    let mut stream = ScannedStream::<_, TcpStream>::tcp(&mut input, addr).unwrap();

    // The result of consuming ScannedStream is equal to consuming the input stream.
    assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 1st"))));
    assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 2nd"))));
    // ... continue until all contents are consumed ...
    assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents last"))));
    assert_eq!(stream.next().await, None);
}

§When the byte stream is infected

An Err is returned after all contents are consumed.

use clamav_stream::{Error, ScannedStream};

use bytes::Bytes;
use std::net::TcpStream;
use tokio::fs::File;
use tokio_stream::StreamExt;
use tokio_util::io::ReaderStream;

#[tokio::main]
async fn main() {
    let file = File::open("tests/eicar.txt").await.unwrap();
    let mut input = ReaderStream::new(file);

    let addr = "localhost:3310"; // tcp address to clamav server.
    let mut stream = ScannedStream::<_, TcpStream>::tcp(&mut input, addr).unwrap();

    // An Err is returned after all contents are consumed.
    assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 1st"))));
    assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 2nd"))));
    // ... continue until all contents are consumed ...
    assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents last"))));
    assert_eq!(stream.next().await, Some(Err(Error::Scan("message from clamav".into()))));
    assert_eq!(stream.next().await, None);
}

Structs§

ScannedStream
A wrapper stream holding byte stream. This sends the inner stream to clamav to scan it while passes it through to the consumer.

Enums§

Error
The error type returned by ScannedStream.