Проверка на наличие вирусов, загруженные файлы с помощью антивируса ClamAV


Мне нужно проверить загруженный файл для антивируса, и если есть исключение, я должен дать сообщение в соответствии с исключением для пользователей. например, если тайм-аут, я хотел бы попросить пользователей, чтобы попробовать againg в некоторое время.

Мой первый класс, fileupload С является:

public class FileUpload {

    //Message when no virus found.     
    private static final String NO_VIRUS_FOUND =  "No virus found";


    //More attributes and functions


    public void checkFile(FacesContext ctx, UIComponent comp, Object value) throws IOException {
          file = (Part) value;
          if (file != null) {
                  String antiVirusResult;    
                  antiVirusResult = FileCheckClass.checkVirus(getConfig(), file.getInputStream(), NO_VIRUS_FOUND);
                 if (!antiVirusResult.contains(NO_VIRUS_FOUND)) {

                     generateAntiVirusMessages(antiVirusResult);
                     throw new ValidatorException(msgs);
                 }
          }
     }

}

Мой класс второй, класс filecheck не имеет checkVirus() функции:

public static String checkVirus(FileConfig fileconfig, InputStream inputStream, String noVirusFound) {
        try {

            ClamAVClient cl = new ClamAVClient(fileConfig.getClamavHost(), fileConfig.getClamavPort(), DEFAULT_TIMEOUT);      

            if(ClamAVClient.isCleanReply(cl.scan(inputStream))){
                return noVirusFound;
            }
        } catch (Exception e) {
            logger.error("Error while scanning file: ", e);
            return e.toString();
        }
        return noVirusFound;
    }

От проверки на вирусы функция, я должен возвращать строку, так что я пас NO_VIRUS_FOUND в нее с первого класса.

  • Это приемлемая практика, чтобы передать строку из одного класса в другой только для целей сравнения строк в конце. Я боюсь, что если я определяю струны по отдельности в два класса, изменения в одном классе могут серьезно повлиять на результат выполнения функции в других.

  • Может там могут быть некоторые улучшения, что кто-то может предложить выше ситуации?



670
2
задан 10 апреля 2018 в 10:04 Источник Поделиться
Комментарии
1 ответ


  1. представляется логичным falacy: что делать, если ClamAVClient.isCleanReply() возвращает false, а не исключение? нет еще пункт есть, и checkVirus вернется не вирус нашли.

  2. вместо возвращения Stringпочему не checkVirus() повторно бросить исключение? таким образом, он может также вернуть строку имя вируса (или как производится из ClamAVClient)

  3. вместо того, чтобы передать строку, сделать ее публичной. тогда любой класс может ссылаться на него как FileUpload.NO_VIRUS_FOUND

  4. еще лучше, сделать перечисление из-за постоянной. таким образом, вы можете добавлять значения в enum (как VIRUS_FOUND ...)

хотя это спорно, кодирования, исключением считается анти-паттерн. Исключения должны быть зарезервированы для ошибок, а не как показатель того, что был найден вирус.

Редактировать:

что касается вопроса, как реализовать пункт 2:
Во-первых, я хотел создать исключение custum, что означает неудачную проверку на вирусы

public class VirusCheckException extends Exception {
public VirusCheckException(Throwable cause) {
super(cause);
}
public VirusCheckException(String message, Throwable cause) {
super(message, cause);
}
// also rest of constructors...
}

затем, вместо того, чтобы возвращать сообщение об исключении, бросить пользовательское исключение. возвращаемое значение-это освободило для получения более богатые данные от сканирования (если это возможно):

public static String checkVirus(FileConfig fileconfig, InputStream inputStream, String noVirusFound) 
throws VirusCheckException {
try {
ClamAVClient cl = new ClamAVClient(fileConfig.getClamavHost(), fileConfig.getClamavPort(), DEFAULT_TIMEOUT);

Object response = cl.scan(inputStream);
if (ClamAVClient.isCleanReply(response)) {
return noVirusFound;
} else {
return ClamAVClient.getVirusName(response); // assuming there is such...
}
} catch (Exception e) {
return new VirusCheckException("Virus Found!", e);
}
}

теперь вы должны поймать это исключение в методе callng и обработать его:

public void checkFile(...) {
try {
antiVirusResult = FileCheckClass.checkVirus(getConfig(), file.getInputStream(), NO_VIRUS_FOUND);
} catch (VirusCheckException e) {
generateAntiVirusMessages(e.getMessage());
throw new ValidatorException(msgs);
}
}

1
ответ дан 10 апреля 2018 в 11:04 Источник Поделиться