gradle path to /app

This commit is contained in:
Anthony Stirling 2025-07-15 15:40:56 +01:00
parent 3d1b5890c7
commit 57cf5d4812
30 changed files with 266 additions and 71 deletions

View File

@ -12,13 +12,13 @@ set -e
# Instructions for future developers: # Instructions for future developers:
# #
# - To start the application, use: # - To start the application, use:
# ./gradlew bootRun --no-daemon -Dspring-boot.run.fork=true -Dserver.address=0.0.0.0 # cd app && ./gradlew bootRun --no-daemon -Dspring-boot.run.fork=true -Dserver.address=0.0.0.0
# #
# - To run tests, use: # - To run tests, use:
# ./gradlew test # cd app && ./gradlew test
# #
# - To build the project, use: # - To build the project, use:
# ./gradlew build # cd app && ./gradlew build
# #
# - For running pre-commit hooks (if configured), use: # - For running pre-commit hooks (if configured), use:
# pre-commit run --all-files # pre-commit run --all-files
@ -28,7 +28,7 @@ set -e
echo "Devcontainer started successfully!" echo "Devcontainer started successfully!"
VERSION=$(grep "^version =" build.gradle | awk -F'"' '{print $2}') VERSION=$(grep "^version =" app/build.gradle | awk -F'"' '{print $2}')
GRADLE_VERSION=$(gradle -version | grep "^Gradle " | awk '{print $2}') GRADLE_VERSION=$(gradle -version | grep "^Gradle " | awk '{print $2}')
GRADLE_PATH=$(which gradle) GRADLE_PATH=$(which gradle)
JAVA_VERSION=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}') JAVA_VERSION=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}')

View File

@ -147,11 +147,11 @@ labels:
- label: 'Gradle' - label: 'Gradle'
files: files:
- 'gradle/.*' - 'app/gradle/.*'
- 'gradlew' - 'app/gradlew'
- 'gradlew.bat' - 'app/gradlew.bat'
- 'settings.gradle' - 'app/settings.gradle'
- 'build.gradle' - 'app/build.gradle'
- 'app/common/build.gradle' - 'app/common/build.gradle'
- 'app/proprietary/build.gradle' - 'app/proprietary/build.gradle'
- 'app/core/build.gradle' - 'app/core/build.gradle'

View File

@ -188,7 +188,7 @@ jobs:
else else
export DISABLE_ADDITIONAL_FEATURES=false export DISABLE_ADDITIONAL_FEATURES=false
fi fi
./gradlew clean build cd app && ./gradlew clean build
env: env:
STIRLING_PDF_DESKTOP_UI: false STIRLING_PDF_DESKTOP_UI: false

View File

@ -39,7 +39,7 @@ jobs:
distribution: "temurin" distribution: "temurin"
- name: Build with Gradle and spring security ${{ matrix.spring-security }} - name: Build with Gradle and spring security ${{ matrix.spring-security }}
run: ./gradlew clean build run: cd app && ./gradlew clean build
env: env:
DISABLE_ADDITIONAL_FEATURES: ${{ matrix.spring-security }} DISABLE_ADDITIONAL_FEATURES: ${{ matrix.spring-security }}
@ -106,7 +106,7 @@ jobs:
- uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
- name: Generate OpenAPI documentation - name: Generate OpenAPI documentation
run: ./gradlew :stirling-pdf:generateOpenApiDocs run: cd app && ./gradlew :stirling-pdf:generateOpenApiDocs
- name: Upload OpenAPI Documentation - name: Upload OpenAPI Documentation
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
@ -132,7 +132,7 @@ jobs:
distribution: "adopt" distribution: "adopt"
- name: check the licenses for compatibility - name: check the licenses for compatibility
run: ./gradlew clean checkLicense run: cd app && ./gradlew clean checkLicense
- name: FAILED - check the licenses for compatibility - name: FAILED - check the licenses for compatibility
if: failure() if: failure()

View File

@ -45,7 +45,7 @@ jobs:
uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
- name: Check licenses for compatibility - name: Check licenses for compatibility
run: ./gradlew clean checkLicense run: cd app && ./gradlew clean checkLicense
- name: Upload artifact on failure - name: Upload artifact on failure
if: failure() if: failure()

View File

