From f5ca02df1d0146f15e8f6a1cd7902606edf0e3ab Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 23 Feb 2025 13:36:21 +0000 Subject: [PATCH] Dynamic paths for tools and removal of unused book endpoints (#3018) # Description of Changes This pull request includes several changes primarily focused on improving configuration management, removing deprecated methods, and updating paths for external dependencies. The most important changes are summarized below: ### Configuration Management Improvements: * Added a new `RuntimePathConfig` class to manage dynamic paths for operations and pipeline configurations (`src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java`). * Removed the `bookAndHtmlFormatsInstalled` bean and its associated logic from `AppConfig` and `EndpointConfiguration` (`src/main/java/stirling/software/SPDF/config/AppConfig.java`, `src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java`). [[1]](diffhunk://#diff-4d774ec79aa55750c0a4739bee971b68877078b73654e863fd40ee924347e143L130-L138) [[2]](diffhunk://#diff-750f31f6ecbd64b025567108a33775cad339e835a04360affff82a09410b697dL12-L35) [[3]](diffhunk://#diff-750f31f6ecbd64b025567108a33775cad339e835a04360affff82a09410b697dL275-L280) ### External Dependency Path Updates: * Updated paths for `weasyprint` and `unoconvert` in `ExternalAppDepConfig` to use values from `RuntimePathConfig` (`src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java`). [[1]](diffhunk://#diff-c47af298c07c2622aa98b038b78822c56bdb002de71081e102d344794e7832a6R12-L33) [[2]](diffhunk://#diff-c47af298c07c2622aa98b038b78822c56bdb002de71081e102d344794e7832a6L104-R115) ### Minor Adjustments: * Corrected a typo from "Unoconv" to "Unoconvert" in `EndpointConfiguration` (`src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java`). --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/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/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] 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/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### 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/DeveloperGuide.md#6-testing) for more details. --- .../software/SPDF/EE/EEAppConfig.java | 1 + .../SPDF/EE/KeygenLicenseVerifier.java | 1 + .../software/SPDF/EE/LicenseKeyChecker.java | 1 + .../software/SPDF/SPDFApplication.java | 2 + .../software/SPDF/UI/impl/DesktopBrowser.java | 3 + .../software/SPDF/UI/impl/LoadingWindow.java | 1 + .../software/SPDF/config/AppConfig.java | 10 +- .../SPDF/config/EndpointConfiguration.java | 21 +--- .../SPDF/config/ExternalAppDepConfig.java | 37 +++++--- .../software/SPDF/config/InitialSetup.java | 2 + .../SPDF/config/InstallationPathConfig.java | 28 ------ .../software/SPDF/config/MetricsFilter.java | 1 + .../software/SPDF/config/PostHogConfig.java | 1 + .../SPDF/config/RuntimePathConfig.java | 86 +++++++++++++++++ .../CustomAuthenticationFailureHandler.java | 2 + .../CustomAuthenticationSuccessHandler.java | 2 + .../security/CustomLogoutSuccessHandler.java | 2 + .../config/security/FirstLoginFilter.java | 2 + .../config/security/IPRateLimitingFilter.java | 1 + .../config/security/InitialSecuritySetup.java | 2 + .../config/security/LoginAttemptService.java | 2 + .../security/SecurityConfiguration.java | 1 + .../security/UserAuthenticationFilter.java | 2 + .../security/UserBasedRateLimitingFilter.java | 1 + .../SPDF/config/security/UserService.java | 5 +- .../security/database/DatabaseConfig.java | 1 + .../security/database/DatabaseService.java | 1 + ...tomOAuth2AuthenticationFailureHandler.java | 1 + ...tomOAuth2AuthenticationSuccessHandler.java | 1 + .../oauth2/CustomOAuth2UserService.java | 1 + .../security/oauth2/OAuth2Configuration.java | 1 + ...stomSaml2AuthenticationFailureHandler.java | 1 + ...stomSaml2AuthenticationSuccessHandler.java | 2 + ...mSaml2ResponseAuthenticationConverter.java | 1 + .../security/saml2/SAML2Configuration.java | 2 + .../session/CustomHttpSessionListener.java | 1 + .../session/SessionPersistentRegistry.java | 1 + .../security/session/SessionRepository.java | 1 + .../api/AdditionalLanguageJsController.java | 1 + .../controller/api/DatabaseController.java | 1 + .../SPDF/controller/api/MergeController.java | 1 + .../api/RearrangePagesPDFController.java | 1 + .../controller/api/SplitPDFController.java | 1 + .../api/SplitPdfByChaptersController.java | 1 + .../api/SplitPdfBySizeController.java | 1 + .../SPDF/controller/api/UserController.java | 2 + .../ConvertBookToPDFController.java | 77 --------------- .../api/converters/ConvertHtmlToPDF.java | 15 +-- .../converters/ConvertImgPDFController.java | 1 + .../api/converters/ConvertMarkdownToPdf.java | 14 +-- .../converters/ConvertOfficeController.java | 8 +- .../ConvertPDFToBookController.java | 95 ------------------- .../api/converters/ConvertPDFToPDFA.java | 1 + .../api/converters/ConvertWebsiteToPDF.java | 9 +- .../api/converters/ExtractCSVController.java | 38 ++++---- .../api/misc/AutoRenameController.java | 1 + .../api/misc/AutoSplitPdfController.java | 1 + .../api/misc/BlankPageController.java | 1 + .../api/misc/ExtractImageScansController.java | 1 + .../api/misc/ExtractImagesController.java | 1 + .../api/misc/FlattenController.java | 1 + .../api/misc/MetadataController.java | 1 + .../controller/api/misc/OCRController.java | 1 + .../api/misc/OverlayImageController.java | 1 + .../api/misc/PrintFileController.java | 1 + .../api/pipeline/ApiDocService.java | 2 + .../api/pipeline/PipelineController.java | 1 + .../pipeline/PipelineDirectoryProcessor.java | 92 ++++++++++++++---- .../api/pipeline/PipelineProcessor.java | 2 + .../api/security/CertSignController.java | 1 + .../controller/api/security/GetInfoOnPDF.java | 1 + .../api/security/RedactController.java | 1 + .../controller/web/AccountWebController.java | 2 + .../web/ConverterWebController.java | 17 ---- .../controller/web/DatabaseWebController.java | 1 + .../controller/web/GeneralWebController.java | 13 ++- .../controller/web/HomeWebController.java | 1 + .../controller/web/MetricsController.java | 2 + .../SPDF/model/ApplicationProperties.java | 21 ++++ .../software/SPDF/model/SessionEntity.java | 1 + .../SPDF/model/api/PDFWithPageNums.java | 1 + .../api/converters/ConvertToImageRequest.java | 1 + .../api/converters/HTMLToPdfRequest.java | 1 + .../api/converters/PdfToBookRequest.java | 1 + .../api/converters/PdfToPdfARequest.java | 1 + .../converters/PdfToPresentationRequest.java | 1 + .../api/converters/PdfToTextOrRTFRequest.java | 1 + .../api/converters/PdfToWordRequest.java | 1 + .../model/api/filter/ContainsTextRequest.java | 1 + .../model/api/filter/FileSizeRequest.java | 1 + .../model/api/filter/PageRotationRequest.java | 1 + .../model/api/filter/PageSizeRequest.java | 1 + .../SPDF/model/api/general/CropPdfForm.java | 1 + .../general/MergeMultiplePagesRequest.java | 1 + .../model/api/general/MergePdfsRequest.java | 1 + .../model/api/general/OverlayPdfsRequest.java | 1 + .../api/general/RearrangePagesRequest.java | 1 + .../model/api/general/RotatePDFRequest.java | 1 + .../model/api/general/ScalePagesRequest.java | 1 + .../general/SplitPdfBySizeOrCountRequest.java | 1 + .../model/api/misc/AddPageNumbersRequest.java | 1 + .../SPDF/model/api/misc/AddStampRequest.java | 1 + .../model/api/misc/AutoSplitPdfRequest.java | 1 + .../model/api/misc/ExtractHeaderRequest.java | 1 + .../SPDF/model/api/misc/FlattenRequest.java | 1 + .../SPDF/model/api/misc/MetadataRequest.java | 1 + .../model/api/misc/OptimizePdfRequest.java | 1 + .../model/api/misc/OverlayImageRequest.java | 1 + .../SPDF/model/api/misc/PrintFileRequest.java | 1 + .../api/misc/ProcessPdfWithOcrRequest.java | 1 + .../api/misc/RemoveBlankPagesRequest.java | 1 + .../misc/ReplaceAndInvertColorRequest.java | 1 + .../api/security/AddPasswordRequest.java | 1 + .../api/security/AddWatermarkRequest.java | 1 + .../api/security/ManualRedactPdfRequest.java | 1 + .../api/security/PDFPasswordRequest.java | 1 + .../model/api/security/RedactPdfRequest.java | 1 + .../api/security/SanitizePdfRequest.java | 1 + .../api/security/SignPDFWithCertRequest.java | 1 + .../security/SignatureValidationRequest.java | 1 + .../software/SPDF/pdf/TextFinder.java | 1 + .../SPDF/service/CustomPDDocumentFactory.java | 1 + .../SPDF/service/LanguageService.java | 1 + .../SPDF/service/SignatureService.java | 1 + .../software/SPDF/utils/FileMonitor.java | 45 ++++++++- .../software/SPDF/utils/FileToPdf.java | 31 ++---- .../software/SPDF/utils/GeneralUtils.java | 1 + .../software/SPDF/utils/PDFToFile.java | 1 + .../software/SPDF/utils/PdfUtils.java | 1 + .../software/SPDF/utils/ProcessExecutor.java | 1 + .../misc/CustomColorReplaceStrategy.java | 1 + .../misc/ReplaceAndInvertColorStrategy.java | 1 + .../StringToArrayListPropertyEditor.java | 1 + src/main/resources/settings.yml.template | 9 ++ .../converters/ConvertWebsiteToPdfTest.java | 8 +- .../software/SPDF/utils/FileToPdfTest.java | 3 +- 136 files changed, 465 insertions(+), 349 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java delete mode 100644 src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java delete mode 100644 src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java diff --git a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java index 4648c033..67cb8a91 100644 --- a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java +++ b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java @@ -6,6 +6,7 @@ import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Configuration diff --git a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java index c75c98e9..a562cbcb 100644 --- a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java +++ b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.posthog.java.shaded.org.json.JSONObject; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java b/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java index 4636c892..9de7a705 100644 --- a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java +++ b/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java @@ -7,6 +7,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/SPDFApplication.java b/src/main/java/stirling/software/SPDF/SPDFApplication.java index 242a0bff..a7c7bf3e 100644 --- a/src/main/java/stirling/software/SPDF/SPDFApplication.java +++ b/src/main/java/stirling/software/SPDF/SPDFApplication.java @@ -22,7 +22,9 @@ import io.github.pixee.security.SystemCommand; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.config.ConfigInitializer; import stirling.software.SPDF.config.InstallationPathConfig; diff --git a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java index b221d019..403b2536 100644 --- a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java +++ b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java @@ -34,11 +34,14 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import jakarta.annotation.PreDestroy; + import lombok.extern.slf4j.Slf4j; + import me.friwi.jcefmaven.CefAppBuilder; import me.friwi.jcefmaven.EnumProgress; import me.friwi.jcefmaven.MavenCefAppHandlerAdapter; import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; + import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.utils.UIScaling; diff --git a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java index b4479be3..93118924 100644 --- a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java +++ b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java @@ -14,6 +14,7 @@ import javax.swing.*; import io.github.pixee.security.BoundedLineReader; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.UIScaling; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index a3379df3..cb9dbcd8 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -20,6 +20,7 @@ import org.springframework.core.io.ResourceLoader; import org.thymeleaf.spring6.SpringTemplateEngine; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Configuration @@ -127,15 +128,6 @@ public class AppConfig { } } - @Bean(name = "bookAndHtmlFormatsInstalled") - public boolean bookAndHtmlFormatsInstalled() { - String installOps = System.getProperty("INSTALL_BOOK_AND_ADVANCED_HTML_OPS"); - if (installOps == null) { - installOps = System.getenv("INSTALL_BOOK_AND_ADVANCED_HTML_OPS"); - } - return "true".equalsIgnoreCase(installOps); - } - @ConditionalOnMissingClass("stirling.software.SPDF.config.security.SecurityConfiguration") @Bean(name = "activSecurity") public boolean missingActivSecurity() { diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index c8fe0c29..16121170 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.config; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -9,30 +8,24 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Service @Slf4j -@DependsOn({"bookAndHtmlFormatsInstalled"}) public class EndpointConfiguration { private static final String REMOVE_BLANKS = "remove-blanks"; private final ApplicationProperties applicationProperties; private Map endpointStatuses = new ConcurrentHashMap<>(); private Map> endpointGroups = new ConcurrentHashMap<>(); - private boolean bookAndHtmlFormatsInstalled; @Autowired - public EndpointConfiguration( - ApplicationProperties applicationProperties, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled) { + public EndpointConfiguration(ApplicationProperties applicationProperties) { this.applicationProperties = applicationProperties; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; init(); processEnvironmentConfigs(); } @@ -197,8 +190,8 @@ public class EndpointConfiguration { addEndpointToGroup("LibreOffice", "pdf-to-html"); addEndpointToGroup("LibreOffice", "pdf-to-xml"); - // Unoconv - addEndpointToGroup("Unoconv", "file-to-pdf"); + // Unoconvert + addEndpointToGroup("Unoconvert", "file-to-pdf"); // qpdf addEndpointToGroup("qpdf", "compress-pdf"); @@ -272,12 +265,6 @@ public class EndpointConfiguration { List endpointsToRemove = applicationProperties.getEndpoints().getToRemove(); List groupsToRemove = applicationProperties.getEndpoints().getGroupsToRemove(); - if (!bookAndHtmlFormatsInstalled) { - if (groupsToRemove == null) { - groupsToRemove = new ArrayList<>(); - } - groupsToRemove.add("Calibre"); - } if (endpointsToRemove != null) { for (String endpoint : endpointsToRemove) { disableEndpoint(endpoint.trim()); diff --git a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java index 886244ff..3a77dd08 100644 --- a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java +++ b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import org.springframework.context.annotation.Configuration; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; @Configuration @@ -16,21 +17,29 @@ import lombok.extern.slf4j.Slf4j; public class ExternalAppDepConfig { private final EndpointConfiguration endpointConfiguration; - private final Map> commandToGroupMapping = - new HashMap<>() { - { - put("soffice", List.of("LibreOffice")); - put("/opt/venv/bin/weasyprint", List.of("Weasyprint")); - put("pdftohtml", List.of("Pdftohtml")); - put("/opt/venv/bin/unoconvert", List.of("Unoconv")); - put("qpdf", List.of("qpdf")); - put("tesseract", List.of("tesseract")); - } - }; + private final String weasyprintPath; + private final String unoconvPath; + private final Map> commandToGroupMapping; - public ExternalAppDepConfig(EndpointConfiguration endpointConfiguration) { + public ExternalAppDepConfig( + EndpointConfiguration endpointConfiguration, RuntimePathConfig runtimePathConfig) { this.endpointConfiguration = endpointConfiguration; + weasyprintPath = runtimePathConfig.getWeasyPrintPath(); + unoconvPath = runtimePathConfig.getUnoConvertPath(); + + commandToGroupMapping = + new HashMap<>() { + + { + put("soffice", List.of("LibreOffice")); + put(weasyprintPath, List.of("Weasyprint")); + put("pdftohtml", List.of("Pdftohtml")); + put(unoconvPath, List.of("Unoconvert")); + put("qpdf", List.of("qpdf")); + put("tesseract", List.of("tesseract")); + } + }; } private boolean isCommandAvailable(String command) { @@ -101,9 +110,9 @@ public class ExternalAppDepConfig { checkDependencyAndDisableGroup("tesseract"); checkDependencyAndDisableGroup("soffice"); checkDependencyAndDisableGroup("qpdf"); - checkDependencyAndDisableGroup("/opt/venv/bin/weasyprint"); + checkDependencyAndDisableGroup(weasyprintPath); checkDependencyAndDisableGroup("pdftohtml"); - checkDependencyAndDisableGroup("/opt/venv/bin/unoconvert"); + checkDependencyAndDisableGroup(unoconvPath); // Special handling for Python/OpenCV dependencies boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python"); if (!pythonAvailable) { diff --git a/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/src/main/java/stirling/software/SPDF/config/InitialSetup.java index c8053b6f..a533c90a 100644 --- a/src/main/java/stirling/software/SPDF/config/InitialSetup.java +++ b/src/main/java/stirling/software/SPDF/config/InitialSetup.java @@ -13,7 +13,9 @@ import org.springframework.stereotype.Component; import io.micrometer.common.util.StringUtils; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java b/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java index 757e9a13..af6076a9 100644 --- a/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java +++ b/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java @@ -11,7 +11,6 @@ public class InstallationPathConfig { // Root paths private static final String LOG_PATH; private static final String CONFIG_PATH; - private static final String PIPELINE_PATH; private static final String CUSTOM_FILES_PATH; private static final String CLIENT_WEBUI_PATH; @@ -19,11 +18,6 @@ public class InstallationPathConfig { private static final String SETTINGS_PATH; private static final String CUSTOM_SETTINGS_PATH; - // Pipeline paths - private static final String PIPELINE_WATCHED_FOLDERS_PATH; - private static final String PIPELINE_FINISHED_FOLDERS_PATH; - private static final String PIPELINE_DEFAULT_WEB_UI_CONFIGS; - // Custom file paths private static final String STATIC_PATH; private static final String TEMPLATES_PATH; @@ -35,7 +29,6 @@ public class InstallationPathConfig { // Initialize root paths LOG_PATH = BASE_PATH + "logs" + File.separator; CONFIG_PATH = BASE_PATH + "configs" + File.separator; - PIPELINE_PATH = BASE_PATH + "pipeline" + File.separator; CUSTOM_FILES_PATH = BASE_PATH + "customFiles" + File.separator; CLIENT_WEBUI_PATH = BASE_PATH + "clientWebUI" + File.separator; @@ -43,11 +36,6 @@ public class InstallationPathConfig { SETTINGS_PATH = CONFIG_PATH + "settings.yml"; CUSTOM_SETTINGS_PATH = CONFIG_PATH + "custom_settings.yml"; - // Initialize pipeline paths - PIPELINE_WATCHED_FOLDERS_PATH = PIPELINE_PATH + "watchedFolders" + File.separator; - PIPELINE_FINISHED_FOLDERS_PATH = PIPELINE_PATH + "finishedFolders" + File.separator; - PIPELINE_DEFAULT_WEB_UI_CONFIGS = PIPELINE_PATH + "defaultWebUIConfigs" + File.separator; - // Initialize custom file paths STATIC_PATH = CUSTOM_FILES_PATH + "static" + File.separator; TEMPLATES_PATH = CUSTOM_FILES_PATH + "templates" + File.separator; @@ -92,10 +80,6 @@ public class InstallationPathConfig { return CONFIG_PATH; } - public static String getPipelinePath() { - return PIPELINE_PATH; - } - public static String getCustomFilesPath() { return CUSTOM_FILES_PATH; } @@ -112,18 +96,6 @@ public class InstallationPathConfig { return CUSTOM_SETTINGS_PATH; } - public static String getPipelineWatchedFoldersDir() { - return PIPELINE_WATCHED_FOLDERS_PATH; - } - - public static String getPipelineFinishedFoldersDir() { - return PIPELINE_FINISHED_FOLDERS_PATH; - } - - public static String getPipelineDefaultWebUIConfigsDir() { - return PIPELINE_DEFAULT_WEB_UI_CONFIGS; - } - public static String getStaticPath() { return STATIC_PATH; } diff --git a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java index fba1ee9c..d187502c 100644 --- a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java +++ b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java @@ -14,6 +14,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import stirling.software.SPDF.utils.RequestUriUtils; @Component diff --git a/src/main/java/stirling/software/SPDF/config/PostHogConfig.java b/src/main/java/stirling/software/SPDF/config/PostHogConfig.java index fc5ed308..4d537112 100644 --- a/src/main/java/stirling/software/SPDF/config/PostHogConfig.java +++ b/src/main/java/stirling/software/SPDF/config/PostHogConfig.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; import com.posthog.java.PostHog; import jakarta.annotation.PreDestroy; + import lombok.extern.slf4j.Slf4j; @Configuration diff --git a/src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java b/src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java new file mode 100644 index 00000000..4172fd33 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java @@ -0,0 +1,86 @@ +package stirling.software.SPDF.config; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.model.ApplicationProperties.CustomPaths.Operations; +import stirling.software.SPDF.model.ApplicationProperties.CustomPaths.Pipeline; + +@Slf4j +@Configuration +@Getter +public class RuntimePathConfig { + private final ApplicationProperties properties; + private final String basePath; + private final String weasyPrintPath; + private final String unoConvertPath; + + // Pipeline paths + private final String pipelineWatchedFoldersPath; + private final String pipelineFinishedFoldersPath; + private final String pipelineDefaultWebUiConfigs; + private final String pipelinePath; + + public RuntimePathConfig(ApplicationProperties properties) { + this.properties = properties; + this.basePath = InstallationPathConfig.getPath(); + + String pipelinePath = basePath + "pipeline" + File.separator; + String watchedFoldersPath = pipelinePath + "watchedFolders" + File.separator; + String finishedFoldersPath = pipelinePath + "finishedFolders" + File.separator; + String webUiConfigsPath = pipelinePath + "defaultWebUIConfigs" + File.separator; + + Pipeline pipeline = properties.getSystem().getCustomPaths().getPipeline(); + if (pipeline != null) { + if (!StringUtils.isEmpty(pipeline.getWatchedFoldersDir())) { + watchedFoldersPath = pipeline.getWatchedFoldersDir(); + } + if (!StringUtils.isEmpty(pipeline.getFinishedFoldersDir())) { + finishedFoldersPath = pipeline.getFinishedFoldersDir(); + } + if (!StringUtils.isEmpty(pipeline.getWebUIConfigsDir())) { + webUiConfigsPath = pipeline.getWebUIConfigsDir(); + } + } + + this.pipelinePath = pipelinePath; + this.pipelineWatchedFoldersPath = watchedFoldersPath; + this.pipelineFinishedFoldersPath = finishedFoldersPath; + this.pipelineDefaultWebUiConfigs = webUiConfigsPath; + + boolean isDocker = isRunningInDocker(); + + // Initialize Operation paths + String weasyPrintPath = isDocker ? "/opt/venv/bin/weasyprint" : "weasyprint"; + String unoConvertPath = isDocker ? "/opt/venv/bin/unoconvert" : "unoconvert"; + + + // Check for custom operation paths + Operations operations = properties.getSystem().getCustomPaths().getOperations(); + if (operations != null) { + if (!StringUtils.isEmpty(operations.getWeasyprint())) { + weasyPrintPath = operations.getWeasyprint(); + } + if (!StringUtils.isEmpty(operations.getUnoconvert())) { + unoConvertPath = operations.getUnoconvert(); + } + } + + // Assign operations final fields + this.weasyPrintPath = weasyPrintPath; + this.unoConvertPath = unoConvertPath; + } + + private boolean isRunningInDocker() { + return Files.exists(Paths.get("/.dockerenv")); + } + +} diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 23b6dc0d..1a1e2bc3 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -14,7 +14,9 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.User; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java index 61d5a3ce..9784a99c 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java @@ -10,7 +10,9 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.RequestUriUtils; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java index ffeb8d08..88260ea5 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java @@ -18,8 +18,10 @@ import com.coveo.saml.SamlClient; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.config.security.saml2.CertificateUtils; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; diff --git a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java index ee1a5f48..a11eba7f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java @@ -16,7 +16,9 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.User; import stirling.software.SPDF.utils.RequestUriUtils; diff --git a/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java index 02ac582a..3599a833 100644 --- a/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java @@ -6,6 +6,7 @@ import java.util.concurrent.atomic.AtomicInteger; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; + import stirling.software.SPDF.utils.RequestUriUtils; public class IPRateLimitingFilter implements Filter { diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index c521d2ca..432e2d2f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -6,7 +6,9 @@ import java.util.UUID; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.Role; diff --git a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java index 088800d5..f036acfd 100644 --- a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java +++ b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java @@ -6,7 +6,9 @@ import java.util.concurrent.TimeUnit; import org.springframework.stereotype.Service; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.AttemptCounter; diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index 7fbc4436..d140f749 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -29,6 +29,7 @@ import org.springframework.security.web.savedrequest.NullRequestCache; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationFailureHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationSuccessHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2UserService; diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index be425590..6f51d3d3 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -22,7 +22,9 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApiKeyAuthenticationToken; diff --git a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java index 13573349..1c725c9f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java @@ -23,6 +23,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import stirling.software.SPDF.model.Role; @Component diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index 1c8866d5..a45019bc 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -21,6 +21,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; @@ -139,8 +140,8 @@ public class UserService implements UserServiceInterface { User user = findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); - if(user.getApiKey() == null || user.getApiKey().length() == 0) { - user = addApiKeyToUser(username); + if (user.getApiKey() == null || user.getApiKey().length() == 0) { + user = addApiKeyToUser(username); } return user.getApiKey(); } diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java index 32856d0e..d2b301c0 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java @@ -11,6 +11,7 @@ import org.springframework.context.annotation.Configuration; import lombok.Getter; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.provider.UnsupportedProviderException; diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java index adece75d..a8daede3 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java @@ -26,6 +26,7 @@ import org.springframework.jdbc.datasource.init.ScriptException; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java index 88905f76..79ea7bfc 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java @@ -13,6 +13,7 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java index ef4ac324..8c40137c 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java @@ -14,6 +14,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java index 5b2fb994..2c683b38 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java @@ -12,6 +12,7 @@ import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java index b7571796..454af525 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java @@ -20,6 +20,7 @@ import org.springframework.security.oauth2.client.registration.InMemoryClientReg import org.springframework.security.oauth2.core.user.OAuth2UserAuthority; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java index 3b652d35..32bc25db 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java @@ -11,6 +11,7 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java index c6c64a82..0f889323 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java @@ -12,8 +12,10 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java index 6c56a2c5..47a89414 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java @@ -13,6 +13,7 @@ import org.springframework.security.saml2.provider.service.authentication.OpenSa import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.User; diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java b/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java index 0e4b83d1..bc72df7a 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java @@ -18,7 +18,9 @@ import org.springframework.security.saml2.provider.service.registration.Saml2Mes import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; import jakarta.servlet.http.HttpServletRequest; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.SAML2; diff --git a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java index 305684b9..3d97181a 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpSessionEvent; import jakarta.servlet.http.HttpSessionListener; + import lombok.extern.slf4j.Slf4j; @Component diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java index 4c931e01..3c9ea74d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java @@ -11,6 +11,7 @@ import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Component; import jakarta.transaction.Transactional; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.model.SessionEntity; diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java index 0cc875a2..b7f0133f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import jakarta.transaction.Transactional; + import stirling.software.SPDF.model.SessionEntity; @Repository diff --git a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java index fbd568cb..8475d1f2 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Hidden; import jakarta.servlet.http.HttpServletResponse; + import stirling.software.SPDF.service.LanguageService; @RestController diff --git a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java index 0c7e7160..79138721 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java @@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.database.DatabaseService; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java index b5d2cdc6..3a71dec9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java @@ -32,6 +32,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.general.MergePdfsRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java index 35f6cf07..6b04ee77 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.SortTypes; import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.model.api.general.RearrangePagesRequest; diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java index ef6dc9a3..00776bb8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -27,6 +27,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java index e3bb9d35..3d7af365 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java @@ -31,6 +31,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PdfMetadata; import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest; import stirling.software.SPDF.service.PdfMetadataService; diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java index 97e42dca..ee7de379 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -24,6 +24,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index f2534aad..3e37a8ed 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -26,7 +26,9 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java deleted file mode 100644 index 778aab04..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java +++ /dev/null @@ -1,77 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.multipart.MultipartFile; - -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; - -import stirling.software.SPDF.model.api.GeneralFile; -import stirling.software.SPDF.service.CustomPDDocumentFactory; -import stirling.software.SPDF.utils.FileToPdf; -import stirling.software.SPDF.utils.WebResponseUtils; - -// @RestController -// @Tag(name = "Convert", description = "Convert APIs") -// @RequestMapping("/api/v1/convert") -public class ConvertBookToPDFController { - - private final boolean bookAndHtmlFormatsInstalled; - - private final CustomPDDocumentFactory pdfDocumentFactory; - - @Autowired - public ConvertBookToPDFController( - CustomPDDocumentFactory pdfDocumentFactory, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled) { - this.pdfDocumentFactory = pdfDocumentFactory; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; - } - - @PostMapping(consumes = "multipart/form-data", value = "/book/pdf") - @Operation( - summary = - "Convert a BOOK/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx) to PDF", - description = - "(Requires bookAndHtmlFormatsInstalled flag and Calibre installed) This endpoint takes an BOOK/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx) input and converts it to PDF format.") - public ResponseEntity HtmlToPdf(@ModelAttribute GeneralFile request) throws Exception { - MultipartFile fileInput = request.getFileInput(); - - if (!bookAndHtmlFormatsInstalled) { - throw new IllegalArgumentException( - "bookAndHtmlFormatsInstalled flag is False, this functionality is not available"); - } - - if (fileInput == null) { - throw new IllegalArgumentException("Please provide a file for conversion."); - } - - String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename()); - - if (originalFilename != null) { - String originalFilenameLower = originalFilename.toLowerCase(); - if (!originalFilenameLower.endsWith(".epub") - && !originalFilenameLower.endsWith(".mobi") - && !originalFilenameLower.endsWith(".azw3") - && !originalFilenameLower.endsWith(".fb2") - && !originalFilenameLower.endsWith(".txt") - && !originalFilenameLower.endsWith(".docx")) { - throw new IllegalArgumentException( - "File must be in .epub, .mobi, .azw3, .fb2, .txt, or .docx format."); - } - } - byte[] pdfBytes = FileToPdf.convertBookTypeToPdf(fileInput.getBytes(), originalFilename); - - pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); - - String outputFilename = - originalFilename.replaceFirst("[.][^.]+$", "") - + ".pdf"; // Remove file extension and append .pdf - - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index bdc3dd74..cd68798b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,7 +1,6 @@ package stirling.software.SPDF.controller.api.converters; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -13,6 +12,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; @@ -24,20 +24,21 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertHtmlToPDF { - private final boolean bookAndHtmlFormatsInstalled; - private final CustomPDDocumentFactory pdfDocumentFactory; private final ApplicationProperties applicationProperties; + private final RuntimePathConfig runtimePathConfig; + @Autowired public ConvertHtmlToPDF( CustomPDDocumentFactory pdfDocumentFactory, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled, - ApplicationProperties applicationProperties) { + ApplicationProperties applicationProperties, + RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; + this.applicationProperties = applicationProperties; + this.runtimePathConfig = runtimePathConfig; } @PostMapping(consumes = "multipart/form-data", value = "/html/pdf") @@ -65,10 +66,10 @@ public class ConvertHtmlToPDF { byte[] pdfBytes = FileToPdf.convertHtmlToPdf( + runtimePathConfig.getWeasyPrintPath(), request, fileInput.getBytes(), originalFilename, - bookAndHtmlFormatsInstalled, disableSanitize); pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java index 7bdf7534..104ed0fa 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java @@ -31,6 +31,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.converters.ConvertToImageRequest; import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index b1bee105..12153977 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -11,7 +11,6 @@ import org.commonmark.parser.Parser; import org.commonmark.renderer.html.AttributeProvider; import org.commonmark.renderer.html.HtmlRenderer; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -23,6 +22,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.service.CustomPDDocumentFactory; @@ -34,20 +34,20 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertMarkdownToPdf { - private final boolean bookAndHtmlFormatsInstalled; - private final CustomPDDocumentFactory pdfDocumentFactory; private final ApplicationProperties applicationProperties; + private final RuntimePathConfig runtimePathConfig; @Autowired public ConvertMarkdownToPdf( CustomPDDocumentFactory pdfDocumentFactory, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled, - ApplicationProperties applicationProperties) { + ApplicationProperties applicationProperties, + RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; + this.applicationProperties = applicationProperties; + this.runtimePathConfig = runtimePathConfig; } @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") @@ -86,10 +86,10 @@ public class ConvertMarkdownToPdf { byte[] pdfBytes = FileToPdf.convertHtmlToPdf( + runtimePathConfig.getWeasyPrintPath(), null, htmlContent.getBytes(), "converted.html", - bookAndHtmlFormatsInstalled, disableSanitize); pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); String outputFilename = diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java index b7bb699c..4cdfd1bd 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java @@ -22,6 +22,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.ProcessExecutor; @@ -34,10 +35,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; public class ConvertOfficeController { private final CustomPDDocumentFactory pdfDocumentFactory; + private final RuntimePathConfig runtimePathConfig; @Autowired - public ConvertOfficeController(CustomPDDocumentFactory pdfDocumentFactory) { + public ConvertOfficeController( + CustomPDDocumentFactory pdfDocumentFactory, RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; + this.runtimePathConfig = runtimePathConfig; } public File convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { @@ -61,7 +65,7 @@ public class ConvertOfficeController { List command = new ArrayList<>( Arrays.asList( - "/opt/venv/bin/unoconvert", + runtimePathConfig.getUnoConvertPath(), "--port", "2003", "--convert-to", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java deleted file mode 100644 index 18166972..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java +++ /dev/null @@ -1,95 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.multipart.MultipartFile; - -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; - -import stirling.software.SPDF.model.api.converters.PdfToBookRequest; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -// @RestController -// @Tag(name = "Convert", description = "Convert APIs") -// @RequestMapping("/api/v1/convert") -public class ConvertPDFToBookController { - - @Qualifier("bookAndHtmlFormatsInstalled") - private final boolean bookAndHtmlFormatsInstalled; - - public ConvertPDFToBookController( - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled) { - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; - } - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/book") - @Operation( - summary = - "Convert a PDF to a Book/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx .. (others to include by chatgpt) to PDF", - description = - "(Requires bookAndHtmlFormatsInstalled flag and Calibre installed) This endpoint Convert a PDF to a Book/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx .. (others to include by chatgpt) to PDF") - public ResponseEntity HtmlToPdf(@ModelAttribute PdfToBookRequest request) - throws Exception { - MultipartFile fileInput = request.getFileInput(); - if (!bookAndHtmlFormatsInstalled) { - throw new IllegalArgumentException( - "bookAndHtmlFormatsInstalled flag is False, this functionality is not available"); - } - if (fileInput == null) { - throw new IllegalArgumentException("Please provide a file for conversion."); - } - // Validate the output format - String outputFormat = request.getOutputFormat().toLowerCase(); - List allowedFormats = - Arrays.asList( - "epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", - "lrf"); - if (!allowedFormats.contains(outputFormat)) { - throw new IllegalArgumentException("Invalid output format: " + outputFormat); - } - byte[] outputFileBytes; - List command = new ArrayList<>(); - Path tempOutputFile = - Files.createTempFile( - "output_", // Use the output format for the file extension - "." + outputFormat); - Path tempInputFile = null; - try { - // Create temp input file from the provided PDF - // Assuming input is always PDF - tempInputFile = Files.createTempFile("input_", ".pdf"); - Files.write(tempInputFile, fileInput.getBytes()); - command.add("ebook-convert"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - ProcessExecutorResult returnCode = - ProcessExecutor.getInstance(ProcessExecutor.Processes.CALIBRE) - .runCommandWithOutputHandling(command); - outputFileBytes = Files.readAllBytes(tempOutputFile); - } finally { - // Clean up temporary files - if (tempInputFile != null) { - Files.deleteIfExists(tempInputFile); - } - Files.deleteIfExists(tempOutputFile); - } - String outputFilename = - Filenames.toSimpleFileName(fileInput.getOriginalFilename()) - .replaceFirst("[.][^.]+$", "") - + "." - + // Remove file extension and append .pdf - outputFormat; - return WebResponseUtils.bytesToWebResponse(outputFileBytes, outputFilename); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index 69c42701..25c0a213 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.converters.PdfToPdfARequest; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index dccc4dff..6c9f93fc 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -18,6 +18,8 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; @@ -32,10 +34,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; public class ConvertWebsiteToPDF { private final CustomPDDocumentFactory pdfDocumentFactory; + private final RuntimePathConfig runtimePathConfig; @Autowired - public ConvertWebsiteToPDF(CustomPDDocumentFactory pdfDocumentFactory) { + public ConvertWebsiteToPDF( + CustomPDDocumentFactory pdfDocumentFactory, RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; + this.runtimePathConfig = runtimePathConfig; } @PostMapping(consumes = "multipart/form-data", value = "/url/pdf") @@ -65,7 +70,7 @@ public class ConvertWebsiteToPDF { // Prepare the WeasyPrint command List command = new ArrayList<>(); - command.add("/opt/venv/bin/weasyprint"); + command.add(runtimePathConfig.getWeasyPrintPath()); command.add(URL); command.add(tempOutputFile.toString()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java index 7f8e7087..d88bb02d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java @@ -25,9 +25,12 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.pdf.FlexibleCSVWriter; + import technology.tabula.ObjectExtractor; import technology.tabula.Page; import technology.tabula.Table; @@ -51,22 +54,20 @@ public class ExtractCSVController { try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { List pages = form.getPageNumbersList(document, true); SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); - CSVFormat format = CSVFormat.EXCEL.builder() - .setEscape('"') - .setQuoteMode(QuoteMode.ALL) - .build(); + CSVFormat format = + CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build(); for (int pageNum : pages) { try (ObjectExtractor extractor = new ObjectExtractor(document)) { - log.info("{}",pageNum); + log.info("{}", pageNum); Page page = extractor.extract(pageNum); List tables = sea.extract(page); - + for (int i = 0; i < tables.size(); i++) { StringWriter sw = new StringWriter(); FlexibleCSVWriter csvWriter = new FlexibleCSVWriter(format); - csvWriter.write(sw, Collections.singletonList(tables.get(i))); - + csvWriter.write(sw, Collections.singletonList(tables.get(i))); + String entryName = generateEntryName(baseName, pageNum, i + 1); csvEntries.add(new CsvEntry(entryName, sw.toString())); } @@ -83,7 +84,8 @@ public class ExtractCSVController { } } - private ResponseEntity createZipResponse(List entries, String baseName) throws IOException { + private ResponseEntity createZipResponse(List entries, String baseName) + throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ZipOutputStream zipOut = new ZipOutputStream(baos)) { for (CsvEntry entry : entries) { @@ -93,21 +95,25 @@ public class ExtractCSVController { zipOut.closeEntry(); } } - + HttpHeaders headers = new HttpHeaders(); - headers.setContentDisposition(ContentDisposition.builder("attachment") - .filename(baseName + "_extracted.zip").build()); + headers.setContentDisposition( + ContentDisposition.builder("attachment") + .filename(baseName + "_extracted.zip") + .build()); headers.setContentType(MediaType.parseMediaType("application/zip")); - + return ResponseEntity.ok().headers(headers).body(baos.toByteArray()); } private ResponseEntity createCsvResponse(CsvEntry entry, String baseName) { HttpHeaders headers = new HttpHeaders(); - headers.setContentDisposition(ContentDisposition.builder("attachment") - .filename(baseName + "_extracted.csv").build()); + headers.setContentDisposition( + ContentDisposition.builder("attachment") + .filename(baseName + "_extracted.csv") + .build()); headers.setContentType(MediaType.parseMediaType("text/csv")); - + return ResponseEntity.ok().headers(headers).body(entry.content()); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java index 6625c6f5..b85b7fdf 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java index d2f850ce..4700284c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java @@ -33,6 +33,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index 1f3407d3..9c84a8e9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -29,6 +29,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.PdfUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java index 6bcc8003..92c4ed42 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java @@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest; import stirling.software.SPDF.utils.CheckProgramInstall; import stirling.software.SPDF.utils.ProcessExecutor; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index 1036cda6..189b1a7e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -38,6 +38,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFExtractImagesRequest; import stirling.software.SPDF.utils.ImageProcessingUtils; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java index c1e205ea..9361e715 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java @@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.FlattenRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java index 2eec9547..4ebce319 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.MetadataRequest; import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.propertyeditor.StringToMapPropertyEditor; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index c8ffe9de..44fbb65b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java index 951515ad..2814149e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java @@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.OverlayImageRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.PdfUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java index 059e7051..79140c57 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java @@ -26,6 +26,7 @@ import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.PrintFileRequest; @RestController diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java index 12a33051..eb7730e3 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java @@ -19,7 +19,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletContext; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.model.ApiEndpoint; import stirling.software.SPDF.model.Role; diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java index 2d6dd7b3..291cd9b4 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineResult; import stirling.software.SPDF.model.api.HandleDataRequest; diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java index 38550c5c..192bed0e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java @@ -5,9 +5,14 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystemException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.BasicFileAttributes; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -24,7 +29,8 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; -import stirling.software.SPDF.config.InstallationPathConfig; + +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineResult; @@ -50,18 +56,19 @@ public class PipelineDirectoryProcessor { ObjectMapper objectMapper, ApiDocService apiDocService, PipelineProcessor processor, - FileMonitor fileMonitor) { + FileMonitor fileMonitor, + RuntimePathConfig runtimePathConfig) { this.objectMapper = objectMapper; this.apiDocService = apiDocService; - this.watchedFoldersDir = InstallationPathConfig.getPipelineWatchedFoldersDir(); - this.finishedFoldersDir = InstallationPathConfig.getPipelineFinishedFoldersDir(); + this.watchedFoldersDir = runtimePathConfig.getPipelineWatchedFoldersPath(); + this.finishedFoldersDir = runtimePathConfig.getPipelineFinishedFoldersPath(); this.processor = processor; this.fileMonitor = fileMonitor; } @Scheduled(fixedRate = 60000) public void scanFolders() { - Path watchedFolderPath = Paths.get(watchedFoldersDir); + Path watchedFolderPath = Paths.get(watchedFoldersDir).toAbsolutePath(); if (!Files.exists(watchedFolderPath)) { try { Files.createDirectories(watchedFolderPath); @@ -71,19 +78,33 @@ public class PipelineDirectoryProcessor { return; } } - try (Stream paths = Files.walk(watchedFolderPath)) { - paths.filter(Files::isDirectory) - .forEach( - t -> { - try { - if (!t.equals(watchedFolderPath) && !t.endsWith("processing")) { - handleDirectory(t); - } - } catch (Exception e) { - log.error("Error handling directory: {}", t, e); + + try { + Files.walkFileTree( + watchedFolderPath, + new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory( + Path dir, BasicFileAttributes attrs) { + try { + // Skip root directory and "processing" subdirectories + if (!dir.equals(watchedFolderPath) && !dir.endsWith("processing")) { + handleDirectory(dir); } - }); - } catch (Exception e) { + } catch (Exception e) { + log.error("Error handling directory: {}", dir, e); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path path, IOException exc) { + // Handle broken symlinks or inaccessible directories + log.error("Error accessing path: {}", path, exc); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { log.error("Error walking through directory: {}", watchedFolderPath, e); } } @@ -187,6 +208,7 @@ public class PipelineDirectoryProcessor { } return isAllowed; }) + .map(Path::toAbsolutePath) .filter( path -> { boolean isReady = @@ -200,7 +222,10 @@ public class PipelineDirectoryProcessor { }) .map(Path::toFile) .toArray(File[]::new); - log.info("Collected {} files for processing", files.length); + log.info( + "Collected {} files for processing for {}", + files.length, + dir.toAbsolutePath().toString()); return files; } } @@ -210,8 +235,35 @@ public class PipelineDirectoryProcessor { List filesToProcess = new ArrayList<>(); for (File file : files) { Path targetPath = resolveUniqueFilePath(processingDir, file.getName()); - Files.move(file.toPath(), targetPath); - filesToProcess.add(targetPath.toFile()); + + // Retry with exponential backoff + int maxRetries = 3; + int retryDelayMs = 500; + boolean moved = false; + + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + Files.move(file.toPath(), targetPath, StandardCopyOption.REPLACE_EXISTING); + moved = true; + break; + } catch (FileSystemException e) { + if (attempt < maxRetries) { + log.info("File move failed (attempt {}), retrying...", attempt); + try { + Thread.sleep(retryDelayMs * (int) Math.pow(2, attempt - 1)); + } catch (InterruptedException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } + } + } + + if (moved) { + filesToProcess.add(targetPath.toFile()); + } else { + log.error("Failed to move file after {} attempts: {}", maxRetries, file.getName()); + } } return filesToProcess; } diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index 80171f20..cc533e4c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -29,7 +29,9 @@ import io.github.pixee.security.Filenames; import io.github.pixee.security.ZipSecurity; import jakarta.servlet.ServletContext; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineOperation; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index 68dca8b8..35575599 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -66,6 +66,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java index fc9e8623..b2bcfb53 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java @@ -60,6 +60,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java index 19d54b0b..71e90c24 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java @@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PDFText; import stirling.software.SPDF.model.api.security.ManualRedactPdfRequest; import stirling.software.SPDF.model.api.security.RedactPdfRequest; diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index 31c39c1f..845ad675 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -19,7 +19,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.*; diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java index 0e00afdd..0307f67a 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.web; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -15,14 +14,6 @@ import stirling.software.SPDF.utils.CheckProgramInstall; @Tag(name = "Convert", description = "Convert APIs") public class ConverterWebController { - @ConditionalOnExpression("${bookAndHtmlFormatsInstalled}") - @GetMapping("/book-to-pdf") - @Hidden - public String convertBookToPdfForm(Model model) { - model.addAttribute("currentPage", "book-to-pdf"); - return "convert/book-to-pdf"; - } - @GetMapping("/img-to-pdf") @Hidden public String convertImgToPdfForm(Model model) { @@ -67,14 +58,6 @@ public class ConverterWebController { // PDF TO...... - @ConditionalOnExpression("${bookAndHtmlFormatsInstalled}") - @GetMapping("/pdf-to-book") - @Hidden - public String convertPdfToBookForm(Model model) { - model.addAttribute("currentPage", "pdf-to-book"); - return "convert/pdf-to-book"; - } - @GetMapping("/pdf-to-img") @Hidden public String pdfToimgForm(Model model) { diff --git a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java index fefb096e..c3bd4f2a 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.GetMapping; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; + import stirling.software.SPDF.config.security.database.DatabaseService; import stirling.software.SPDF.utils.FileInfo; diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index 5bfb11b3..fb6e43eb 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -25,7 +25,9 @@ import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.model.SignatureFile; import stirling.software.SPDF.service.SignatureService; @@ -38,14 +40,17 @@ public class GeneralWebController { private final SignatureService signatureService; private final UserServiceInterface userService; private final ResourceLoader resourceLoader; + private final RuntimePathConfig runtimePathConfig; public GeneralWebController( SignatureService signatureService, @Autowired(required = false) UserServiceInterface userService, - ResourceLoader resourceLoader) { + ResourceLoader resourceLoader, + RuntimePathConfig runtimePathConfig) { this.signatureService = signatureService; this.userService = userService; this.resourceLoader = resourceLoader; + this.runtimePathConfig = runtimePathConfig; } @GetMapping("/pipeline") @@ -54,11 +59,9 @@ public class GeneralWebController { model.addAttribute("currentPage", "pipeline"); List pipelineConfigs = new ArrayList<>(); List> pipelineConfigsWithNames = new ArrayList<>(); - if (new File(InstallationPathConfig.getPipelineDefaultWebUIConfigsDir()).exists()) { + if (new File(runtimePathConfig.getPipelineDefaultWebUiConfigs()).exists()) { try (Stream paths = - Files.walk( - Paths.get( - InstallationPathConfig.getPipelineDefaultWebUIConfigsDir()))) { + Files.walk(Paths.get(runtimePathConfig.getPipelineDefaultWebUiConfigs()))) { List jsonFiles = paths.filter(Files::isRegularFile) .filter(p -> p.toString().endsWith(".json")) diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java index 402c1728..3341d005 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.Dependency; diff --git a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java index 6479c7af..13c5e7ff 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java @@ -19,7 +19,9 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.StartupApplicationListener; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 9906bec4..0400b3d8 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -31,6 +31,7 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.YamlPropertySourceFactory; import stirling.software.SPDF.model.provider.GithubProvider; @@ -285,6 +286,26 @@ public class ApplicationProperties { private String enableAnalytics; private Datasource datasource; private Boolean disableSanitize; + private CustomPaths customPaths = new CustomPaths(); + } + + @Data + public static class CustomPaths { + private Pipeline pipeline = new Pipeline(); + private Operations operations = new Operations(); + + @Data + public static class Pipeline { + private String watchedFoldersDir; + private String finishedFoldersDir; + private String webUIConfigsDir; + } + + @Data + public static class Operations { + private String weasyprint; + private String unoconvert; + } } @Data diff --git a/src/main/java/stirling/software/SPDF/model/SessionEntity.java b/src/main/java/stirling/software/SPDF/model/SessionEntity.java index fcdb8777..bba7b33d 100644 --- a/src/main/java/stirling/software/SPDF/model/SessionEntity.java +++ b/src/main/java/stirling/software/SPDF/model/SessionEntity.java @@ -6,6 +6,7 @@ import java.util.Date; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; + import lombok.Data; @Entity diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java index 1e7ae22a..3da8b7ce 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -14,6 +14,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.GeneralUtils; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java index 87d30e62..5116f19c 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java index 5f5ae051..4bd32856 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java index b3454afb..0d518e57 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java index 59535314..c48e5326 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java index 45064375..68c14a1f 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java index a399a0ee..5d3ab2ab 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java index db3c3dfb..c0bed063 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java index 0537362d..147badc3 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java index b92d2ce2..95795139 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFComparison; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java index 64692d45..2a183deb 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFComparison; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java index d8f214f0..1d89ef29 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFComparison; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java index cec72ce4..5f991ffc 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index 1ecdc2ee..b8beb9ff 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java index ddb04295..9b97d88d 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.MultiplePDFFiles; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java index 37216201..1bad8042 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java index 7cda530e..050dc1eb 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.SortTypes; import stirling.software.SPDF.model.api.PDFWithPageNums; diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java index 1efd7049..ac13e4bf 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java index 0ba004c9..bba2141c 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageSize; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java index 3bb141e7..0c436cf4 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java index 4776ddc0..b67d7653 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java index ebd54128..b320b715 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java index 1880453e..bc4a0f5c 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java index f2c9bb59..3f886fcd 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java index c87d1974..364d3129 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java index e638d7d2..fb326e79 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java index 48c95086..3fb15791 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java index b057709c..49a3185d 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java index 89c33573..f6ee362c 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java index e26741c9..3415fbf9 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java index 7177449f..85bf7d1e 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java index 1d96d35b..7c1a620d 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java index 99cdfc36..ef85dfea 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java index 81f921ec..f4ebada0 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java index 0bd2d41d..2d431b7e 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java index 2c320823..2ee29757 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java index de340300..54c6a0aa 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java index 0e12dfe7..f3006736 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java index 6949a95e..b0266f30 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java index 73deef40..7bb9324f 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/pdf/TextFinder.java b/src/main/java/stirling/software/SPDF/pdf/TextFinder.java index 484f6524..4119b3ea 100644 --- a/src/main/java/stirling/software/SPDF/pdf/TextFinder.java +++ b/src/main/java/stirling/software/SPDF/pdf/TextFinder.java @@ -11,6 +11,7 @@ import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PDFText; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java b/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java index 040e65d1..138420dd 100644 --- a/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java +++ b/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PdfMetadata; import stirling.software.SPDF.model.api.PDFFile; diff --git a/src/main/java/stirling/software/SPDF/service/LanguageService.java b/src/main/java/stirling/software/SPDF/service/LanguageService.java index a5048112..e38105c5 100644 --- a/src/main/java/stirling/software/SPDF/service/LanguageService.java +++ b/src/main/java/stirling/software/SPDF/service/LanguageService.java @@ -11,6 +11,7 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Service diff --git a/src/main/java/stirling/software/SPDF/service/SignatureService.java b/src/main/java/stirling/software/SPDF/service/SignatureService.java index bd4642e7..f6686f3b 100644 --- a/src/main/java/stirling/software/SPDF/service/SignatureService.java +++ b/src/main/java/stirling/software/SPDF/service/SignatureService.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; import org.thymeleaf.util.StringUtils; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.model.SignatureFile; diff --git a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java index 389d2819..6a815d8c 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java +++ b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java @@ -3,6 +3,9 @@ package stirling.software.SPDF.utils; import static java.nio.file.StandardWatchEventKinds.*; import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import java.nio.file.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -15,7 +18,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; -import stirling.software.SPDF.config.InstallationPathConfig; + +import stirling.software.SPDF.config.RuntimePathConfig; @Component @Slf4j @@ -35,7 +39,9 @@ public class FileMonitor { * monitored, false otherwise */ @Autowired - public FileMonitor(@Qualifier("directoryFilter") Predicate pathFilter) + public FileMonitor( + @Qualifier("directoryFilter") Predicate pathFilter, + RuntimePathConfig runtimePathConfig) throws IOException { this.newlyDiscoveredFiles = new HashSet<>(); this.path2KeyMapping = new HashMap<>(); @@ -43,7 +49,7 @@ public class FileMonitor { this.pathFilter = pathFilter; this.readyForProcessingFiles = ConcurrentHashMap.newKeySet(); this.watchService = FileSystems.getDefault().newWatchService(); - this.rootDir = Path.of(InstallationPathConfig.getPipelineWatchedFoldersDir()); + this.rootDir = Path.of(runtimePathConfig.getPipelineWatchedFoldersPath()).toAbsolutePath(); } private boolean shouldNotProcess(Path path) { @@ -162,6 +168,37 @@ public class FileMonitor { * @return true if the file is ready for processing, false otherwise */ public boolean isFileReadyForProcessing(Path path) { - return readyForProcessingFiles.contains(path); + // 1. Check FileMonitor's ready list + boolean isReady = readyForProcessingFiles.contains(path.toAbsolutePath()); + + // 2. Check last modified timestamp + if (!isReady) { + try { + long lastModified = Files.getLastModifiedTime(path).toMillis(); + long currentTime = System.currentTimeMillis(); + isReady = (currentTime - lastModified) > 5000; + } catch (IOException e) { + log.info("Timestamp check failed for {}", path, e); + } + } + + // 3. Direct file lock check + if (isReady) { + try (RandomAccessFile raf = new RandomAccessFile(path.toFile(), "rw"); + FileChannel channel = raf.getChannel()) { + // Try acquiring an exclusive lock + FileLock lock = channel.tryLock(); + if (lock == null) { + isReady = false; + } else { + lock.release(); + } + } catch (IOException e) { + log.info("File lock detected on {}", path); + isReady = false; + } + } + + return isReady; } } diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index c28cda6e..6a0e263a 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -23,10 +23,10 @@ import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; public class FileToPdf { public static byte[] convertHtmlToPdf( + String weasyprintPath, HTMLToPdfRequest request, byte[] fileBytes, String fileName, - boolean htmlFormatsInstalled, boolean disableSanitize) throws IOException, InterruptedException { @@ -49,29 +49,12 @@ public class FileToPdf { } List command = new ArrayList<>(); - if (!htmlFormatsInstalled) { - command.add("/opt/venv/bin/weasyprint"); - command.add("-e"); - command.add("utf-8"); - command.add("-v"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - } else { - command.add("ebook-convert"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - command.add("--paper-size"); - command.add("a4"); - - if (request != null && request.getZoom() != 1.0) { - File tempCssFile = Files.createTempFile("customStyle", ".css").toFile(); - try (FileWriter writer = new FileWriter(tempCssFile)) { - writer.write("body { zoom: " + request.getZoom() + "; }"); - } - command.add("--extra-css"); - command.add(tempCssFile.getAbsolutePath()); - } - } + command.add(weasyprintPath); + command.add("-e"); + command.add("utf-8"); + command.add("-v"); + command.add(tempInputFile.toString()); + command.add(tempOutputFile.toString()); ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT) diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index ea4b235b..72e1034c 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -28,6 +28,7 @@ import io.github.pixee.security.HostValidator; import io.github.pixee.security.Urls; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java index 011a8921..ef2c5b9c 100644 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java @@ -26,6 +26,7 @@ import com.vladsch.flexmark.util.data.MutableDataSet; import io.github.pixee.security.Filenames; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 78b773ef..de161550 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -35,6 +35,7 @@ import org.springframework.web.multipart.MultipartFile; import io.github.pixee.security.Filenames; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.service.CustomPDDocumentFactory; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index dd1e7e89..a8d39969 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -12,6 +12,7 @@ import java.util.concurrent.TimeUnit; import io.github.pixee.security.BoundedLineReader; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java b/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java index e3795da9..b4869b02 100644 --- a/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java +++ b/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java @@ -23,6 +23,7 @@ import org.springframework.core.io.InputStreamResource; import org.springframework.web.multipart.MultipartFile; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; diff --git a/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java b/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java index 024e0e70..c6460592 100644 --- a/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java +++ b/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java @@ -7,6 +7,7 @@ import org.springframework.web.multipart.MultipartFile; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; diff --git a/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java b/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java index d4ec7acc..7f28ad54 100644 --- a/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java +++ b/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.security.RedactionArea; @Slf4j diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index a7816da1..f6e2bb0f 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -96,6 +96,15 @@ system: hostName: localhost # the host name to use for the database url. Set to 'localhost' when running the app locally. Set to match the name of the container name of your database container when running the app on a server (Docker configuration) port: 5432 # set the port number of the database. Ensure this matches the port the database is listening to name: postgres # set the name of your database. Should match the name of the database you create + customPaths: + pipeline: + watchedFoldersDir: "" #Defaults to /pipeline/watchedFolders + finishedFoldersDir: "" #Defaults to /pipeline/finishedFolders + operations: + weasyprint: "" #Defaults to /opt/venv/bin/weasyprint + unoconvert: "" #Defaults to /opt/venv/bin/unoconvert + + ui: appName: '' # application's visible name diff --git a/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java b/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java index fa2c6e34..b2efad0b 100644 --- a/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java +++ b/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; + +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; @@ -16,12 +18,16 @@ public class ConvertWebsiteToPdfTest { @Mock private CustomPDDocumentFactory mockPdfDocumentFactory; + @Mock + private RuntimePathConfig runtimePathConfig; + + private ConvertWebsiteToPDF convertWebsiteToPDF; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); - convertWebsiteToPDF = new ConvertWebsiteToPDF(mockPdfDocumentFactory); + convertWebsiteToPDF = new ConvertWebsiteToPDF(mockPdfDocumentFactory, runtimePathConfig); } @Test diff --git a/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java b/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java index 9b0c004b..f5cb2c80 100644 --- a/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java +++ b/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java @@ -14,12 +14,11 @@ public class FileToPdfTest { HTMLToPdfRequest request = new HTMLToPdfRequest(); byte[] fileBytes = new byte[0]; // Sample file bytes String fileName = "test.html"; // Sample file name - boolean htmlFormatsInstalled = true; // Sample boolean value boolean disableSanitize = false; // Sample boolean value // Check if the method throws IOException assertThrows(IOException.class, () -> { - FileToPdf.convertHtmlToPdf(request, fileBytes, fileName, htmlFormatsInstalled, disableSanitize); + FileToPdf.convertHtmlToPdf("/path/",request, fileBytes, fileName, disableSanitize); }); }