diff --git a/.github/workflows/ai_pr_title_review.yml b/.github/workflows/ai_pr_title_review.yml index 7c47b8d58..b7d944c34 100644 --- a/.github/workflows/ai_pr_title_review.yml +++ b/.github/workflows/ai_pr_title_review.yml @@ -87,7 +87,7 @@ jobs: - name: AI PR Title Analysis if: steps.actor.outputs.is_repo_dev == 'true' id: ai-title-analysis - uses: actions/ai-inference@d645f067d89ee1d5d736a5990e327e504d1c5a4a # v1.1.0 + uses: actions/ai-inference@9693b137b6566bb66055a713613bf4f0493701eb # v1.2.3 with: model: openai/gpt-4o system-prompt-file: ".github/config/system-prompt.txt" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 120a223ad..47fae4f83 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -74,6 +74,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@d6bbdef45e766d081b84a2def353b0055f728d3e # v3.29.3 + uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 with: sarif_file: results.sarif diff --git a/Dockerfile b/Dockerfile index 4ea6316ae..375ab94c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -78,7 +78,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a # URW Base 35 fonts for better PDF rendering font-urw-base35 && \ python3 -m venv /opt/venv && \ - /opt/venv/bin/pip install --upgrade pip setuptools && \ + /opt/venv/bin/pip install --no-cache-dir --upgrade pip setuptools && \ /opt/venv/bin/pip install --no-cache-dir --upgrade unoserver weasyprint && \ ln -s /usr/lib/libreoffice/program/uno.py /opt/venv/lib/python3.12/site-packages/ && \ ln -s /usr/lib/libreoffice/program/unohelper.py /opt/venv/lib/python3.12/site-packages/ && \ @@ -89,7 +89,6 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a ln -s /usr/share/fontconfig/conf.avail/69-urw-*.conf /etc/fonts/conf.d/ && \ fc-cache -f -v && \ chmod +x /scripts/* && \ - chmod +x /scripts/init.sh && \ # User permissions addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline /tmp/stirling-pdf && \ diff --git a/Dockerfile.dev b/Dockerfile.dev index 78460115f..48084878d 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -36,7 +36,7 @@ ENV SETUPTOOLS_USE_DISTUTILS=local \ # Installation der benötigten Python-Pakete RUN python3 -m venv --system-site-packages /opt/venv \ && . /opt/venv/bin/activate \ - && pip install --upgrade pip setuptools \ + && pip install --no-cache-dir --upgrade pip setuptools \ && pip install --no-cache-dir WeasyPrint pdf2image pillow unoserver opencv-python-headless pre-commit # Füge den venv-Pfad zur globalen PATH-Variable hinzu, damit die Tools verfügbar sind @@ -54,8 +54,7 @@ RUN echo "devuser ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devuser \ # Setze das Arbeitsverzeichnis (wird später per Bind-Mount überschrieben) WORKDIR /workspace -RUN chmod +x /workspace/.devcontainer/git-init.sh -RUN sudo chmod +x /workspace/.devcontainer/init-setup.sh +RUN chmod +x /workspace/.devcontainer/git-init.sh /workspace/.devcontainer/init-setup.sh # Wechsel zum Nicht‑Root Benutzer USER devuser diff --git a/Dockerfile.fat b/Dockerfile.fat index fd5964baf..fda3d89c4 100644 --- a/Dockerfile.fat +++ b/Dockerfile.fat @@ -91,7 +91,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a py3-pillow@testing \ py3-pdf2image@testing && \ python3 -m venv /opt/venv && \ - /opt/venv/bin/pip install --upgrade pip setuptools && \ + /opt/venv/bin/pip install --no-cache-dir --upgrade pip setuptools && \ /opt/venv/bin/pip install --no-cache-dir --upgrade unoserver weasyprint && \ ln -s /usr/lib/libreoffice/program/uno.py /opt/venv/lib/python3.12/site-packages/ && \ ln -s /usr/lib/libreoffice/program/unohelper.py /opt/venv/lib/python3.12/site-packages/ && \ @@ -102,7 +102,6 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a ln -s /usr/share/fontconfig/conf.avail/69-urw-*.conf /etc/fonts/conf.d/ && \ fc-cache -f -v && \ chmod +x /scripts/* && \ - chmod +x /scripts/init.sh && \ # User permissions addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline /tmp/stirling-pdf && \ diff --git a/README.md b/README.md index 836762158..b0a563fa5 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,7 @@ Stirling-PDF currently supports 40 languages! | Swedish (Svenska) (sv_SE) | ![67%](https://geps.dev/progress/67) | | Thai (ไทย) (th_TH) | ![60%](https://geps.dev/progress/60) | | Tibetan (བོད་ཡིག་) (bo_CN) | ![66%](https://geps.dev/progress/66) | -| Traditional Chinese (繁體中文) (zh_TW) | ![77%](https://geps.dev/progress/77) | +| Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | | Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) | | Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) | | Vietnamese (Tiếng Việt) (vi_VN) | ![58%](https://geps.dev/progress/58) | diff --git a/app/core/build.gradle b/app/core/build.gradle index ca7a007b7..d37ee9354 100644 --- a/app/core/build.gradle +++ b/app/core/build.gradle @@ -62,7 +62,7 @@ dependencies { exclude group: 'com.google.code.gson', module: 'gson' } implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4' - implementation 'com.opencsv:opencsv:5.11.2' // https://mvnrepository.com/artifact/com.opencsv/opencsv + implementation 'com.opencsv:opencsv:5.12.0' // https://mvnrepository.com/artifact/com.opencsv/opencsv // Batik implementation 'org.apache.xmlgraphics:batik-all:1.19' diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index 44f2b892a..070d681e4 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -108,9 +108,13 @@ public class PipelineProcessor { if (inputFileTypes == null) { inputFileTypes = new ArrayList(Arrays.asList("ALL")); } - if (!operation.matches("^[a-zA-Z0-9_-]+$")) { - throw new IllegalArgumentException("Invalid operation value received."); + + if (!apiDocService.isValidOperation(operation, parameters)) { + log.error("Invalid operation or parameters: o:{} p:{}", operation, parameters); + throw new IllegalArgumentException( + "Invalid operation: " + operation + " with parameters: " + parameters); } + String url = getBaseUrl() + operation; List newOutputFiles = new ArrayList<>(); if (!isMultiInputOperation) { @@ -136,7 +140,7 @@ public class PipelineProcessor { // skip // this // file - if (operation.startsWith("filter-") + if (operation.startsWith("/api/v1/filter/filter-") && (response.getBody() == null || response.getBody().length == 0)) { filtersApplied = true; diff --git a/app/core/src/main/resources/static/css/edit-table-of-contents.css b/app/core/src/main/resources/static/css/edit-table-of-contents.css index 11a4bf777..d85813a73 100644 --- a/app/core/src/main/resources/static/css/edit-table-of-contents.css +++ b/app/core/src/main/resources/static/css/edit-table-of-contents.css @@ -1,6 +1,6 @@ /* Main bookmark container styles */ .bookmark-editor { - margin-top: 20px; + margin-bottom: 20px; padding: 20px; border: 1px solid var(--border-color, #ced4da); border-radius: 0.25rem; @@ -273,4 +273,4 @@ --text-muted: var(--md-sys-color-on-surface-variant, #adb5bd); --bg-empty: var(--md-sys-color-surface-container-low, #24282e); --border-empty: var(--md-sys-color-outline, #495057); -} \ No newline at end of file +} diff --git a/app/core/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java b/app/core/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java index 60e3f975d..0a40fcd5b 100644 --- a/app/core/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java +++ b/app/core/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java @@ -45,23 +45,26 @@ class PipelineProcessorTest { @Test void runPipelineWithFilterSetsFlag() throws Exception { PipelineOperation op = new PipelineOperation(); - op.setOperation("filter-page-count"); + op.setOperation("/api/v1/filter/filter-page-count"); op.setParameters(Map.of()); PipelineConfig config = new PipelineConfig(); config.setOperations(List.of(op)); - Resource file = new ByteArrayResource("data".getBytes()) { - @Override - public String getFilename() { - return "test.pdf"; - } - }; + Resource file = + new ByteArrayResource("data".getBytes()) { + @Override + public String getFilename() { + return "test.pdf"; + } + }; List files = List.of(file); - when(apiDocService.isMultiInput("filter-page-count")).thenReturn(false); - when(apiDocService.getExtensionTypes(false, "filter-page-count")) + when(apiDocService.isMultiInput("/api/v1/filter/filter-page-count")).thenReturn(false); + when(apiDocService.getExtensionTypes(false, "/api/v1/filter/filter-page-count")) .thenReturn(List.of("pdf")); + when(apiDocService.isValidOperation(eq("/api/v1/filter/filter-page-count"), anyMap())) + .thenReturn(true); doReturn(new ResponseEntity<>(new byte[0], HttpStatus.OK)) .when(pipelineProcessor) diff --git a/build.gradle b/build.gradle index 897e0ef38..7ec5d4e3c 100644 --- a/build.gradle +++ b/build.gradle @@ -2,10 +2,10 @@ plugins { id "java" id "jacoco" id "io.spring.dependency-management" version "1.1.7" - id "org.springframework.boot" version "3.5.3" + id "org.springframework.boot" version "3.5.4" id "org.springdoc.openapi-gradle-plugin" version "1.9.0" id "io.swagger.swaggerhub" version "1.3.2" - id "edu.sc.seis.launch4j" version "3.0.6" + id "edu.sc.seis.launch4j" version "3.0.7" id "com.diffplug.spotless" version "7.2.1" id "com.github.jk1.dependency-license-report" version "2.9" //id "nebula.lint" version "19.0.3" @@ -21,7 +21,7 @@ import java.nio.file.Files import java.time.Year ext { - springBootVersion = "3.5.3" + springBootVersion = "3.5.4" pdfboxVersion = "3.0.5" imageioVersion = "3.12.0" lombokVersion = "1.18.38" diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index fde2da33f..9a379eb84 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -1026,8 +1026,5 @@ ignore = [ [zh_TW] ignore = [ - 'lang.dzo', - 'lang.iku', - 'lang.que', 'language.direction', ]