@ -37,14 +37,14 @@ jobs:
- name: Get version number - name: Get version number
id: versionNumber id: versionNumber
run: | run: |
VERSION=$(./gradlew printVersion --quiet | tail -1) VERSION=$(cd app && ./gradlew printVersion --quiet | tail -1)
echo "versionNumber=$VERSION" >> $GITHUB_OUTPUT echo "versionNumber=$VERSION" >> $GITHUB_OUTPUT
# ✅ Get Mac-specific version from Gradle # ✅ Get Mac-specific version from Gradle
- name: Get version number mac - name: Get version number mac
id: versionNumberMac id: versionNumberMac
run: | run: |
VERSION_MAC=$(./gradlew printMacVersion --quiet | tail -1) VERSION_MAC=$(cd app && ./gradlew printMacVersion --quiet | tail -1)
echo "versionNumberMac=$VERSION_MAC" >> $GITHUB_OUTPUT echo "versionNumberMac=$VERSION_MAC" >> $GITHUB_OUTPUT
build-portable: build-portable:
@ -77,7 +77,7 @@ jobs:
gradle-version: 8.14 gradle-version: 8.14
- name: Generate jar (Disable Security=${{ matrix.disable_security }}) - name: Generate jar (Disable Security=${{ matrix.disable_security }})
run: ./gradlew clean createExe run: cd app && ./gradlew clean createExe
env: env:
DISABLE_ADDITIONAL_FEATURES: ${{ matrix.disable_security }} DISABLE_ADDITIONAL_FEATURES: ${{ matrix.disable_security }}
STIRLING_PDF_DESKTOP_UI: false STIRLING_PDF_DESKTOP_UI: false
@ -173,7 +173,7 @@ jobs:
# Build installer # Build installer
- name: Build Installer - name: Build Installer
run: ./gradlew build jpackage -x test --info run: cd app && ./gradlew build jpackage -x test --info
env: env:
DISABLE_ADDITIONAL_FEATURES: true DISABLE_ADDITIONAL_FEATURES: true
STIRLING_PDF_DESKTOP_UI: true STIRLING_PDF_DESKTOP_UI: true
@ -194,7 +194,7 @@ jobs:
- name: Build project and run jpackage (x86_64) - name: Build project and run jpackage (x86_64)
if: matrix.os == 'macos-latest' if: matrix.os == 'macos-latest'
run: arch -x86_64 ./gradlew jpackageMacX64 run: cd app && arch -x86_64 ./gradlew jpackageMacX64
# Rename and collect artifacts based on OS # Rename and collect artifacts based on OS
- name: Prepare artifacts - name: Prepare artifacts

View File

@ -35,7 +35,7 @@ jobs:
gradle-version: 8.14 gradle-version: 8.14
- name: Run Gradle Command - name: Run Gradle Command
run: ./gradlew clean build run: cd app && ./gradlew clean build
env: env:
DISABLE_ADDITIONAL_FEATURES: true DISABLE_ADDITIONAL_FEATURES: true
STIRLING_PDF_DESKTOP_UI: false STIRLING_PDF_DESKTOP_UI: false
@ -52,7 +52,7 @@ jobs:
- name: Get version number - name: Get version number
id: versionNumber id: versionNumber
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT run: echo "versionNumber=$(cd app && ./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
- name: Login to Docker Hub - name: Login to Docker Hub
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0

View File

@ -40,7 +40,7 @@ jobs:
gradle-version: 8.14 gradle-version: 8.14
- name: Generate jar (Disable Security=${{ matrix.disable_security }}) - name: Generate jar (Disable Security=${{ matrix.disable_security }})
run: ./gradlew clean createExe run: cd app && ./gradlew clean createExe
env: env:
DISABLE_ADDITIONAL_FEATURES: ${{ matrix.disable_security }} DISABLE_ADDITIONAL_FEATURES: ${{ matrix.disable_security }}
STIRLING_PDF_DESKTOP_UI: false STIRLING_PDF_DESKTOP_UI: false

View File

@ -36,7 +36,7 @@ jobs:
DISABLE_ADDITIONAL_FEATURES: false DISABLE_ADDITIONAL_FEATURES: false
STIRLING_PDF_DESKTOP_UI: true STIRLING_PDF_DESKTOP_UI: true
run: | run: |
./gradlew clean build sonar \ cd app && ./gradlew clean build sonar \
-Dsonar.projectKey=Stirling-Tools_Stirling-PDF \ -Dsonar.projectKey=Stirling-Tools_Stirling-PDF \
-Dsonar.organization=stirling-tools \ -Dsonar.organization=stirling-tools \
-Dsonar.host.url=https://sonarcloud.io \ -Dsonar.host.url=https://sonarcloud.io \

View File

@ -29,17 +29,17 @@ jobs:
- uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
- name: Generate Swagger documentation - name: Generate Swagger documentation
run: ./gradlew :stirling-pdf:generateOpenApiDocs run: cd app && ./gradlew :stirling-pdf:generateOpenApiDocs
- name: Upload Swagger Documentation to SwaggerHub - name: Upload Swagger Documentation to SwaggerHub
run: ./gradlew swaggerhubUpload run: cd app && ./gradlew swaggerhubUpload
env: env:
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }} SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
SWAGGERHUB_USER: "Frooodle" SWAGGERHUB_USER: "Frooodle"
- name: Get version number - name: Get version number
id: versionNumber id: versionNumber
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT run: echo "versionNumber=$(cd app && ./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
- name: Set API version as published and default on SwaggerHub - name: Set API version as published and default on SwaggerHub
run: | run: |

