From 80206eaf073a22a623b9908c670c97cabe763ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= <127139797+balazs-szucs@users.noreply.github.com> Date: Mon, 17 Nov 2025 12:58:07 +0100 Subject: [PATCH] feat(config): enforce minimum qpdf version requirement (#4907) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description of Changes - 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 --- ## Checklist ### General - [X] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [X] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [X] I have performed a self-review of my own code - [X] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. 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();