diff --git a/README.md b/README.md index 157f60c..d9b89bf 100644 --- a/README.md +++ b/README.md @@ -35,19 +35,15 @@ spring: server: port: 8080 # Порт, на котором работает сервис ``` -Если KESL использует русскую локализацию, то следует в файл `application.yaml` добавить следующий параметр: +Для проверки ответов от KESL, при обнаружении архива с паролем, следует в файл `application.yaml` добавить следующий параметр: ```yaml password: protected: result: - name: 'Объекты, защищенные паролем' -``` -Для английской локализации: -```yaml -password: - protected: - result: - name: 'Password-protected objects' + names: [ + 'Объекты, защищенные паролем', + 'Password-protected objects' + ] ``` ### **2. Запуск JAR-файла с конфигурационным файлом** ```bash diff --git a/pom.xml b/pom.xml index 5c35eea..c6d5d21 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,12 @@ spring-boot-starter-web + + org.springframework.boot + spring-boot-configuration-processor + compile + + org.zeroturnaround zt-exec diff --git a/src/main/java/ru/micord/av/service/AvServiceApplication.java b/src/main/java/ru/micord/av/service/AvServiceApplication.java index 7fe9aa8..a9b1d9b 100644 --- a/src/main/java/ru/micord/av/service/AvServiceApplication.java +++ b/src/main/java/ru/micord/av/service/AvServiceApplication.java @@ -2,8 +2,11 @@ package ru.micord.av.service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import ru.micord.av.service.property.PasswordProtectedResultNamesProperty; @SpringBootApplication +@EnableConfigurationProperties(value = PasswordProtectedResultNamesProperty.class) public class AvServiceApplication { public static void main(String[] args) { diff --git a/src/main/java/ru/micord/av/service/property/PasswordProtectedResultNamesProperty.java b/src/main/java/ru/micord/av/service/property/PasswordProtectedResultNamesProperty.java new file mode 100644 index 0000000..e25304d --- /dev/null +++ b/src/main/java/ru/micord/av/service/property/PasswordProtectedResultNamesProperty.java @@ -0,0 +1,26 @@ +package ru.micord.av.service.property; + +import java.util.List; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Alexandr Shalaginov + */ +@Component +@ConfigurationProperties(prefix = "password.protected.result") +public class PasswordProtectedResultNamesProperty { + private List names = List.of( + "Объекты, защищенные паролем", + "Password-protected objects" + ); + + public List getNames() { + return names; + } + + public void setNames(List names) { + this.names = names; + } +} diff --git a/src/main/java/ru/micord/av/service/service/FileScanService.java b/src/main/java/ru/micord/av/service/service/FileScanService.java index 8d32265..e5adb33 100644 --- a/src/main/java/ru/micord/av/service/service/FileScanService.java +++ b/src/main/java/ru/micord/av/service/service/FileScanService.java @@ -9,6 +9,7 @@ import java.util.concurrent.TimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -16,6 +17,7 @@ import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.ProcessResult; import org.zeroturnaround.exec.stream.slf4j.Slf4jStream; import ru.micord.av.service.exception.AvException; +import ru.micord.av.service.property.PasswordProtectedResultNamesProperty; /** * @author Adel Kalimullin @@ -25,10 +27,15 @@ public class FileScanService { private static final String KESL_CONTROL = "kesl-control"; private static final String KESL_SCAN = "--scan-file"; private static final Logger LOGGER = LoggerFactory.getLogger(FileScanService.class); - @Value("${file.upload.directory:/tmp/uploaded_files}") - private String uploadDirectory; - @Value("${password.protected.result.name:Объекты, защищенные паролем}") - private String passwordProtectedResultName; + private final String uploadDirectory; + private final PasswordProtectedResultNamesProperty passwordProtectedResultNamesProperty; + + @Autowired + public FileScanService(@Value("${file.upload.directory:/tmp/uploaded_files}") String uploadDirectory, + PasswordProtectedResultNamesProperty passwordProtectedResultNamesProperty) { + this.uploadDirectory = uploadDirectory; + this.passwordProtectedResultNamesProperty = passwordProtectedResultNamesProperty; + } public int scanFile(MultipartFile file) { File tempFile = null; @@ -80,19 +87,28 @@ public class FileScanService { } private void checkScanResult(String result, String originalFileName) { - if (!result.contains(passwordProtectedResultName)) { + boolean isResultContains = passwordProtectedResultNamesProperty.getNames().stream() + .filter(result::contains) + .toList() + .isEmpty(); + + if (!isResultContains) { throw new AvException(String.format( - "File scan result doesn't contains \"%s\", " - + "please check property \"password.protected.result.name\" is correct", - passwordProtectedResultName + "File scan result doesn't contains any of values: \"%s\". " + + "Please check property \"password.protected.result.names\" is correct", + passwordProtectedResultNamesProperty.getNames() )); } for (String line : result.split("\n")) { String[] lineParts = line.split(":"); if (lineParts.length > 1) { - if (lineParts[0].startsWith(passwordProtectedResultName) - && Integer.parseInt(lineParts[1].trim()) > 0) { + boolean isLinePartStartWith = passwordProtectedResultNamesProperty.getNames().stream() + .filter(lineParts[0]::startsWith) + .toList() + .isEmpty(); + + if (isLinePartStartWith && Integer.parseInt(lineParts[1].trim()) > 0) { throw new AvException("Detected password-protected file: " + originalFileName); } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index be42268..9d05834 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -5,4 +5,7 @@ file: password: protected: result: - name: 'Объекты, защищенные паролем' \ No newline at end of file + names: [ + 'Объекты, защищенные паролем', + 'Password-protected objects' + ] \ No newline at end of file