RED-5670: Changed temp file creation so that it works on any OS, not just on Unix/Linux

This commit is contained in:
Viktor Seifert 2022-11-28 15:02:28 +01:00
parent 7852836630
commit 0b7f3d1c0e
4 changed files with 75 additions and 44 deletions

View File

@ -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<Set<PosixFilePermission>> 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<Watermark> watermarkList = objectMapper.readValue(bytes, new TypeReference<List<Watermark>>() {
List<Watermark> 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<DossierStatusInfo> dossierStatusInfoList = objectMapper.readValue(bytes, new TypeReference<List<DossierStatusInfo>>() {
List<DossierStatusInfo> dossierStatusInfoList = objectMapper.readValue(bytes, new TypeReference<>() {
});
importTemplateResult.getDossierStatusInfos().addAll(dossierStatusInfoList);
} else if (ze.getName().contains(ExportFilename.DOSSIER_ATTRIBUTES_CONFIG.getFilename())) {
List<DossierAttributeConfig> dossierAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<List<DossierAttributeConfig>>() {
List<DossierAttributeConfig> dossierAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() {
});
importTemplateResult.getDossierAttributesConfigs().addAll(dossierAttributeConfigs);
} else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_CONFIG.getFilename())) {
List<FileAttributeConfig> fileAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<List<FileAttributeConfig>>() {
List<FileAttributeConfig> fileAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() {
});
importTemplateResult.getFileAttributesConfigs().addAll(fileAttributeConfigs);
} else if (ze.getName().contains(ExportFilename.LEGAL_BASIS.getFilename())) {
List<LegalBasis> legalBasisList = objectMapper.readValue(bytes, new TypeReference<List<LegalBasis>>() {
List<LegalBasis> 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<ReportTemplateUploadRequest> 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);
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}

View File

@ -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";
}
}