From f8621464354acfe17c3a103abf5a154911e32ffb Mon Sep 17 00:00:00 2001 From: Jj! Date: Tue, 11 Jun 2019 16:38:09 -0500 Subject: [PATCH 01/25] [SHIBUI-1317] WIP --- backend/build.gradle | 4 +++- .../EntityDescriptorController.java | 1 - ...ilterTargetRepresentationDeserializer.java | 1 - .../src/main/resources/application.properties | 2 ++ build.gradle | 3 --- gradle/wrapper/gradle-wrapper.jar | Bin 53556 -> 54417 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index c7792db77..f47b7b20a 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -1,7 +1,7 @@ plugins { id 'groovy' id 'war' - id 'org.springframework.boot' version '2.0.0.RELEASE' + id 'org.springframework.boot' version '2.1.5.RELEASE' id 'com.gorylenko.gradle-git-properties' version '1.4.21' id 'net.researchgate.release' version '2.6.0' id 'io.franzbecker.gradle-lombok' version '1.13' @@ -139,6 +139,8 @@ dependencies { //So it works on Java 9 without explicitly requiring to load that module (needed by Hibernate) runtimeOnly 'javax.xml.bind:jaxb-api:2.3.0' + // runtime libraries for later java versions + runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.0' // TODO: these will likely only be runtimeOnly or test scope, unless we want to ship the libraries with the final product compile "com.h2database:h2" diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java index 80213f5cd..8ec003b0c 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java @@ -32,7 +32,6 @@ import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import javax.annotation.PostConstruct; -import javax.xml.ws.Response; import java.net.URI; import java.util.stream.Collectors; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/FilterTargetRepresentationDeserializer.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/FilterTargetRepresentationDeserializer.java index 5d52d2fe5..6ee01690b 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/FilterTargetRepresentationDeserializer.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/FilterTargetRepresentationDeserializer.java @@ -6,7 +6,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.FilterTargetRepresentation; -import jdk.nashorn.internal.runtime.regexp.joni.ast.StringNode; import java.io.IOException; import java.util.ArrayList; diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index d35c7c099..0a006ec78 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -8,6 +8,8 @@ logging.level.org.springframework=INFO logging.level.edu.internet2.tier.shibboleth.admin.ui=INFO +spring.main.allow-bean-definition-overriding=true + # Database Credentials spring.datasource.username=shibui spring.datasource.password=shibui diff --git a/build.gradle b/build.gradle index b1dad6f5c..e69de29bb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +0,0 @@ -task wrapper(type: Wrapper) { - gradleVersion = '4.8.1' -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ca78035ef0501d802d4fc55381ef2d5c3ce0ec6e..758de960ec7947253b058ff79c88ce51f3abe08a 100644 GIT binary patch delta 40459 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 cJp Date: Tue, 11 Jun 2019 16:41:56 -0500 Subject: [PATCH 02/25] [SHIBUI-1317] WIP --- backend/build.gradle | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index f47b7b20a..87149598a 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -316,14 +316,16 @@ dockerRun { clean true } -task runChecker << { - def ready = false - while (!ready) { - try { - ready = 'http://localhost:10101'.toURL().text.length() > 0 - } catch (IOException e) { - println 'cannot reach site' - sleep 5000 +task runChecker { + doLast { + def ready = false + while (!ready) { + try { + ready = 'http://localhost:10101'.toURL().text.length() > 0 + } catch (IOException e) { + println 'cannot reach site' + sleep 5000 + } } } } From 72c4d7dc4209b291870169eef9658425da200145 Mon Sep 17 00:00:00 2001 From: Jj! Date: Tue, 11 Jun 2019 17:02:08 -0500 Subject: [PATCH 03/25] [SHIBUI-1317] WIP --- backend/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/build.gradle b/backend/build.gradle index 5f904bfc7..e58358003 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -343,4 +343,6 @@ dockerCompose { test { dependsOn 'composeUp' finalizedBy 'composeDown' + + maxHeapSize = '4G' } From f836400a556ad930b7e5e673a77cfbe32fbc25f2 Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 13 Jun 2019 10:01:33 -0500 Subject: [PATCH 04/25] [SHIBUI-1317] WIP --- gradle/wrapper/gradle-wrapper.jar | Bin 54417 -> 55190 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 758de960ec7947253b058ff79c88ce51f3abe08a..87b738cbd051603d91cc39de6cb000dd98fe6b02 100644 GIT binary patch literal 55190 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 z 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 From 288ec9a5870fc815ed4df1617701610d466f7f14 Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 13 Jun 2019 16:34:48 -0500 Subject: [PATCH 05/25] [SHIBUI-1317] WIP --- backend/build.gradle | 20 ++++++++++--------- .../ui/configuration/SearchConfiguration.java | 7 ++++--- .../FileCheckingFileWritingService.java | 4 ++-- .../MetadataResolverRepositoryTests.groovy | 2 ++ .../ui/service/EmailServiceImplTests.groovy | 8 ++------ ...JPAMetadataResolverServiceImplTests.groovy | 3 +-- ...JPAMetadataResolverServiceImplTests.groovy | 10 +--------- gradle.properties | 10 +++++----- gradlew | 2 +- gradlew.bat | 2 +- pac4j-module/build.gradle | 4 ++-- 11 files changed, 32 insertions(+), 40 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index e58358003..204bf14ac 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -6,7 +6,7 @@ plugins { id 'io.franzbecker.gradle-lombok' version '1.13' id 'com.palantir.docker' version '0.20.1' id 'com.palantir.docker-run' version '0.20.1' - id 'com.avast.gradle.docker-compose' version '0.8.0' + // id 'com.avast.gradle.docker-compose' version '0.8.0' } apply plugin: 'io.spring.dependency-management' @@ -92,7 +92,7 @@ springBoot { } lombok { - version = "1.18.4" + version = "1.18.8" //TODO: get new sha256 sha256 = "" } @@ -283,7 +283,7 @@ compileJava { } jacoco { - toolVersion = '0.8.1' + toolVersion = '0.8.4' } jacocoTestReport { @@ -329,10 +329,16 @@ task runChecker { } } +test { + forkEvery = 1 + maxHeapSize = '4G' +} + /* * Docker Compose (gradle-docker-compose-plugin) settings. * Used to start and stop docker containers before running tests. */ +/* apply plugin: 'docker-compose' dockerCompose { useComposeFiles = ['./src/test/docker-files/docker-compose.yml'] @@ -340,9 +346,5 @@ dockerCompose { waitForTcpPorts = false } -test { - dependsOn 'composeUp' - finalizedBy 'composeDown' - - maxHeapSize = '4G' -} +dockerCompose.isRequiredBy(test) + */ diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SearchConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SearchConfiguration.java index bcd13d547..3678954c3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SearchConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SearchConfiguration.java @@ -6,6 +6,7 @@ import org.apache.lucene.analysis.LowerCaseFilter; import org.apache.lucene.analysis.StopFilter; import org.apache.lucene.analysis.TokenFilter; +import org.apache.lucene.analysis.en.EnglishAnalyzer; import org.apache.lucene.analysis.ngram.NGramTokenFilter; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.standard.StandardTokenizer; @@ -33,9 +34,9 @@ protected TokenStreamComponents createComponents(String fieldName) { final StandardTokenizer src = new StandardTokenizer(); src.setMaxTokenLength(255); TokenFilter tokenFilter; - tokenFilter = new NGramTokenFilter(src, 3, 10); + tokenFilter = new NGramTokenFilter(src, 3, 10, true); tokenFilter = new LowerCaseFilter(tokenFilter); - tokenFilter = new StopFilter(tokenFilter, StandardAnalyzer.STOP_WORDS_SET); + tokenFilter = new StopFilter(tokenFilter, EnglishAnalyzer.ENGLISH_STOP_WORDS_SET); return new TokenStreamComponents(src, tokenFilter); } }; @@ -50,7 +51,7 @@ protected TokenStreamComponents createComponents(String fieldName) { src.setMaxTokenLength(255); TokenFilter tokenFilter; tokenFilter = new LowerCaseFilter(src); - tokenFilter = new StopFilter(tokenFilter, StandardAnalyzer.STOP_WORDS_SET); + tokenFilter = new StopFilter(tokenFilter, EnglishAnalyzer.ENGLISH_STOP_WORDS_SET); return new TokenStreamComponents(src, tokenFilter); } }; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/FileCheckingFileWritingService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/FileCheckingFileWritingService.java index 6c05fa987..5e099f3e6 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/FileCheckingFileWritingService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/FileCheckingFileWritingService.java @@ -63,11 +63,11 @@ private boolean checkContentMatches(InputStream inputStream, String content) thr return Arrays.equals(fileDigest, contentDigest); } - void writeContent(Path path, String content) throws IOException { + protected void writeContent(Path path, String content) throws IOException { Files.write(path, content.getBytes()); } - void writeContent(WritableResource resource, String content) throws IOException { + protected void writeContent(WritableResource resource, String content) throws IOException { try (OutputStream os = resource.getOutputStream()) { os.write(content.getBytes()); } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy index cec7fe8c5..62c3b83ab 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest import org.springframework.data.jpa.repository.config.EnableJpaRepositories +import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -32,6 +33,7 @@ import javax.persistence.EntityManager @ContextConfiguration(classes = [CoreShibUiConfiguration, SearchConfiguration, TestConfiguration, InternationalizationConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) class MetadataResolverRepositoryTests extends Specification { @Autowired MetadataResolverRepository metadataResolverRepository diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy index 8960f807e..7531172cb 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy @@ -22,12 +22,8 @@ import spock.lang.Specification /** * @author Bill Smith (wsmith@unicon.net) */ -@SpringBootTest -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, EmailConfiguration, TestConfiguration, InternationalizationConfiguration, SearchConfiguration, DevConfig]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -@ActiveProfiles(["no-auth", "dev"]) +@Ignore +// TODO: fix class EmailServiceImplTests extends Specification { @Autowired diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy index 08a14feb5..110ebffc4 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy @@ -29,9 +29,8 @@ import spock.lang.Specification import static edu.internet2.tier.shibboleth.admin.ui.util.TestHelpers.* -@SpringBootTest @DataJpaTest -@ContextConfiguration(classes = [CoreShibUiConfiguration, SearchConfiguration, InternationalizationConfiguration]) +@ContextConfiguration(classes = [CoreShibUiConfiguration, SearchConfiguration, InternationalizationConfiguration, TestConfig]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") class IncommonJPAMetadataResolverServiceImplTests extends Specification { diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy index dd55874a0..46c0492e8 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy @@ -29,14 +29,12 @@ import net.shibboleth.ext.spring.resource.ResourceHelper import net.shibboleth.utilities.java.support.resolver.CriteriaSet import org.joda.time.DateTime import org.opensaml.core.criterion.EntityIdCriterion -import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver import org.opensaml.saml.metadata.resolver.MetadataResolver import org.opensaml.saml.metadata.resolver.filter.MetadataFilterChain import org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest -import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.TestConfiguration import org.springframework.context.annotation.Bean import org.springframework.core.io.ClassPathResource @@ -49,16 +47,10 @@ import spock.lang.Ignore import spock.lang.Specification import spock.lang.Unroll -import javax.xml.transform.OutputKeys -import javax.xml.transform.TransformerFactory -import javax.xml.transform.dom.DOMSource -import javax.xml.transform.stream.StreamResult - import static edu.internet2.tier.shibboleth.admin.ui.util.TestHelpers.generatedXmlIsTheSameAsExpectedXml -@SpringBootTest @DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, MetadataResolverConverterConfiguration, SearchConfiguration, InternationalizationConfiguration, PlaceholderResolverComponentsConfiguration]) +@ContextConfiguration(classes=[CoreShibUiConfiguration, MetadataResolverConverterConfiguration, SearchConfiguration, InternationalizationConfiguration, PlaceholderResolverComponentsConfiguration, Config]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) diff --git a/gradle.properties b/gradle.properties index 335e4cb7b..2d38c703f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,14 +2,14 @@ name=shibui group=edu.internet2.tier.shibboleth.admin.ui version=1.6.0-SNAPSHOT -shibboleth.version=3.4.0 -opensaml.version=3.4.0 +shibboleth.version=3.4.4 +opensaml.version=3.4.3 -spring-boot.version=2.0.0.RELEASE +spring-boot.version=2.1.5.RELEASE -hibernate.version=5.2.11.Final +hibernate.version=5.4.3.Final -lucene.version=7.2.1 +lucene.version=8.1.1 org.gradle.jvmargs=-Xmx4g -XX:-UseGCOverheadLimit diff --git a/gradlew b/gradlew index cccdd3d51..af6708ff2 100755 --- a/gradlew +++ b/gradlew @@ -28,7 +28,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index f9553162f..6d57edc70 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/pac4j-module/build.gradle b/pac4j-module/build.gradle index 8bdb9c5d6..63d0c1d1f 100644 --- a/pac4j-module/build.gradle +++ b/pac4j-module/build.gradle @@ -2,8 +2,8 @@ plugins { id 'groovy' id 'com.palantir.docker' version '0.20.1' id 'jacoco' - id 'org.springframework.boot' version '2.0.0.RELEASE' apply false - id 'io.spring.dependency-management' version '1.0.6.RELEASE' + id 'org.springframework.boot' version '2.1.5.RELEASE' apply false + id 'io.spring.dependency-management' version '1.0.7.RELEASE' } sourceCompatibility = 1.8 From 2a0c2355c8dcf17b11b83c05f9fd0d87ce71aa62 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Tue, 16 Jul 2019 18:39:28 +0000 Subject: [PATCH 06/25] gradle.properties edited online with Bitbucket --- gradle.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle.properties b/gradle.properties index 2d38c703f..e7dfdbe5a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,3 +18,4 @@ i2.github.token= i2.github.owner=TIER i2.github.repo=shib-idp-ui i2.github.apiEndpoint=https://github.internet2.edu/api/v3 + From 1b35b7077ca38de79cb94add61601b5bfd3e5ddb Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Wed, 17 Jul 2019 10:07:00 -0400 Subject: [PATCH 07/25] Fix test --- .../admin/ui/repository/EntityDescriptorRepositoryTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy index 741df5ac5..9719ada72 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy @@ -29,7 +29,7 @@ import javax.persistence.EntityManager * A highly unnecessary test so that I can check to make sure that persistence is correct for the model */ @DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, InternationalizationConfiguration]) +@ContextConfiguration(classes=[CoreShibUiConfiguration, InternationalizationConfiguration, Config]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) From 2caecebd15529a1ad57a73301047b77c1aabcdd8 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 22 Jul 2019 16:34:05 -0400 Subject: [PATCH 08/25] Fix audit date logic for later versions of Spring Boot 2.x --- .../ui/service/envers/EnversVersioningMetadataTests.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy index 9eed8e2bc..3bc1a2f98 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy @@ -60,9 +60,9 @@ class EnversVersioningMetadataTests extends Specification { then: mrVersions[0].creator == mr.createdBy - mrVersions[0].date == mr.createdDateAsZonedDateTime() + mrVersions[0].date == mr.modifiedDateAsZonedDateTime() edVersions[0].creator == ed.createdBy - edVersions[0].date == ed.createdDateAsZonedDateTime() + edVersions[0].date == ed.modifiedDateAsZonedDateTime() when: 'new version due to update' mr.name = 'UPDATED' From f7ffa8dd4d6236a6f34685d3cfc71274db9a9a2e Mon Sep 17 00:00:00 2001 From: Jj! Date: Tue, 6 Aug 2019 16:01:53 -0500 Subject: [PATCH 09/25] [SHIBUI-1317] merge and clean build.gradle --- backend/build.gradle | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index 2570b8693..805bc841b 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -55,13 +55,19 @@ sourceSets { java { srcDirs = [] } + resources { + srcDir new File(buildDir, 'generated/ui') + } } integrationTest { groovy { srcDirs = ['src/integration/groovy'] + compileClasspath += main.output + runtimeClasspath += main.output } resources { srcDir 'src/integration/resources' + srcDir new File(buildDir, 'generated/ui') } } @@ -220,31 +226,6 @@ dependencies { enversTestRuntime configurations.testRuntime } -sourceSets { - main { - groovy { - srcDirs = ['src/main/groovy', 'src/main/java', generatedSrcDir] - } - java { - srcDirs = [] - } - resources { - srcDir new File(buildDir, 'generated/ui') - } - } - integrationTest { - groovy { - srcDirs = ['src/integration/groovy'] - compileClasspath += main.output - runtimeClasspath += main.output - } - resources { - srcDir 'src/integration/resources' - srcDir new File(buildDir, 'generated/ui') - } - } -} - task copyUI(type: Copy) { from tasks.findByPath(':ui:npm_run_buildProd').outputs into new File(buildDir, 'generated/ui/static') From 866959511fe4d0e1017044dadb6a4ac3d8bec4d3 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 4 Feb 2021 13:44:23 -0500 Subject: [PATCH 10/25] wip --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 83cd0f86d..71b9f0b2b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ name=shibui group=edu.internet2.tier.shibboleth.admin.ui -version=1.8.0-RC1-SNAPSHOT +version=2.0.0-RC1-SNAPSHOT shibboleth.version=3.4.4 opensaml.version=3.4.3 From f456dfb61c73448e271e3cf4bddacd29b753eb67 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 4 Feb 2021 15:44:32 -0500 Subject: [PATCH 11/25] SHIBUI-1724 WIP --- backend/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 81ea10e80..e040917f3 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -4,7 +4,7 @@ # Logging Configuration #logging.config=classpath:log4j2.xml -#logging.level.org.springframework.security=INFO +#logging.level.org.springframework.security=DEBUG logging.level.org.springframework=INFO logging.level.edu.internet2.tier.shibboleth.admin.ui=INFO From 46205a117f7beb6b0c337929c853980eea6e71e4 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 4 Feb 2021 15:55:12 -0500 Subject: [PATCH 12/25] SHIBUI-1724 WIP --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 050e01025..eb7935285 100644 --- a/.gitignore +++ b/.gitignore @@ -394,4 +394,7 @@ rinteg #Local run with durable H2 shell script wrapper **/application-h2durable.properties -rdurable \ No newline at end of file +rdurable + +#Local build with no tests script wrapper +build-no-tests From 8aec4da081e5180183ff06e3338a82b7154b6b1d Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 4 Feb 2021 16:22:36 -0500 Subject: [PATCH 13/25] wip1 --- backend/build.gradle | 14 +++++++------- beacon/build.gradle | 2 +- beacon/spring/build.gradle | 4 ++-- pac4j-module/build.gradle | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index a6c3f2dc8..77ec52afc 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -11,8 +11,8 @@ plugins { apply plugin: 'io.spring.dependency-management' apply plugin: 'jacoco' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 repositories { jcenter() @@ -152,7 +152,7 @@ dependencies { //For easy data mocking capabilities compile 'net.andreinc.mockneat:mockneat:0.1.4' - compile 'org.codehaus.groovy:groovy-all:2.4.15' + compile 'org.codehaus.groovy:groovy-all:3.0.7' //So it works on Java 9 without explicitly requiring to load that module (needed by Hibernate) runtimeOnly 'javax.xml.bind:jaxb-api:2.3.0' @@ -170,8 +170,8 @@ dependencies { testCompile "org.springframework.boot:spring-boot-starter-test" testCompile "org.springframework.security:spring-security-test" - testCompile "org.spockframework:spock-core:1.1-groovy-2.4" - testCompile "org.spockframework:spock-spring:1.1-groovy-2.4" + testCompile "org.spockframework:spock-core:2.0-groovy-3.0-SNAPSHOT" + testCompile "org.spockframework:spock-spring:2.0-groovy-3.0-SNAPSHOT" testCompile "org.xmlunit:xmlunit-core:2.5.1" testRuntime 'cglib:cglib-nodep:3.2.5' @@ -191,8 +191,8 @@ dependencies { integrationTestCompile 'jp.vmi:selenese-runner-java:3.20.0' integrationTestCompile "org.springframework.boot:spring-boot-starter-test" integrationTestCompile "org.springframework.security:spring-security-test" - integrationTestCompile "org.spockframework:spock-core:1.1-groovy-2.4" - integrationTestCompile "org.spockframework:spock-spring:1.1-groovy-2.4" + integrationTestCompile "org.spockframework:spock-core:2.0-groovy-3.0-SNAPSHOT" + integrationTestCompile "org.spockframework:spock-spring:2.0-groovy-3.0-SNAPSHOT" // CSV file support compile 'com.opencsv:opencsv:4.4' diff --git a/beacon/build.gradle b/beacon/build.gradle index a0d845ead..e38845294 100644 --- a/beacon/build.gradle +++ b/beacon/build.gradle @@ -1,4 +1,4 @@ allprojects { group = 'edu.internet2.tap.beacon' - version = '1.0.0-SNAPSHOT' + version = '1.0.0' } \ No newline at end of file diff --git a/beacon/spring/build.gradle b/beacon/spring/build.gradle index bb895f0e6..61ab07be5 100644 --- a/beacon/spring/build.gradle +++ b/beacon/spring/build.gradle @@ -6,8 +6,8 @@ plugins { } apply plugin: 'java' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 repositories { jcenter() diff --git a/pac4j-module/build.gradle b/pac4j-module/build.gradle index 1e4a304ee..9e3a69da9 100644 --- a/pac4j-module/build.gradle +++ b/pac4j-module/build.gradle @@ -5,8 +5,8 @@ plugins { id 'io.spring.dependency-management' version '1.0.7.RELEASE' } -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 repositories { jcenter() @@ -34,8 +34,8 @@ dependencies { testCompile project(':backend') testCompile "org.springframework.boot:spring-boot-starter-test" - testCompile "org.spockframework:spock-core:1.1-groovy-2.4" - testCompile "org.spockframework:spock-spring:1.1-groovy-2.4" + testCompile "org.spockframework:spock-core:2.0-groovy-3.0-SNAPSHOT" + testCompile "org.spockframework:spock-spring:2.0-groovy-3.0-SNAPSHOT" annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" } \ No newline at end of file From d227d57fd1808b213e4dee16d6b4648aac3cc280 Mon Sep 17 00:00:00 2001 From: Shad Vider Date: Tue, 9 Feb 2021 12:16:07 -0700 Subject: [PATCH 14/25] updated to gradle 6.8.2, and updated necessary build.gradle files --- backend/build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- pac4j-module/build.gradle | 6 +++--- ui/build.gradle | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index 77ec52afc..d49e8817b 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -170,8 +170,8 @@ dependencies { testCompile "org.springframework.boot:spring-boot-starter-test" testCompile "org.springframework.security:spring-security-test" - testCompile "org.spockframework:spock-core:2.0-groovy-3.0-SNAPSHOT" - testCompile "org.spockframework:spock-spring:2.0-groovy-3.0-SNAPSHOT" + testCompile "org.spockframework:spock-core:1.3-groovy-2.5" + testCompile "org.spockframework:spock-spring:1.3-groovy-2.5" testCompile "org.xmlunit:xmlunit-core:2.5.1" testRuntime 'cglib:cglib-nodep:3.2.5' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f4d7b2bf6..2a563242c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/pac4j-module/build.gradle b/pac4j-module/build.gradle index 9e3a69da9..2d952a4c8 100644 --- a/pac4j-module/build.gradle +++ b/pac4j-module/build.gradle @@ -34,8 +34,8 @@ dependencies { testCompile project(':backend') testCompile "org.springframework.boot:spring-boot-starter-test" - testCompile "org.spockframework:spock-core:2.0-groovy-3.0-SNAPSHOT" - testCompile "org.spockframework:spock-spring:2.0-groovy-3.0-SNAPSHOT" + testCompile "org.spockframework:spock-core:1.3-groovy-2.5" + testCompile "org.spockframework:spock-spring:1.3-groovy-2.5" annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" -} \ No newline at end of file +} diff --git a/ui/build.gradle b/ui/build.gradle index 64fe2e561..34827354e 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -1,6 +1,6 @@ plugins { id 'base' - id 'com.moowork.node' version '1.3.1' + id 'com.github.node-gradle.node' version '2.2.4' } node { From 7ddfbd664590129a782508dbb0662fc103faa00c Mon Sep 17 00:00:00 2001 From: Shad Vider Date: Fri, 12 Feb 2021 10:43:43 -0700 Subject: [PATCH 15/25] WIP - updating spring boot to 2.4.2 --- backend/build.gradle | 8 ++++---- beacon/core/build.gradle | 12 ++++++------ gradle.properties | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index d49e8817b..08583ffc4 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -1,7 +1,7 @@ plugins { id 'groovy' id 'war' - id 'org.springframework.boot' version '2.1.5.RELEASE' + id 'org.springframework.boot' version '2.4.2' id 'com.gorylenko.gradle-git-properties' version '1.4.21' id 'io.franzbecker.gradle-lombok' version '1.13' id 'com.palantir.docker' version '0.20.1' @@ -132,7 +132,7 @@ dependencies { } // spring boot auto-config starters - ['starter-web', 'starter-data-jpa', 'starter-security', 'starter-actuator', 'devtools', 'starter-webflux', 'starter-thymeleaf', 'starter-mail'].each { + ['starter-web', 'starter-data-jpa', 'starter-security', 'starter-actuator', 'devtools', 'starter-webflux', 'starter-thymeleaf', 'starter-mail', 'starter-validation'].each { compile "org.springframework.boot:spring-boot-${it}" } // TODO: figure out what this should really be @@ -191,8 +191,8 @@ dependencies { integrationTestCompile 'jp.vmi:selenese-runner-java:3.20.0' integrationTestCompile "org.springframework.boot:spring-boot-starter-test" integrationTestCompile "org.springframework.security:spring-security-test" - integrationTestCompile "org.spockframework:spock-core:2.0-groovy-3.0-SNAPSHOT" - integrationTestCompile "org.spockframework:spock-spring:2.0-groovy-3.0-SNAPSHOT" + integrationTestCompile "org.spockframework:spock-core:1.3-groovy-2.5" + integrationTestCompile "org.spockframework:spock-spring:1.3-groovy-2.5" // CSV file support compile 'com.opencsv:opencsv:4.4' diff --git a/beacon/core/build.gradle b/beacon/core/build.gradle index 5c9689ebd..c80df0931 100644 --- a/beacon/core/build.gradle +++ b/beacon/core/build.gradle @@ -1,13 +1,13 @@ import org.springframework.boot.gradle.plugin.SpringBootPlugin plugins { - id 'org.springframework.boot' version '2.0.0.RELEASE' apply false + id 'org.springframework.boot' version '2.4.2' apply false id 'io.spring.dependency-management' version '1.0.6.RELEASE' } apply plugin: 'groovy' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 repositories { jcenter() @@ -21,8 +21,8 @@ dependencyManagement { dependencies { testCompile "org.springframework.boot:spring-boot-starter-test" - testCompile "org.spockframework:spock-core:1.1-groovy-2.4" - testCompile "org.spockframework:spock-spring:1.1-groovy-2.4" + testCompile "org.spockframework:spock-core:1.3-groovy-2.5" + testCompile "org.spockframework:spock-spring:1.3-groovy-2.5" testCompile 'org.junit.jupiter:junit-jupiter-api:5.5.2' testCompile 'org.junit.jupiter:junit-jupiter-engine:5.5.2' @@ -30,4 +30,4 @@ dependencies { jar { archiveName = "beacon-core-${version}.jar" -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index 71b9f0b2b..779b57b73 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ version=2.0.0-RC1-SNAPSHOT shibboleth.version=3.4.4 opensaml.version=3.4.3 -spring-boot.version=2.1.5.RELEASE +spring-boot.version=2.4.2 hibernate.version=5.3.14.Final From db59610947bdb43f9e90e4a61e54f6a036515eaf Mon Sep 17 00:00:00 2001 From: Jj! Date: Fri, 12 Feb 2021 17:00:30 -0600 Subject: [PATCH 16/25] [SHIBUI-1724] changing media types to new version --- .../configuration/auto/WebSecurityConfig.java | 2 -- .../controller/EntitiesControllerTests.groovy | 2 +- .../EntityDescriptorControllerTests.groovy | 22 +++++++++---------- .../EntityIdsSearchControllerTests.groovy | 14 ++++++------ .../MetadataFiltersControllerTests.groovy | 12 +++++----- .../UsersControllerIntegrationTests.groovy | 16 +++++++------- 6 files changed, 33 insertions(+), 35 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java index b24cad7c2..f9a256b62 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -34,7 +33,6 @@ * Workaround for slashes in URL from [https://stackoverflow.com/questions/48453980/spring-5-0-3-requestrejectedexception-the-request-was-rejected-because-the-url] */ @Configuration -@AutoConfigureBefore(SpringBootWebSecurityConfiguration.class) @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) public class WebSecurityConfig { diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerTests.groovy index 30117bc14..ea265d46d 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerTests.groovy @@ -104,7 +104,7 @@ class EntitiesControllerTests extends Specification { then: def x = content() result.andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(content().json(expectedBody, false)) } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy index bf3778fbb..ed721055a 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy @@ -102,7 +102,7 @@ class EntityDescriptorControllerTests extends Specification { userRepository.findByUsername(username) >> TestHelpers.generateOptionalUser(username, role) def emptyRecordsFromRepository = [].stream() def expectedEmptyListResponseBody = '[]' - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedHttpResponseStatus = status().isOk() when: @@ -153,7 +153,7 @@ class EntityDescriptorControllerTests extends Specification { ] """ - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedHttpResponseStatus = status().isOk() when: @@ -229,7 +229,7 @@ class EntityDescriptorControllerTests extends Specification { ] """ - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedHttpResponseStatus = status().isOk() when: @@ -282,7 +282,7 @@ class EntityDescriptorControllerTests extends Specification { ] """ - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedHttpResponseStatus = status().isOk() when: @@ -361,7 +361,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( post('/api/EntityDescriptor') - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -413,7 +413,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( post('/api/EntityDescriptor') - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -449,7 +449,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( post('/api/EntityDescriptor') - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -933,7 +933,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( put("/api/EntityDescriptor/$resourceId") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -966,7 +966,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( put("/api/EntityDescriptor/$resourceId") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -992,7 +992,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( put("/api/EntityDescriptor/$resourceId") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -1018,7 +1018,7 @@ class EntityDescriptorControllerTests extends Specification { when: def result = mockMvc.perform( put("/api/EntityDescriptor/$resourceId") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityIdsSearchControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityIdsSearchControllerTests.groovy index 77ea5ddd0..f452c769a 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityIdsSearchControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityIdsSearchControllerTests.groovy @@ -6,7 +6,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders import spock.lang.Specification import spock.lang.Subject -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 +import static org.springframework.http.MediaType.APPLICATION_JSON import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status @@ -36,7 +36,7 @@ class EntityIdsSearchControllerTests extends Specification { def limitValue = "5" def expectedEntityIdsFromSearchService = new EntityIdsSearchResultRepresentation(["http://unicon.instructure.com/saml2", "https://idp.unicon.net/idp/shibboleth"]) def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedResponseBody = """ { "entityIds":[ @@ -66,7 +66,7 @@ class EntityIdsSearchControllerTests extends Specification { def limitValue = "1" def expectedEntityIdsFromSearchService = new EntityIdsSearchResultRepresentation(["http://unicon.instructure.com/saml2"]) def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedResponseBody = """ { "entityIds":[ @@ -104,7 +104,7 @@ class EntityIdsSearchControllerTests extends Specification { "https://shibbox.lpplus.net/shibboleth", "https://shibsp.amherst.edu/shibboleth"]) def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedResponseBody = """ { "entityIds":[ @@ -141,7 +141,7 @@ class EntityIdsSearchControllerTests extends Specification { def limitValue = "5" def expectedEntityIdsFromSearchService = new EntityIdsSearchResultRepresentation([]) def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedResponseBody = """ { "entityIds":[] @@ -168,7 +168,7 @@ class EntityIdsSearchControllerTests extends Specification { def limitValue = NO_LIMIT def expectedEntityIdsFromSearchService = new EntityIdsSearchResultRepresentation([]) def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON def expectedResponseBody = """ { "entityIds":[] @@ -188,4 +188,4 @@ class EntityIdsSearchControllerTests extends Specification { .andExpect(content().contentType(expectedResponseContentType)) .andExpect(content().json(expectedResponseBody, true)) } -} \ No newline at end of file +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy index 16ab5f6e0..280294aa1 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy @@ -31,7 +31,7 @@ import spock.lang.Specification import spock.lang.Unroll import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 +import static org.springframework.http.MediaType.APPLICATION_JSON import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* @@ -106,7 +106,7 @@ class MetadataFiltersControllerTests extends Specification { 1 * metadataResolverRepository.findByResourceId(_) >> metadataResolver def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON when: def result = mockMvc.perform(get("$BASE_URI/foo/Filters")) @@ -127,7 +127,7 @@ class MetadataFiltersControllerTests extends Specification { def expectedResourceId = expectedFilter.resourceId def expectedHttpResponseStatus = status().isOk() - def expectedResponseContentType = APPLICATION_JSON_UTF8 + def expectedResponseContentType = APPLICATION_JSON when: def result = mockMvc.perform(get("$BASE_URI/foo/Filters/$expectedResourceId")) @@ -163,7 +163,7 @@ class MetadataFiltersControllerTests extends Specification { when: def result = mockMvc.perform( post("$BASE_URI/foo/Filters") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -208,7 +208,7 @@ class MetadataFiltersControllerTests extends Specification { when: def result = mockMvc.perform( put("$BASE_URI/foo/Filters/$filterUUID") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: @@ -245,7 +245,7 @@ class MetadataFiltersControllerTests extends Specification { when: def result = mockMvc.perform( put("$BASE_URI/foo/Filters/$filterUUID") - .contentType(APPLICATION_JSON_UTF8) + .contentType(APPLICATION_JSON) .content(postedJsonBody)) then: diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy index b50495b47..5ecb34dc0 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy @@ -83,7 +83,7 @@ class UsersControllerIntegrationTests extends Specification { then: 'Request completed with HTTP 200 and returned a list of users' result .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(content().json(expectedJson, false)) } @@ -106,7 +106,7 @@ class UsersControllerIntegrationTests extends Specification { then: 'Request completed with HTTP 200 and returned one user' result .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(content().json(expectedJson, false)) } @@ -156,7 +156,7 @@ class UsersControllerIntegrationTests extends Specification { when: def result = mockMvc.perform(post(RESOURCE_URI) - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(JsonOutput.toJson(newUser)) .accept(MediaType.APPLICATION_JSON)) @@ -177,11 +177,11 @@ class UsersControllerIntegrationTests extends Specification { when: mockMvc.perform(post(RESOURCE_URI) - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(JsonOutput.toJson(newUser)) .accept(MediaType.APPLICATION_JSON)) def result = mockMvc.perform(post(RESOURCE_URI) - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(JsonOutput.toJson(newUser)) .accept(MediaType.APPLICATION_JSON)) @@ -202,7 +202,7 @@ class UsersControllerIntegrationTests extends Specification { when: def result = mockMvc.perform(post(RESOURCE_URI) - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(JsonOutput.toJson(newUser)) .accept(MediaType.APPLICATION_JSON)) @@ -212,7 +212,7 @@ class UsersControllerIntegrationTests extends Specification { when: newUser['firstName'] = 'Bob' result = mockMvc.perform(patch("$RESOURCE_URI/$newUser.username") - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(JsonOutput.toJson(newUser)) .accept(MediaType.APPLICATION_JSON)) @@ -232,7 +232,7 @@ class UsersControllerIntegrationTests extends Specification { when: def result = mockMvc.perform(patch("$RESOURCE_URI/$newUser.username") - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(JsonOutput.toJson(newUser))) then: From 8786156ff60a89059c8041ce2fabc48b9207dd4f Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 22 Feb 2021 09:33:55 -0500 Subject: [PATCH 17/25] Boot 2.4 wip --- ...tityDescriptorEnversVersioningTests.groovy | 3 + .../resources/application.properties | 104 ++++++++++++++++++ .../src/main/resources/application.properties | 2 +- ui/package-lock.json | 6 +- 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 backend/src/enversTest/resources/application.properties diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy index b7f31270a..03bfe5661 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy @@ -44,9 +44,11 @@ import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorReposit import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest import org.springframework.data.jpa.repository.config.EnableJpaRepositories import org.springframework.test.context.ContextConfiguration +import org.springframework.test.context.TestPropertySource import org.springframework.transaction.PlatformTransactionManager import spock.lang.Specification @@ -64,6 +66,7 @@ import static edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTes @ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, SearchConfiguration, TestConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) class EntityDescriptorEnversVersioningTests extends Specification { @Autowired diff --git a/backend/src/enversTest/resources/application.properties b/backend/src/enversTest/resources/application.properties new file mode 100644 index 000000000..4d88d62df --- /dev/null +++ b/backend/src/enversTest/resources/application.properties @@ -0,0 +1,104 @@ +# Server Configuration +#server.port=8080 + +# Logging Configuration +#logging.config=classpath:log4j2.xml + +#logging.level.org.springframework.security=DEBUG +logging.level.org.springframework=INFO +logging.level.edu.internet2.tier.shibboleth.admin.ui=INFO + +spring.main.allow-bean-definition-overriding=true + +# Database Credentials +spring.datasource.username=shibui +spring.datasource.password=shibui + +# Database Configuration H2 +spring.datasource.url=jdbc:h2:mem:shibui;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.platform=h2 +spring.datasource.driverClassName=org.h2.Driver +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.h2.console.enabled=true + +# spring.jackson.default-property-inclusion=non_absent +spring.jackson.default-property-inclusion=NON_NULL + +# Database Configuration PostgreSQL +#spring.datasource.url=jdbc:postgresql://localhost:5432/shibui +#spring.datasource.driverClassName=org.postgresql.Driver +#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +#Maria/MySQL DB +#spring.datasource.url=jdbc:mariadb://localhost:3306/shibui +#spring.datasource.driverClassName=org.mariadb.jdbc.Driver +#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect + +# Liquibase properties +spring.liquibase.enabled=false +#spring.liquibase.change-log=classpath:edu/internet2/tier/shibboleth/admin/ui/database/masterchangelog.xml + +# Hibernate properties +# for production never ever use create, create-drop. It's BEST to use validate +spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl +spring.jpa.show-sql=false +spring.jpa.properties.hibernate.format_sql=false + +spring.jpa.hibernate.use-new-id-generator-mappings=true + +#Envers versioning +spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true + +# Set the following property to periodically write out the generated metadata files. There is no default value; the following is just an example +# shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated +shibui.logout-url=/dashboard + +# spring.profiles.active=default + +#shibui.default-password= + +shibui.metadata-sources-ui-schema-location=classpath:metadata-sources-ui-schema.json +shibui.entity-attributes-filters-ui-schema-location=classpath:entity-attributes-filters-ui-schema.json +shibui.nameid-filter-ui-schema-location=classpath:nameid-filter.schema.json + +#Actuator endpoints (info) +# Un-comment to get full git details exposed like author, abbreviated SHA-1, commit message +#management.info.git.mode=full + +### +# metadata-providers.xml write configuration + +# Set the following property to periodically write out metadata providers configuration. There is no default value; the following is just an example +# shibui.metadataProviders.target=file:/opt/shibboleth-idp/conf/shibui-metadata-providers.xml +# shibui.metadataProviders.taskRunRate=30000 + +# Email configuration (local mailhog) +# spring.mail.host=mailhog +# spring.mail.port=1025 +# spring.mail.username=username +# spring.mail.password=password +# spring.mail.properties.mail.smtp.auth=false +# spring.mail.properties.mail.smtp.starttls.enable=false + +shibui.mail.text-email-template-path-prefix=/mail/text/ +shibui.mail.html.email-template-path-prefix=/mail/html/ +shibui.mail.system-email-address=doNotReply@shibui.org + +shibui.roles=ROLE_ADMIN,ROLE_USER,ROLE_NONE + +#In order to enable authentication via configured pac4j library (with external SAMl Idp, for example) +#This property must be set to true and pac4j properties configured. For sample pac4j properties, see application.yml +#for an example pac4j configuration +#shibui.pac4j-enabled=true + +#This property must be set to true in order to enable posting stats to beacon endpoint. Furthermore, appropriate +#environment variables must be set for beacon publisher to be used (the ones that are set when running shib-ui in +#docker container +shibui.beacon-enabled=true + + + + + +spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index e040917f3..fd85c0aee 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -95,4 +95,4 @@ shibui.roles=ROLE_ADMIN,ROLE_USER,ROLE_NONE #This property must be set to true in order to enable posting stats to beacon endpoint. Furthermore, appropriate #environment variables must be set for beacon publisher to be used (the ones that are set when running shib-ui in #docker container -shibui.beacon-enabled=true \ No newline at end of file +shibui.beacon-enabled=true diff --git a/ui/package-lock.json b/ui/package-lock.json index 922d700dd..421964f7a 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -4989,7 +4989,8 @@ }, "kind-of": { "version": "6.0.2", - "resolved": "", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } @@ -17186,7 +17187,8 @@ }, "kind-of": { "version": "6.0.2", - "resolved": "", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } From 2158e0a5e81e486f388ae36d694be21cb8d78b92 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 22 Feb 2021 10:07:28 -0500 Subject: [PATCH 18/25] WIP1 --- ...tityDescriptorEnversVersioningTests.groovy | 1 - .../resources/application.properties | 102 +----------------- .../src/main/resources/application.properties | 4 +- 3 files changed, 4 insertions(+), 103 deletions(-) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy index 03bfe5661..034b0a67c 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy @@ -66,7 +66,6 @@ import static edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTes @ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, SearchConfiguration, TestConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) class EntityDescriptorEnversVersioningTests extends Specification { @Autowired diff --git a/backend/src/enversTest/resources/application.properties b/backend/src/enversTest/resources/application.properties index 4d88d62df..5e1533c70 100644 --- a/backend/src/enversTest/resources/application.properties +++ b/backend/src/enversTest/resources/application.properties @@ -1,104 +1,4 @@ -# Server Configuration -#server.port=8080 - -# Logging Configuration -#logging.config=classpath:log4j2.xml - -#logging.level.org.springframework.security=DEBUG -logging.level.org.springframework=INFO -logging.level.edu.internet2.tier.shibboleth.admin.ui=INFO - -spring.main.allow-bean-definition-overriding=true - -# Database Credentials -spring.datasource.username=shibui -spring.datasource.password=shibui - -# Database Configuration H2 -spring.datasource.url=jdbc:h2:mem:shibui;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.platform=h2 -spring.datasource.driverClassName=org.h2.Driver -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.h2.console.enabled=true - -# spring.jackson.default-property-inclusion=non_absent -spring.jackson.default-property-inclusion=NON_NULL - -# Database Configuration PostgreSQL -#spring.datasource.url=jdbc:postgresql://localhost:5432/shibui -#spring.datasource.driverClassName=org.postgresql.Driver -#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect - -#Maria/MySQL DB -#spring.datasource.url=jdbc:mariadb://localhost:3306/shibui -#spring.datasource.driverClassName=org.mariadb.jdbc.Driver -#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect - -# Liquibase properties spring.liquibase.enabled=false -#spring.liquibase.change-log=classpath:edu/internet2/tier/shibboleth/admin/ui/database/masterchangelog.xml - -# Hibernate properties -# for production never ever use create, create-drop. It's BEST to use validate -spring.jpa.hibernate.ddl-auto=update -spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl -spring.jpa.show-sql=false -spring.jpa.properties.hibernate.format_sql=false - -spring.jpa.hibernate.use-new-id-generator-mappings=true - -#Envers versioning -spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true - -# Set the following property to periodically write out the generated metadata files. There is no default value; the following is just an example -# shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated -shibui.logout-url=/dashboard - -# spring.profiles.active=default - -#shibui.default-password= - -shibui.metadata-sources-ui-schema-location=classpath:metadata-sources-ui-schema.json -shibui.entity-attributes-filters-ui-schema-location=classpath:entity-attributes-filters-ui-schema.json -shibui.nameid-filter-ui-schema-location=classpath:nameid-filter.schema.json - -#Actuator endpoints (info) -# Un-comment to get full git details exposed like author, abbreviated SHA-1, commit message -#management.info.git.mode=full - -### -# metadata-providers.xml write configuration - -# Set the following property to periodically write out metadata providers configuration. There is no default value; the following is just an example -# shibui.metadataProviders.target=file:/opt/shibboleth-idp/conf/shibui-metadata-providers.xml -# shibui.metadataProviders.taskRunRate=30000 - -# Email configuration (local mailhog) -# spring.mail.host=mailhog -# spring.mail.port=1025 -# spring.mail.username=username -# spring.mail.password=password -# spring.mail.properties.mail.smtp.auth=false -# spring.mail.properties.mail.smtp.starttls.enable=false - -shibui.mail.text-email-template-path-prefix=/mail/text/ -shibui.mail.html.email-template-path-prefix=/mail/html/ -shibui.mail.system-email-address=doNotReply@shibui.org - -shibui.roles=ROLE_ADMIN,ROLE_USER,ROLE_NONE - -#In order to enable authentication via configured pac4j library (with external SAMl Idp, for example) -#This property must be set to true and pac4j properties configured. For sample pac4j properties, see application.yml -#for an example pac4j configuration -#shibui.pac4j-enabled=true - -#This property must be set to true in order to enable posting stats to beacon endpoint. Furthermore, appropriate -#environment variables must be set for beacon publisher to be used (the ones that are set when running shib-ui in -#docker container -shibui.beacon-enabled=true - - - - +#Needed in the latest versions of Spring Boot when doing manual transaction management like we do in envers versioning code spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index fd85c0aee..390a99981 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -36,7 +36,6 @@ spring.jackson.default-property-inclusion=NON_NULL # Liquibase properties spring.liquibase.enabled=false -#spring.liquibase.change-log=classpath:edu/internet2/tier/shibboleth/admin/ui/database/masterchangelog.xml # Hibernate properties # for production never ever use create, create-drop. It's BEST to use validate @@ -50,6 +49,9 @@ spring.jpa.hibernate.use-new-id-generator-mappings=true #Envers versioning spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true +#Needed in the latest versions of Spring Boot when doing manual transaction management like we do in envers versioning code +spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext + # Set the following property to periodically write out the generated metadata files. There is no default value; the following is just an example # shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated shibui.logout-url=/dashboard From 867c5407acadf7622376133105d36d65b316dfea Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 22 Feb 2021 14:37:03 -0500 Subject: [PATCH 19/25] WIP2 --- .gitignore | 2 ++ ...rControllerVersionEndpointsIntegrationTests.groovy | 5 ++--- .../src/enversTest/resources/application.properties | 2 ++ ...yDescriptorSchemaValidatingControllerAdvice.groovy | 2 +- .../EntitiesControllerIntegrationTests.groovy | 11 ++++++++++- .../configuration/BeaconPublishingConfiguration.java | 2 +- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index eb7935285..76178c9b0 100644 --- a/.gitignore +++ b/.gitignore @@ -398,3 +398,5 @@ rdurable #Local build with no tests script wrapper build-no-tests + +beacon/spring/out diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index 82b143c00..9bdd25a6c 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -111,7 +111,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi edv2.body.serviceProviderName == 'SP2' } - @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) + //@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) def 'SHIBUI-1414'() { given: def ed = new EntityDescriptor(entityID: 'testme', serviceProviderName: 'testme').with { @@ -125,7 +125,6 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi }) entityDescriptorRepository.save(it) } - when: def headers = new HttpHeaders().with { it.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) @@ -133,7 +132,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi } def allVersions = getAllEntityDescriptorVersions(ed.resourceId, List) - def edv1 = getEntityDescriptorForVersion(ed.resourceId, allVersions.body[0].id, String).body + String edv1 = getEntityDescriptorForVersion(ed.resourceId, allVersions.body[0].id, String).body def tedv2 = getEntityDescriptorForVersion(ed.resourceId, allVersions.body[1].id, EntityDescriptorRepresentation).body def aedv1 = new JsonSlurper().parseText(edv1).with { diff --git a/backend/src/enversTest/resources/application.properties b/backend/src/enversTest/resources/application.properties index 5e1533c70..1484db691 100644 --- a/backend/src/enversTest/resources/application.properties +++ b/backend/src/enversTest/resources/application.properties @@ -1,3 +1,5 @@ +spring.main.allow-bean-definition-overriding=true + spring.liquibase.enabled=false #Needed in the latest versions of Spring Boot when doing manual transaction management like we do in envers versioning code diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy index f25950256..3b12c6c85 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy @@ -21,7 +21,7 @@ import static edu.internet2.tier.shibboleth.admin.ui.jsonschema.LowLevelJsonSche * * @author Dmitriy Kopylenko */ -@ControllerAdvice +//@ControllerAdvice class EntityDescriptorSchemaValidatingControllerAdvice extends RequestBodyAdviceAdapter { @Autowired diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy index d8d9e7afb..3108db5c5 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy @@ -17,6 +17,7 @@ import org.springframework.core.io.ClassPathResource import org.springframework.test.context.ActiveProfiles import org.springframework.test.web.reactive.server.WebTestClient import org.springframework.test.web.servlet.result.MockMvcResultHandlers +import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.util.DefaultUriBuilderFactory import org.xmlunit.builder.DiffBuilder import org.xmlunit.builder.Input @@ -35,7 +36,11 @@ class EntitiesControllerIntegrationTests extends Specification { private WebTestClient webClient def setup() { + //DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory() + //factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE) + // yeah, don't ask... this is just shenanigans + this.webClient = WebTestClient.builder().uriBuilderFactory(factory).build() this.webClient.webClient.uriBuilderFactory.encodingMode = DefaultUriBuilderFactory.EncodingMode.NONE } @@ -60,7 +65,11 @@ class EntitiesControllerIntegrationTests extends Specification { when: def result = this.webClient .get() - .uri("/api/entities/http%3A%2F%2Ftest.scaldingspoon.org%2Ftest1") + .uri { + it.path("/api/entities/http%3A%2F%2Ftest.scaldingspoon.org%2Ftest1") + it.build() + } + //.uri("/api/entities/http%3A%2F%2Ftest.scaldingspoon.org%2Ftest1") .exchange() // someday, I'd like to know why IntelliJ "cannot resolve symbol 'exchange'" then: diff --git a/beacon/spring/src/main/java/edu/internet2/tap/beacon/configuration/BeaconPublishingConfiguration.java b/beacon/spring/src/main/java/edu/internet2/tap/beacon/configuration/BeaconPublishingConfiguration.java index 79e073641..f0324bacd 100644 --- a/beacon/spring/src/main/java/edu/internet2/tap/beacon/configuration/BeaconPublishingConfiguration.java +++ b/beacon/spring/src/main/java/edu/internet2/tap/beacon/configuration/BeaconPublishingConfiguration.java @@ -49,7 +49,7 @@ public BeaconPublishingTask(DefaultBeaconPublisher beaconPublisher) { } //Cron is based on the spec defined here: https://spaces.at.internet2.edu/display/TWGH/TIER+Instrumentation+-+The+TIER+Beacon - @Scheduled(cron = "0 ${random.int[0,59]} ${random.int[0,3]} ? * *}") + @Scheduled(cron = "0 ${random.int[0,59]} ${random.int[0,3]} ? * *") @Async void publish() { logger.debug("Publishing payload: {} to beacon endpoint: {}", From f8f58f6898d80f9e9708d7e75eaa5aa74199efe5 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 22 Feb 2021 16:27:02 -0500 Subject: [PATCH 20/25] Boot upgrade wip --- .../EntitiesControllerIntegrationTests.groovy | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy index 3108db5c5..0fa9084e2 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy @@ -35,14 +35,14 @@ class EntitiesControllerIntegrationTests extends Specification { @Autowired private WebTestClient webClient - def setup() { + /*def setup() { //DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory() //factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE) // yeah, don't ask... this is just shenanigans this.webClient = WebTestClient.builder().uriBuilderFactory(factory).build() this.webClient.webClient.uriBuilderFactory.encodingMode = DefaultUriBuilderFactory.EncodingMode.NONE - } + }*/ def "GET /api/entities returns the proper json"() { given: @@ -65,11 +65,7 @@ class EntitiesControllerIntegrationTests extends Specification { when: def result = this.webClient .get() - .uri { - it.path("/api/entities/http%3A%2F%2Ftest.scaldingspoon.org%2Ftest1") - it.build() - } - //.uri("/api/entities/http%3A%2F%2Ftest.scaldingspoon.org%2Ftest1") + .uri("/api/entities/http%3A%2F%2Ftest.scaldingspoon.org%2Ftest1") .exchange() // someday, I'd like to know why IntelliJ "cannot resolve symbol 'exchange'" then: From 368f8acf9ec6f0b05341f72bf4406a3cf6524d93 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 22 Feb 2021 17:00:45 -0500 Subject: [PATCH 21/25] Spring Boot upgrade wip --- .../admin/ui/configuration/auto/WebSecurityConfig.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java index f9a256b62..cc6847621 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/auto/WebSecurityConfig.java @@ -21,6 +21,7 @@ import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; +import org.springframework.security.web.firewall.DefaultHttpFirewall; import org.springframework.security.web.firewall.HttpFirewall; import org.springframework.security.web.firewall.StrictHttpFirewall; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @@ -55,6 +56,11 @@ public HttpFirewall allowUrlEncodedSlashHttpFirewall() { return firewall; } + @Bean + public HttpFirewall defaultFirewall() { + return new DefaultHttpFirewall(); + } + @Bean @Profile("!no-auth") public WebSecurityConfigurerAdapter defaultAuth() { @@ -142,7 +148,8 @@ protected void configure(HttpSecurity http) throws Exception { @Override public void configure(WebSecurity web) throws Exception { super.configure(web); - web.httpFirewall(allowUrlEncodedSlashHttpFirewall()); + //Switch to the default firewall + web.httpFirewall(defaultFirewall()); } }; } From 7fb82784c1397e17db1cbda8a6cdeb82efe8e960 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 23 Feb 2021 09:01:17 -0500 Subject: [PATCH 22/25] WIP1 --- ...scriptorControllerVersionEndpointsIntegrationTests.groovy | 2 +- .../EntityDescriptorSchemaValidatingControllerAdvice.groovy | 2 +- .../ui/controller/EntitiesControllerIntegrationTests.groovy | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index 9bdd25a6c..a8d5a68ab 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -111,7 +111,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi edv2.body.serviceProviderName == 'SP2' } - //@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) + @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) def 'SHIBUI-1414'() { given: def ed = new EntityDescriptor(entityID: 'testme', serviceProviderName: 'testme').with { diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy index 3b12c6c85..f25950256 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/jsonschema/EntityDescriptorSchemaValidatingControllerAdvice.groovy @@ -21,7 +21,7 @@ import static edu.internet2.tier.shibboleth.admin.ui.jsonschema.LowLevelJsonSche * * @author Dmitriy Kopylenko */ -//@ControllerAdvice +@ControllerAdvice class EntityDescriptorSchemaValidatingControllerAdvice extends RequestBodyAdviceAdapter { @Autowired diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy index 0fa9084e2..cbe48c847 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntitiesControllerIntegrationTests.groovy @@ -36,11 +36,8 @@ class EntitiesControllerIntegrationTests extends Specification { private WebTestClient webClient /*def setup() { - //DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory() - //factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE) - // yeah, don't ask... this is just shenanigans - this.webClient = WebTestClient.builder().uriBuilderFactory(factory).build() + // The API is changed. Doesn't work anymore. Not sure if we need it here this.webClient.webClient.uriBuilderFactory.encodingMode = DefaultUriBuilderFactory.EncodingMode.NONE }*/ From 8f36aae6a3d656a9cffd00239f2d6ea5c28a1087 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 23 Feb 2021 13:17:26 -0500 Subject: [PATCH 23/25] Upgrade wip --- ...yDescriptorControllerVersionEndpointsIntegrationTests.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index a8d5a68ab..ddebb0e28 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -18,6 +18,7 @@ import org.springframework.http.HttpMethod import org.springframework.http.MediaType import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles +import spock.lang.Ignore import spock.lang.Specification /** @@ -112,6 +113,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi } @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) + @Ignore def 'SHIBUI-1414'() { given: def ed = new EntityDescriptor(entityID: 'testme', serviceProviderName: 'testme').with { From ecae2ee93c5fc9db8ae26e339b2195621ecc3976 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 23 Feb 2021 14:26:20 -0500 Subject: [PATCH 24/25] Spring Boot upgrade wip --- ...criptorControllerVersionEndpointsIntegrationTests.groovy | 1 - backend/src/enversTest/resources/application.properties | 6 ------ 2 files changed, 7 deletions(-) delete mode 100644 backend/src/enversTest/resources/application.properties diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index ddebb0e28..204ad91e0 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -113,7 +113,6 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi } @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) - @Ignore def 'SHIBUI-1414'() { given: def ed = new EntityDescriptor(entityID: 'testme', serviceProviderName: 'testme').with { diff --git a/backend/src/enversTest/resources/application.properties b/backend/src/enversTest/resources/application.properties deleted file mode 100644 index 1484db691..000000000 --- a/backend/src/enversTest/resources/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -spring.main.allow-bean-definition-overriding=true - -spring.liquibase.enabled=false - -#Needed in the latest versions of Spring Boot when doing manual transaction management like we do in envers versioning code -spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext From a5de3e0988dc8f35de18d17978da2ac05a347f06 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Fri, 26 Feb 2021 11:23:55 -0500 Subject: [PATCH 25/25] Address code review comments --- backend/build.gradle | 8 ++------ ...ptorControllerVersionEndpointsIntegrationTests.groovy | 1 - .../envers/EntityDescriptorEnversVersioningTests.groovy | 2 -- backend/src/main/resources/application.properties | 2 +- .../admin/ui/service/EmailServiceImplTests.groovy | 9 ++++++--- beacon/build.gradle | 4 ---- beacon/gradle.properties | 2 ++ 7 files changed, 11 insertions(+), 17 deletions(-) delete mode 100644 beacon/build.gradle create mode 100644 beacon/gradle.properties diff --git a/backend/build.gradle b/backend/build.gradle index 08583ffc4..59bb93bc1 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -3,7 +3,7 @@ plugins { id 'war' id 'org.springframework.boot' version '2.4.2' id 'com.gorylenko.gradle-git-properties' version '1.4.21' - id 'io.franzbecker.gradle-lombok' version '1.13' + id 'io.freefair.lombok' version '5.3.0' id 'com.palantir.docker' version '0.20.1' id 'com.palantir.docker-run' version '0.20.1' } @@ -109,11 +109,7 @@ springBoot { buildInfo() } -lombok { - version = "1.18.8" - //TODO: get new sha256 - sha256 = "" -} +generateLombokConfig.enabled = false dependencies { // opensaml deps diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index 204ad91e0..a8d5a68ab 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -18,7 +18,6 @@ import org.springframework.http.HttpMethod import org.springframework.http.MediaType import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ActiveProfiles -import spock.lang.Ignore import spock.lang.Specification /** diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy index 034b0a67c..b7f31270a 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EntityDescriptorEnversVersioningTests.groovy @@ -44,11 +44,9 @@ import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorReposit import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest import org.springframework.data.jpa.repository.config.EnableJpaRepositories import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.TestPropertySource import org.springframework.transaction.PlatformTransactionManager import spock.lang.Specification diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 390a99981..de3f94759 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -4,7 +4,7 @@ # Logging Configuration #logging.config=classpath:log4j2.xml -#logging.level.org.springframework.security=DEBUG +#logging.level.org.springframework.security=INFO logging.level.org.springframework=INFO logging.level.edu.internet2.tier.shibboleth.admin.ui=INFO diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy index d1cc1be3b..148def965 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EmailServiceImplTests.groovy @@ -10,7 +10,6 @@ import groovy.json.JsonOutput import groovy.json.JsonSlurper import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest import org.springframework.boot.test.context.SpringBootTest import org.springframework.core.env.Environment import org.springframework.data.jpa.repository.config.EnableJpaRepositories @@ -22,8 +21,12 @@ import spock.lang.Specification /** * @author Bill Smith (wsmith@unicon.net) */ -@Ignore -// TODO: fix +@SpringBootTest +//@DataJpaTest +@ContextConfiguration(classes=[CoreShibUiConfiguration, EmailConfiguration, TestConfiguration, InternationalizationConfiguration, SearchConfiguration, DevConfig]) +@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) +@EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@ActiveProfiles(["no-auth", "dev"]) class EmailServiceImplTests extends Specification { @Autowired diff --git a/beacon/build.gradle b/beacon/build.gradle deleted file mode 100644 index e38845294..000000000 --- a/beacon/build.gradle +++ /dev/null @@ -1,4 +0,0 @@ -allprojects { - group = 'edu.internet2.tap.beacon' - version = '1.0.0' -} \ No newline at end of file diff --git a/beacon/gradle.properties b/beacon/gradle.properties new file mode 100644 index 000000000..23dbf7481 --- /dev/null +++ b/beacon/gradle.properties @@ -0,0 +1,2 @@ +group=edu.internet2.tap.beacon +version=1.0.0-SNAPSHOT