View File

@ -26,7 +26,7 @@ jobs:
distribution: 'temurin' distribution: 'temurin'
- name: Build with Gradle - name: Build with Gradle
run: ./gradlew clean build run: cd app && ./gradlew clean build
env: env:
DISABLE_ADDITIONAL_FEATURES: true DISABLE_ADDITIONAL_FEATURES: true

6
.gitignore vendored
View File

@ -33,6 +33,8 @@ SwaggerDoc.json
# Gradle # Gradle
.gradle .gradle
.lock .lock
/app/.gradle
/app/build
# External tool builders # External tool builders
.externalToolBuilders/ .externalToolBuilders/
@ -195,5 +197,9 @@ id_ed25519.pub
**/jcef-bundle/ **/jcef-bundle/
# Database backups
**/db/backup/
*.db.bak
# node_modules # node_modules
node_modules/ node_modules/

View File

@ -1,15 +1,6 @@
# Build the application # Build the application
FROM gradle:8.14-jdk21 AS build FROM gradle:8.14-jdk21 AS build
COPY build.gradle .
COPY settings.gradle .
COPY gradlew .
COPY gradle gradle/
COPY app/core/build.gradle core/.
COPY app/common/build.gradle common/.
COPY app/proprietary/build.gradle proprietary/.
RUN ./gradlew build -x spotlessApply -x spotlessCheck -x test -x sonarqube || return 0
# Set the working directory # Set the working directory
WORKDIR /app WORKDIR /app
@ -17,7 +8,7 @@ WORKDIR /app
COPY . . COPY . .
# Build the application with DISABLE_ADDITIONAL_FEATURES=false # Build the application with DISABLE_ADDITIONAL_FEATURES=false
RUN DISABLE_ADDITIONAL_FEATURES=false \ RUN cd app && DISABLE_ADDITIONAL_FEATURES=false \
STIRLING_PDF_DESKTOP_UI=false \ STIRLING_PDF_DESKTOP_UI=false \
./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube ./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube

View File

