diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 898e0eaf2f744e9921d74193b7ef1973923c3c56..a6d38e74b8452ca7c78195b3aa34bbd0b128cc83 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,8 +10,8 @@ workflow: - when: always variables: - MAVEN_OPTS: "-Xmx500m -XX:GCLockerRetryAllocationCount=100 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN" - MAVEN_CLI_OPTS: "--batch-mode -DinstallAtEnd=true -DdeployAtEnd=true -DskipDeployBigArtefact=true -s $CI_PROJECT_DIR/ci_settings.xml" + MAVEN_OPTS: "-Xmx500m -XX:+UseSerialGC -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN" + MAVEN_CLI_OPTS: "--batch-mode -DskipDeployBigArtefact=true -s $CI_PROJECT_DIR/ci_settings.xml" stages: - build @@ -30,6 +30,8 @@ maven-build: rules: - if: $OPERATION != null when: never + - if: $CI_COMMIT_TAG != null + when: never - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH variables: MAVEN_GOAL: "install" @@ -42,19 +44,25 @@ maven-build: image: registry.opencode.de/diplanung/ozgxplanung/mvn-build-image:latest script: - mvn package -Dxplan-tests.maven.deploy.skip=true -Pdocker,skipAll -pl $mvnProjects -am + - ci/readEnvPropsForKanikoBuilds.sh > build.env - find . -name docker-build.tar | xargs gzip - set -o pipefail; find . -name docker-build.tar.gz | grep . | xargs du -h rules: - if: $CI_PIPELINE_SOURCE == 'schedule' when: never + - if: $CI_COMMIT_TAG != null + when: on_success - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH when: never - when: on_success artifacts: expire_in: 1 hour + reports: + dotenv: build.env variables: UPSTREAM_REF: $CI_COMMIT_REF_NAME + maven-prepare-docker-contexts-apis-and-inspire-plu: extends: .maven-prepare-docker-contexts variables: @@ -96,25 +104,15 @@ maven-prepare-docker-contexts-others: include: ci/all-kaniko-builds.gitlab-ci.yml -maven-release: +maven-deploy-release: image: registry.opencode.de/diplanung/ozgxplanung/mvn-build-image:latest stage: build:jvm rules: - - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH - when: never - if: $OPERATION != null when: never - - if: $CI_COMMIT_TAG - before_script: - - mkdir -p ~/.ssh/ - - cp $DEPLOY_PRIVATE_KEY ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa - - cp $KNOWN_HOSTS ~/.ssh/known_hosts - - apt-get update && apt-get install -y git - - git config --global user.email "noreply@gitlab.opencode.de" - - git config --global user.name "xplanung GitLab CI" - - git checkout -B "$CI_COMMIT_REF_NAME" + - if: $CI_COMMIT_TAG != null script: - - mvn release:prepare release:perform $MAVEN_CLI_OPTS -DscmReleaseCommitComment="release @{releaseLabel}" -DtagNameFormat="v@{project.version}" + - mvn $MAVEN_CLI_OPTS deploy -PskipAll -Dxplan-tests.maven.deploy.skip=true gitlab-release: stage: deploy @@ -122,9 +120,9 @@ gitlab-release: rules: - if: $OPERATION != null when: never - - if: $CI_COMMIT_TAG + - if: $CI_COMMIT_TAG != null script: - - echo "Running the release job for $CI_COMMIT_TAG" + - echo "Running job gitlab-release for $CI_COMMIT_TAG" release: tag_name: $CI_COMMIT_TAG name: 'Release $CI_COMMIT_TAG' diff --git a/ci/all-kaniko-builds.gitlab-ci.yml b/ci/all-kaniko-builds.gitlab-ci.yml index 959dd308c367fae55177ae6214c287b2d037bcc4..0a6c703acb2182e446fdd659f5f614dc00970e15 100644 --- a/ci/all-kaniko-builds.gitlab-ci.yml +++ b/ci/all-kaniko-builds.gitlab-ci.yml @@ -5,15 +5,17 @@ name: gcr.io/kaniko-project/executor:v1.9.0-debug entrypoint: [""] script: - - /kaniko/executor --context=tar://${CI_PROJECT_DIR}/$tarGzFile --destination=$destination:$dockerTag + - /kaniko/executor --context=tar://${CI_PROJECT_DIR}/$tarGzFile --destination=$destination:$xplanboxVersion --build-arg="BUILD_DATE='$(date --utc +'%Y-%m-%d %H:%M:%SZ')'" --build-arg="DOCKER_IMAGE_NAME=$dockerImageName" --build-arg="GIT_REVISION=${CI_COMMIT_SHA}" --build-arg="XPLANBOX_IMAGE_NAME_PREFIX=${CI_REGISTRY_IMAGE}/xplanbox" - --build-arg="XPLANBOX_VERSION=${dockerTag}" + --build-arg="XPLANBOX_VERSION=${xplanboxVersion}" rules: - if: $CI_PIPELINE_SOURCE == 'schedule' when: never + - if: $CI_COMMIT_TAG != null + when: on_success - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH when: never - when: on_success @@ -30,6 +32,7 @@ kaniko:xplan-cli-docker: tarGzFile: xplan-cli/xplan-cli-docker/target/docker/xplanbox/xplan-cli/tmp/docker-build.tar.gz needs: - maven-prepare-docker-contexts-cli + - kaniko:xplan-docker-volume-init kaniko:xplan-db-updater: extends: .kaniko:build diff --git a/ci/readEnvPropsForKanikoBuilds.sh b/ci/readEnvPropsForKanikoBuilds.sh new file mode 100755 index 0000000000000000000000000000000000000000..cb003d077cb032e6367d889b898779c0b0882c47 --- /dev/null +++ b/ci/readEnvPropsForKanikoBuilds.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# to be run in a folder with pom.xml + +xplanboxVersion=$(mvn -N help:evaluate -Dexpression=project.version -q -DforceStdout) + +echo -n "xplanboxVersion=$([[ $xplanboxVersion == *SNAPSHOT ]] && echo 'latest' || echo $xplanboxVersion) +" \ No newline at end of file diff --git a/pom.xml b/pom.xml index 96eb0f1ed2930f4a9297538c36733ddff5bb938f..d2c2d380f8e24d99c3aee47a9b440365cb0d2282 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,7 @@ <module>xplan-core</module> <module>xplan-documentation</module> <module>xplan-resources</module> + <module>xplan-security</module> <module>xplan-tests</module> <module>xplan-webapps</module> <module>xplan-webservices</module> @@ -1366,6 +1367,16 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + <version>${spring-boot.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <version>${spring-boot.version}</version> + </dependency> <!-- Spring Security --> <dependency> <groupId>org.springframework.security</groupId> diff --git a/xplan-api/pom.xml b/xplan-api/pom.xml index c32f764c83e52e80f57122271a0e59518ec0198c..b900feb70a5039e2227ccac2aeaaecc677dfc9c4 100644 --- a/xplan-api/pom.xml +++ b/xplan-api/pom.xml @@ -43,14 +43,14 @@ <resource> <directory>src/main/webapp</directory> <includes> - <include>version.txt</include> + <include>**/version.txt</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/webapp</directory> <excludes> - <exclude>version.txt</exclude> + <exclude>**/version.txt</exclude> </excludes> <filtering>false</filtering> </resource> diff --git a/xplan-api/xplan-api-dokumente/src/main/webapp/version.txt b/xplan-api/xplan-api-dokumente/src/main/webapp/xdokumente/version.txt similarity index 100% rename from xplan-api/xplan-api-dokumente/src/main/webapp/version.txt rename to xplan-api/xplan-api-dokumente/src/main/webapp/xdokumente/version.txt diff --git a/xplan-api/xplan-api-manager/pom.xml b/xplan-api/xplan-api-manager/pom.xml index c6d801e5ac4861ea4b7fe217a00a4f697c1cbd13..5c5f1c025eabed7edb8af7d58e165176142c66c4 100644 --- a/xplan-api/xplan-api-manager/pom.xml +++ b/xplan-api/xplan-api-manager/pom.xml @@ -78,6 +78,11 @@ <groupId>de.latlon.product.xplanbox</groupId> <artifactId>xplan-api-commons</artifactId> </dependency> + <dependency> + <groupId>de.latlon.product.xplanbox</groupId> + <artifactId>xplan-security</artifactId> + <version>${project.version}</version> + </dependency> <!-- deegree --> <dependency> <groupId>de.latlon</groupId> diff --git a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java index 922a9b5ae79159d9d4db64adf30c283e2032824c..ec44d236a2b7c6d85f59f0fef13733f6594ab511 100644 --- a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java +++ b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java @@ -5,11 +5,13 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = { "de.latlon.xplanbox.api.manager.config" }) -@EnableAutoConfiguration(exclude = { QuartzAutoConfiguration.class, LiquibaseAutoConfiguration.class }) +@EnableAutoConfiguration( + exclude = { QuartzAutoConfiguration.class, LiquibaseAutoConfiguration.class, SecurityAutoConfiguration.class }) public class SpringBootApp { public static void main(String[] args) { diff --git a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java index ff89e7d0a42b2bfa48b983c8a7b69666ca261d15..8f6cf17a75892d73e84782d601b24117e6d998a5 100644 --- a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java +++ b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java @@ -81,6 +81,7 @@ import de.latlon.xplan.validator.semantic.xquery.XQuerySemanticValidator; import de.latlon.xplan.validator.syntactic.SyntacticValidator; import de.latlon.xplan.validator.syntactic.SyntacticValidatorImpl; import de.latlon.xplanbox.api.commons.handler.SystemConfigHandler; +import de.latlon.xplanbox.security.config.SecurityContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; @@ -108,7 +109,7 @@ import static de.latlon.xplan.manager.workspace.WorkspaceUtils.DEFAULT_XPLANSYN_ */ @Configuration @ComponentScan(basePackages = { "de.latlon.xplanbox.api.manager.handler" }) -@Import({ JpaContext.class, RasterStorageContext.class, AmazonS3RasterStorageContext.class, +@Import({ SecurityContext.class, JpaContext.class, RasterStorageContext.class, AmazonS3RasterStorageContext.class, DocumentStorageContext.class, StorageCleanUpContext.class }) public class ApplicationContext { diff --git a/xplan-api/xplan-api-manager/src/main/webapp/version.txt b/xplan-api/xplan-api-manager/src/main/webapp/xmanager/version.txt similarity index 100% rename from xplan-api/xplan-api-manager/src/main/webapp/version.txt rename to xplan-api/xplan-api-manager/src/main/webapp/xmanager/version.txt diff --git a/xplan-api/xplan-api-validator/pom.xml b/xplan-api/xplan-api-validator/pom.xml index 74b3e5c315537d5c1e6106c85770778923cf0dee..3a2dc2c74673d15d1baf118c4aaa8357cb7c1fee 100755 --- a/xplan-api/xplan-api-validator/pom.xml +++ b/xplan-api/xplan-api-validator/pom.xml @@ -133,6 +133,11 @@ <groupId>de.latlon.product.xplanbox</groupId> <artifactId>xplan-api-commons</artifactId> </dependency> + <dependency> + <groupId>de.latlon.product.xplanbox</groupId> + <artifactId>xplan-security</artifactId> + <version>${project.version}</version> + </dependency> <!-- XPlanung --> <dependency> <groupId>de.xleitstelle.xplanung</groupId> diff --git a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java index 7bb58b188a46c20adc877451e0666e444036fabb..1d7d89b60e5edda95aee44793fafce902a838807 100644 --- a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java +++ b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java @@ -1,11 +1,14 @@ package de.latlon.xplanbox.api.validator; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = { "de.latlon.xplanbox.api.validator.config" }) +@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class }) public class SpringBootApp { public static void main(String[] args) { diff --git a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java index fc4c339c3ca6054578d24b54441598896322275d..cfb8b7a10b2a3f01ecc83ecaf834a3101e9a3d64 100644 --- a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java +++ b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java @@ -20,22 +20,6 @@ */ package de.latlon.xplanbox.api.validator.config; -import static java.nio.file.Files.createTempDirectory; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.io.ResourceLoader; - import de.latlon.xplan.commons.configuration.PropertiesLoader; import de.latlon.xplan.commons.configuration.SystemPropertyPropertiesLoader; import de.latlon.xplan.manager.web.shared.ConfigurationException; @@ -57,13 +41,29 @@ import de.latlon.xplan.validator.syntactic.SyntacticValidator; import de.latlon.xplan.validator.syntactic.SyntacticValidatorImpl; import de.latlon.xplan.validator.wms.config.ValidatorWmsContext; import de.latlon.xplanbox.api.commons.handler.SystemConfigHandler; +import de.latlon.xplanbox.security.config.SecurityContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.io.ResourceLoader; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static java.nio.file.Files.createTempDirectory; /** * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> */ @Configuration @ComponentScan(basePackages = { "de.latlon.xplanbox.api.validator.handler", "de.latlon.xplanbox.api.validator.v1" }) -@Import(ValidatorWmsContext.class) +@Import({ SecurityContext.class, ValidatorWmsContext.class }) public class ApplicationContext { @Autowired diff --git a/xplan-api/xplan-api-validator/src/main/webapp/version.txt b/xplan-api/xplan-api-validator/src/main/webapp/xvalidator/version.txt similarity index 100% rename from xplan-api/xplan-api-validator/src/main/webapp/version.txt rename to xplan-api/xplan-api-validator/src/main/webapp/xvalidator/version.txt diff --git a/xplan-security/pom.xml b/xplan-security/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b928556b436f59b4851d0c59c71d7a91f60fd37 --- /dev/null +++ b/xplan-security/pom.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <artifactId>xplan-security</artifactId> + + <parent> + <groupId>de.latlon.product.xplanbox</groupId> + <artifactId>xplanbox</artifactId> + <version>7.1-SNAPSHOT</version> + </parent> + + <dependencies> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <!-- logging --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <!-- test --> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java new file mode 100644 index 0000000000000000000000000000000000000000..7721fac23399fc423cb17bcbaf44b3557512bf66 --- /dev/null +++ b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java @@ -0,0 +1,79 @@ +package de.latlon.xplanbox.security.authentication; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.UserDetailsManager; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * {@link UserDetailsManager} managing user details from properties file + * + * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> + * @since 7.1 + */ +public class PropertiesFileUserDetailsManager implements UserDetailsManager { + + private static final Logger LOG = LoggerFactory.getLogger(PropertiesFileUserDetailsManager.class); + + private final Map<String, String> usersAndEncryptedPasswords; + + public PropertiesFileUserDetailsManager(String userPropertiesFile, PasswordEncoder passwordEncoder) + throws SecurityConfigurationException { + try (FileInputStream inputStream = new FileInputStream(userPropertiesFile)) { + Properties users = new Properties(); + users.load(inputStream); + this.usersAndEncryptedPasswords = users.entrySet() + .stream() + .collect(Collectors.toMap(entry -> (String) entry.getKey(), + entry -> passwordEncoder.encode((String) entry.getValue()))); + } + catch (IOException e) { + LOG.error("Properties file with users could not be read. ", e); + throw new SecurityConfigurationException(e); + } + } + + @Override + public void createUser(UserDetails user) { + throw new UnsupportedOperationException(); + } + + @Override + public void updateUser(UserDetails user) { + throw new UnsupportedOperationException(); + } + + @Override + public void deleteUser(String username) { + throw new UnsupportedOperationException(); + } + + @Override + public void changePassword(String oldPassword, String newPassword) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean userExists(String username) { + return usersAndEncryptedPasswords.containsKey(username); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + if (!userExists(username)) { + throw new UsernameNotFoundException(username); + } + String password = this.usersAndEncryptedPasswords.get(username); + return User.withUsername(username).password(password).roles("USER_ROLE").build(); + } + +} diff --git a/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/SecurityConfigurationException.java b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/SecurityConfigurationException.java new file mode 100644 index 0000000000000000000000000000000000000000..b7b9da4d2bdae0711729905f024a1dfae7c134ec --- /dev/null +++ b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/SecurityConfigurationException.java @@ -0,0 +1,15 @@ +package de.latlon.xplanbox.security.authentication; + +/** + * Indicates a misconfiguration in the security module. + * + * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> + * @since 7.1 + */ +public class SecurityConfigurationException extends Exception { + + public SecurityConfigurationException(Throwable e) { + super(e); + } + +} diff --git a/xplan-security/src/main/java/de/latlon/xplanbox/security/config/SecurityContext.java b/xplan-security/src/main/java/de/latlon/xplanbox/security/config/SecurityContext.java new file mode 100644 index 0000000000000000000000000000000000000000..1bebe7c5513d2729cfa1b98b4297a3734627af09 --- /dev/null +++ b/xplan-security/src/main/java/de/latlon/xplanbox/security/config/SecurityContext.java @@ -0,0 +1,49 @@ +package de.latlon.xplanbox.security.config; + +import de.latlon.xplanbox.security.authentication.PropertiesFileUserDetailsManager; +import de.latlon.xplanbox.security.authentication.SecurityConfigurationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +/** + * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> + * @since 7.1 + */ +@EnableWebSecurity +@Configuration +@Profile("enableSecurity") +@ComponentScan(basePackages = { "de.latlon.xplanbox.security" }) +public class SecurityContext { + + private static final Logger LOG = LoggerFactory.getLogger(SecurityContext.class); + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + LOG.info("Configure security."); + http.csrf((csrf) -> csrf.disable()).authorizeRequests().anyRequest().authenticated().and().httpBasic(); + return http.build(); + } + + @Bean + public PropertiesFileUserDetailsManager userDetailsService( + @Value("#{environment.XPLAN_SECURITY_USER_PROPERTIES_FILE}") String userPropertiesFile, + PasswordEncoder passwordEncoder) throws SecurityConfigurationException { + return new PropertiesFileUserDetailsManager(userPropertiesFile, passwordEncoder); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + +} \ No newline at end of file diff --git a/xplan-security/src/test/java/de/latlon/xplanbox/security/config/SecurityContextTest.java b/xplan-security/src/test/java/de/latlon/xplanbox/security/config/SecurityContextTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4705d2f1e2940594d14c3a62163ed1a251e46d46 --- /dev/null +++ b/xplan-security/src/test/java/de/latlon/xplanbox/security/config/SecurityContextTest.java @@ -0,0 +1,19 @@ +package de.latlon.xplanbox.security.config; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; + +/** + * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a> + */ +@SpringBootTest +@ContextConfiguration(classes = SecurityContext.class) +public class SecurityContextTest { + + @Test + public void contextLoad() { + + } + +} diff --git a/xplan-tests/xplan-tests-soapui/pom.xml b/xplan-tests/xplan-tests-soapui/pom.xml index cb2cb464956f5ab467c78e02021f294257fc5fcd..081c6d3f09240f3f2d80430757ea54bfa614244f 100644 --- a/xplan-tests/xplan-tests-soapui/pom.xml +++ b/xplan-tests/xplan-tests-soapui/pom.xml @@ -90,6 +90,7 @@ <settingsFile>${basedir}/src/main/resources/soapui-settings.xml</settingsFile> <outputFolder>${project.build.directory}/soapui</outputFolder> <junitReport>true</junitReport> + <exportAll>true</exportAll> <testFailIgnore>true</testFailIgnore> <endpoint>${endpoint}</endpoint> <username>${username}</username> diff --git a/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh b/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh index c199bb8c10ca63dd3f5ec8847f3df61b389b0f83..0caa5c19c3557774d1c5e331c2f6eb0c16d30e3a 100755 --- a/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh +++ b/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh @@ -48,7 +48,7 @@ echo "Transforming to PDF $REPORT_PATH_PDF..." sed -i 's/display:none;//' target/site/surefire-report.html weasyprint file://$PWD/target/site/surefire-report.html $REPORT_PATH_PDF REPORT_PATH_TAR=target/test-report.tar.gz -tar cfz $REPORT_PATH_TAR -C target/site . +tar cfz $REPORT_PATH_TAR -C target site soapui if [ "$XPLAN_UPLOAD_TEST_REPORT" = "true" ]; then