diff --git a/Dockerfile.fat b/Dockerfile.fat index 6d23809a8..4f4ef419a 100644 --- a/Dockerfile.fat +++ b/Dockerfile.fat @@ -5,6 +5,8 @@ COPY build.gradle . COPY settings.gradle . COPY gradlew . COPY gradle gradle/ +COPY common/build.gradle common/. +COPY proprietary/build.gradle proprietary/. RUN ./gradlew build -x spotlessApply -x spotlessCheck -x test -x sonarqube || return 0 # Set the working directory diff --git a/build.gradle b/build.gradle index 56d0f8271..b8d1ebc92 100644 --- a/build.gradle +++ b/build.gradle @@ -270,8 +270,6 @@ tasks.register('jpackageMacX64') { } } -//jpackage.finalizedBy(jpackageMacX64) - tasks.register('downloadTempJre') { group = 'distribution' description = 'Downloads and extracts a temporary JRE' @@ -421,43 +419,16 @@ dependencies { 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-web:$springBootVersion") implementation "org.springframework.boot:spring-boot-starter-jetty:$springBootVersion" - - implementation "org.springframework.boot:spring-boot-starter-thymeleaf:$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") { implementation project(':proprietary') -// implementation 'io.micrometer:micrometer-registry-prometheus' -// -// implementation "org.springframework.boot:spring-boot-starter-security:$springBootVersion" -// implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.3.RELEASE" -// implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" -// implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" -// implementation "org.springframework.boot:spring-boot-starter-mail:$springBootVersion" -// -// implementation "org.springframework.session:spring-session-core:3.4.3" -// implementation "org.springframework:spring-jdbc:6.2.7" -// -// implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' -// // Don't upgrade h2database -// runtimeOnly "com.h2database:h2:2.3.232" -// runtimeOnly "org.postgresql:postgresql:42.7.5" -// constraints { -// implementation "org.opensaml:opensaml-core:$openSamlVersion" -// implementation "org.opensaml:opensaml-saml-api:$openSamlVersion" -// implementation "org.opensaml:opensaml-saml-impl:$openSamlVersion" -// } -// implementation "org.springframework.security:spring-security-saml2-service-provider:$springSecuritySamlVersion" -// // implementation 'org.springframework.security:spring-security-core:$springSecuritySamlVersion' -// implementation 'com.coveo:saml-client:5.0.0' } - implementation 'org.snakeyaml:snakeyaml-engine:2.9' - - testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion" // Batik implementation "org.apache.xmlgraphics:batik-all:1.19" @@ -465,10 +436,12 @@ dependencies { // 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-jpeg:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-pcx:$imageioVersion@ // runtimeOnly "com.twelvemonkeys.imageio:imageio-pict:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-pnm:$imageioVersion" @@ -476,24 +449,18 @@ dependencies { // 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-tiff:$imageioVersion" - runtimeOnly "com.twelvemonkeys.imageio:imageio-webp:$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 +// 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:pdfbox:$pdfboxVersion") implementation "org.apache.pdfbox:preflight:$pdfboxVersion" - - implementation ("org.apache.pdfbox:xmpbox:$pdfboxVersion") // https://mvnrepository.com/artifact/technology.tabula/tabula @@ -517,7 +484,6 @@ dependencies { // 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") @@ -527,6 +493,7 @@ dependencies { // 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 { diff --git a/common/build.gradle b/common/build.gradle index 64b98b88b..813e78be6 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -30,19 +30,19 @@ dependencyManagement { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20240325.1' - implementation 'com.fathzer:javaluator:3.0.6' - implementation 'com.posthog.java:posthog:1.2.0' - implementation 'io.github.pixee:java-security-toolkit:1.2.1' - implementation 'org.apache.commons:commons-lang3:3.17.0' - implementation 'com.drewnoakes:metadata-extractor:2.19.0' // Image metadata extractor - implementation 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8' - implementation "org.apache.pdfbox:pdfbox:$pdfboxVersion" - implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' - implementation 'org.snakeyaml:snakeyaml-engine:2.9' - implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6" + 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' + api "org.apache.pdfbox:pdfbox:$pdfboxVersion" + api 'jakarta.servlet:jakarta.servlet-api:6.0.0' + api 'org.snakeyaml:snakeyaml-engine:2.9' + api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6" compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/configuration/DatabaseConfig.java b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/DatabaseConfig.java index 8d686e4d7..5507580a4 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/security/configuration/DatabaseConfig.java +++ b/proprietary/src/main/java/stirling/software/proprietary/security/configuration/DatabaseConfig.java @@ -4,6 +4,7 @@ import javax.sql.DataSource; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jdbc.DatabaseDriver; @@ -54,14 +55,25 @@ public class DatabaseConfig { public DataSource dataSource() throws UnsupportedProviderException { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); - if (!runningProOrHigher) { + if (!runningProOrHigher || !datasource.isEnableCustomDatabase()) { return useDefaultDataSource(dataSourceBuilder); } - if (!datasource.isEnableCustomDatabase()) { - return useDefaultDataSource(dataSourceBuilder); - } + return useCustomDataSource(dataSourceBuilder); + } + private DataSource useDefaultDataSource(DataSourceBuilder dataSourceBuilder) { + log.info("Using default H2 database"); + + dataSourceBuilder.url(DATASOURCE_DEFAULT_URL) + .driverClassName(DatabaseDriver.H2.getDriverClassName()) + .username(DEFAULT_USERNAME); + + return dataSourceBuilder.build(); + } + + @ConditionalOnBooleanProperty(name = "premium.enabled") + private DataSource useCustomDataSource(DataSourceBuilder dataSourceBuilder) throws UnsupportedProviderException { log.info("Using custom database configuration"); if (!datasource.getCustomDatabaseUrl().isBlank()) { @@ -73,11 +85,11 @@ public class DatabaseConfig { } else { dataSourceBuilder.driverClassName(getDriverClassName(datasource.getType())); dataSourceBuilder.url( - generateCustomDataSourceUrl( - datasource.getType(), - datasource.getHostName(), - datasource.getPort(), - datasource.getName())); + generateCustomDataSourceUrl( + datasource.getType(), + datasource.getHostName(), + datasource.getPort(), + datasource.getName())); } dataSourceBuilder.username(datasource.getUsername()); dataSourceBuilder.password(datasource.getPassword()); @@ -85,16 +97,6 @@ public class DatabaseConfig { return dataSourceBuilder.build(); } - private DataSource useDefaultDataSource(DataSourceBuilder dataSourceBuilder) { - log.info("Using default H2 database"); - - dataSourceBuilder.url(DATASOURCE_DEFAULT_URL) - .driverClassName(DatabaseDriver.H2.getDriverClassName()) - .username(DEFAULT_USERNAME); - - return dataSourceBuilder.build(); - } - /** * Generate the URL the DataSource will use to connect to the database * 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 402497da6..cec19214a 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,7 +6,6 @@ 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; @@ -26,7 +25,7 @@ import org.springframework.security.web.authentication.rememberme.PersistentToke import org.springframework.security.web.csrf.CookieCsrfTokenRepository; import org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler; import org.springframework.security.web.savedrequest.NullRequestCache; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher; import stirling.software.common.configuration.AppConfig; import stirling.software.common.model.ApplicationProperties; import stirling.software.proprietary.security.CustomAuthenticationFailureHandler; @@ -166,7 +165,7 @@ public class SecurityConfiguration { http.requestCache(requestCache -> requestCache.requestCache(new NullRequestCache())); http.logout( logout -> - logout.logoutRequestMatcher(new AntPathRequestMatcher("/logout")) + logout.logoutRequestMatcher(PathPatternRequestMatcher.withDefaults().matcher("/logout")) .logoutSuccessHandler( new CustomLogoutSuccessHandler(applicationProperties, appConfig)) .clearAuthentication(true) diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 2228b73a7..b22e2ab66 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -64,7 +64,6 @@ premium: key: 00000000-0000-0000-0000-000000000000 enabled: true # Enable license key checks for pro/enterprise features proFeatures: - customDatabase: false # Enable database features todo: use only for custom DB SSOAutoLogin: false CustomMetadata: autoUpdateMetadata: false