From b6905e5732612ac2522f3f6ca11aab985ed43112 Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 31 Jan 2025 14:15:14 +0100 Subject: [PATCH] Return pdf file --- .../SigningRequestDocumentController.java | 10 +++++ .../services/PdfService.java | 7 ++++ .../services/impl/PdfServiceImpl.java | 38 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/main/java/ch/dlmw/swisssignchallenge/services/PdfService.java create mode 100644 src/main/java/ch/dlmw/swisssignchallenge/services/impl/PdfServiceImpl.java diff --git a/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java b/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java index 5a09258..9c186fb 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java @@ -1,6 +1,7 @@ package ch.dlmw.swisssignchallenge.controllers; import ch.dlmw.swisssignchallenge.entities.SigningRequestDocument; +import ch.dlmw.swisssignchallenge.services.PdfService; import ch.dlmw.swisssignchallenge.services.SigningRequestDocumentService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -9,6 +10,7 @@ import com.github.fge.jsonpatch.JsonPatchException; import lombok.AllArgsConstructor; import org.openapitools.api.SigningRequestDocumentApi; import org.openapitools.model.PatchOperation; +import org.springframework.core.io.Resource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -19,6 +21,7 @@ import java.util.List; @AllArgsConstructor public class SigningRequestDocumentController implements SigningRequestDocumentApi { private final SigningRequestDocumentService signingRequestDocumentService; + private final PdfService pdfService; private final ObjectMapper objectMapper; @Override @@ -38,6 +41,13 @@ public class SigningRequestDocumentController implements SigningRequestDocumentA } } + @Override + public ResponseEntity getSigningRequestDocumentData(String id) { + var document = signingRequestDocumentService.getSigningRequestDocument(id); + + return ResponseEntity.ok(pdfService.getPdf(document.getName())); + } + private T applyPatch(List patchOperations, T object, Class entityType) throws JsonPatchException, IOException { JsonNode patchNode = objectMapper.valueToTree(patchOperations); JsonPatch jsonPatch = JsonPatch.fromJson(patchNode); diff --git a/src/main/java/ch/dlmw/swisssignchallenge/services/PdfService.java b/src/main/java/ch/dlmw/swisssignchallenge/services/PdfService.java new file mode 100644 index 0000000..a01f8bc --- /dev/null +++ b/src/main/java/ch/dlmw/swisssignchallenge/services/PdfService.java @@ -0,0 +1,7 @@ +package ch.dlmw.swisssignchallenge.services; + +import org.springframework.core.io.Resource; + +public interface PdfService { + Resource getPdf(String name); +} diff --git a/src/main/java/ch/dlmw/swisssignchallenge/services/impl/PdfServiceImpl.java b/src/main/java/ch/dlmw/swisssignchallenge/services/impl/PdfServiceImpl.java new file mode 100644 index 0000000..26e0348 --- /dev/null +++ b/src/main/java/ch/dlmw/swisssignchallenge/services/impl/PdfServiceImpl.java @@ -0,0 +1,38 @@ +package ch.dlmw.swisssignchallenge.services.impl; + +import ch.dlmw.swisssignchallenge.services.PdfService; +import lombok.AllArgsConstructor; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.stereotype.Service; + +import java.net.MalformedURLException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.NoSuchElementException; + +@Service +@AllArgsConstructor +public class PdfServiceImpl implements PdfService { + private static final String FILE_DIRECTORY = "/srv/pdfs/"; + + @Override + public Resource getPdf(String name) { + if (name.contains("..")) { // this is to avoid traversal attacks + throw new IllegalArgumentException("Invalid file name: " + name); + } + + Path filePath = Paths.get(FILE_DIRECTORY).resolve(name).normalize(); + Resource resource; + try { + resource = new UrlResource(filePath.toUri()); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Invalid file name: " + name); + } + if (!resource.exists() || !resource.isReadable()) { + throw new NoSuchElementException("Couldn't find file: " + name); + } + + return resource; + } +}