cert-sign

This commit is contained in:
Ludy87 2025-05-02 19:29:40 +02:00
parent 8516ad1543
commit c66dc984c0
No known key found for this signature in database
GPG Key ID: 92696155E0220F94
2 changed files with 34 additions and 12 deletions

View File

@ -1,6 +1,7 @@
package stirling.software.SPDF.controller.api.security;
import java.awt.*;
import java.beans.PropertyEditorSupport;
import java.io.*;
import java.nio.file.Files;
import java.security.*;
@ -53,7 +54,10 @@ import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;
import org.bouncycastle.pkcs.PKCSException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -82,6 +86,18 @@ public class CertSignController {
Security.addProvider(new BouncyCastleProvider());
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
MultipartFile.class,
new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(null);
}
});
}
private final CustomPDFDocumentFactory pdfDocumentFactory;
private static void sign(
@ -103,8 +119,7 @@ public class CertSignController {
signature.setLocation(location);
signature.setReason(reason);
signature.setSignDate(Calendar.getInstance());
if (showSignature) {
if (Boolean.TRUE.equals(showSignature)) {
SignatureOptions signatureOptions = new SignatureOptions();
signatureOptions.setVisualSignature(
instance.createVisibleSignature(doc, signature, pageNumber, showLogo));
@ -121,7 +136,12 @@ public class CertSignController {
}
}
@PostMapping(consumes = "multipart/form-data", value = "/cert-sign")
@PostMapping(
consumes = {
MediaType.MULTIPART_FORM_DATA_VALUE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE
},
value = "/cert-sign")
@Operation(
summary = "Sign PDF with a Digital Certificate",
description =
@ -137,12 +157,12 @@ public class CertSignController {
MultipartFile p12File = request.getP12File();
MultipartFile jksfile = request.getJksFile();
String password = request.getPassword();
Boolean showSignature = request.isShowSignature();
Boolean showSignature = request.getShowSignature();
String reason = request.getReason();
String location = request.getLocation();
String name = request.getName();
Integer pageNumber = request.getPageNumber() - 1;
Boolean showLogo = request.isShowLogo();
Integer pageNumber = request.getPageNumber() != null ? (request.getPageNumber() - 1) : null;
Boolean showLogo = request.getShowLogo();
if (certType == null) {
throw new IllegalArgumentException("Cert type must be provided");
@ -279,7 +299,7 @@ public class CertSignController {
widget.setAppearance(appearance);
try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream)) {
if (showLogo) {
if (Boolean.TRUE.equals(showLogo)) {
cs.saveGraphicsState();
PDExtendedGraphicsState extState = new PDExtendedGraphicsState();
extState.setBlendMode(BlendMode.MULTIPLY);

View File

@ -20,7 +20,8 @@ public class SignPDFWithCertRequest extends PDFFile {
@Schema(
description =
"The private key for the digital certificate (required for PEM type certificates)")
"The private key for the digital certificate (required for PEM type"
+ " certificates)")
private MultipartFile privateKeyFile;
@Schema(description = "The digital certificate (required for PEM type certificates)")
@ -32,11 +33,11 @@ public class SignPDFWithCertRequest extends PDFFile {
@Schema(description = "The JKS keystore file (Java Key Store)")
private MultipartFile jksFile;
@Schema(description = "The password for the keystore or the private key")
@Schema(description = "The password for the keystore or the private key", format = "password")
private String password;
@Schema(description = "Whether to visually show the signature in the PDF file")
private boolean showSignature;
private Boolean showSignature;
@Schema(description = "The reason for signing the PDF")
private String reason;
@ -49,9 +50,10 @@ public class SignPDFWithCertRequest extends PDFFile {
@Schema(
description =
"The page number where the signature should be visible. This is required if showSignature is set to true")
"The page number where the signature should be visible. This is required if"
+ " showSignature is set to true")
private Integer pageNumber;
@Schema(description = "Whether to visually show a signature logo along with the signature")
private boolean showLogo;
private Boolean showLogo;
}