Thema dieser Dokumentation / Das FirstSpirit 5 Modul- / Komponenten-Modell / Modul-Implementierung mit den Komponenten-Typen - PUBLIC, SERVICE, LIBRARY / Die LIBRARY-Komponente(n) des Moduls

Die LIBRARY-Komponente(n) des Moduls

Class: de.espirit.firstspirit.opt.vscan.engines.clamav.ClamScanEngine

Klasse: ClamScanEngine

Package: de.espirit.firstspirit.opt.vscan.engines.clamav.ClamScanEngine

Die konkrete Implementierung des ScanEngine-Interfaces. Diese Klasse setzt alle Status, enthält die Logik zur Kommunikation mit der externen Scan-Engine und extrahiert aus dem Reply die nötigen Informationen, um einen eindeutigen Status zu setzen (throw new UploadRejectedException). Anstelle dieser Implementierung der ClamScanEngine (/usr/bin/clamscan) kann man sich bspw. auch eine HTTP/ICAP-Implementierung vorstellen.

Wichtig Prinzipiell muss für die Einbindung weiterer Scanning-Engines nur die nötige(n) Klasse(n) für die spezielle AntiVirus-Anwendungen implementiert werden. Die ClamScanEngine-Klasse soll zeigen, wie es z. B. auch möglich wäre, eine ICAP-Umsetzung zu schaffen, die mittels ICAP-Client mit einer entfernten ICAP-AntiVirus-Anwendung (Symantec, Kaspersky etc.) kommuniziert.
Hierzu ist eine Anpassung anderer Klassen oder Interfaces nicht notwendig, z. B.: de.espirit.firstspirit.opt.vscan.engines.icap.IcapClient
Wichtig Eine Implementierung, welche die FirstSpirit UploadFilter-API nutzt, muss eine konkrete UploadRejectedException werfen, falls ein Medium nicht den Restriktionen entspricht oder im Falle der ScanEngine ein Virus gefunden wurde.

Listing: de.espirit.firstspirit.opt.vscan.engines.clamav.ClamScanEngine

package de.espirit.firstspirit.opt.vscan.engines.clamav;

import de.espirit.common.base.Logging;
import de.espirit.firstspirit.access.AccessUtil;
import de.espirit.firstspirit.opt.vscan.ScanEngine;
import de.espirit.firstspirit.access.store.mediastore.UploadRejectedException;
import de.espirit.firstspirit.opt.vscan.VScanService;
import de.espirit.firstspirit.opt.vscan.VScanServiceConfiguration;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URI;

public class ClamScanEngine implements ScanEngine {

public static final Class<?> LOGGER = ClamScanEngine.class;
public static final String ENGINE_NAME = "ClamAv"; // NON-NLS

private URI _executable;

public ClamScanEngine() {
Logging.logDebug("ClamScanEngine created", LOGGER); // NON-NLS
}

public String getName() {
return ENGINE_NAME;
}

public void init(final VScanServiceConfiguration configuration) {
_executable = configuration.getExecutable();
Logging.logDebug("Executable set to: " + _executable, LOGGER); // NON-NLS
if ( ! executableExists()) {
Logging.logError(VScanService.MODULE_NAME + ": " + getName() +
" executable '" + getExecutable() +
"' not found.", LOGGER); // NON-NLS
throw new IllegalStateException(VScanService.MODULE_NAME + ": " +
getName() + " executable '" + getExecutable() + "' not found.");
}
}

public URI getExecutable() {
return _executable;
}

public boolean executableExists() {
final File file = new File(getExecutable().toString());
return file.exists() && file.isFile();
}

public void scanFile(final File arg) throws UploadRejectedException {
if (Logging.isDebugEnabled(LOGGER)) {
Logging.logDebug("scanning file " + arg, LOGGER); // NON-NLS
}
final String[] args = {getExecutable().toString(), arg.toString()};
try {
final StringWriter out = new StringWriter();
final StringWriter error = new StringWriter();
AccessUtil.executeProcess(out, error, args);
final String message = out.toString();
final String[] stat = message.split(":");
final String[] cause = message.split("\n");
if ( ! " OK".equals(stat[1].substring(0, 3))) {
Logging.logError("File upload rejected - " +
message, LOGGER); // NON-NLS
throw new UploadRejectedException(cause[0]);
}
if (Logging.isDebugEnabled(LOGGER)) {
Logging.logDebug("scanned file " + arg, LOGGER); // NON-NLS
}
} catch (IOException e) {
Logging.logError("Couldn't start process",
e, LOGGER); // NON-NLS
throw new UploadRejectedException(
"Couldn't start upload filter process", e);
}
}

public boolean isThreadSafe() {
return true;
}

}

© 2005 - 2024 Crownpeak Technology GmbH | Alle Rechte vorbehalten. | FirstSpirit 2024.13 | Datenschutz