From 1751aaa23de2bda0162dc7708391f0c14640fba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Sat, 15 Nov 2025 16:05:16 +0100 Subject: [PATCH] feat(config): enforce minimum qpdf version requirement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added validation to ensure qpdf version is at least 12.0.0 - Disabled corresponding groups if the installed version is below the requirement - Logged warnings for unsupported or undetermined versions Signed-off-by: Balázs Szücs --- .../SPDF/config/ExternalAppDepConfig.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/core/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java b/app/core/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java index a703d1da3..22ad2adf4 100644 --- a/app/core/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java +++ b/app/core/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java @@ -148,6 +148,31 @@ public class ExternalAppDepConfig { "WeasyPrint version could not be determined ({} --version)", command)); } + + // Extra: enforce minimum qpdf version if command matches + if (isQpdf(command)) { + Optional version = getVersionSafe(command, "--version"); + version.ifPresentOrElse( + v -> { + Version installed = new Version(v); + Version required = new Version("12.0.0"); + if (installed.compareTo(required) < 0) { + List affectedGroups = + commandToGroupMapping.getOrDefault(command, List.of("qpdf")); + for (String group : affectedGroups) { + endpointConfiguration.disableGroup(group); + } + log.warn( + "qpdf version {} is below required {} - disabling group(s): {}", + installed, + required, + String.join(", ", affectedGroups)); + } else { + log.info("qpdf {} meets minimum {}", installed, required); + } + }, + () -> log.warn("qpdf version could not be determined ({} --version)", command)); + } } private boolean isWeasyprint(String command) { @@ -155,6 +180,10 @@ public class ExternalAppDepConfig { || command.toLowerCase(Locale.ROOT).contains("weasyprint"); } + private boolean isQpdf(String command) { + return command.toLowerCase(Locale.ROOT).contains("qpdf"); + } + private List getAffectedFeatures(String group) { List endpoints = new ArrayList<>(endpointConfiguration.getEndpointsForGroup(group)); return endpoints.stream().map(this::formatEndpointAsFeature).toList();