diff --git a/.gitattributes b/.gitattributes
index c498408ab..f72c204bd 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,10 +1,10 @@
* text=auto eol=lf
# Ignore all JavaScript files in a directory
-src/main/resources/static/pdfjs/* linguist-vendored
-src/main/resources/static/pdfjs/** linguist-vendored
-src/main/resources/static/pdfjs-legacy/* linguist-vendored
-src/main/resources/static/pdfjs-legacy/** linguist-vendored
-src/main/resources/static/css/bootstrap-icons.css linguist-vendored
-src/main/resources/static/css/bootstrap.min.css linguist-vendored
-src/main/resources/static/css/fonts/* linguist-vendored
+stirling-pdf/src/main/resources/static/pdfjs/* linguist-vendored
+stirling-pdf/src/main/resources/static/pdfjs/** linguist-vendored
+stirling-pdf/src/main/resources/static/pdfjs-legacy/* linguist-vendored
+stirling-pdf/src/main/resources/static/pdfjs-legacy/** linguist-vendored
+stirling-pdf/src/main/resources/static/css/bootstrap-icons.css linguist-vendored
+stirling-pdf/src/main/resources/static/css/bootstrap.min.css linguist-vendored
+stirling-pdf/src/main/resources/static/css/fonts/* linguist-vendored
diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml
index bb52c7b85..d1a340065 100644
--- a/.github/labeler-config.yml
+++ b/.github/labeler-config.yml
@@ -1,60 +1,45 @@
Translation:
- changed-files:
- - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/messages_*_*.properties'
- any-glob-to-any-file: 'scripts/ignore_translation.toml'
- - any-glob-to-any-file: 'src/main/resources/templates/fragments/languages.html'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/templates/fragments/languages.html'
Front End:
- changed-files:
- - any-glob-to-any-file: 'src/main/resources/templates/**/*'
- - any-glob-to-any-file: 'src/main/resources/static/**/*'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/**'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/UI/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/templates/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/static/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/**'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/UI/**/*'
Java:
- changed-files:
- - any-glob-to-any-file: 'src/main/java/**/*.java'
+ - any-glob-to-any-file: 'common/src/main/java/**/*.java'
+ - any-glob-to-any-file: 'proprietary/src/main/java/**/*.java'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/**/*.java'
Back End:
- changed-files:
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/**/*'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/**/*'
- - any-glob-to-any-file: 'src/main/resources/settings.yml.template'
- - any-glob-to-any-file: 'src/main/resources/application.properties'
- - any-glob-to-any-file: 'src/main/resources/banner.txt'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/config/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/settings.yml.template'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/application.properties'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/resources/banner.txt'
- any-glob-to-any-file: 'scripts/png_to_webp.py'
- any-glob-to-any-file: 'split_photos.py'
Security:
- changed-files:
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/interfaces/DatabaseInterface.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/EmailController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/H2SQLController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/UserController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/api/Email.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/exception/BackupNotFoundException.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/exception/NoProviderFoundExceptionjava'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/provider/**/*'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AuthenticationType.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/ApiKeyAuthenticationToken.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AttemptCounter.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/Authority.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/PersistentLogin.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/SessionEntity.java'
+ - any-glob-to-any-file: 'proprietary/src/main/java/stirling/software/proprietary/security/**/*'
- any-glob-to-any-file: 'scripts/download-security-jar.sh'
- any-glob-to-any-file: '.github/workflows/dependency-review.yml'
- any-glob-to-any-file: '.github/workflows/scorecards.yml'
API:
- changed-files:
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/OpenApiConfig.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*'
- - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/api/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/model/api/**/*'
- any-glob-to-any-file: 'scripts/png_to_webp.py'
- any-glob-to-any-file: 'split_photos.py'
- any-glob-to-any-file: '.github/workflows/swagger.yml'
@@ -88,7 +73,9 @@ Devtools:
Test:
- changed-files:
- any-glob-to-any-file: 'cucumber/**/*'
- - any-glob-to-any-file: 'src/test/**/*'
+ - any-glob-to-any-file: 'common/src/test/**/*'
+ - any-glob-to-any-file: 'proprietary/src/test/**/*'
+ - any-glob-to-any-file: 'stirling-pdf/src/test/**/*'
- any-glob-to-any-file: 'src/testing/**/*'
- any-glob-to-any-file: '.pre-commit-config'
- any-glob-to-any-file: '.github/workflows/pre_commit.yml'
diff --git a/.github/scripts/check_language_properties.py b/.github/scripts/check_language_properties.py
index 10e6fb650..8ae7dbfc1 100644
--- a/.github/scripts/check_language_properties.py
+++ b/.github/scripts/check_language_properties.py
@@ -317,7 +317,7 @@ def check_for_differences(reference_file, file_list, branch, actor):
report.append("## ❌ Overall Check Status: **_Failed_**")
report.append("")
report.append(
- f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)"
+ f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/stirling-pdf/src/main/resources/messages_en_GB.properties)"
)
else:
report.append("## ✅ Overall Check Status: **_Success_**")
diff --git a/.github/workflows/check_properties.yml b/.github/workflows/check_properties.yml
index d74e3084a..9598351a5 100644
--- a/.github/workflows/check_properties.yml
+++ b/.github/workflows/check_properties.yml
@@ -4,7 +4,7 @@ on:
pull_request_target:
types: [opened, synchronize, reopened]
paths:
- - "src/main/resources/messages_*.properties"
+ - "stirling-pdf/src/main/resources/messages_*.properties"
permissions:
contents: read # Allow read access to repository content
@@ -61,7 +61,20 @@ jobs:
run: |
echo "Fetching PR changed files..."
echo "Getting list of changed files from PR..."
- gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt # Filter only matching property files
+ # Check if PR number exists
+ if [ -z "${{ steps.get-pr-data.outputs.pr_number }}" ]; then
+ echo "Error: PR number is empty"
+ exit 1
+ fi
+ # Get changed files and filter for properties files, handle case where no matches are found
+ gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^stirling-pdf/src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt || echo "No matching properties files found in PR"
+ # Check if any files were found
+ if [ ! -s changed_files.txt ]; then
+ echo "No properties files changed in this PR"
+ echo "Workflow will exit early as no relevant files to check"
+ exit 0
+ fi
+ echo "Found $(wc -l < changed_files.txt) matching properties files"
- name: Determine reference file test
id: determine-file
@@ -103,7 +116,7 @@ jobs:
// Filter for relevant files based on the PR changes
const changedFiles = files
.map(file => file.filename)
- .filter(file => /^src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file));
+ .filter(file => /^stirling-pdf\src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file));
console.log("Changed files:", changedFiles);
@@ -141,12 +154,12 @@ jobs:
// Determine reference file
let referenceFilePath;
- if (changedFiles.includes("src/main/resources/messages_en_GB.properties")) {
+ if (changedFiles.includes("stirling-pdf/src/main/resources/messages_en_GB.properties")) {
console.log("Using PR branch reference file.");
const { data: fileContent } = await github.rest.repos.getContent({
owner: prRepoOwner,
repo: prRepoName,
- path: "src/main/resources/messages_en_GB.properties",
+ path: "stirling-pdf/src/main/resources/messages_en_GB.properties",
ref: branch,
});
@@ -158,7 +171,7 @@ jobs:
const { data: fileContent } = await github.rest.repos.getContent({
owner: repoOwner,
repo: repoName,
- path: "src/main/resources/messages_en_GB.properties",
+ path: "stirling-pdf/src/main/resources/messages_en_GB.properties",
ref: "main",
});
diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml
index e040e5436..f9fb1e521 100644
--- a/.github/workflows/licenses-update.yml
+++ b/.github/workflows/licenses-update.yml
@@ -57,11 +57,11 @@ jobs:
- name: Move and rename license file
run: |
- mv build/reports/dependency-license/index.json src/main/resources/static/3rdPartyLicenses.json
+ mv build/reports/dependency-license/index.json stirling-pdf/src/main/resources/static/3rdPartyLicenses.json
- name: Commit changes
run: |
- git add src/main/resources/static/3rdPartyLicenses.json
+ git add stirling-pdf/src/main/resources/static/3rdPartyLicenses.json
git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV
- name: Create Pull Request
diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml
index 92b4f3c87..dd29b0d4b 100644
--- a/.github/workflows/sync_files.yml
+++ b/.github/workflows/sync_files.yml
@@ -8,8 +8,8 @@ on:
paths:
- "build.gradle"
- "README.md"
- - "src/main/resources/messages_*.properties"
- - "src/main/resources/static/3rdPartyLicenses.json"
+ - "stirling-pdf/src/main/resources/messages_*.properties"
+ - "stirling-pdf/src/main/resources/static/3rdPartyLicenses.json"
- "scripts/ignore_translation.toml"
permissions:
@@ -41,11 +41,11 @@ jobs:
- name: Sync translation property files
run: |
- python .github/scripts/check_language_properties.py --reference-file "src/main/resources/messages_en_GB.properties" --branch main
+ python .github/scripts/check_language_properties.py --reference-file "stirling-pdf/src/main/resources/messages_en_GB.properties" --branch main
- name: Commit translation files
run: |
- git add src/main/resources/messages_*.properties
+ git add stirling-pdf/src/main/resources/messages_*.properties
git diff --staged --quiet || git commit -m ":memo: Sync translation files" || echo "No changes detected"
- name: Install dependencies
@@ -101,4 +101,4 @@ jobs:
sign-commits: true
add-paths: |
README.md
- src/main/resources/messages_*.properties
+ stirling-pdf/src/main/resources/messages_*.properties
diff --git a/.gitignore b/.gitignore
index 06602d03b..ca949e769 100644
--- a/.gitignore
+++ b/.gitignore
@@ -125,6 +125,9 @@ SwaggerDoc.json
*.rar
*.db
/build
+/stirling-pdf/build
+/common/build
+/proprietary/build
# Byte-compiled / optimized / DLL files
__pycache__/
@@ -194,4 +197,3 @@ id_ed25519.pub
# node_modules
node_modules/
-*.mjs
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index beec5eb99..b4b3841e6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -20,7 +20,7 @@ repos:
- --skip="./.*,*.csv,*.json,*.ambr"
- --quiet-level=2
files: \.(html|css|js|py|md)$
- exclude: (.vscode|.devcontainer|src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js)
+ exclude: (.vscode|.devcontainer|stirling-pdf/src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js)
- repo: https://github.com/gitleaks/gitleaks
rev: v8.26.0
hooks:
diff --git a/DeveloperGuide.md b/DeveloperGuide.md
index d484838e0..d2c9ddb2a 100644
--- a/DeveloperGuide.md
+++ b/DeveloperGuide.md
@@ -137,9 +137,9 @@ services:
ports:
- "8080:8080"
volumes:
- - /stirling/latest/data:/usr/share/tessdata:rw
- - /stirling/latest/config:/configs:rw
- - /stirling/latest/logs:/logs:rw
+ - ./stirling/latest/data:/usr/share/tessdata:rw
+ - ./stirling/latest/config:/configs:rw
+ - ./stirling/latest/logs:/logs:rw
environment:
DISABLE_ADDITIONAL_FEATURES: "false"
SECURITY_ENABLELOGIN: "true"
@@ -332,7 +332,7 @@ Thymeleaf is a server-side Java HTML template engine. It is used in Stirling-PDF
### Thymeleaf overview
-In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content.
+In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `stirling-pdf/src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content.
Some examples of this are:
@@ -384,7 +384,7 @@ This would generate n entries of tr for each person in exampleData
### Adding a New Feature to the Backend (API)
1. **Create a New Controller:**
- - Create a new Java class in the `src/main/java/stirling/software/SPDF/controller/api` directory.
+ - Create a new Java class in the `stirling-pdf/src/main/java/stirling/software/SPDF/controller/api` directory.
- Annotate the class with `@RestController` and `@RequestMapping` to define the API endpoint.
- Ensure to add API documentation annotations like `@Tag(name = "General", description = "General APIs")` and `@Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")`.
@@ -411,7 +411,7 @@ This would generate n entries of tr for each person in exampleData
```
2. **Define the Service Layer:** (Not required but often useful)
- - Create a new service class in the `src/main/java/stirling/software/SPDF/service` directory.
+ - Create a new service class in the `stirling-pdf/src/main/java/stirling/software/SPDF/service` directory.
- Implement the business logic for the new feature.
```java
@@ -463,7 +463,7 @@ This would generate n entries of tr for each person in exampleData
### Adding a New Feature to the Frontend (UI)
1. **Create a New Thymeleaf Template:**
- - Create a new HTML file in the `src/main/resources/templates` directory.
+ - Create a new HTML file in the `stirling-pdf/src/main/resources/templates` directory.
- Use Thymeleaf attributes to dynamically generate content.
- Use `extract-page.html` as a base example for the HTML template, which is useful to ensure importing of the general layout, navbar, and footer.
@@ -507,7 +507,7 @@ This would generate n entries of tr for each person in exampleData
```
2. **Create a New Controller for the UI:**
- - Create a new Java class in the `src/main/java/stirling/software/SPDF/controller/ui` directory.
+ - Create a new Java class in the `stirling-pdf/src/main/java/stirling/software/SPDF/controller/ui` directory.
- Annotate the class with `@Controller` and `@RequestMapping` to define the UI endpoint.
```java
@@ -537,7 +537,7 @@ This would generate n entries of tr for each person in exampleData
3. **Update the Navigation Bar:**
- Add a link to the new feature page in the navigation bar.
- - Update the `src/main/resources/templates/fragments/navbar.html` file.
+ - Update the `stirling-pdf/src/main/resources/templates/fragments/navbar.html` file.
```html
@@ -551,7 +551,7 @@ When adding a new feature or modifying existing ones in Stirling-PDF, you'll nee
### 1. Locate Existing Language Files
-Find the existing `messages.properties` files in the `src/main/resources` directory. You'll see files like:
+Find the existing `messages.properties` files in the `stirling-pdf/src/main/resources` directory. You'll see files like:
- `messages.properties` (default, usually English)
- `messages_en_GB.properties`
diff --git a/Dockerfile b/Dockerfile
index bef88cd98..55b179983 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,7 +4,7 @@ FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be02
# Copy necessary files
COPY scripts /scripts
COPY pipeline /pipeline
-COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
+COPY stirling-pdf/src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
#COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/
COPY build/libs/*.jar app.jar
diff --git a/Dockerfile.fat b/Dockerfile.fat
index 20ce8030f..df444d1ea 100644
--- a/Dockerfile.fat
+++ b/Dockerfile.fat
@@ -26,7 +26,7 @@ FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be02
# Copy necessary files
COPY scripts /scripts
COPY pipeline /pipeline
-COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
+COPY stirling-pdf/src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
COPY --from=build /app/build/libs/*.jar app.jar
ARG VERSION_TAG
diff --git a/HowToAddNewLanguage.md b/HowToAddNewLanguage.md
index c1fb7c127..cdc4729a2 100644
--- a/HowToAddNewLanguage.md
+++ b/HowToAddNewLanguage.md
@@ -10,7 +10,7 @@ Fork Stirling-PDF and create a new branch out of `main`.
Then add a reference to the language in the navbar by adding a new language entry to the dropdown:
-- Edit the file: [languages.html](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html)
+- Edit the file: [languages.html](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/stirling-pdf/src/main/resources/templates/fragments/languages.html)
For example, to add Polish, you would add:
@@ -25,7 +25,7 @@ The `data-bs-language-code` is the code used to reference the file in the next s
Start by copying the existing English property file:
-- [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)
+- [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/stirling-pdf/src/main/resources/messages_en_GB.properties)
Copy and rename it to `messages_{your data-bs-language-code here}.properties`. In the Polish example, you would set the name to `messages_pl_PL.properties`.
diff --git a/build.gradle b/build.gradle
index 6ca36d727..369082e02 100644
--- a/build.gradle
+++ b/build.gradle
@@ -26,21 +26,124 @@ ext {
bouncycastleVersion = "1.80"
springSecuritySamlVersion = "6.5.0"
openSamlVersion = "4.3.2"
+ commonmarkVersion = "0.24.0"
tempJrePath = null
}
-group = "stirling.software"
-version = "0.46.2"
-
-java {
- // 17 is lowest but we support and recommend 21
- sourceCompatibility = JavaVersion.VERSION_17
+jar {
+ enabled = false
+ manifest {
+ attributes "Implementation-Title": "Stirling-PDF",
+ "Implementation-Version": project.version
+ }
}
-repositories {
- mavenCentral()
- maven { url = "https://build.shibboleth.net/maven/releases" }
- maven { url = "https://maven.pkg.github.com/jcefmaven/jcefmaven" }
+bootJar {
+ enabled = false
+}
+
+sourceSets {
+ main {
+ java {
+ if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false' || System.getenv('DISABLE_ADDITIONAL_FEATURES') == 'true'
+ || (project.hasProperty('DISABLE_ADDITIONAL_FEATURES')
+ && System.getProperty('DISABLE_ADDITIONAL_FEATURES') == 'true')) {
+ exclude 'stirling/software/proprietary/security/**'
+ }
+
+ if (System.getenv('STIRLING_PDF_DESKTOP_UI') == 'false') {
+ exclude 'stirling/software/SPDF/UI/impl/**'
+ }
+
+ }
+ }
+
+ test {
+ java {
+ if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false' || System.getenv('DISABLE_ADDITIONAL_FEATURES') == 'true'
+ || (project.hasProperty('DISABLE_ADDITIONAL_FEATURES')
+ && System.getProperty('DISABLE_ADDITIONAL_FEATURES') == 'true')) {
+ exclude 'stirling/software/proprietary/security/**'
+ }
+
+ if (System.getenv('STIRLING_PDF_DESKTOP_UI') == 'false') {
+ exclude 'stirling/software/SPDF/UI/impl/**'
+ }
+ }
+ }
+}
+
+allprojects {
+ group = 'stirling.software'
+ version = '0.46.2'
+
+ configurations.configureEach {
+ exclude group: 'commons-logging', module: 'commons-logging'
+ exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
+ }
+}
+
+subprojects {
+ apply plugin: 'java'
+ apply plugin: 'java-library'
+ apply plugin: 'com.diffplug.spotless'
+ apply plugin: 'org.springframework.boot'
+ apply plugin: 'io.spring.dependency-management'
+
+ java {
+ // 17 is lowest but we support and recommend 21
+ sourceCompatibility = JavaVersion.VERSION_17
+ }
+
+ bootJar {
+ enabled = false
+ }
+
+ repositories {
+ mavenCentral()
+ }
+
+ configurations.configureEach {
+ exclude group: 'commons-logging', module: 'commons-logging'
+ exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
+ // Exclude vulnerable BouncyCastle version used in tableau
+ exclude group: 'org.bouncycastle', module: 'bcpkix-jdk15on'
+ exclude group: 'org.bouncycastle', module: 'bcutil-jdk15on'
+ exclude group: 'org.bouncycastle', module: 'bcmail-jdk15on'
+ }
+
+ dependencyManagement {
+ imports {
+ mavenBom "org.springframework.boot:spring-boot-dependencies:$springBootVersion"
+ }
+ }
+
+ dependencies {
+ implementation 'org.springframework.boot:spring-boot-starter-actuator'
+ implementation 'io.github.pixee:java-security-toolkit:1.2.1'
+
+ //tmp for security bumps
+ implementation 'ch.qos.logback:logback-core:1.5.18'
+ implementation 'ch.qos.logback:logback-classic:1.5.18'
+ compileOnly "org.projectlombok:lombok:$lombokVersion"
+ annotationProcessor "org.projectlombok:lombok:$lombokVersion"
+
+ testImplementation 'org.springframework.boot:spring-boot-starter-test'
+ testRuntimeOnly 'org.mockito:mockito-inline:5.2.0'
+ }
+
+ tasks.withType(JavaCompile).configureEach {
+ options.encoding = "UTF-8"
+ dependsOn "spotlessApply"
+ }
+
+ compileJava {
+ options.compilerArgs << "-parameters"
+ }
+
+ test {
+ useJUnitPlatform()
+ }
}
licenseReport {
@@ -99,10 +202,9 @@ jpackage {
mainJar = "Stirling-PDF-${project.version}.jar"
appName = "Stirling PDF"
appVersion = project.version
-// appVersion = "2005.45.1"
vendor = "Stirling PDF Inc"
appDescription = "Stirling PDF - Your Local PDF Editor"
- icon = "src/main/resources/static/favicon.ico"
+ icon = "stirling-pdf/src/main/resources/static/favicon.ico"
verbose = true
// mainClass = "org.springframework.boot.loader.launch.JarLauncher"
@@ -141,10 +243,10 @@ jpackage {
installDir = "C:/Program Files/Stirling-PDF"
}
- // macOS-specific configuration
+ // MacOS-specific configuration
mac {
appVersion = getMacVersion(project.version.toString())
- icon = "src/main/resources/static/favicon.icns"
+ icon = "stirling-pdf/src/main/resources/static/favicon.icns"
type = "dmg"
macPackageIdentifier = "Stirling PDF"
macPackageName = "Stirling PDF"
@@ -166,7 +268,7 @@ jpackage {
// Linux-specific configuration
linux {
appVersion = project.version
- icon = "src/main/resources/static/favicon.png"
+ icon = "stirling-pdf/src/main/resources/static/favicon.png"
type = "deb" // Can also use "rpm" for Red Hat-based systems
// Debian package configuration
@@ -202,10 +304,15 @@ jpackage {
]*/
// Add copyright and license information
- copyright = "Copyright © 2024 Stirling Software"
+ copyright = "Copyright © 2025 Stirling PDF Inc."
licenseFile = "LICENSE"
}
+//tasks.wrapper {
+// gradleVersion = "8.14"
+// distributionType = Wrapper.DistributionType.ALL
+//}
+
tasks.register('jpackageMacX64') {
group = 'distribution'
description = 'Packages app for MacOS x86_64'
@@ -238,7 +345,7 @@ tasks.register('jpackageMacX64') {
'--main-class', 'org.springframework.boot.loader.launch.JarLauncher',
'--runtime-image', file(jrePath + "/zulu-17.jre/Contents/Home"),
'--dest', 'build/jpackage/x86_64',
- '--icon', 'src/main/resources/static/favicon.icns',
+ '--icon', 'stirling-pdf/src/main/resources/static/favicon.icns',
'--app-version', getMacVersion(project.version.toString()),
'--mac-package-name', 'Stirling PDF (x86_64)',
'--mac-package-identifier', 'Stirling PDF (x86_64)',
@@ -287,12 +394,12 @@ tasks.register('downloadTempJre') {
def jreArchive = new File(tmpDir, 'jre.tar.gz')
def jreDir = new File(tmpDir, 'jre')
- println "Downloading JRE to $jreArchive..."
+ println "Downloading JRE to $jreArchive"
jreArchive.withOutputStream { out ->
new URI(jreUrl).toURL().withInputStream { from -> out << from }
}
- println "Extracting JRE to $jreDir..."
+ println "Extracting JRE to $jreDir"
jreDir.mkdirs()
providers.exec {
commandLine 'tar', '-xzf', jreArchive.absolutePath, '-C', jreDir.absolutePath, '--strip-components=1'
@@ -324,7 +431,7 @@ tasks.register('cleanTempJre') {
}
launch4j {
- icon = "${projectDir}/src/main/resources/static/favicon.ico"
+ icon = "${projectDir}/stirling-pdf/src/main/resources/static/favicon.ico"
outfile="Stirling-PDF.exe"
@@ -335,7 +442,7 @@ launch4j {
}
jarTask = tasks.bootJar
- errTitle="Encountered error, Do you have Java 21?"
+ errTitle="Encountered error, do you have Java 21?"
downloadUrl="https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe"
if(System.getenv("STIRLING_PDF_DESKTOP_UI") == 'true') {
@@ -377,159 +484,12 @@ sonar {
property "sonar.projectKey", "Stirling-Tools_Stirling-PDF"
property "sonar.organization", "stirling-tools"
- property "sonar.exclusions", "**/build-wrapper-dump.json, src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**"
- property "sonar.coverage.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**"
- property "sonar.cpd.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**"
+ property "sonar.exclusions", "**/build-wrapper-dump.json, **/src/main/java/org/apache/**, **/src/main/resources/static/pdfjs/**, **/src/main/resources/static/pdfjs-legacy/**, **/src/main/resources/static/js/thirdParty/**"
+ property "sonar.coverage.exclusions", "**/src/main/java/org/apache/**, **/src/main/resources/static/pdfjs/**, **/src/main/resources/static/pdfjs-legacy/**, **/src/main/resources/static/js/thirdParty/**"
+ property "sonar.cpd.exclusions", "**/src/main/java/org/apache/**, **/src/main/resources/static/pdfjs/**, **/src/main/resources/static/pdfjs-legacy/**, **/src/main/resources/static/js/thirdParty/**"
}
}
-//gradleLint {
-// rules=['unused-dependency']
-// }
-tasks.wrapper {
- gradleVersion = "8.14"
- distributionType = Wrapper.DistributionType.ALL
-}
-//tasks.withType(JavaCompile) {
-// options.compilerArgs << "-Xlint:deprecation"
-//}
-configurations.all {
- // Remove all commons-logging dependencies so that only spring-jcl is used
- exclude group: 'commons-logging', module: 'commons-logging'
- // Exclude Tomcat
- exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
-}
-
-dependencies {
- implementation project(':common')
-
- //tmp for security bumps
- implementation 'ch.qos.logback:logback-core:1.5.18'
- implementation 'ch.qos.logback:logback-classic:1.5.18'
-
- // Exclude vulnerable BouncyCastle version used in tableau
- configurations.all {
- exclude group: 'org.bouncycastle', module: 'bcpkix-jdk15on'
- exclude group: 'org.bouncycastle', module: 'bcutil-jdk15on'
- exclude group: 'org.bouncycastle', module: 'bcmail-jdk15on'
- }
-
- if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") {
- implementation "me.friwi:jcefmaven:135.0.20"
- implementation "org.openjfx:javafx-controls:21"
- implementation "org.openjfx:javafx-swing:21"
- }
-
- //security updates
- implementation "org.springframework:spring-webmvc:6.2.7"
-
- implementation("io.github.pixee:java-security-toolkit:1.2.1")
-
- // Exclude Tomcat and include Jetty
-// implementation("org.springframework.boot:spring-boot-starter-web:$springBootVersion")
- implementation "org.springframework.boot:spring-boot-starter-jetty:$springBootVersion"
-// implementation "org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion"
- implementation 'com.posthog.java:posthog:1.2.0'
- implementation 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20240325.1'
- implementation 'org.snakeyaml:snakeyaml-engine:2.9'
-
- if (System.getenv("DOCKER_ENABLE_SECURITY") != "false" || System.getenv('DISABLE_ADDITIONAL_FEATURES') != 'true'
- || (project.hasProperty('DISABLE_ADDITIONAL_FEATURES')
- && System.getProperty('DISABLE_ADDITIONAL_FEATURES') != 'true')) {
- implementation project(':proprietary')
- }
-
- // Batik
- implementation "org.apache.xmlgraphics:batik-all:1.19"
-
- // TwelveMonkeys
- runtimeOnly "com.twelvemonkeys.imageio:imageio-batik:$imageioVersion"
- runtimeOnly "com.twelvemonkeys.imageio:imageio-bmp:$imageioVersion"
- runtimeOnly "com.twelvemonkeys.imageio:imageio-jpeg:$imageioVersion"
- runtimeOnly "com.twelvemonkeys.imageio:imageio-tiff:$imageioVersion"
- runtimeOnly "com.twelvemonkeys.imageio:imageio-webp:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-hdr:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-icns:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-iff:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-pcx:$imageioVersion@
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-pict:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-pnm:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-psd:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-sgi:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-tga:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-thumbsdb:$imageioVersion"
- // runtimeOnly "com.twelvemonkeys.imageio:imageio-xwd:$imageioVersion"
-
- // Image metadata extractor
- implementation "com.drewnoakes:metadata-extractor:2.19.0"
- implementation "commons-io:commons-io:2.19.0"
-// implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8"
-
- // General PDF
- // https://mvnrepository.com/artifact/com.opencsv/opencsv
- implementation ("com.opencsv:opencsv:5.11")
-// implementation ("org.apache.pdfbox:pdfbox:$pdfboxVersion")
- implementation "org.apache.pdfbox:preflight:$pdfboxVersion"
- implementation ("org.apache.pdfbox:xmpbox:$pdfboxVersion")
-
- // https://mvnrepository.com/artifact/technology.tabula/tabula
- implementation ('technology.tabula:tabula:1.0.5') {
- exclude group: "org.slf4j", module: "slf4j-simple"
- exclude group: "org.bouncycastle", module: "bcprov-jdk15on"
- exclude group: "com.google.code.gson", module: "gson"
- exclude group: "commons-io", module: "commons-io"
- }
-
- implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4'
-
- implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion"
- implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
- implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
- implementation "io.micrometer:micrometer-core:1.15.0"
- implementation group: "com.google.zxing", name: "core", version: "3.5.3"
- // https://mvnrepository.com/artifact/org.commonmark/commonmark
- implementation "org.commonmark:commonmark:0.24.0"
- implementation "org.commonmark:commonmark-ext-gfm-tables:0.24.0"
- // https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17
- implementation "com.bucket4j:bucket4j_jdk17-core:8.14.0"
- implementation "com.fathzer:javaluator:3.0.6"
- implementation 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8'
-
- developmentOnly("org.springframework.boot:spring-boot-devtools:$springBootVersion")
- compileOnly "org.projectlombok:lombok:$lombokVersion"
- annotationProcessor "org.projectlombok:lombok:$lombokVersion"
-
- // Mockito (core)
- testImplementation 'org.mockito:mockito-core:5.18.0'
- testRuntimeOnly 'org.mockito:mockito-inline:5.2.0'
- testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
-}
-
-tasks.withType(JavaCompile).configureEach {
- options.encoding = "UTF-8"
- dependsOn "spotlessApply"
-}
-compileJava {
- options.compilerArgs << "-parameters"
-}
-
-task writeVersion {
- def propsFile = file("$projectDir/src/main/resources/version.properties")
- def propsDir = propsFile.parentFile
-
- doLast {
- if (!propsDir.exists()) {
- propsDir.mkdirs()
- }
-
- def props = new Properties()
- props.setProperty("version", version)
- props.store(propsFile.newWriter(), null)
- }
-}
-
-processResources.dependsOn(writeVersion)
-
swaggerhubUpload {
// dependsOn = generateOpenApiDocs // Depends on your task generating Swagger docs
api = "Stirling-PDF" // The name of your API on SwaggerHub
@@ -540,25 +500,43 @@ swaggerhubUpload {
oas = "3.0.0" // The version of the OpenAPI Specification you"re using
}
-jar {
- enabled = false
- manifest {
- attributes "Implementation-Title": "Stirling-PDF",
- "Implementation-Version": project.version
- }
-}
-
tasks.named("test") {
useJUnitPlatform()
}
-task printVersion {
+tasks.register('writeVersion') {
+ def propsFile = file("$projectDir/stirling-pdf/src/main/resources/version.properties")
+ def propsDir = propsFile.parentFile
+
+ doLast {
+ if (propsDir.exists()) {
+ if (propsFile.exists()) {
+ println "File exists: $propsFile"
+ } else {
+ println "$propsFile does not exist. Creating file."
+ propsFile.createNewFile()
+ }
+ } else {
+ println "Creating directory: $propsDir"
+ propsDir.mkdirs()
+ propsFile.createNewFile()
+ }
+
+ def props = new Properties()
+ props.setProperty("version", version)
+ props.store(propsFile.newWriter(), null)
+ }
+}
+
+processResources.dependsOn(writeVersion)
+
+tasks.register('printVersion') {
doLast {
println project.version
}
}
-task printMacVersion {
+tasks.register('printMacVersion') {
doLast {
println getMacVersion(project.version.toString())
}
diff --git a/common/.gitignore b/common/.gitignore
index 90d48ccea..17f0d4976 100644
--- a/common/.gitignore
+++ b/common/.gitignore
@@ -124,6 +124,7 @@ SwaggerDoc.json
*.rar
*.db
/build
+/common/build/
# Byte-compiled / optimized / DLL files
__pycache__/
@@ -193,4 +194,3 @@ id_ed25519.pub
# node_modules
node_modules/
-*.mjs
diff --git a/common/build.gradle b/common/build.gradle
index 871ba43f9..e886065fb 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -1,41 +1,9 @@
-plugins {
- id 'java-library'
- id 'io.spring.dependency-management' version '1.1.7'
-}
-
-group = 'stirling.software'
-version = '0.46.2'
-
-ext {
- lombokVersion = "1.18.38"
-}
-
-java {
- sourceCompatibility = JavaVersion.VERSION_17
-}
-
-repositories {
- mavenCentral()
-}
-
-configurations.all {
- exclude group: 'commons-logging', module: 'commons-logging'
- exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
-}
-
-dependencyManagement {
- imports {
- mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.0'
- }
-}
-
dependencies {
api 'org.springframework.boot:spring-boot-starter-web'
api 'org.springframework.boot:spring-boot-starter-thymeleaf'
api 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20240325.1'
api 'com.fathzer:javaluator:3.0.6'
api 'com.posthog.java:posthog:1.2.0'
- api 'io.github.pixee:java-security-toolkit:1.2.1'
api 'org.apache.commons:commons-lang3:3.17.0'
api 'com.drewnoakes:metadata-extractor:2.19.0' // Image metadata extractor
api 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8'
@@ -44,9 +12,4 @@ dependencies {
api 'org.snakeyaml:snakeyaml-engine:2.9'
api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8"
api 'jakarta.mail:jakarta.mail-api:2.1.3'
- compileOnly "org.projectlombok:lombok:$lombokVersion"
- annotationProcessor "org.projectlombok:lombok:$lombokVersion"
-
- testImplementation "org.springframework.boot:spring-boot-starter-test"
- testRuntimeOnly 'org.mockito:mockito-inline:5.2.0'
}
diff --git a/common/src/main/java/stirling/software/common/configuration/AppConfig.java b/common/src/main/java/stirling/software/common/configuration/AppConfig.java
index 6c243eb59..f0e5a6449 100644
--- a/common/src/main/java/stirling/software/common/configuration/AppConfig.java
+++ b/common/src/main/java/stirling/software/common/configuration/AppConfig.java
@@ -1,5 +1,7 @@
package stirling.software.common.configuration;
+import io.github.pixee.security.SystemCommand;
+import jakarta.annotation.PostConstruct;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -149,12 +151,12 @@ public class AppConfig {
@Bean(name = "activeSecurity")
public boolean activeSecurity() {
- String additionalFeaturesOff = env.getProperty("DISABLE_ADDITIONAL_FEATURES");
+ String disableAdditionalFeatures = env.getProperty("DISABLE_ADDITIONAL_FEATURES");
- if (additionalFeaturesOff != null) {
+ if (disableAdditionalFeatures != null) {
// DISABLE_ADDITIONAL_FEATURES=true means security OFF, so return false
// DISABLE_ADDITIONAL_FEATURES=false means security ON, so return true
- return !Boolean.parseBoolean(additionalFeaturesOff);
+ return !Boolean.parseBoolean(disableAdditionalFeatures);
}
return env.getProperty("DOCKER_ENABLE_SECURITY", Boolean.class, true);
@@ -164,7 +166,7 @@ public class AppConfig {
@ConditionalOnMissingClass(
"stirling.software.proprietary.security.configuration.SecurityConfiguration")
public boolean missingActiveSecurity() {
- return false;
+ return true;
}
@Bean(name = "directoryFilter")
diff --git a/common/src/main/java/stirling/software/common/model/ApplicationProperties.java b/common/src/main/java/stirling/software/common/model/ApplicationProperties.java
index 9472d40e4..58ff13f50 100644
--- a/common/src/main/java/stirling/software/common/model/ApplicationProperties.java
+++ b/common/src/main/java/stirling/software/common/model/ApplicationProperties.java
@@ -344,10 +344,10 @@ public class ApplicationProperties {
@Override
public String toString() {
return """
- Driver {
- driverName='%s'
- }
- """
+ Driver {
+ driverName='%s'
+ }
+ """
.formatted(driverName);
}
}
diff --git a/common/src/main/java/stirling/software/common/service/PostHogService.java b/common/src/main/java/stirling/software/common/service/PostHogService.java
index 6965027dd..2bc219832 100644
--- a/common/src/main/java/stirling/software/common/service/PostHogService.java
+++ b/common/src/main/java/stirling/software/common/service/PostHogService.java
@@ -208,7 +208,7 @@ public class PostHogService {
// New environment variables
dockerMetrics.put("version_tag", System.getenv("VERSION_TAG"));
- dockerMetrics.put("without_enhanced_features", System.getenv("WITHOUT_ENHANCED_FEATURES"));
+ dockerMetrics.put("additional_features_off", System.getenv("ADDITIONAL_FEATURES_OFF"));
dockerMetrics.put("fat_docker", System.getenv("FAT_DOCKER"));
return dockerMetrics;
diff --git a/common/src/main/java/stirling/software/common/util/ValidationUtil.java b/common/src/main/java/stirling/software/common/util/ValidationUtil.java
new file mode 100644
index 000000000..8646f3bb6
--- /dev/null
+++ b/common/src/main/java/stirling/software/common/util/ValidationUtil.java
@@ -0,0 +1,14 @@
+package stirling.software.common.util;
+
+import java.util.Collection;
+
+public class ValidationUtil {
+
+ public static boolean isStringEmpty(String input) {
+ return input == null || input.isBlank();
+ }
+
+ public static boolean isCollectionEmpty(Collection input) {
+ return input == null || input.isEmpty();
+ }
+}
diff --git a/common/src/test/java/stirling/software/common/util/CheckProgramInstallTest.java b/common/src/test/java/stirling/software/common/util/CheckProgramInstallTest.java
index ae8132618..17723a5e4 100644
--- a/common/src/test/java/stirling/software/common/util/CheckProgramInstallTest.java
+++ b/common/src/test/java/stirling/software/common/util/CheckProgramInstallTest.java
@@ -1,5 +1,14 @@
package stirling.software.common.util;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -10,18 +19,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-
-import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
-
class CheckProgramInstallTest {
private MockedStatic mockProcessExecutor;
diff --git a/common/src/test/java/stirling/software/common/util/FileMonitorTest.java b/common/src/test/java/stirling/software/common/util/FileMonitorTest.java
index b7d59eab8..0a0ff107a 100644
--- a/common/src/test/java/stirling/software/common/util/FileMonitorTest.java
+++ b/common/src/test/java/stirling/software/common/util/FileMonitorTest.java
@@ -19,7 +19,6 @@ import org.junit.jupiter.api.io.TempDir;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
-
import stirling.software.common.configuration.RuntimePathConfig;
@ExtendWith(MockitoExtension.class)
diff --git a/common/src/test/java/stirling/software/common/util/ProviderUtilsTest.java b/common/src/test/java/stirling/software/common/util/ProviderUtilsTest.java
index 8788f4c91..18dd04ead 100644
--- a/common/src/test/java/stirling/software/common/util/ProviderUtilsTest.java
+++ b/common/src/test/java/stirling/software/common/util/ProviderUtilsTest.java
@@ -1,10 +1,7 @@
package stirling.software.common.util;
-import static org.mockito.Mockito.*;
-
import java.util.List;
import java.util.stream.Stream;
-
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -12,11 +9,13 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.mockito.junit.jupiter.MockitoExtension;
-
import stirling.software.common.model.enumeration.UsernameAttribute;
import stirling.software.common.model.oauth2.GitHubProvider;
import stirling.software.common.model.oauth2.GoogleProvider;
import stirling.software.common.model.oauth2.Provider;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class ProviderUtilsTest {
@@ -29,19 +28,19 @@ class ProviderUtilsTest {
when(provider.getClientSecret()).thenReturn("clientSecret");
when(provider.getScopes()).thenReturn(List.of("read:user"));
- Assertions.assertTrue(ProviderUtils.validateProvider(provider));
+ assertTrue(ProviderUtils.validateProvider(provider));
}
@ParameterizedTest
@MethodSource("providerParams")
void testUnsuccessfulValidation(Provider provider) {
- Assertions.assertFalse(ProviderUtils.validateProvider(provider));
+ assertFalse(ProviderUtils.validateProvider(provider));
}
public static Stream providerParams() {
Provider generic = null;
var google =
- new GoogleProvider(null, "clientSecret", List.of("scope"), UsernameAttribute.EMAIL);
+ new GoogleProvider(null, "clientSecret", List.of("scope"), UsernameAttribute.EMAIL);
var github = new GitHubProvider("clientId", "", List.of("scope"), UsernameAttribute.LOGIN);
return Stream.of(Arguments.of(generic), Arguments.of(google), Arguments.of(github));
diff --git a/common/src/test/java/stirling/software/common/util/misc/HighContrastColorReplaceDeciderTest.java b/common/src/test/java/stirling/software/common/util/misc/HighContrastColorReplaceDeciderTest.java
index 9ae3d6eb7..7b01783d1 100644
--- a/common/src/test/java/stirling/software/common/util/misc/HighContrastColorReplaceDeciderTest.java
+++ b/common/src/test/java/stirling/software/common/util/misc/HighContrastColorReplaceDeciderTest.java
@@ -1,12 +1,10 @@
package stirling.software.common.util.misc;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
import org.junit.jupiter.api.Test;
-
import stirling.software.common.model.api.misc.HighContrastColorCombination;
import stirling.software.common.model.api.misc.ReplaceAndInvert;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
class HighContrastColorReplaceDeciderTest {
diff --git a/common/src/test/java/stirling/software/common/util/misc/InvertFullColorStrategyTest.java b/common/src/test/java/stirling/software/common/util/misc/InvertFullColorStrategyTest.java
index 61b48e4f7..d6a4fad94 100644
--- a/common/src/test/java/stirling/software/common/util/misc/InvertFullColorStrategyTest.java
+++ b/common/src/test/java/stirling/software/common/util/misc/InvertFullColorStrategyTest.java
@@ -26,7 +26,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.core.io.InputStreamResource;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
-
import stirling.software.common.model.api.misc.ReplaceAndInvert;
class InvertFullColorStrategyTest {
diff --git a/common/src/test/java/stirling/software/common/util/misc/ReplaceAndInvertColorStrategyTest.java b/common/src/test/java/stirling/software/common/util/misc/ReplaceAndInvertColorStrategyTest.java
index 0f9471773..f5520146e 100644
--- a/common/src/test/java/stirling/software/common/util/misc/ReplaceAndInvertColorStrategyTest.java
+++ b/common/src/test/java/stirling/software/common/util/misc/ReplaceAndInvertColorStrategyTest.java
@@ -9,7 +9,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.core.io.InputStreamResource;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
-
import stirling.software.common.model.api.misc.ReplaceAndInvert;
class ReplaceAndInvertColorStrategyTest {
diff --git a/common/src/test/java/stirling/software/common/util/propertyeditor/StringToArrayListPropertyEditorTest.java b/common/src/test/java/stirling/software/common/util/propertyeditor/StringToArrayListPropertyEditorTest.java
index ce1535986..6cdfeae62 100644
--- a/common/src/test/java/stirling/software/common/util/propertyeditor/StringToArrayListPropertyEditorTest.java
+++ b/common/src/test/java/stirling/software/common/util/propertyeditor/StringToArrayListPropertyEditorTest.java
@@ -1,17 +1,14 @@
package stirling.software.common.util.propertyeditor;
+import java.util.List;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import stirling.software.common.model.api.security.RedactionArea;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import java.util.List;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import stirling.software.common.model.api.security.RedactionArea;
-
class StringToArrayListPropertyEditorTest {
private StringToArrayListPropertyEditor editor;
diff --git a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml
index 89d0fc94e..55ea0893d 100644
--- a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml
+++ b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml
@@ -14,9 +14,9 @@ services:
ports:
- "8080:8080"
volumes:
- - /stirling/latest/data:/usr/share/tessdata:rw
- - /stirling/latest/config:/configs:rw
- - /stirling/latest/logs:/logs:rw
+ - ./stirling/latest/data:/usr/share/tessdata:rw
+ - ./stirling/latest/config:/configs:rw
+ - ./stirling/latest/logs:/logs:rw
environment:
DISABLE_ADDITIONAL_FEATURES: "false"
SECURITY_ENABLELOGIN: "true"
diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml
index c927ab706..fe839d941 100644
--- a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml
+++ b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml
@@ -14,9 +14,9 @@ services:
ports:
- "8080:8080"
volumes:
- - /stirling/latest/data:/usr/share/tessdata:rw
- - /stirling/latest/config:/configs:rw
- - /stirling/latest/logs:/logs:rw
+ - ./stirling/latest/data:/usr/share/tessdata:rw
+ - ./stirling/latest/config:/configs:rw
+ - ./stirling/latest/logs:/logs:rw
environment:
DISABLE_ADDITIONAL_FEATURES: "false"
SECURITY_ENABLELOGIN: "true"
diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml
index d3e1b9759..14e78b2ff 100644
--- a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml
+++ b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml
@@ -14,8 +14,8 @@ services:
ports:
- "8080:8080"
volumes:
- - /stirling/latest/config:/configs:rw
- - /stirling/latest/logs:/logs:rw
+ - ./stirling/latest/config:/configs:rw
+ - ./stirling/latest/logs:/logs:rw
environment:
DISABLE_ADDITIONAL_FEATURES: "true"
SECURITY_ENABLELOGIN: "false"
diff --git a/exampleYmlFiles/docker-compose-latest.yml b/exampleYmlFiles/docker-compose-latest.yml
index d8b1aee74..2db962e32 100644
--- a/exampleYmlFiles/docker-compose-latest.yml
+++ b/exampleYmlFiles/docker-compose-latest.yml
@@ -14,9 +14,9 @@ services:
ports:
- "8080:8080"
volumes:
- - /stirling/latest/data:/usr/share/tessdata:rw
- - /stirling/latest/config:/configs:rw
- - /stirling/latest/logs:/logs:rw
+ - ./stirling/latest/data:/usr/share/tessdata:rw
+ - ./stirling/latest/config:/configs:rw
+ - ./stirling/latest/logs:/logs:rw
environment:
DISABLE_ADDITIONAL_FEATURES: "true"
SECURITY_ENABLELOGIN: "false"
diff --git a/exampleYmlFiles/test_cicd.yml b/exampleYmlFiles/test_cicd.yml
index 749e863a3..31e24da48 100644
--- a/exampleYmlFiles/test_cicd.yml
+++ b/exampleYmlFiles/test_cicd.yml
@@ -14,9 +14,9 @@ services:
ports:
- 8080:8080
volumes:
- - /stirling/latest/data:/usr/share/tessdata:rw
- - /stirling/latest/config:/configs:rw
- - /stirling/latest/logs:/logs:rw
+ - ./stirling/latest/data:/usr/share/tessdata:rw
+ - ./stirling/latest/config:/configs:rw
+ - ./stirling/latest/logs:/logs:rw
environment:
DISABLE_ADDITIONAL_FEATURES: "false"
SECURITY_ENABLELOGIN: "true"
diff --git a/proprietary/.gitignore b/proprietary/.gitignore
index 90d48ccea..51fc2457f 100644
--- a/proprietary/.gitignore
+++ b/proprietary/.gitignore
@@ -124,6 +124,7 @@ SwaggerDoc.json
*.rar
*.db
/build
+/proprietary/build/
# Byte-compiled / optimized / DLL files
__pycache__/
@@ -193,4 +194,3 @@ id_ed25519.pub
# node_modules
node_modules/
-*.mjs
diff --git a/proprietary/build.gradle b/proprietary/build.gradle
index 331476f57..aff6559e9 100644
--- a/proprietary/build.gradle
+++ b/proprietary/build.gradle
@@ -1,28 +1,7 @@
-plugins {
- id 'java-library'
- id 'io.spring.dependency-management' version '1.1.7'
-}
-
repositories {
- mavenCentral()
maven { url = "https://build.shibboleth.net/maven/releases" }
}
-java {
- sourceCompatibility = JavaVersion.VERSION_17
-}
-
-configurations.all {
- exclude group: 'commons-logging', module: 'commons-logging'
- exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
-}
-
-dependencyManagement {
- imports {
- mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.0'
- }
-}
-
dependencies {
implementation project(':common')
@@ -42,7 +21,6 @@ dependencies {
// https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17
implementation 'org.bouncycastle:bcprov-jdk18on:1.80'
- implementation 'io.github.pixee:java-security-toolkit:1.2.1'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.3.RELEASE'
api 'io.micrometer:micrometer-registry-prometheus'
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'
@@ -54,14 +32,6 @@ dependencies {
implementation "org.opensaml:opensaml-saml-impl:$openSamlVersion"
}
implementation 'com.coveo:saml-client:5.0.0'
-
- compileOnly "org.projectlombok:lombok:$lombokVersion"
- annotationProcessor "org.projectlombok:lombok:$lombokVersion"
-
- testImplementation platform('org.junit:junit-bom:5.10.0')
- testImplementation 'org.junit.jupiter:junit-jupiter'
- testImplementation 'org.springframework.boot:spring-boot-starter-test'
- testRuntimeOnly 'org.mockito:mockito-inline:5.2.0'
}
tasks.register('prepareKotlinBuildScriptModel') {}
diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/CustomLogoutSuccessHandler.java b/proprietary/src/main/java/stirling/software/proprietary/security/CustomLogoutSuccessHandler.java
index 44046eb71..77f7ebafd 100644
--- a/proprietary/src/main/java/stirling/software/proprietary/security/CustomLogoutSuccessHandler.java
+++ b/proprietary/src/main/java/stirling/software/proprietary/security/CustomLogoutSuccessHandler.java
@@ -38,6 +38,7 @@ public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
public static final String LOGOUT_PATH = "/login?logout=true";
private final ApplicationProperties applicationProperties;
+
private final AppConfig appConfig;
@Override
diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/configuration/SecurityConfiguration.java b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/SecurityConfiguration.java
index b49e19c08..ab809a037 100644
--- a/proprietary/src/main/java/stirling/software/proprietary/security/configuration/SecurityConfiguration.java
+++ b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/SecurityConfiguration.java
@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
@@ -55,6 +56,7 @@ import stirling.software.proprietary.security.session.SessionPersistentRegistry;
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
+@DependsOn("runningProOrHigher")
public class SecurityConfiguration {
private final CustomUserDetailsService userDetailsService;
diff --git a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/EEAppConfig.java
similarity index 95%
rename from src/main/java/stirling/software/SPDF/EE/EEAppConfig.java
rename to proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/EEAppConfig.java
index 17289587a..55c59f6bc 100644
--- a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java
+++ b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/EEAppConfig.java
@@ -1,13 +1,13 @@
-package stirling.software.SPDF.EE;
+package stirling.software.proprietary.security.configuration.ee;
+import static stirling.software.proprietary.security.configuration.ee.KeygenLicenseVerifier.License;
+
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
-import lombok.extern.slf4j.Slf4j;
-
-import stirling.software.SPDF.EE.KeygenLicenseVerifier.License;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.model.ApplicationProperties.EnterpriseEdition;
import stirling.software.common.model.ApplicationProperties.Premium;
@@ -15,7 +15,6 @@ import stirling.software.common.model.ApplicationProperties.Premium.ProFeatures.
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
-@Slf4j
public class EEAppConfig {
private final ApplicationProperties applicationProperties;
@@ -30,6 +29,7 @@ public class EEAppConfig {
}
@Bean(name = "runningProOrHigher")
+ @Qualifier("runningProOrHigher")
public boolean runningProOrHigher() {
return licenseKeyChecker.getPremiumLicenseEnabledResult() != License.NORMAL;
}
diff --git a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/KeygenLicenseVerifier.java
similarity index 99%
rename from src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java
rename to proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/KeygenLicenseVerifier.java
index e92e048e9..969385a33 100644
--- a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java
+++ b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/KeygenLicenseVerifier.java
@@ -1,4 +1,4 @@
-package stirling.software.SPDF.EE;
+package stirling.software.proprietary.security.configuration.ee;
import java.net.URI;
import java.net.http.HttpClient;
@@ -27,7 +27,7 @@ import stirling.software.common.util.GeneralUtils;
@RequiredArgsConstructor
public class KeygenLicenseVerifier {
- enum License {
+ public enum License {
NORMAL,
PRO,
ENTERPRISE
diff --git a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/LicenseKeyChecker.java
similarity index 95%
rename from src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java
rename to proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/LicenseKeyChecker.java
index c1a6f199c..15baef7db 100644
--- a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java
+++ b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee/LicenseKeyChecker.java
@@ -1,4 +1,4 @@
-package stirling.software.SPDF.EE;
+package stirling.software.proprietary.security.configuration.ee;
import java.io.IOException;
import java.nio.file.Files;
@@ -10,12 +10,12 @@ import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
-import stirling.software.SPDF.EE.KeygenLicenseVerifier.License;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.util.GeneralUtils;
+import stirling.software.proprietary.security.configuration.ee.KeygenLicenseVerifier.License;
-@Component
@Slf4j
+@Component
public class LicenseKeyChecker {
private static final String FILE_PREFIX = "file:";
diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/saml2/SAML2Configuration.java b/proprietary/src/main/java/stirling/software/proprietary/security/saml2/SAML2Configuration.java
index 233bcaadd..7fd4768b3 100644
--- a/proprietary/src/main/java/stirling/software/proprietary/security/saml2/SAML2Configuration.java
+++ b/proprietary/src/main/java/stirling/software/proprietary/security/saml2/SAML2Configuration.java
@@ -5,7 +5,6 @@ import java.util.Collections;
import java.util.UUID;
import org.opensaml.saml.saml2.core.AuthnRequest;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -30,8 +29,8 @@ import stirling.software.common.model.ApplicationProperties.Security.SAML2;
@Configuration
@Slf4j
+@ConditionalOnProperty(value = "security.saml2.enabled", havingValue = "true")
@RequiredArgsConstructor
-@ConditionalOnBooleanProperty("security.saml2.enabled")
public class SAML2Configuration {
private final ApplicationProperties applicationProperties;
diff --git a/src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java b/proprietary/src/test/java/stirling/software/proprietary/security/configuration/ee/LicenseKeyCheckerTest.java
similarity index 87%
rename from src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java
rename to proprietary/src/test/java/stirling/software/proprietary/security/configuration/ee/LicenseKeyCheckerTest.java
index e11d0a0b4..4a6e7ad65 100644
--- a/src/test/java/stirling/software/SPDF/EE/LicenseKeyCheckerTest.java
+++ b/proprietary/src/test/java/stirling/software/proprietary/security/configuration/ee/LicenseKeyCheckerTest.java
@@ -1,7 +1,10 @@
-package stirling.software.SPDF.EE;
+package stirling.software.proprietary.security.configuration.ee;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
+import static stirling.software.proprietary.security.configuration.ee.KeygenLicenseVerifier.License;
import java.io.IOException;
import java.nio.file.Files;
@@ -13,7 +16,6 @@ import org.junit.jupiter.api.io.TempDir;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
-import stirling.software.SPDF.EE.KeygenLicenseVerifier.License;
import stirling.software.common.model.ApplicationProperties;
@ExtendWith(MockitoExtension.class)
diff --git a/scripts/download-security-jar.sh b/scripts/download-security-jar.sh
index d49cf3605..5df242921 100644
--- a/scripts/download-security-jar.sh
+++ b/scripts/download-security-jar.sh
@@ -1,5 +1,5 @@
echo "Running Stirling PDF with DISABLE_ADDITIONAL_FEATURES=${DISABLE_ADDITIONAL_FEATURES} and VERSION_TAG=${VERSION_TAG}"
-# Check for $DISABLE_ADDITIONAL_FEATURES and download the appropriate JAR if required
+# Check for DISABLE_ADDITIONAL_FEATURES and download the appropriate JAR if required
if [ "$DISABLE_ADDITIONAL_FEATURES" = "false" ] && [ "$VERSION_TAG" != "alpha" ]; then
if [ ! -f app-security.jar ]; then
echo "Trying to download from: https://files.stirlingpdf.com/v$VERSION_TAG/Stirling-PDF-with-login.jar"
diff --git a/settings.gradle b/settings.gradle
index e4e55768e..9f7584d3a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -4,4 +4,4 @@ plugins {
}
rootProject.name = 'Stirling-PDF'
-include 'common', 'proprietary'
+include 'stirling-pdf', 'common', 'proprietary'
diff --git a/src/main/java/stirling/software/SPDF/model/api/Email.java b/src/main/java/stirling/software/SPDF/model/api/Email.java
deleted file mode 100644
index 6048195e2..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/Email.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package stirling.software.SPDF.model.api;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-@EqualsAndHashCode(callSuper = true)
-@ConditionalOnProperty(value = "mail.enabled", havingValue = "true", matchIfMissing = false)
-public class Email extends GeneralFile {
-
- @Schema(
- description = "The recipient's email address",
- requiredMode = Schema.RequiredMode.REQUIRED,
- format = "email")
- private String to;
-
- @Schema(
- description = "The subject of the email",
- defaultValue = "Stirling Software PDF Notification",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String subject;
-
- @Schema(
- description = "The body of the email",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED,
- defaultValue =
- "This message was automatically generated by Stirling-PDF, an innovative"
- + " solution from Stirling Software. For more information, visit our website.
Please do"
- + " not reply directly to this email.")
- private String body;
-}
diff --git a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java
deleted file mode 100644
index e3ffc8c8b..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package stirling.software.SPDF.model.api;
-
-import org.springframework.web.multipart.MultipartFile;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode
-public class GeneralFile {
-
- @Schema(
- description = "The input file",
- requiredMode = Schema.RequiredMode.REQUIRED,
- format = "binary")
- private MultipartFile fileInput;
-}
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
deleted file mode 100644
index 149676946..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package stirling.software.SPDF.model.api.converters;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import stirling.software.SPDF.model.api.PDFWithPageNums;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class ConvertToImageRequest extends PDFWithPageNums {
-
- @Schema(
- description = "The output image format",
- defaultValue = "png",
- allowableValues = {"png", "jpeg", "jpg", "gif", "webp"},
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String imageFormat;
-
- @Schema(
- description =
- "Choose between a single image containing all pages or separate images for each"
- + " page",
- defaultValue = "multiple",
- allowableValues = {"single", "multiple"},
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String singleOrMultiple;
-
- @Schema(
- description = "The color type of the output image(s)",
- defaultValue = "color",
- allowableValues = {"color", "greyscale", "blackwhite"},
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String colorType;
-
- @Schema(
- description = "The DPI (dots per inch) for the output image(s)",
- defaultValue = "300",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Integer dpi;
-}
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
deleted file mode 100644
index f89ba320f..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package stirling.software.SPDF.model.api.general;
-
-import org.springframework.web.multipart.MultipartFile;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import stirling.software.common.model.api.PDFFile;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class OverlayPdfsRequest extends PDFFile {
-
- @Schema(
- description =
- "An array of PDF files to be used as overlays on the base PDF. The order in"
- + " these files is applied based on the selected mode.",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private MultipartFile[] overlayFiles;
-
- @Schema(
- description =
- "The mode of overlaying: 'SequentialOverlay' for sequential application,"
- + " 'InterleavedOverlay' for round-robin application, 'FixedRepeatOverlay'"
- + " for fixed repetition based on provided counts",
- allowableValues = {"SequentialOverlay", "InterleavedOverlay", "FixedRepeatOverlay"},
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String overlayMode;
-
- @Schema(
- description =
- "An array of integers specifying the number of times each corresponding overlay"
- + " file should be applied in the 'FixedRepeatOverlay' mode. This should"
- + " match the length of the overlayFiles array.",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private int[] counts;
-
- @Schema(
- description = "Overlay position 0 is Foregound, 1 is Background",
- allowableValues = {"0", "1"},
- requiredMode = Schema.RequiredMode.REQUIRED,
- type = "number")
- private int overlayPosition;
-}
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
deleted file mode 100644
index 48d470a5a..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package stirling.software.SPDF.model.api.misc;
-
-import org.springframework.web.multipart.MultipartFile;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import stirling.software.SPDF.model.api.PDFWithPageNums;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class AddStampRequest extends PDFWithPageNums {
-
- @Schema(
- description = "The stamp type (text or image)",
- allowableValues = {"text", "image"},
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String stampType;
-
- @Schema(description = "The stamp text", defaultValue = "Stirling Software")
- private String stampText;
-
- @Schema(description = "The stamp image")
- private MultipartFile stampImage;
-
- @Schema(
- description = "The selected alphabet of the stamp text",
- allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"},
- defaultValue = "roman")
- private String alphabet = "roman";
-
- @Schema(
- description = "The font size of the stamp text and image",
- defaultValue = "30",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private float fontSize;
-
- @Schema(
- description = "The rotation of the stamp in degrees",
- defaultValue = "0",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private float rotation;
-
- @Schema(
- description = "The opacity of the stamp (0.0 - 1.0)",
- defaultValue = "0.5",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private float opacity;
-
- @Schema(
- description =
- "Position for stamp placement based on a 1-9 grid (1: bottom-left, 2: bottom-center,"
- + " 3: bottom-right, 4: middle-left, 5: middle-center, 6: middle-right,"
- + " 7: top-left, 8: top-center, 9: top-right)",
- allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"},
- defaultValue = "5",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private int position;
-
- @Schema(
- description =
- "Override X coordinate for stamp placement. If set, it will override the"
- + " position-based calculation. Negative value means no override.",
- defaultValue = "-1",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private float overrideX; // Default to -1 indicating no override
-
- @Schema(
- description =
- "Override Y coordinate for stamp placement. If set, it will override the"
- + " position-based calculation. Negative value means no override.",
- defaultValue = "-1",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private float overrideY; // Default to -1 indicating no override
-
- @Schema(
- description = "Specifies the margin size for the stamp.",
- allowableValues = {"small", "medium", "large", "x-large"},
- defaultValue = "medium",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String customMargin;
-
- @Schema(description = "The color of the stamp text", defaultValue = "#d3d3d3")
- private String customColor;
-}
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
deleted file mode 100644
index 63b267196..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package stirling.software.SPDF.model.api.misc;
-
-import java.util.Map;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import stirling.software.common.model.api.PDFFile;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class MetadataRequest extends PDFFile {
-
- @Schema(
- description = "Delete all metadata if set to true",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean deleteAll;
-
- @Schema(
- description = "The author of the document",
- defaultValue = "author",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String author;
-
- @Schema(
- description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)",
- pattern = "yyyy/MM/dd HH:mm:ss",
- defaultValue = "2023/10/01 12:00:00",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String creationDate;
-
- @Schema(
- description = "The creator of the document",
- defaultValue = "creator",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String creator;
-
- @Schema(
- description = "The keywords for the document",
- defaultValue = "keywords",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String keywords;
-
- @Schema(
- description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)",
- pattern = "yyyy/MM/dd HH:mm:ss",
- defaultValue = "2023/10/01 12:00:00",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String modificationDate;
-
- @Schema(
- description = "The producer of the document",
- defaultValue = "producer",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String producer;
-
- @Schema(
- description = "The subject of the document",
- defaultValue = "subject",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String subject;
-
- @Schema(
- description = "The title of the document",
- defaultValue = "title",
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String title;
-
- @Schema(
- description = "The trapped status of the document",
- defaultValue = "False",
- allowableValues = {"True", "False", "Unknown"},
- requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String trapped;
-
- @Schema(
- description =
- "Map list of key and value of custom parameters. Note these must start with"
- + " customKey and customValue if they are non-standard")
- private Map allRequestParams;
-}
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
deleted file mode 100644
index 279a41a27..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package stirling.software.SPDF.model.api.security;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import stirling.software.common.model.api.PDFFile;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class RedactPdfRequest extends PDFFile {
-
- @Schema(
- description = "List of text to redact from the PDF",
- defaultValue = "text,text2",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String listOfText;
-
- @Schema(
- description = "Whether to use regex for the listOfText",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean useRegex;
-
- @Schema(
- description = "Whether to use whole word search",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean wholeWordSearch;
-
- @Schema(
- description = "The color for redaction",
- defaultValue = "#000000",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String redactColor;
-
- @Schema(
- description = "Custom padding for redaction",
- type = "number",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private float customPadding;
-
- @Schema(
- description = "Convert the redacted PDF to an image",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean convertPDFToImage;
-}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java
deleted file mode 100644
index 9b44835f9..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package stirling.software.SPDF.model.api.security;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode
-public class RedactionArea {
- @Schema(description = "The left edge point of the area to be redacted.")
- private Double x;
-
- @Schema(description = "The top edge point of the area to be redacted.")
- private Double y;
-
- @Schema(description = "The height of the area to be redacted.")
- private Double height;
-
- @Schema(description = "The width of the area to be redacted.")
- private Double width;
-
- @Schema(description = "The page on which the area should be redacted.")
- private Integer page;
-
- @Schema(description = "The color used to redact the specified area.")
- private String color;
-}
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
deleted file mode 100644
index 736fbb20d..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package stirling.software.SPDF.model.api.security;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import stirling.software.common.model.api.PDFFile;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class SanitizePdfRequest extends PDFFile {
-
- @Schema(
- description = "Remove JavaScript actions from the PDF",
- defaultValue = "true",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean removeJavaScript;
-
- @Schema(
- description = "Remove embedded files from the PDF",
- defaultValue = "true",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean removeEmbeddedFiles;
-
- @Schema(
- description = "Remove XMP metadata from the PDF",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean removeXMPMetadata;
-
- @Schema(
- description = "Remove document info metadata from the PDF",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean removeMetadata;
-
- @Schema(
- description = "Remove links from the PDF",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean removeLinks;
-
- @Schema(
- description = "Remove fonts from the PDF",
- defaultValue = "false",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean removeFonts;
-}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
deleted file mode 100644
index f69e4c658..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package stirling.software.SPDF.model.api.user;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class UpdateUserDetails extends UpdateUserUsername {
-
- @Schema(
- description = "new password for user",
- format = "password",
- requiredMode = Schema.RequiredMode.REQUIRED)
- private String newPassword;
-}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
deleted file mode 100644
index b4b0105f3..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package stirling.software.SPDF.model.api.user;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class UpdateUserUsername extends UsernameAndPass {
-
- @Schema(description = "new username for user")
- private String newUsername;
-}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/Username.java b/src/main/java/stirling/software/SPDF/model/api/user/Username.java
deleted file mode 100644
index 5c8d8a482..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/user/Username.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package stirling.software.SPDF.model.api.user;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode
-public class Username {
-
- @Schema(description = "username of user", requiredMode = Schema.RequiredMode.REQUIRED)
- private String username;
-}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
deleted file mode 100644
index e9a205c0d..000000000
--- a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package stirling.software.SPDF.model.api.user;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class UsernameAndPass extends Username {
-
- @Schema(description = "password of user", format = "password")
- private String password;
-}
diff --git a/stirling-pdf/.gitignore b/stirling-pdf/.gitignore
new file mode 100644
index 000000000..bda7755db
--- /dev/null
+++ b/stirling-pdf/.gitignore
@@ -0,0 +1,196 @@
+### Eclipse ###
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.exe
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+.classpath
+.project
+version.properties
+
+#### Stirling-PDF Files ###
+pipeline/watchedFolders/
+pipeline/finishedFolders/
+customFiles/
+configs/
+watchedFolders/
+clientWebUI/
+!cucumber/
+!cucumber/exampleFiles/
+!cucumber/exampleFiles/example_html.zip
+exampleYmlFiles/stirling/
+/testing/file_snapshots
+SwaggerDoc.json
+
+# Gradle
+.gradle
+.lock
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# CDT- autotools
+.autotools
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Annotation Processing
+.apt_generated/
+.apt_generated_test/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
+# Uncomment this line if you wish to ignore the project description file.
+# Typically, this file would be tracked if it contains build/dependency configurations:
+#.project
+
+### Eclipse Patch ###
+# Spring Boot Tooling
+.sts4-cache/
+
+### Git ###
+# Created by git for backups. To disable backups in Git:
+# $ git config --global mergetool.keepBackup false
+*.orig
+
+# Created by git when using merge tools for conflicts
+*.BACKUP.*
+*.BASE.*
+*.LOCAL.*
+*.REMOTE.*
+*_BACKUP_*.txt
+*_BASE_*.txt
+*_LOCAL_*.txt
+*_REMOTE_*.txt
+
+### Java ###
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+*.db
+/build/*
+/stirling-pdf/build/*
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*.pyo
+
+# Virtual environments
+.env*
+.venv*
+env*/
+venv*/
+ENV/
+env.bak/
+venv.bak/
+
+# VS Code
+/.vscode/**/*
+!/.vscode/settings.json
+!/.vscode/extensions.json
+
+# IntelliJ IDEA
+.idea/
+*.iml
+out/
+
+# Ignore Mac DS_Store files
+.DS_Store
+**/.DS_Store
+
+# cucumber
+/cucumber/reports/**
+
+# Certs and Security Files
+*.p12
+*.pk8
+*.pem
+*.crt
+*.cer
+*.cert
+*.der
+*.key
+*.csr
+*.kdbx
+*.jks
+*.asc
+
+# SSH Keys
+*.pub
+*.priv
+id_rsa
+id_rsa.pub
+id_ecdsa
+id_ecdsa.pub
+id_ed25519
+id_ed25519.pub
+.ssh/
+*ssh
+
+# cache
+.cache
+.ruff_cache
+.mypy_cache
+.pytest_cache
+.ipynb_checkpoints
+
+**/jcef-bundle/
+
+# node_modules
+node_modules/
diff --git a/stirling-pdf/build.gradle b/stirling-pdf/build.gradle
new file mode 100644
index 000000000..e182e8c0c
--- /dev/null
+++ b/stirling-pdf/build.gradle
@@ -0,0 +1,95 @@
+repositories {
+ maven { url = 'https://build.shibboleth.net/maven/releases' }
+ maven { url = 'https://maven.pkg.github.com/jcefmaven/jcefmaven' }
+}
+
+dependencies {
+ if (System.getenv('STIRLING_PDF_DESKTOP_UI') != 'false'
+ || (project.hasProperty('STIRLING_PDF_DESKTOP_UI')
+ && project.getProperty('STIRLING_PDF_DESKTOP_UI') != 'false')) {
+ implementation 'me.friwi:jcefmaven:132.3.1'
+ implementation 'org.openjfx:javafx-controls:21'
+ implementation 'org.openjfx:javafx-swing:21'
+ }
+
+ if (System.getenv('DISABLE_ADDITIONAL_FEATURES') != 'true'
+ || (project.hasProperty('DISABLE_ADDITIONAL_FEATURES')
+ && System.getProperty('DISABLE_ADDITIONAL_FEATURES') != 'true')) {
+ implementation project(':proprietary')
+ }
+
+ implementation project(':common')
+ implementation 'org.springframework.boot:spring-boot-starter-jetty'
+ implementation 'com.posthog.java:posthog:1.2.0'
+ implementation 'commons-io:commons-io:2.19.0'
+ implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion"
+ implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
+ implementation 'io.micrometer:micrometer-core:1.14.6'
+ implementation 'com.google.zxing:core:3.5.3'
+ implementation "org.commonmark:commonmark:$commonmarkVersion" // https://mvnrepository.com/artifact/org.commonmark/commonmark
+ implementation "org.commonmark:commonmark-ext-gfm-tables:$commonmarkVersion"
+
+ // General PDF dependencies
+ implementation "org.apache.pdfbox:preflight:$pdfboxVersion"
+ implementation "org.apache.pdfbox:xmpbox:$pdfboxVersion"
+
+ // https://mvnrepository.com/artifact/technology.tabula/tabula
+ implementation ('technology.tabula:tabula:1.0.5') {
+ exclude group: 'org.slf4j', module: 'slf4j-simple'
+ exclude group: 'org.bouncycastle', module: 'bcprov-jdk15on'
+ exclude group: 'com.google.code.gson', module: 'gson'
+ }
+ implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4'
+ implementation 'com.opencsv:opencsv:5.11' // https://mvnrepository.com/artifact/com.opencsv/opencsv
+
+ // Batik
+ implementation 'org.apache.xmlgraphics:batik-all:1.18'
+
+ // TwelveMonkeys
+ runtimeOnly "com.twelvemonkeys.imageio:imageio-batik:$imageioVersion"
+ runtimeOnly "com.twelvemonkeys.imageio:imageio-bmp:$imageioVersion"
+ runtimeOnly "com.twelvemonkeys.imageio:imageio-jpeg:$imageioVersion"
+ runtimeOnly "com.twelvemonkeys.imageio:imageio-tiff:$imageioVersion"
+ runtimeOnly "com.twelvemonkeys.imageio:imageio-webp:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-hdr:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-icns:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-iff:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-pcx:$imageioVersion@
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-pict:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-pnm:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-psd:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-sgi:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-tga:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-thumbsdb:$imageioVersion"
+ // runtimeOnly "com.twelvemonkeys.imageio:imageio-xwd:$imageioVersion"
+
+ developmentOnly 'org.springframework.boot:spring-boot-devtools'
+}
+
+sourceSets {
+ main {
+ resources {
+ srcDirs += ['../configs']
+ }
+ }
+}
+
+jar {
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+ zip64 = true
+
+ from {
+ configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+ }
+
+ manifest {
+ attributes(
+ 'Main-Class': 'stirling.software.SPDF.SPDFApplication',
+ 'Implementation-Title': 'Stirling-PDF',
+ 'Implementation-Version': project.version
+ )
+ }
+}
+
+jar.dependsOn ':common:jar'
+jar.dependsOn ':proprietary:jar'
diff --git a/src/main/java/org/apache/pdfbox/examples/signature/CMSProcessableInputStream.java b/stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/CMSProcessableInputStream.java
similarity index 100%
rename from src/main/java/org/apache/pdfbox/examples/signature/CMSProcessableInputStream.java
rename to stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/CMSProcessableInputStream.java
diff --git a/src/main/java/org/apache/pdfbox/examples/signature/CreateSignatureBase.java b/stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/CreateSignatureBase.java
similarity index 100%
rename from src/main/java/org/apache/pdfbox/examples/signature/CreateSignatureBase.java
rename to stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/CreateSignatureBase.java
diff --git a/src/main/java/org/apache/pdfbox/examples/signature/TSAClient.java b/stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/TSAClient.java
similarity index 100%
rename from src/main/java/org/apache/pdfbox/examples/signature/TSAClient.java
rename to stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/TSAClient.java
diff --git a/src/main/java/org/apache/pdfbox/examples/signature/ValidationTimeStamp.java b/stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/ValidationTimeStamp.java
similarity index 100%
rename from src/main/java/org/apache/pdfbox/examples/signature/ValidationTimeStamp.java
rename to stirling-pdf/src/main/java/org/apache/pdfbox/examples/signature/ValidationTimeStamp.java
diff --git a/src/main/java/org/apache/pdfbox/examples/util/ConnectedInputStream.java b/stirling-pdf/src/main/java/org/apache/pdfbox/examples/util/ConnectedInputStream.java
similarity index 100%
rename from src/main/java/org/apache/pdfbox/examples/util/ConnectedInputStream.java
rename to stirling-pdf/src/main/java/org/apache/pdfbox/examples/util/ConnectedInputStream.java
diff --git a/src/main/java/stirling/software/SPDF/Factories/ReplaceAndInvertColorFactory.java b/stirling-pdf/src/main/java/stirling/software/SPDF/Factories/ReplaceAndInvertColorFactory.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/Factories/ReplaceAndInvertColorFactory.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/Factories/ReplaceAndInvertColorFactory.java
diff --git a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java b/stirling-pdf/src/main/java/stirling/software/SPDF/LibreOfficeListener.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/LibreOfficeListener.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/LibreOfficeListener.java
diff --git a/src/main/java/stirling/software/SPDF/SPDFApplication.java b/stirling-pdf/src/main/java/stirling/software/SPDF/SPDFApplication.java
similarity index 91%
rename from src/main/java/stirling/software/SPDF/SPDFApplication.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/SPDFApplication.java
index 91a5354e4..7784f7f00 100644
--- a/src/main/java/stirling/software/SPDF/SPDFApplication.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/SPDFApplication.java
@@ -11,7 +11,6 @@ import java.util.Map;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -27,6 +26,7 @@ import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.UI.WebBrowser;
+import stirling.software.common.configuration.AppConfig;
import stirling.software.common.configuration.ConfigInitializer;
import stirling.software.common.configuration.InstallationPathConfig;
import stirling.software.common.model.ApplicationProperties;
@@ -36,9 +36,9 @@ import stirling.software.common.util.UrlUtils;
@EnableScheduling
@SpringBootApplication(
scanBasePackages = {
- "stirling.software.common",
"stirling.software.SPDF",
- "stirling.software.proprietary.security"
+ "stirling.software.common",
+ "stirling.software.proprietary"
},
exclude = {
DataSourceAutoConfiguration.class,
@@ -50,20 +50,17 @@ public class SPDFApplication {
private static String baseUrlStatic;
private static String contextPathStatic;
+ private final AppConfig appConfig;
private final Environment env;
private final ApplicationProperties applicationProperties;
private final WebBrowser webBrowser;
- @Value("${baseUrl:http://localhost}")
- private String baseUrl;
-
- @Value("${server.servlet.context-path:/}")
- private String contextPath;
-
public SPDFApplication(
+ AppConfig appConfig,
Environment env,
ApplicationProperties applicationProperties,
@Autowired(required = false) WebBrowser webBrowser) {
+ this.appConfig = appConfig;
this.env = env;
this.applicationProperties = applicationProperties;
this.webBrowser = webBrowser;
@@ -152,9 +149,14 @@ public class SPDFApplication {
@PostConstruct
public void init() {
- baseUrlStatic = this.baseUrl;
- contextPathStatic = this.contextPath;
+ String baseUrl = appConfig.getBaseUrl();
+ String contextPath = appConfig.getContextPath();
+ String serverPort = appConfig.getServerPort();
+ baseUrlStatic = baseUrl;
+ contextPathStatic = contextPath;
+ serverPortStatic = serverPort;
String url = baseUrl + ":" + getStaticPort() + contextPath;
+
if (webBrowser != null
&& Boolean.parseBoolean(System.getProperty("STIRLING_PDF_DESKTOP_UI", "false"))) {
webBrowser.initWebUI(url);
@@ -165,6 +167,7 @@ public class SPDFApplication {
try {
String os = System.getProperty("os.name").toLowerCase();
Runtime rt = Runtime.getRuntime();
+
if (os.contains("win")) {
// For Windows
SystemCommand.runCommand(rt, "rundll32 url.dll,FileProtocolHandler " + url);
@@ -181,17 +184,6 @@ public class SPDFApplication {
log.info("Running configs {}", applicationProperties.toString());
}
- @Value("${server.port:8080}")
- public void setServerPort(String port) {
- if ("auto".equalsIgnoreCase(port)) {
- // Use Spring Boot's automatic port assignment (server.port=0)
- SPDFApplication.serverPortStatic =
- "0"; // This will let Spring Boot assign an available port
- } else {
- SPDFApplication.serverPortStatic = port;
- }
- }
-
public static void setServerPortStatic(String port) {
if ("auto".equalsIgnoreCase(port)) {
// Use Spring Boot's automatic port assignment (server.port=0)
diff --git a/src/main/java/stirling/software/SPDF/UI/WebBrowser.java b/stirling-pdf/src/main/java/stirling/software/SPDF/UI/WebBrowser.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/UI/WebBrowser.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/UI/WebBrowser.java
diff --git a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java b/stirling-pdf/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java
diff --git a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java b/stirling-pdf/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java
diff --git a/src/main/java/stirling/software/SPDF/config/AppUpdateService.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/AppUpdateService.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/AppUpdateService.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/AppUpdateService.java
diff --git a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java
similarity index 75%
rename from src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java
index cc9daff83..677bc59b4 100644
--- a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java
@@ -14,21 +14,21 @@ import jakarta.servlet.http.HttpServletResponse;
public class CleanUrlInterceptor implements HandlerInterceptor {
private static final List ALLOWED_PARAMS =
- Arrays.asList(
- "lang",
- "endpoint",
- "endpoints",
- "logout",
- "error",
- "errorOAuth",
- "file",
- "messageType",
- "infoMessage");
+ Arrays.asList(
+ "lang",
+ "endpoint",
+ "endpoints",
+ "logout",
+ "error",
+ "errorOAuth",
+ "file",
+ "messageType",
+ "infoMessage");
@Override
public boolean preHandle(
- HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
+ HttpServletRequest request, HttpServletResponse response, Object handler)
+ throws Exception {
String queryString = request.getQueryString();
if (queryString != null && !queryString.isEmpty()) {
String requestURI = request.getRequestURI();
@@ -69,15 +69,15 @@ public class CleanUrlInterceptor implements HandlerInterceptor {
@Override
public void postHandle(
- HttpServletRequest request,
- HttpServletResponse response,
- Object handler,
- ModelAndView modelAndView) {}
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Object handler,
+ ModelAndView modelAndView) {}
@Override
public void afterCompletion(
- HttpServletRequest request,
- HttpServletResponse response,
- Object handler,
- Exception ex) {}
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Object handler,
+ Exception ex) {}
}
diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java
diff --git a/src/main/java/stirling/software/SPDF/config/EndpointInspector.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/EndpointInspector.java
similarity index 96%
rename from src/main/java/stirling/software/SPDF/config/EndpointInspector.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/EndpointInspector.java
index d9ceb0f9d..a690d799d 100644
--- a/src/main/java/stirling/software/SPDF/config/EndpointInspector.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/config/EndpointInspector.java
@@ -39,14 +39,14 @@ public class EndpointInspector implements ApplicationListener mappings =
- applicationContext.getBeansOfType(RequestMappingHandlerMapping.class);
+ applicationContext.getBeansOfType(RequestMappingHandlerMapping.class);
for (Map.Entry entry : mappings.entrySet()) {
RequestMappingHandlerMapping mapping = entry.getValue();
Map handlerMethods = mapping.getHandlerMethods();
for (Map.Entry handlerEntry :
- handlerMethods.entrySet()) {
+ handlerMethods.entrySet()) {
RequestMappingInfo mappingInfo = handlerEntry.getKey();
HandlerMethod handlerMethod = handlerEntry.getValue();
@@ -105,7 +105,7 @@ public class EndpointInspector implements ApplicationListener> commandToGroupMapping;
public ExternalAppDepConfig(
- EndpointConfiguration endpointConfiguration, RuntimePathConfig runtimePathConfig) {
+ EndpointConfiguration endpointConfiguration, RuntimePathConfig runtimePathConfig) {
this.endpointConfiguration = endpointConfiguration;
weasyprintPath = runtimePathConfig.getWeasyPrintPath();
unoconvPath = runtimePathConfig.getUnoConvertPath();
commandToGroupMapping =
- new HashMap<>() {
+ 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"));
- }
- };
+ {
+ 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) {
@@ -63,8 +63,8 @@ public class ExternalAppDepConfig {
private List getAffectedFeatures(String group) {
return endpointConfiguration.getEndpointsForGroup(group).stream()
- .map(endpoint -> formatEndpointAsFeature(endpoint))
- .toList();
+ .map(endpoint -> formatEndpointAsFeature(endpoint))
+ .toList();
}
private String formatEndpointAsFeature(String endpoint) {
@@ -72,8 +72,8 @@ public class ExternalAppDepConfig {
String feature = endpoint.replace("-", " ").replace("pdf", "PDF").replace("img", "image");
// Split into words and capitalize each word
return Arrays.stream(feature.split("\\s+"))
- .map(word -> capitalizeWord(word))
- .collect(Collectors.joining(" "));
+ .map(word -> capitalizeWord(word))
+ .collect(Collectors.joining(" "));
}
private String capitalizeWord(String word) {
@@ -95,12 +95,12 @@ public class ExternalAppDepConfig {
List affectedFeatures = getAffectedFeatures(group);
endpointConfiguration.disableGroup(group);
log.warn(
- "Missing dependency: {} - Disabling group: {} (Affected features: {})",
- command,
- group,
- affectedFeatures != null && !affectedFeatures.isEmpty()
- ? String.join(", ", affectedFeatures)
- : "unknown");
+ "Missing dependency: {} - Disabling group: {} (Affected features: {})",
+ command,
+ group,
+ affectedFeatures != null && !affectedFeatures.isEmpty()
+ ? String.join(", ", affectedFeatures)
+ : "unknown");
}
}
}
@@ -123,9 +123,9 @@ public class ExternalAppDepConfig {
endpointConfiguration.disableGroup("Python");
endpointConfiguration.disableGroup("OpenCV");
log.warn(
- "Missing dependency: Python - Disabling Python features: {} and OpenCV features: {}",
- String.join(", ", pythonFeatures),
- String.join(", ", openCVFeatures));
+ "Missing dependency: Python - Disabling Python features: {} and OpenCV features: {}",
+ String.join(", ", pythonFeatures),
+ String.join(", ", openCVFeatures));
} else {
// If Python is available, check for OpenCV
try {
@@ -141,16 +141,16 @@ public class ExternalAppDepConfig {
List openCVFeatures = getAffectedFeatures("OpenCV");
endpointConfiguration.disableGroup("OpenCV");
log.warn(
- "OpenCV not available in Python - Disabling OpenCV features: {}",
- String.join(", ", openCVFeatures));
+ "OpenCV not available in Python - Disabling OpenCV features: {}",
+ String.join(", ", openCVFeatures));
}
} catch (Exception e) {
List openCVFeatures = getAffectedFeatures("OpenCV");
endpointConfiguration.disableGroup("OpenCV");
log.warn(
- "Error checking OpenCV: {} - Disabling OpenCV features: {}",
- e.getMessage(),
- String.join(", ", openCVFeatures));
+ "Error checking OpenCV: {} - Disabling OpenCV features: {}",
+ e.getMessage(),
+ String.join(", ", openCVFeatures));
}
}
endpointConfiguration.logDisabledEndpointsSummary();
diff --git a/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/InitialSetup.java
similarity index 98%
rename from src/main/java/stirling/software/SPDF/config/InitialSetup.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/InitialSetup.java
index d61e2ca6c..d242bfeab 100644
--- a/src/main/java/stirling/software/SPDF/config/InitialSetup.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/config/InitialSetup.java
@@ -59,7 +59,7 @@ public class InitialSetup {
public void initEnableCSRFSecurity() throws IOException {
if (GeneralUtils.isVersionHigher(
- "0.36.0", applicationProperties.getAutomaticallyGenerated().getAppVersion())) {
+ "0.46.0", applicationProperties.getAutomaticallyGenerated().getAppVersion())) {
Boolean csrf = applicationProperties.getSecurity().getCsrfDisabled();
if (!csrf) {
GeneralUtils.saveKeyToSettings("security.csrfDisabled", false);
diff --git a/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java
diff --git a/src/main/java/stirling/software/SPDF/config/LogbackPropertyLoader.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/LogbackPropertyLoader.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/LogbackPropertyLoader.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/LogbackPropertyLoader.java
diff --git a/src/main/java/stirling/software/SPDF/config/MetricsConfig.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/MetricsConfig.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/MetricsConfig.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/MetricsConfig.java
diff --git a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/MetricsFilter.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/MetricsFilter.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/MetricsFilter.java
diff --git a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/OpenApiConfig.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java
diff --git a/src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java
diff --git a/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java
similarity index 76%
rename from src/main/java/stirling/software/SPDF/config/WebMvcConfig.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java
index c3e204b3c..5cd007543 100644
--- a/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java
@@ -25,7 +25,11 @@ public class WebMvcConfig implements WebMvcConfigurer {
// Handler for external static resources
registry.addResourceHandler("/**")
.addResourceLocations(
- "file:" + InstallationPathConfig.getStaticPath(), "classpath:/static/");
+ "file:" + InstallationPathConfig.getStaticPath(),
+ "classpath:/static/"
+ );
+ registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
+ registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
// .setCachePeriod(0); // Optional: disable caching
}
}
diff --git a/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java
similarity index 97%
rename from src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java
index 3815b95bd..f574c6bbc 100644
--- a/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java
@@ -12,7 +12,7 @@
// import jakarta.servlet.http.HttpServletResponse;
// import jakarta.servlet.http.HttpSession;
// import lombok.extern.slf4j.Slf4j;
-// import stirling.software.SPDF.utils.RequestUriUtils;
+// import stirling.software.common.util.RequestUriUtils;
//
//// @Component
// @Slf4j
diff --git a/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionManager.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionManager.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionManager.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionManager.java
diff --git a/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintGenerator.java b/stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintGenerator.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintGenerator.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/config/fingerprint/FingerprintGenerator.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/CropController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/CropController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/CropController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/MergeController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/RotationController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/RotationController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/RotationController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java
similarity index 90%
rename from src/main/java/stirling/software/SPDF/controller/api/SettingsController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java
index 0e9cd96dc..eb902cdc3 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java
@@ -36,9 +36,9 @@ public class SettingsController {
public ResponseEntity updateApiKey(@RequestBody Boolean enabled) throws IOException {
if (applicationProperties.getSystem().getEnableAnalytics() != null) {
return ResponseEntity.status(HttpStatus.ALREADY_REPORTED)
- .body(
- "Setting has already been set, To adjust please edit "
- + InstallationPathConfig.getSettingsPath());
+ .body(
+ "Setting has already been set, To adjust please edit "
+ + InstallationPathConfig.getSettingsPath());
}
GeneralUtils.saveKeyToSettings("system.enableAnalytics", enabled);
applicationProperties.getSystem().setEnableAnalytics(enabled);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
index 1b65891ac..38fd72c2f 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
@@ -27,9 +27,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import stirling.software.SPDF.model.api.PDFWithPageNums;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.WebResponseUtils;
+import stirling.software.SPDF.model.api.PDFWithPageNums;
@RestController
@RequestMapping("/api/v1/general")
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
index 94cf6aa6d..95f18031a 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
@@ -31,11 +31,11 @@ import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest;
import stirling.software.common.model.PdfMetadata;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.service.PdfMetadataService;
import stirling.software.common.util.WebResponseUtils;
+import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest;
@RestController
@RequestMapping("/api/v1/general")
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
index c2bbd31b5..b5653eabb 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
@@ -31,9 +31,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
-import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.WebResponseUtils;
+import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
@RestController
@RequestMapping("/api/v1/general")
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
similarity index 98%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
index 9c8cb5105..780e5b8a5 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
@@ -23,7 +23,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
-import stirling.software.SPDF.model.api.GeneralFile;
+import stirling.software.common.model.api.GeneralFile;
import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
similarity index 99%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
index 8509f5056..d314f7e84 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
@@ -1,5 +1,8 @@
package stirling.software.SPDF.controller.api.misc;
+import io.github.pixee.security.Filenames;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
@@ -17,14 +20,17 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
-
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
@@ -38,17 +44,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-
-import io.github.pixee.security.Filenames;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-
import stirling.software.SPDF.config.EndpointConfiguration;
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java
similarity index 99%
rename from src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java
index 9c127b6ad..f8cf1c6a0 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java
@@ -35,8 +35,9 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.model.PipelineResult;
-import stirling.software.common.configuration.RuntimePathConfig;
+import stirling.software.SPDF.service.ApiDocService;
import stirling.software.common.service.PostHogService;
+import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.util.FileMonitor;
@Service
diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
similarity index 99%
rename from src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
index 4e052b55e..222ecd1c6 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
@@ -35,6 +35,7 @@ import stirling.software.SPDF.SPDFApplication;
import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.model.PipelineResult;
+import stirling.software.SPDF.service.ApiDocService;
import stirling.software.common.model.enumeration.Role;
import stirling.software.common.service.UserServiceInterface;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
similarity index 98%
rename from src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
index 1e4feb840..ef5202c70 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
@@ -33,8 +33,8 @@ 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;
-import stirling.software.SPDF.model.api.security.RedactionArea;
import stirling.software.SPDF.pdf.TextFinder;
+import stirling.software.common.model.api.security.RedactionArea;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.PdfUtils;
@@ -184,8 +184,7 @@ public class RedactController {
String pageNumbersInput = request.getPageNumbers();
String[] parsedPageNumbers =
pageNumbersInput != null ? pageNumbersInput.split(",") : new String[0];
- List pageNumbers =
- GeneralUtils.parsePageList(parsedPageNumbers, pagesCount, false);
+ List pageNumbers = GeneralUtils.parsePageList(parsedPageNumbers, pagesCount, false);
Collections.sort(pageNumbers);
return pageNumbers;
}
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java
similarity index 100%
rename from src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java
diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
similarity index 96%
rename from src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
rename to stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
index e878ef837..b283e3a6f 100644
--- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
+++ b/stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
@@ -22,11 +22,11 @@ import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import stirling.software.SPDF.model.Dependency;
import stirling.software.common.model.ApplicationProperties;
+import stirling.software.SPDF.model.Dependency;
-@Controller
@Slf4j
+@Controller
@RequiredArgsConstructor
public class HomeWebController {
@@ -49,7 +49,8 @@ public class HomeWebController {
String json = new String(is.readAllBytes(), StandardCharsets.UTF_8);
ObjectMapper mapper = new ObjectMapper();
Map> data =
- mapper.readValue(json, new TypeReference