From 4e7f5d9642b5d575349e8296082d770f54cbf4ab Mon Sep 17 00:00:00 2001 From: Dario Ghunney Ware Date: Wed, 16 Apr 2025 16:56:18 +0100 Subject: [PATCH] wip - making db and sessions conditional --- src/main/java/stirling/software/SPDF/SPDFApplication.java | 8 +++++++- .../SPDF/config/security/UserAuthenticationFilter.java | 2 ++ .../software/SPDF/config/security/UserService.java | 3 ++- .../SPDF/config/security/database/DatabaseConfig.java | 6 +++++- .../SPDF/config/security/database/DatabaseService.java | 4 +++- .../config/security/session/SessionRegistryConfig.java | 2 ++ .../SPDF/config/security/session/SessionRepository.java | 2 ++ src/main/resources/application.properties | 3 ++- src/main/resources/settings.yml.template | 2 ++ 9 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/SPDFApplication.java b/src/main/java/stirling/software/SPDF/SPDFApplication.java index 3cf89a657..34fb5257e 100644 --- a/src/main/java/stirling/software/SPDF/SPDFApplication.java +++ b/src/main/java/stirling/software/SPDF/SPDFApplication.java @@ -14,6 +14,8 @@ 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; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.EnableScheduling; @@ -32,7 +34,11 @@ import stirling.software.SPDF.utils.UrlUtils; @Slf4j @EnableScheduling -@SpringBootApplication +@SpringBootApplication( + exclude = { + DataSourceAutoConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class + }) public class SPDFApplication { private static String serverPortStatic; diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index b0684d750..85668dd28 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; @@ -35,6 +36,7 @@ import stirling.software.SPDF.model.User; @Slf4j @Component +@ConditionalOnProperty(name = "premium.enabled", havingValue = "true") public class UserAuthenticationFilter extends OncePerRequestFilter { private final ApplicationProperties applicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index d90539171..ab6f0378c 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -5,6 +5,7 @@ import java.sql.SQLException; import java.util.*; import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Lazy; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -46,7 +47,7 @@ public class UserService implements UserServiceInterface { private final SessionPersistentRegistry sessionRegistry; - private final DatabaseInterface databaseService; + @Lazy private final DatabaseInterface databaseService; private final ApplicationProperties applicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java index d221704ea..5c0df766e 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java @@ -3,9 +3,11 @@ package stirling.software.SPDF.config.security.database; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -16,7 +18,9 @@ import stirling.software.SPDF.model.exception.UnsupportedProviderException; @Slf4j @Getter +@Lazy @Configuration +@ConditionalOnProperty(name = "premium.proFeatures.database", havingValue = "true") public class DatabaseConfig { public final String DATASOURCE_DEFAULT_URL; @@ -35,7 +39,7 @@ public class DatabaseConfig { DATASOURCE_DEFAULT_URL = "jdbc:h2:file:" + InstallationPathConfig.getConfigPath() - + "stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"; + + "stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL"; log.debug("Database URL: {}", DATASOURCE_DEFAULT_URL); this.applicationProperties = applicationProperties; this.runningProOrHigher = runningProOrHigher; diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java index 27e9ae7b1..a8f95100d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import javax.sql.DataSource; +import org.springframework.context.annotation.Lazy; import org.springframework.jdbc.datasource.init.CannotReadScriptException; import org.springframework.jdbc.datasource.init.ScriptException; import org.springframework.stereotype.Service; @@ -33,6 +34,7 @@ import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.exception.BackupNotFoundException; import stirling.software.SPDF.utils.FileInfo; +@Lazy @Slf4j @Service public class DatabaseService implements DatabaseInterface { @@ -42,7 +44,7 @@ public class DatabaseService implements DatabaseInterface { private final Path BACKUP_DIR; private final ApplicationProperties applicationProperties; - private final DataSource dataSource; + @Lazy private final DataSource dataSource; public DatabaseService(ApplicationProperties applicationProperties, DataSource dataSource) { this.BACKUP_DIR = diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java index 8fa24e95a..18a84279c 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java @@ -1,10 +1,12 @@ package stirling.software.SPDF.config.security.session; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.session.SessionRegistryImpl; @Configuration +@ConditionalOnProperty(name = "premium.enabled", havingValue = "true") public class SessionRegistryConfig { @Bean diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java index b7f0133f3..d4f2f4bcc 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java @@ -3,6 +3,7 @@ package stirling.software.SPDF.config.security.session; import java.util.Date; import java.util.List; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -14,6 +15,7 @@ import jakarta.transaction.Transactional; import stirling.software.SPDF.model.SessionEntity; @Repository +@ConditionalOnProperty(name = "premium.enabled", havingValue = "true") public interface SessionRepository extends JpaRepository { List findByPrincipalName(String principalName); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d7d074223..148fa1785 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -28,11 +28,12 @@ spring.thymeleaf.encoding=UTF-8 spring.web.resources.mime-mappings.webmanifest=application/manifest+json spring.mvc.async.request-timeout=${SYSTEM_CONNECTIONTIMEOUTMILLISECONDS:1200000} +management.endpoints.web.exposure.include=beans spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password= -spring.h2.console.enabled=false +spring.h2.console.enabled=true spring.jpa.hibernate.ddl-auto=update server.servlet.session.timeout:30m # Change the default URL path for OpenAPI JSON diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 380faeb42..3f9adffaf 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -64,6 +64,7 @@ premium: key: 00000000-0000-0000-0000-000000000000 enabled: false # Enable license key checks for pro/enterprise features proFeatures: + database: false # Enable database features SSOAutoLogin: false CustomMetadata: autoUpdateMetadata: false @@ -103,6 +104,7 @@ system: 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: + enabled: true # set to 'true' to enable the database connection 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