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