From b839c4e3aea67c94fa29d476f63673fc232dcdab Mon Sep 17 00:00:00 2001 From: Philipp Schramm Date: Mon, 30 Jan 2023 11:51:14 +0100 Subject: [PATCH] RED-5248: Fix handling of temp files --- .../segmentation/PdfSegmentationService.java | 19 +------- .../tableextraction/utils/FileUtils.java | 43 +++++++++++++++++++ .../FileSystemBackedStorageService.java | 5 ++- .../AnalyseFileRealDataIntegrationTest.java | 18 ++++---- 4 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/utils/FileUtils.java diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java index 05166420..10388bd4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java @@ -4,18 +4,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.attribute.FileAttribute; -import java.nio.file.attribute.PosixFilePermission; -import java.nio.file.attribute.PosixFilePermissions; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.SystemUtils; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -36,6 +30,7 @@ import com.iqser.red.service.redaction.v1.server.tableextraction.model.AbstractT import com.iqser.red.service.redaction.v1.server.tableextraction.model.CleanRulings; import com.iqser.red.service.redaction.v1.server.tableextraction.service.RulingCleaningService; import com.iqser.red.service.redaction.v1.server.tableextraction.service.TableExtractionService; +import com.iqser.red.service.redaction.v1.server.tableextraction.utils.FileUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -60,17 +55,7 @@ public class PdfSegmentationService { PDDocument pdDocument = null; try { //create tempFile - File tempFile; - - if (SystemUtils.IS_OS_UNIX) { - FileAttribute> attr = PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------")); - tempFile = Files.createTempFile("document", ".pdf", attr).toFile(); - } else { - tempFile = Files.createTempFile("document", ".pdf").toFile(); - tempFile.setReadable(true, true); - tempFile.setWritable(true, true); - tempFile.setExecutable(true, true); - } + File tempFile = FileUtils.createTempFile("document", ".pdf"); Map> pdfTableCells = new HashMap<>(); if (redactionServiceSettings.isCvTableParsingEnabled()) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/utils/FileUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/utils/FileUtils.java new file mode 100644 index 00000000..209d5f58 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/utils/FileUtils.java @@ -0,0 +1,43 @@ +package com.iqser.red.service.redaction.v1.server.tableextraction.utils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@UtilityClass +public class FileUtils { + + public File createTempFile(String filenamePrefix, String filenameSuffix) throws IOException { + + System.out.println(filenamePrefix + " " + filenameSuffix); + File tempFile = Files.createTempFile(filenamePrefix, filenameSuffix).toFile(); + setRWPermissionsOnlyForOwner(tempFile); + + return tempFile; + } + + + // We don't need to check the results of the permission setters below, + // since we're manipulating a file we created ourselves. + @SuppressWarnings("ResultOfMethodCallIgnored") + private void setRWPermissionsOnlyForOwner(File tempFile) { + + try { + // deny for all + tempFile.setReadable(false); + tempFile.setWritable(false); + tempFile.setExecutable(false); + // allow for owner + tempFile.setReadable(true, true); + tempFile.setWritable(true, true); + } catch (SecurityException ex) { + // This should never happen since we're creating a temp file ourselves. + log.warn("Caught an exception during temp file creation. This should not happend. Check the code.", ex); + } + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/FileSystemBackedStorageService.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/FileSystemBackedStorageService.java index 8e867191..16dc95d1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/FileSystemBackedStorageService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/FileSystemBackedStorageService.java @@ -15,6 +15,7 @@ import org.springframework.core.io.InputStreamResource; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.commons.jackson.ObjectMapperFactory; +import com.iqser.red.service.redaction.v1.server.tableextraction.utils.FileUtils; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; @@ -67,7 +68,7 @@ public class FileSystemBackedStorageService implements StorageService { @SneakyThrows public void storeJSONObject(String objectId, T any) { - File tempFile = File.createTempFile("test", ".tmp"); + File tempFile = FileUtils.createTempFile("test", ".tmp"); getMapper().writeValue(new FileOutputStream(tempFile), any); dataMap.put(objectId, tempFile); } @@ -106,7 +107,7 @@ public class FileSystemBackedStorageService implements StorageService { @SneakyThrows public void storeObject(String objectId, InputStream stream) { - File tempFile = File.createTempFile("test", ".tmp"); + File tempFile = FileUtils.createTempFile("test", ".tmp"); try (var fileOutputStream = new FileOutputStream(tempFile)) { IOUtils.copy(stream, fileOutputStream); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java index 97772805..de4cd80d 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java @@ -1,5 +1,13 @@ package com.iqser.red.service.redaction.v1.server.realdata; +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Set; + +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; @@ -10,14 +18,6 @@ import com.iqser.red.service.redaction.v1.server.annotate.AnnotationService; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; - -import java.time.OffsetDateTime; -import java.util.List; -import java.util.Set; - @Slf4j public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest { @@ -88,7 +88,7 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest // var annotated = annotationService.annotate(AnnotateRequest.builder().fileId("fileId").dossierId("dossierId").build()); // annotated.getDocument(); // -// File tempFile = File.createTempFile("annotated",".pdf"); +// File tempFile = FileUtils.createTempFile("annotated",".pdf"); // IOUtils.write(annotated.getDocument(), new FileOutputStream(tempFile)); // log.warn("File saved to: {}",tempFile.getAbsolutePath()); // Runtime.getRuntime().exec("open "+tempFile.getAbsolutePath());