@ -66,7 +66,7 @@ allprojects {
} }
tasks.register('writeVersion') { tasks.register('writeVersion') {
def propsFile = file("$projectDir/app/common/src/main/resources/version.properties") def propsFile = file("$projectDir/common/src/main/resources/version.properties")
def propsDir = propsFile.parentFile def propsDir = propsFile.parentFile
doLast { doLast {
@ -209,7 +209,7 @@ tasks.withType(JavaCompile).configureEach {
licenseReport { licenseReport {
projects = [project] projects = [project]
renderers = [new JsonReportRenderer()] renderers = [new JsonReportRenderer()]
allowedLicensesFile = project.layout.projectDirectory.file("app/allowed-licenses.json").asFile allowedLicensesFile = project.layout.projectDirectory.file("allowed-licenses.json").asFile
outputDir = project.layout.buildDirectory.dir("reports/dependency-license").get().asFile.path outputDir = project.layout.buildDirectory.dir("reports/dependency-license").get().asFile.path
} }
@ -261,14 +261,14 @@ static def getMacVersion(String version) {
jpackage { jpackage {
dependsOn(":stirling-pdf:bootJar") dependsOn(":stirling-pdf:bootJar")
input = layout.projectDirectory.dir("app/core/build/libs") input = layout.projectDirectory.dir("core/build/libs")
destination = layout.projectDirectory.dir("build/jpackage") destination = layout.projectDirectory.dir("build/jpackage")
mainJar = "Stirling-PDF-${project.version}.jar" mainJar = "Stirling-PDF-${project.version}.jar"
appName = "Stirling PDF" appName = "Stirling PDF"
appVersion = project.version appVersion = project.version
vendor = "Stirling PDF Inc" vendor = "Stirling PDF Inc"
appDescription = "Stirling PDF - Your Local PDF Editor" appDescription = "Stirling PDF - Your Local PDF Editor"
icon = layout.projectDirectory.file("app/core/src/main/resources/static/favicon.ico") icon = layout.projectDirectory.file("core/src/main/resources/static/favicon.ico")
verbose = true verbose = true
// mainClass = "org.springframework.boot.loader.launch.JarLauncher" // mainClass = "org.springframework.boot.loader.launch.JarLauncher"
@ -310,7 +310,7 @@ jpackage {
// MacOS-specific configuration // MacOS-specific configuration
mac { mac {
appVersion = getMacVersion(project.version.toString()) appVersion = getMacVersion(project.version.toString())
icon = layout.projectDirectory.file("app/core/src/main/resources/static/favicon.icns") icon = layout.projectDirectory.file("core/src/main/resources/static/favicon.icns")
type = ImageType.DMG type = ImageType.DMG
macPackageIdentifier = "Stirling PDF" macPackageIdentifier = "Stirling PDF"
macPackageName = "Stirling PDF" macPackageName = "Stirling PDF"
@ -332,7 +332,7 @@ jpackage {
// Linux-specific configuration // Linux-specific configuration
linux { linux {
appVersion = project.version appVersion = project.version
icon = layout.projectDirectory.file("app/core/src/main/resources/static/favicon.png") icon = layout.projectDirectory.file("core/src/main/resources/static/favicon.png")
type = ImageType.DEB // Can also use "rpm" for Red Hat-based systems type = ImageType.DEB // Can also use "rpm" for Red Hat-based systems
// Debian package configuration // Debian package configuration
@ -404,12 +404,12 @@ tasks.register('jpackageMacX64') {
commandLine 'jpackage', commandLine 'jpackage',
'--type', 'dmg', '--type', 'dmg',
'--name', 'Stirling PDF (x86_64)', '--name', 'Stirling PDF (x86_64)',
'--input', 'app/core/build/libs', '--input', 'core/build/libs',
'--main-jar', "Stirling-PDF-${project.version}.jar", '--main-jar', "Stirling-PDF-${project.version}.jar",
'--main-class', 'org.springframework.boot.loader.launch.JarLauncher', '--main-class', 'org.springframework.boot.loader.launch.JarLauncher',
'--runtime-image', file(jrePath + "/zulu-17.jre/Contents/Home"), '--runtime-image', file(jrePath + "/zulu-17.jre/Contents/Home"),
'--dest', 'build/jpackage/x86_64', '--dest', 'build/jpackage/x86_64',
'--icon', 'app/core/src/main/resources/static/favicon.icns', '--icon', 'core/src/main/resources/static/favicon.icns',
'--app-version', getMacVersion(project.version.toString()), '--app-version', getMacVersion(project.version.toString()),
'--mac-package-name', 'Stirling PDF (x86_64)', '--mac-package-name', 'Stirling PDF (x86_64)',
'--mac-package-identifier', 'Stirling PDF (x86_64)', '--mac-package-identifier', 'Stirling PDF (x86_64)',
@ -495,7 +495,7 @@ tasks.register('cleanTempJre') {
} }
launch4j { launch4j {
icon = "${projectDir}/app/core/src/main/resources/static/favicon.ico" icon = "${projectDir}/core/src/main/resources/static/favicon.ico"
outfile="Stirling-PDF.exe" outfile="Stirling-PDF.exe"

View File

@ -43,7 +43,11 @@ public class AutoJobAspect {
// This aspect will run before any audit aspects due to @Order(0) // This aspect will run before any audit aspects due to @Order(0)
// Extract parameters from the request and annotation // Extract parameters from the request and annotation
boolean async = Boolean.parseBoolean(request.getParameter("async")); boolean async = Boolean.parseBoolean(request.getParameter("async"));
log.debug("AutoJobAspect: Processing {} {} with async={}", request.getMethod(), request.getRequestURI(), async); log.debug(
"AutoJobAspect: Processing {} {} with async={}",
request.getMethod(),
request.getRequestURI(),
async);
long timeout = autoJobPostMapping.timeout(); long timeout = autoJobPostMapping.timeout();
int retryCount = autoJobPostMapping.retryCount(); int retryCount = autoJobPostMapping.retryCount();
boolean trackProgress = autoJobPostMapping.trackProgress(); boolean trackProgress = autoJobPostMapping.trackProgress();
@ -219,10 +223,9 @@ public class AutoJobAspect {
resourceWeight); resourceWeight);
} }
/** /**
* Processes arguments in-place to handle file resolution and async file persistence. * Processes arguments in-place to handle file resolution and async file persistence. This
* This approach avoids type mismatch issues by modifying the original objects directly. * approach avoids type mismatch issues by modifying the original objects directly.
* *
* @param originalArgs The original arguments * @param originalArgs The original arguments
* @param async Whether this is an async operation * @param async Whether this is an async operation

View File

@ -30,8 +30,7 @@ public class JobResult {
private String error; private String error;
/** List of result files for jobs that produce files */ /** List of result files for jobs that produce files */
@JsonIgnore @JsonIgnore private List<ResultFile> resultFiles;
private List<ResultFile> resultFiles;
/** Time when the job was created */ /** Time when the job was created */
private LocalDateTime createdAt; private LocalDateTime createdAt;

View File

@ -0,0 +1,18 @@
package stirling.software.SPDF.controller.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ReactRoutingController {
@GetMapping("/{path:^(?!api|static|robots\\.txt|favicon\\.ico)[^\\.]*$}")
public String forwardRootPaths() {
return "forward:/index.html";
}
@GetMapping("/{path:^(?!api|static)[^\\.]*}/{subpath:^(?!.*\\.).*$}")
public String forwardNestedPaths() {
return "forward:/index.html";
}
}

0
gradlew → app/gradlew vendored Executable file → Normal file
View File

View File

View File

@ -6,6 +6,6 @@ rootProject.name = 'Stirling PDF'
include 'stirling-pdf', 'common', 'proprietary' include 'stirling-pdf', 'common', 'proprietary'
project(':stirling-pdf').projectDir = file('app/core') project(':stirling-pdf').projectDir = file('core')
project(':common' ).projectDir = file('app/common') project(':common' ).projectDir = file('common')
project(':proprietary' ).projectDir = file('app/proprietary') project(':proprietary' ).projectDir = file('proprietary')

View File

@ -4,11 +4,11 @@ This file provides high-level instructions for Codex when modifying any files wi
## 1. Code Style and Formatting ## 1. Code Style and Formatting
- Respect the `.editorconfig` settings located in the repository root. Java files use 4 spaces; HTML, JS, and Python generally use 2 spaces. Lines should end with `LF`. - Respect the `.editorconfig` settings located in the repository root. Java files use 4 spaces; HTML, JS, and Python generally use 2 spaces. Lines should end with `LF`.
- Format Java code with `./gradlew spotlessApply` before committing. - Format Java code with `cd app && ./gradlew spotlessApply` before committing.
- Review `DeveloperGuide.md` for project structure and design details before making significant changes. - Review `DeveloperGuide.md` for project structure and design details before making significant changes.
## 2. Testing ## 2. Testing
- Run `./gradlew build` before committing changes to ensure the project compiles. - Run `cd app && ./gradlew build` before committing changes to ensure the project compiles.
- If the build cannot complete due to environment restrictions, DO NOT COMMIT THE CHANGE - If the build cannot complete due to environment restrictions, DO NOT COMMIT THE CHANGE
## 3. Commits ## 3. Commits
@ -16,7 +16,7 @@ This file provides high-level instructions for Codex when modifying any files wi
- Ensure the working tree is clean (`git status`) before concluding your work. - Ensure the working tree is clean (`git status`) before concluding your work.
## 4. Pull Requests ## 4. Pull Requests
- Summarize what was changed and why. Include build results from `./gradlew build` in the PR description. - Summarize what was changed and why. Include build results from `cd app && ./gradlew build` in the PR description.
- Note that the code was generated with the assistance of AI. - Note that the code was generated with the assistance of AI.
## 5. Translations ## 5. Translations

View File

@ -176,7 +176,7 @@ Stirling-PDF uses different Docker images for various configurations. The build
2. Build the project with Gradle: 2. Build the project with Gradle:
```bash ```bash
./gradlew clean build cd app && ./gradlew clean build
``` ```
3. Build the Docker images: 3. Build the Docker images:
@ -243,7 +243,7 @@ To run Stirling-PDF locally:
1. Compile and run the project using built-in IDE methods or by running: 1. Compile and run the project using built-in IDE methods or by running:
```bash ```bash
./gradlew bootRun cd app && ./gradlew bootRun
``` ```
2. Access the application at `http://localhost:8080` in your web browser. 2. Access the application at `http://localhost:8080` in your web browser.

Binary file not shown.

View File

@ -0,0 +1,179 @@
#############################################################################################################
# Welcome to settings file from #
# ____ _____ ___ ____ _ ___ _ _ ____ ____ ____ _____ #
# / ___|_ _|_ _| _ \| | |_ _| \ | |/ ___| | _ \| _ \| ___| #
# \___ \ | | | || |_) | | | || \| | | _ _____| |_) | | | | |_ #
# ___) || | | || _ <| |___ | || |\ | |_| |_____| __/| |_| | _| #
# |____/ |_| |___|_| \_\_____|___|_| \_|\____| |_| |____/|_| #
# #
# Do not comment out any entry, it will be removed on next startup #
# If you want to override with environment parameter follow parameter naming SECURITY_INITIALLOGIN_USERNAME #
#############################################################################################################
security:
enableLogin: false # set to 'true' to enable login
csrfDisabled: false # set to 'true' to disable CSRF protection (not recommended for production)
loginAttemptCount: 5 # lock user account after 5 tries; when using e.g. Fail2Ban you can deactivate the function with -1
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
loginMethod: all # Accepts values like 'all' and 'normal'(only Login with Username/Password), 'oauth2'(only Login with OAuth2) or 'saml2'(only Login with SAML2)
initialLogin:
username: '' # initial username for the first login
password: '' # initial password for the first login
oauth2:
enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
client:
keycloak:
issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint
clientId: '' # client ID for Keycloak OAuth2
clientSecret: '' # client secret for Keycloak OAuth2
scopes: openid, profile, email # scopes for Keycloak OAuth2
useAsUsername: preferred_username # field to use as the username for Keycloak OAuth2. Available options are: [email | name | given_name | family_name | preferred_name]
google:
clientId: '' # client ID for Google OAuth2
clientSecret: '' # client secret for Google OAuth2
scopes: email, profile # scopes for Google OAuth2
useAsUsername: email # field to use as the username for Google OAuth2. Available options are: [email | name | given_name | family_name]
github:
clientId: '' # client ID for GitHub OAuth2
clientSecret: '' # client secret for GitHub OAuth2
scopes: read:user # scope for GitHub OAuth2
useAsUsername: login # field to use as the username for GitHub OAuth2. Available options are: [email | login | name]
issuer: '' # set to any Provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) endpoint
clientId: '' # client ID from your Provider
clientSecret: '' # client secret from your Provider
autoCreateUser: true # set to 'true' to allow auto-creation of non-existing users
blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin
useAsUsername: email # default is 'email'; custom fields can be used as the username
scopes: openid, profile, email # specify the scopes for which the application will request permissions
provider: google # set this to your OAuth Provider's name, e.g., 'google' or 'keycloak'
saml2:
enabled: false # Only enabled for paid enterprise clients (enterpriseEdition.enabled must be true)
provider: '' # The name of your Provider
autoCreateUser: true # set to 'true' to allow auto-creation of non-existing users
blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin
registrationId: stirling # The name of your Service Provider (SP) app name. Should match the name in the path for your SSO & SLO URLs
idpMetadataUri: https://dev-XXXXXXXX.okta.com/app/externalKey/sso/saml/metadata # The uri for your Provider's metadata
idpSingleLoginUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml # The URL for initiating SSO. Provided by your Provider
idpSingleLogoutUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml # The URL for initiating SLO. Provided by your Provider
idpIssuer: '' # The ID of your Provider
idpCert: classpath:okta.cert # The certificate your Provider will use to authenticate your app's SAML authentication requests. Provided by your Provider
privateKey: classpath:saml-private-key.key # Your private key. Generated from your keypair
spCert: classpath:saml-public-cert.crt # Your signing certificate. Generated from your keypair
premium:
key: 00000000-0000-0000-0000-000000000000
enabled: false # Enable license key checks for pro/enterprise features
proFeatures:
database: true # Enable database features
SSOAutoLogin: false
CustomMetadata:
autoUpdateMetadata: false
author: username
creator: Stirling-PDF
producer: Stirling-PDF
googleDrive:
enabled: false
clientId: ''
apiKey: ''
appId: ''
enterpriseFeatures:
audit:
enabled: true # Enable audit logging
level: 2 # Audit logging level: 0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE
retentionDays: 90 # Number of days to retain audit logs
mail:
enabled: false # set to 'true' to enable sending emails
host: smtp.example.com # SMTP server hostname
port: 587 # SMTP server port
username: '' # SMTP server username
password: '' # SMTP server password
from: '' # sender email address
legal:
termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder
accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder
impressum: '' # URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder
system:
defaultLocale: en-US # set the default language (e.g. 'de-DE', 'fr-FR', etc)
googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow
enableAlphaFunctionality: false # set to enable functionality which might need more testing before it fully goes live (this feature might make no changes)
showUpdate: false # see when a new update is available
showUpdateOnlyAdmin: false # only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files
tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored.
enableAnalytics: true # set to 'true' to enable analytics, set to 'false' to disable analytics; for enterprise users, this is set to true
enableUrlToPDF: false # Set to 'true' to enable URL to PDF, INTERNAL ONLY, known security issues, should not be used externally
disableSanitize: false # set to true to disable Sanitize HTML; (can lead to injections in HTML)
datasource:
enableCustomDatabase: false # Enterprise users ONLY, set this property to 'true' if you would like to use your own custom database configuration
customDatabaseUrl: '' # eg jdbc:postgresql://localhost:5432/postgres, set the url for your own custom database connection. If provided, the type, hostName, port and name are not necessary and will not be used
username: postgres # set the database username
password: postgres # set the database password
type: postgresql # the type of the database to set (e.g. 'h2', 'postgresql')
hostName: localhost # the host name to use for the database url. Set to 'localhost' when running the app locally. Set to match the name of the container name of your database container when running the app on a server (Docker configuration)
port: 5432 # set the port number of the database. Ensure this matches the port the database is listening to
name: postgres # set the name of your database. Should match the name of the database you create
customPaths:
pipeline:
watchedFoldersDir: '' #Defaults to /pipeline/watchedFolders
finishedFoldersDir: '' #Defaults to /pipeline/finishedFolders
operations:
weasyprint: '' #Defaults to /opt/venv/bin/weasyprint
unoconvert: '' #Defaults to /opt/venv/bin/unoconvert
fileUploadLimit: '' # Defaults to "". No limit when string is empty. Set a number, between 0 and 999, followed by one of the following strings to set a limit. "KB", "MB", "GB".
tempFileManagement:
baseTmpDir: '' # Defaults to java.io.tmpdir/stirling-pdf
libreofficeDir: '' # Defaults to tempFileManagement.baseTmpDir/libreoffice
systemTempDir: '' # Only used if cleanupSystemTemp is true
prefix: stirling-pdf- # Prefix for temp file names
maxAgeHours: 24 # Maximum age in hours before temp files are cleaned up
cleanupIntervalMinutes: 30 # How often to run cleanup (in minutes)
startupCleanup: true # Clean up old temp files on startup
cleanupSystemTemp: false # Whether to clean broader system temp directory
ui:
appName: '' # application's visible name
homeDescription: '' # short description or tagline shown on the homepage
appNameNavbar: '' # name displayed on the navigation bar
languages: [] # If empty, all languages are enabled. To display only German and Polish ["de_DE", "pl_PL"]. British English is always enabled.
endpoints:
toRemove: [] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice'])
metrics:
enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable
# Automatically Generated Settings (Do Not Edit Directly)
AutomaticallyGenerated:
key: c802c393-3a4a-40bf-a409-71f6656aaa2c
UUID: 0fd342e6-17c4-4870-861e-18e9769f57eb
appVersion: 1.0.0
processExecutor:
sessionLimit: # Process executor instances limits
libreOfficeSessionLimit: 1
pdfToHtmlSessionLimit: 1
qpdfSessionLimit: 4
tesseractSessionLimit: 1
pythonOpenCvSessionLimit: 8
weasyPrintSessionLimit: 16
installAppSessionLimit: 1
calibreSessionLimit: 1
ghostscriptSessionLimit: 8
ocrMyPdfSessionLimit: 2
timeoutMinutes: # Process executor timeout in minutes
libreOfficetimeoutMinutes: 30
pdfToHtmltimeoutMinutes: 20
pythonOpenCvtimeoutMinutes: 30
weasyPrinttimeoutMinutes: 30
installApptimeoutMinutes: 60
calibretimeoutMinutes: 30
tesseractTimeoutMinutes: 30
qpdfTimeoutMinutes: 30
ghostscriptTimeoutMinutes: 30
ocrMyPdfTimeoutMinutes: 30

View File

@ -6,7 +6,6 @@
# ___) || | | || _ <| |___ | || |\ | |_| |_____| __/| |_| | _| # # ___) || | | || _ <| |___ | || |\ | |_| |_____| __/| |_| | _| #
# |____/ |_| |___|_| \_\_____|___|_| \_|\____| |_| |____/|_| # # |____/ |_| |___|_| \_\_____|___|_| \_|\____| |_| |____/|_| #
# # # #
# Custom setting.yml file with all endpoints disabled to only be used for testing purposes #
# Do not comment out any entry, it will be removed on next startup # # Do not comment out any entry, it will be removed on next startup #
# If you want to override with environment parameter follow parameter naming SECURITY_INITIALLOGIN_USERNAME # # If you want to override with environment parameter follow parameter naming SECURITY_INITIALLOGIN_USERNAME #
############################################################################################################# #############################################################################################################
@ -142,7 +141,7 @@ ui:
appNameNavbar: '' # name displayed on the navigation bar appNameNavbar: '' # name displayed on the navigation bar
languages: [] # If empty, all languages are enabled. To display only German and Polish ["de_DE", "pl_PL"]. British English is always enabled. languages: [] # If empty, all languages are enabled. To display only German and Polish ["de_DE", "pl_PL"]. British English is always enabled.
endpoints: # All the possible endpoints are disabled endpoints:
toRemove: [crop, merge-pdfs, multi-page-layout, overlay-pdfs, pdf-to-single-page, rearrange-pages, remove-image-pdf, remove-pages, rotate-pdf, scale-pages, split-by-size-or-count, split-pages, split-pdf-by-chapters, split-pdf-by-sections, add-password, add-watermark, auto-redact, cert-sign, get-info-on-pdf, redact, remove-cert-sign, remove-password, sanitize-pdf, validate-signature, file-to-pdf, html-to-pdf, img-to-pdf, markdown-to-pdf, pdf-to-csv, pdf-to-html, pdf-to-img, pdf-to-markdown, pdf-to-pdfa, pdf-to-presentation, pdf-to-text, pdf-to-word, pdf-to-xml, url-to-pdf, add-image, add-page-numbers, add-stamp, auto-rename, auto-split-pdf, compress-pdf, decompress-pdf, extract-image-scans, extract-images, flatten, ocr-pdf, remove-blanks, repair, replace-invert-pdf, show-javascript, update-metadata, filter-contains-image, filter-contains-text, filter-file-size, filter-page-count, filter-page-rotation, filter-page-size, add-attachments] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) toRemove: [crop, merge-pdfs, multi-page-layout, overlay-pdfs, pdf-to-single-page, rearrange-pages, remove-image-pdf, remove-pages, rotate-pdf, scale-pages, split-by-size-or-count, split-pages, split-pdf-by-chapters, split-pdf-by-sections, add-password, add-watermark, auto-redact, cert-sign, get-info-on-pdf, redact, remove-cert-sign, remove-password, sanitize-pdf, validate-signature, file-to-pdf, html-to-pdf, img-to-pdf, markdown-to-pdf, pdf-to-csv, pdf-to-html, pdf-to-img, pdf-to-markdown, pdf-to-pdfa, pdf-to-presentation, pdf-to-text, pdf-to-word, pdf-to-xml, url-to-pdf, add-image, add-page-numbers, add-stamp, auto-rename, auto-split-pdf, compress-pdf, decompress-pdf, extract-image-scans, extract-images, flatten, ocr-pdf, remove-blanks, repair, replace-invert-pdf, show-javascript, update-metadata, filter-contains-image, filter-contains-text, filter-file-size, filter-page-count, filter-page-rotation, filter-page-size, add-attachments] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice']) groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice'])
@ -153,7 +152,7 @@ metrics:
AutomaticallyGenerated: AutomaticallyGenerated:
key: cbb81c0f-50b1-450c-a2b5-89ae527776eb key: cbb81c0f-50b1-450c-a2b5-89ae527776eb
UUID: 10dd4fba-01fa-4717-9b78-3dc4f54e398a UUID: 10dd4fba-01fa-4717-9b78-3dc4f54e398a
appVersion: 0.44.3 appVersion: 1.0.2
processExecutor: processExecutor:
sessionLimit: # Process executor instances limits sessionLimit: # Process executor instances limits

View File

@ -1,16 +1,16 @@
#!/bin/bash #!/bin/bash
# Find project root by locating build.gradle # Find project root by locating app/build.gradle
find_root() { find_root() {
local dir="$PWD" local dir="$PWD"
while [[ "$dir" != "/" ]]; do while [[ "$dir" != "/" ]]; do
if [[ -f "$dir/build.gradle" ]]; then if [[ -f "$dir/app/build.gradle" ]]; then
echo "$dir" echo "$dir"
return 0 return 0
fi fi
dir="$(dirname "$dir")" dir="$(dirname "$dir")"
done done
echo "Error: build.gradle not found" >&2 echo "Error: app/build.gradle not found" >&2
exit 1 exit 1
} }
@ -175,7 +175,7 @@ compare_file_lists() {
# Get the expected version from Gradle once # Get the expected version from Gradle once
get_expected_version() { get_expected_version() {
./gradlew printVersion --quiet | tail -1 cd app && ./gradlew printVersion --quiet | tail -1
} }
# Function to verify the application version # Function to verify the application version
@ -266,7 +266,7 @@ main() {
export DISABLE_ADDITIONAL_FEATURES=true export DISABLE_ADDITIONAL_FEATURES=true
# Run the gradlew build command and check if it fails # Run the gradlew build command and check if it fails
if ! ./gradlew clean build; then if ! (cd app && ./gradlew clean build); then
echo "Gradle build failed with security disabled, exiting script." echo "Gradle build failed with security disabled, exiting script."
exit 1 exit 1
fi fi
@ -309,7 +309,7 @@ main() {
export DISABLE_ADDITIONAL_FEATURES=false export DISABLE_ADDITIONAL_FEATURES=false
# Run the gradlew build command and check if it fails # Run the gradlew build command and check if it fails
if ! ./gradlew clean build; then if ! (cd app && ./gradlew clean build); then
echo "Gradle build failed with security enabled, exiting script." echo "Gradle build failed with security enabled, exiting script."
exit 1 exit 1
fi fi

View File

@ -75,8 +75,8 @@ build_and_test() {
local compose_file="${docker_compose_base}${build_type}${compose_suffix}" local compose_file="${docker_compose_base}${build_type}${compose_suffix}"
# Gradle build with or without security # Gradle build with or without security
echo "Running ./gradlew clean build with security=$enable_security..." echo "Running cd app && ./gradlew clean build with security=$enable_security..."
./gradlew clean build cd app && ./gradlew clean build
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Gradle build failed, exiting script." echo "Gradle build failed, exiting script."