From 0b7f3d1c0ea88363dc46f4595e088c35f41ad08f Mon Sep 17 00:00:00 2001 From: Viktor Seifert Date: Mon, 28 Nov 2022 15:02:28 +0100 Subject: [PATCH] RED-5670: Changed temp file creation so that it works on any OS, not just on Unix/Linux --- .../service/DossierTemplateImportService.java | 28 +++----- .../peristence/v1/server/utils/FileUtils.java | 65 +++++++++++++++++++ .../tests/ReduceFileSizeMigrationTest.java | 4 +- .../v1/server/integration/utils/OsUtils.java | 22 ------- 4 files changed, 75 insertions(+), 44 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/OsUtils.java diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java index f06657c5e..daba77c0d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java @@ -8,12 +8,7 @@ import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -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.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; @@ -32,7 +27,6 @@ import javax.transaction.Transactional; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -41,6 +35,7 @@ import org.springframework.web.bind.annotation.RequestBody; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.iqser.red.service.peristence.v1.server.utils.FileUtils; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; @@ -529,9 +524,7 @@ public class DossierTemplateImportService { objectMapper.registerModule(new JavaTimeModule()); File tempFile; try { - FileAttribute> attr = PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------")); - tempFile = Files.createTempFile(UUID.randomUUID().toString(), ".zip", attr).toFile(); - IOUtils.write(request.getArchive(), new FileOutputStream(tempFile)); + tempFile = FileUtils.createTempFile(request.getArchive(), UUID.randomUUID().toString(), ".zip"); var importTemplateResult = new ImportTemplateResult(); importTemplateResult.setDossierTemplateId(request.getDossierTemplateId()); importTemplateResult.setUserId(request.getUserId()); @@ -588,26 +581,26 @@ public class DossierTemplateImportService { DossierTemplate dossierTemplate = objectMapper.readValue(bytes, DossierTemplate.class); importTemplateResult.setDossierTemplate(dossierTemplate); } else if (ze.getName().contains(ExportFilename.WATERMARK.getFilename())) { - List watermarkList = objectMapper.readValue(bytes, new TypeReference>() { + List watermarkList = objectMapper.readValue(bytes, new TypeReference<>() { }); importTemplateResult.getWatermarks().addAll(watermarkList); } else if (ze.getName().contains(ExportFilename.COLORS.getFilename())) { Colors colors = objectMapper.readValue(bytes, Colors.class); importTemplateResult.setColors(colors); } else if (ze.getName().contains(ExportFilename.DOSSIER_STATUS.getFilename())) { - List dossierStatusInfoList = objectMapper.readValue(bytes, new TypeReference>() { + List dossierStatusInfoList = objectMapper.readValue(bytes, new TypeReference<>() { }); importTemplateResult.getDossierStatusInfos().addAll(dossierStatusInfoList); } else if (ze.getName().contains(ExportFilename.DOSSIER_ATTRIBUTES_CONFIG.getFilename())) { - List dossierAttributeConfigs = objectMapper.readValue(bytes, new TypeReference>() { + List dossierAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() { }); importTemplateResult.getDossierAttributesConfigs().addAll(dossierAttributeConfigs); } else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_CONFIG.getFilename())) { - List fileAttributeConfigs = objectMapper.readValue(bytes, new TypeReference>() { + List fileAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() { }); importTemplateResult.getFileAttributesConfigs().addAll(fileAttributeConfigs); } else if (ze.getName().contains(ExportFilename.LEGAL_BASIS.getFilename())) { - List legalBasisList = objectMapper.readValue(bytes, new TypeReference>() { + List legalBasisList = objectMapper.readValue(bytes, new TypeReference<>() { }); importTemplateResult.getLegalBases().addAll(legalBasisList); } else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_GENERAL_CONFIG.getFilename())) { @@ -653,8 +646,6 @@ public class DossierTemplateImportService { importTemplateResult.setFalsePositives(typeFalsePositivesMap); importTemplateResult.setFalseRecommendations(typeFalseRecommendationsMap); - List reportTemplateUploadRequests = new ArrayList<>(); - for (var reportZe : reportTemplateBytesMap.entrySet()) { if (reportTemplateFilenameList.contains(reportZe.getKey())) { var report = reportTemplateMap.get(reportZe.getKey()); @@ -668,7 +659,6 @@ public class DossierTemplateImportService { .build()); } - importTemplateResult.getReportTemplateUploadRequests().addAll(reportTemplateUploadRequests); } return importTemplateResult; } finally { @@ -679,9 +669,7 @@ public class DossierTemplateImportService { } } } - } catch (IOException e) { - throw new BadRequestException(e.getMessage(), e); - } catch (BadRequestException e) { + } catch (IOException | BadRequestException e) { throw new BadRequestException(e.getMessage(), e); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java new file mode 100644 index 000000000..f05c90250 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java @@ -0,0 +1,65 @@ +package com.iqser.red.service.peristence.v1.server.utils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@UtilityClass +public class FileUtils { + + public String getTemporaryDirectory() { + + String tmpdir = System.getProperty("java.io.tmpdir"); + if (isWindows() && StringUtils.isNotBlank(tmpdir)) { + return tmpdir; + } + return "/tmp"; + } + + + private boolean isWindows() { + + return StringUtils.containsIgnoreCase(System.getProperty("os.name"), "Windows"); + } + + + public File createTempFile(byte[] content, String filenamePrefix, String filenameSuffix) throws IOException { + + File tempFile = Files.createTempFile(filenamePrefix, filenameSuffix).toFile(); + setRWPermissionsOnlyForOwner(tempFile); + + try (FileOutputStream outputStream = new FileOutputStream(tempFile)) { + IOUtils.write(content, outputStream); + } + 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/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java index 2dd121a8b..b2872a809 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java @@ -8,8 +8,8 @@ import org.springframework.core.io.ClassPathResource; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.peristence.v1.server.integration.utils.OsUtils; import com.iqser.red.service.peristence.v1.server.migration.migrations.ReduceTextFileSizeMigration10; +import com.iqser.red.service.peristence.v1.server.utils.FileUtils; import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; @@ -37,7 +37,7 @@ public class ReduceFileSizeMigrationTest extends AbstractPersistenceServerServic // readJSONObject will not work here. var text = storageService.getObject(StorageIdUtils.getStorageId("dossierId", "fileId", FileType.TEXT)); - try (FileOutputStream fileOutputStream = new FileOutputStream(OsUtils.getTemporaryDirectory() + "/MigratedText.json")) { + try (FileOutputStream fileOutputStream = new FileOutputStream(FileUtils.getTemporaryDirectory() + "/MigratedText.json")) { fileOutputStream.write(text.getInputStream().readAllBytes()); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/OsUtils.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/OsUtils.java deleted file mode 100644 index c6d723759..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/OsUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.utils; - -import org.apache.commons.lang3.StringUtils; - -public class OsUtils { - - public static boolean isWindows() { - - return StringUtils.containsIgnoreCase(System.getProperty("os.name"), "Windows"); - } - - - public static String getTemporaryDirectory() { - - String tmpdir = System.getProperty("java.io.tmpdir"); - if (isWindows() && StringUtils.isNotBlank(tmpdir)) { - return tmpdir; - } - return "/tmp"; - } - -}