From fa723c07aed48cdc6df88abf27641c37cacdf0bb Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 28 Jul 2022 11:23:39 +0300 Subject: [PATCH] Fix critical issue with open file handle leak on user guide folder --- .../controllers/UserGuideController.java | 47 ++++++++++--------- .../eudat/logic/managers/MetricsManager.java | 12 ++--- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java index 2a5dca57a..9e26cf92a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java @@ -20,6 +20,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -41,32 +42,36 @@ public class UserGuideController { @RequestMapping(path = "{lang}", method = RequestMethod.GET ) public ResponseEntity getUserGuide(@PathVariable(name = "lang") String lang) throws IOException { - long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); - metricsManager.calculateValue(MetricNames.LANGUAGES, (int) files, null); - Stream walk = Files.walk(Paths.get(this.environment.getProperty("userguide.path"))); - List result = walk.filter(Files::isRegularFile) - .map(Path::toString).collect(Collectors.toList()); - - String fileName = result.stream().filter(guide -> guide.contains("_" + lang)).findFirst().orElse(null); - if (fileName == null) { - fileName = result.stream().filter(guide -> guide.contains("_en")).findFirst().get(); + long files = 0; + try (Stream paths = Files.list(Paths.get(Objects.requireNonNull(this.environment.getProperty("userguide.path"))))) { + files = paths.count(); } - InputStream is = new FileInputStream(fileName); + metricsManager.calculateValue(MetricNames.LANGUAGES, (int) files, null); + try (Stream paths = Files.walk(Paths.get(Objects.requireNonNull(this.environment.getProperty("userguide.path"))))) { + List result = paths.filter(Files::isRegularFile) + .map(Path::toString).collect(Collectors.toList()); - Path path = Paths.get(fileName); + String fileName = result.stream().filter(guide -> guide.contains("_" + lang)).findFirst().orElse(null); + if (fileName == null) { + fileName = result.stream().filter(guide -> guide.contains("_en")).findFirst().get(); + } + InputStream is = new FileInputStream(fileName); - HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.setContentLength(is.available()); - responseHeaders.setContentType(MediaType.TEXT_HTML); - responseHeaders.set("Content-Disposition", "attachment;filename=" + path.getFileName().toString()); - responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); - responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + Path path = Paths.get(fileName); - byte[] content = new byte[is.available()]; - is.read(content); - is.close(); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(is.available()); + responseHeaders.setContentType(MediaType.TEXT_HTML); + responseHeaders.set("Content-Disposition", "attachment;filename=" + path.getFileName().toString()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); - return new ResponseEntity<>(content, responseHeaders, HttpStatus.OK); + byte[] content = new byte[is.available()]; + is.read(content); + is.close(); + + return new ResponseEntity<>(content, responseHeaders, HttpStatus.OK); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 63bac9c04..b39aebd6d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -17,15 +17,13 @@ import javax.annotation.PostConstruct; import javax.transaction.Transactional; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneId; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -179,8 +177,10 @@ public class MetricsManager { calculateValue(MetricNames.USERS, (int) userManager.countActiveUsers().intValue(), MetricNames.LOGGEDIN); calculateValue(MetricNames.USERS, (int) userManager.countAllUsers().intValue(), MetricNames.TOTAL); - long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); - calculateValue(MetricNames.LANGUAGES, (int) files, null); + try (Stream paths = Files.list(Paths.get(Objects.requireNonNull(this.environment.getProperty("userguide.path"))))) { + long files = paths.count(); + calculateValue(MetricNames.LANGUAGES, (int) files, null); + } calculateValue(MetricNames.INSTALLATIONS, 1, null); calculateValue(MetricNames.NEXUS + MetricNames.INSTALLATIONS, 1, null);