1
0
mirror of synced 2026-08-05 09:47:05 +00:00

Compare commits

..

31 Commits

Author SHA1 Message Date
Joe Grandja 8febecd43f Release 5.0.14.RELEASE 2020-02-05 07:27:13 -05:00
Joe Grandja 425b7783b5 Update to org.slf4j 1.7.30
Fixes gh-7934
2020-02-04 20:34:15 -05:00
Joe Grandja b7ee7136b2 Update to org.powermock 2.0.5
Fixes gh-7933
2020-02-04 20:30:32 -05:00
Joe Grandja 0d331b08b9 Update to hibernate-validator 6.0.18.Final
Fixes gh-7932
2020-02-04 20:26:20 -05:00
Joe Grandja c47d72fd12 Update to org.bouncycastle:bcprov-jdk15on 1.64
Fixes gh-7931
2020-02-04 20:23:01 -05:00
Joe Grandja 248c956962 Update to org.bouncycastle:bcpkix-jdk15on 1.64
Fixes gh-7930
2020-02-04 20:21:09 -05:00
Joe Grandja 530def3af0 Update to org.aspectj 1.9.5
Fixes gh-7929
2020-02-04 20:18:20 -05:00
Joe Grandja e6049fce26 Update to httpclient 4.5.11
Fixes gh-7928
2020-02-04 20:16:00 -05:00
Joe Grandja 0105e95ba2 Update to com.squareup.okhttp3 3.12.8
Fixes gh-7927
2020-02-04 20:13:30 -05:00
Joe Grandja ded544de14 Update to Jackson 2.9.10
Fixes gh-7926
2020-02-04 20:06:52 -05:00
Joe Grandja 7d845b6872 Update to Spring Framework 5.0.16
Fixes gh-7924
2020-02-04 17:26:18 -05:00
Eleftheria Stein 97818ebb22 Load LDIF file from classpath in unboundId mode
Fixes: gh-7833
2020-01-21 17:49:58 +01:00
Filip Hanik f2ee151d63 Build using openjdk8
Fixes gh-7169

[closes #7169]
2020-01-13 10:34:08 -07:00
Rob Winch 8da27b5f41 CompositeServerHttpHeadersWriter Executes Sequentially
Fixes gh-7731
2019-12-12 14:44:57 -06:00
Jeffrey Morlan 466b8a1d82 Fix race condition in SessionRegistryImpl
Adding/removing sessions from principals wasn't atomic. If one thread
removed the last session from a principal while another thread added a
new one, the addition could be lost.

Fixes gh-3189
2019-08-06 13:47:45 -05:00
Rob Winch 0532b6e665 Next Development Version 2019-08-05 12:15:43 -05:00
Rob Winch c94a79c3a9 Release 5.0.13.RELEASE 2019-08-05 12:15:04 -05:00
Rob Winch 09343eb240 Update to Bouncy Castle 1.62
Fixes gh-7194
2019-08-05 11:55:45 -05:00
Rob Winch 90c509d3c5 Update to httpclient 4.5.9
Fixes gh-7193
2019-08-05 11:55:45 -05:00
Rob Winch 3b79bff44d Update to Unboundid 4.0.11
Fixes gh-7192
2019-08-05 11:55:45 -05:00
Rob Winch 3d8819447f Update to AspectJ 1.9.4
Fixes gh-7191
2019-08-05 11:55:45 -05:00
Rob Winch 863e45ca6c Update to Spring Boot 2.0.9.RELEASE
Fixes gh-7190
2019-08-05 11:55:45 -05:00
Rob Winch b520d36abb Update to Powermock 2.0.2
Fixes gh-7189
2019-08-05 11:55:45 -05:00
Rob Winch b03fdd8e25 Update to cglib 3.2.12
Fixes gh-7195
2019-08-05 11:55:39 -05:00
Rob Winch 0f5e37172d Update to Spring Framework 5.0.15.RELEASE
Fixes gh-7188
2019-08-05 11:52:34 -05:00
Rob Winch 7498248910 Update to GAE 1.9.76
Fixes gh-7187
2019-08-05 11:52:19 -05:00
Josh Cummings f3a90df1ef Release Scripts
Added a script for polling Maven Central to notify when release is
uploaded.
2019-06-19 13:40:15 -06:00
Josh Cummings c3b4cabb9f Reinstate docs and schema deployments
Fixes: gh-6929
2019-05-31 21:52:18 -06:00
Josh Cummings 8e3678c79d Temporarily remove docs and schema deployments
Issue: gh-6929
2019-05-31 14:04:30 -06:00
Josh Cummings facc7299e3 Adding JAVA_HOME for JDK 8
Fixes: gh-6928
2019-05-31 14:03:54 -06:00
Joe Grandja b94e4c0197 Next Development Version 2019-04-02 12:47:48 -04:00
11 changed files with 283 additions and 93 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
language: java language: java
jdk: jdk:
- oraclejdk8 - openjdk8
os: os:
- linux - linux
Vendored
+18 -8
View File
@@ -14,7 +14,9 @@ try {
node { node {
checkout scm checkout scm
try { try {
sh "./gradlew clean check --refresh-dependencies --no-daemon --stacktrace" withEnv(["JAVA_HOME=${ tool 'jdk8' }"]) {
sh "./gradlew clean check --refresh-dependencies --no-daemon --stacktrace"
}
} catch(Exception e) { } catch(Exception e) {
currentBuild.result = 'FAILED: check' currentBuild.result = 'FAILED: check'
throw e throw e
@@ -30,10 +32,12 @@ try {
checkout scm checkout scm
withCredentials([string(credentialsId: 'spring-sonar.login', variable: 'SONAR_LOGIN')]) { withCredentials([string(credentialsId: 'spring-sonar.login', variable: 'SONAR_LOGIN')]) {
try { try {
if ("master" == env.BRANCH_NAME) { withEnv(["JAVA_HOME=${ tool 'jdk8' }"]) {
sh "./gradlew sonarqube -PexcludeProjects='**/samples/**' -Dsonar.host.url=$SPRING_SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN --refresh-dependencies --no-daemon --stacktrace" if ("master" == env.BRANCH_NAME) {
} else { sh "./gradlew sonarqube -PexcludeProjects='**/samples/**' -Dsonar.host.url=$SPRING_SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN --refresh-dependencies --no-daemon --stacktrace"
sh "./gradlew sonarqube -PexcludeProjects='**/samples/**' -Dsonar.projectKey='spring-security-${env.BRANCH_NAME}' -Dsonar.projectName='spring-security-${env.BRANCH_NAME}' -Dsonar.host.url=$SPRING_SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN --refresh-dependencies --no-daemon --stacktrace" } else {
sh "./gradlew sonarqube -PexcludeProjects='**/samples/**' -Dsonar.projectKey='spring-security-${env.BRANCH_NAME}' -Dsonar.projectName='spring-security-${env.BRANCH_NAME}' -Dsonar.host.url=$SPRING_SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN --refresh-dependencies --no-daemon --stacktrace"
}
} }
} catch(Exception e) { } catch(Exception e) {
currentBuild.result = 'FAILED: sonar' currentBuild.result = 'FAILED: sonar'
@@ -53,7 +57,9 @@ try {
withCredentials([string(credentialsId: 'spring-gpg-passphrase', variable: 'SIGNING_PASSWORD')]) { withCredentials([string(credentialsId: 'spring-gpg-passphrase', variable: 'SIGNING_PASSWORD')]) {
withCredentials([usernamePassword(credentialsId: 'oss-token', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USERNAME')]) { withCredentials([usernamePassword(credentialsId: 'oss-token', passwordVariable: 'OSSRH_PASSWORD', usernameVariable: 'OSSRH_USERNAME')]) {
withCredentials([usernamePassword(credentialsId: '02bd1690-b54f-4c9f-819d-a77cb7a9822c', usernameVariable: 'ARTIFACTORY_USERNAME', passwordVariable: 'ARTIFACTORY_PASSWORD')]) { withCredentials([usernamePassword(credentialsId: '02bd1690-b54f-4c9f-819d-a77cb7a9822c', usernameVariable: 'ARTIFACTORY_USERNAME', passwordVariable: 'ARTIFACTORY_PASSWORD')]) {
sh "./gradlew deployArtifacts finalizeDeployArtifacts -Psigning.secretKeyRingFile=$SIGNING_KEYRING_FILE -Psigning.keyId=$SPRING_SIGNING_KEYID -Psigning.password='$SIGNING_PASSWORD' -PossrhUsername=$OSSRH_USERNAME -PossrhPassword=$OSSRH_PASSWORD -PartifactoryUsername=$ARTIFACTORY_USERNAME -PartifactoryPassword=$ARTIFACTORY_PASSWORD --refresh-dependencies --no-daemon --stacktrace" withEnv(["JAVA_HOME=${ tool 'jdk8' }"]) {
sh "./gradlew deployArtifacts finalizeDeployArtifacts -Psigning.secretKeyRingFile=$SIGNING_KEYRING_FILE -Psigning.keyId=$SPRING_SIGNING_KEYID -Psigning.password='$SIGNING_PASSWORD' -PossrhUsername=$OSSRH_USERNAME -PossrhPassword=$OSSRH_PASSWORD -PartifactoryUsername=$ARTIFACTORY_USERNAME -PartifactoryPassword=$ARTIFACTORY_PASSWORD --refresh-dependencies --no-daemon --stacktrace"
}
} }
} }
} }
@@ -66,7 +72,9 @@ try {
node { node {
checkout scm checkout scm
withCredentials([file(credentialsId: 'docs.spring.io-jenkins_private_ssh_key', variable: 'DEPLOY_SSH_KEY')]) { withCredentials([file(credentialsId: 'docs.spring.io-jenkins_private_ssh_key', variable: 'DEPLOY_SSH_KEY')]) {
sh "./gradlew deployDocs -PdeployDocsSshKeyPath=$DEPLOY_SSH_KEY -PdeployDocsSshUsername=$SPRING_DOCS_USERNAME --refresh-dependencies --no-daemon --stacktrace" withEnv(["JAVA_HOME=${ tool 'jdk8' }"]) {
sh "./gradlew deployDocs -PdeployDocsSshKeyPath=$DEPLOY_SSH_KEY -PdeployDocsSshUsername=$SPRING_DOCS_USERNAME --refresh-dependencies --no-daemon --stacktrace"
}
} }
} }
} }
@@ -76,7 +84,9 @@ try {
node { node {
checkout scm checkout scm
withCredentials([file(credentialsId: 'docs.spring.io-jenkins_private_ssh_key', variable: 'DEPLOY_SSH_KEY')]) { withCredentials([file(credentialsId: 'docs.spring.io-jenkins_private_ssh_key', variable: 'DEPLOY_SSH_KEY')]) {
sh "./gradlew deploySchema -PdeployDocsSshKeyPath=$DEPLOY_SSH_KEY -PdeployDocsSshUsername=$SPRING_DOCS_USERNAME --refresh-dependencies --no-daemon --stacktrace" withEnv(["JAVA_HOME=${ tool 'jdk8' }"]) {
sh "./gradlew deploySchema -PdeployDocsSshKeyPath=$DEPLOY_SSH_KEY -PdeployDocsSshUsername=$SPRING_DOCS_USERNAME --refresh-dependencies --no-daemon --stacktrace"
}
} }
} }
} }
@@ -132,13 +132,18 @@ public class SessionRegistryImpl implements SessionRegistry,
sessionIds.put(sessionId, sessionIds.put(sessionId,
new SessionInformation(principal, sessionId, new Date())); new SessionInformation(principal, sessionId, new Date()));
Set<String> sessionsUsedByPrincipal = principals.computeIfAbsent(principal, key -> new CopyOnWriteArraySet<>()); principals.compute(principal, (key, sessionsUsedByPrincipal) -> {
sessionsUsedByPrincipal.add(sessionId); if (sessionsUsedByPrincipal == null) {
sessionsUsedByPrincipal = new CopyOnWriteArraySet<>();
}
sessionsUsedByPrincipal.add(sessionId);
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Sessions used by '" + principal + "' : " logger.trace("Sessions used by '" + principal + "' : "
+ sessionsUsedByPrincipal); + sessionsUsedByPrincipal);
} }
return sessionsUsedByPrincipal;
});
} }
public void removeSessionInformation(String sessionId) { public void removeSessionInformation(String sessionId) {
@@ -157,32 +162,29 @@ public class SessionRegistryImpl implements SessionRegistry,
sessionIds.remove(sessionId); sessionIds.remove(sessionId);
Set<String> sessionsUsedByPrincipal = principals.get(info.getPrincipal()); principals.computeIfPresent(info.getPrincipal(), (key, sessionsUsedByPrincipal) -> {
if (sessionsUsedByPrincipal == null) {
return;
}
if (logger.isDebugEnabled()) {
logger.debug("Removing session " + sessionId
+ " from principal's set of registered sessions");
}
sessionsUsedByPrincipal.remove(sessionId);
if (sessionsUsedByPrincipal.isEmpty()) {
// No need to keep object in principals Map anymore
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Removing principal " + info.getPrincipal() logger.debug("Removing session " + sessionId
+ " from registry"); + " from principal's set of registered sessions");
} }
principals.remove(info.getPrincipal());
}
if (logger.isTraceEnabled()) { sessionsUsedByPrincipal.remove(sessionId);
logger.trace("Sessions used by '" + info.getPrincipal() + "' : "
+ sessionsUsedByPrincipal); if (sessionsUsedByPrincipal.isEmpty()) {
} // No need to keep object in principals Map anymore
if (logger.isDebugEnabled()) {
logger.debug("Removing principal " + info.getPrincipal()
+ " from registry");
}
sessionsUsedByPrincipal = null;
}
if (logger.isTraceEnabled()) {
logger.trace("Sessions used by '" + info.getPrincipal() + "' : "
+ sessionsUsedByPrincipal);
}
return sessionsUsedByPrincipal;
});
} }
} }
+3 -3
View File
@@ -1,3 +1,3 @@
gaeVersion=1.9.68 gaeVersion=1.9.76
springBootVersion=2.0.8.RELEASE springBootVersion=2.0.9.RELEASE
version=5.0.12.RELEASE version=5.0.14.RELEASE
+31 -31
View File
@@ -1,21 +1,21 @@
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom 'io.projectreactor:reactor-bom:Bismuth-SR17' mavenBom 'io.projectreactor:reactor-bom:Bismuth-SR17'
mavenBom 'org.springframework:spring-framework-bom:5.0.13.RELEASE' mavenBom 'org.springframework:spring-framework-bom:5.0.16.RELEASE'
mavenBom 'org.springframework.data:spring-data-releasetrain:Kay-SR14' mavenBom 'org.springframework.data:spring-data-releasetrain:Kay-SR14'
} }
dependencies { dependencies {
dependency 'cglib:cglib-nodep:3.2.10' dependency 'cglib:cglib-nodep:3.2.12'
dependency 'com.squareup.okhttp3:mockwebserver:3.12.2' dependency 'com.squareup.okhttp3:mockwebserver:3.12.8'
dependency 'opensymphony:sitemesh:2.4.2' dependency 'opensymphony:sitemesh:2.4.2'
dependency 'org.gebish:geb-spock:0.10.0' dependency 'org.gebish:geb-spock:0.10.0'
dependency 'org.jasig.cas:cas-server-webapp:4.2.7' dependency 'org.jasig.cas:cas-server-webapp:4.2.7'
dependency 'org.powermock:powermock-api-mockito2:2.0.0' dependency 'org.powermock:powermock-api-mockito2:2.0.5'
dependency 'org.powermock:powermock-api-support:2.0.0' dependency 'org.powermock:powermock-api-support:2.0.5'
dependency 'org.powermock:powermock-core:2.0.0' dependency 'org.powermock:powermock-core:2.0.5'
dependency 'org.powermock:powermock-module-junit4-common:2.0.0' dependency 'org.powermock:powermock-module-junit4-common:2.0.5'
dependency 'org.powermock:powermock-module-junit4:2.0.0' dependency 'org.powermock:powermock-module-junit4:2.0.5'
dependency 'org.powermock:powermock-reflect:2.0.0' dependency 'org.powermock:powermock-reflect:2.0.5'
dependency 'org.python:jython:2.5.0' dependency 'org.python:jython:2.5.0'
dependency 'org.spockframework:spock-core:1.0-groovy-2.4' dependency 'org.spockframework:spock-core:1.0-groovy-2.4'
dependency 'org.spockframework:spock-spring:1.0-groovy-2.4' dependency 'org.spockframework:spock-spring:1.0-groovy-2.4'
@@ -28,27 +28,27 @@ dependencyManagement {
dependency 'asm:asm:3.1' dependency 'asm:asm:3.1'
dependency 'ch.qos.logback:logback-classic:1.2.3' dependency 'ch.qos.logback:logback-classic:1.2.3'
dependency 'ch.qos.logback:logback-core:1.2.3' dependency 'ch.qos.logback:logback-core:1.2.3'
dependency 'com.fasterxml.jackson.core:jackson-annotations:2.9.8' dependency 'com.fasterxml.jackson.core:jackson-annotations:2.9.10'
dependency 'com.fasterxml.jackson.core:jackson-core:2.9.8' dependency 'com.fasterxml.jackson.core:jackson-core:2.9.10'
dependency 'com.fasterxml.jackson.core:jackson-databind:2.9.8' dependency 'com.fasterxml.jackson.core:jackson-databind:2.9.10.2'
dependency 'com.fasterxml:classmate:1.3.4' dependency 'com.fasterxml:classmate:1.3.4'
dependency 'com.github.stephenc.jcip:jcip-annotations:1.0-1' dependency 'com.github.stephenc.jcip:jcip-annotations:1.0-1'
dependency 'com.google.appengine:appengine-api-1.0-sdk:1.9.64' dependency 'com.google.appengine:appengine-api-1.0-sdk:1.9.76'
dependency 'com.google.appengine:appengine-api-labs:1.9.64' dependency 'com.google.appengine:appengine-api-labs:1.9.76'
dependency 'com.google.appengine:appengine-api-stubs:1.9.64' dependency 'com.google.appengine:appengine-api-stubs:1.9.76'
dependency 'com.google.appengine:appengine-testing:1.9.64' dependency 'com.google.appengine:appengine-testing:1.9.76'
dependency 'com.google.appengine:appengine:1.9.63' dependency 'com.google.appengine:appengine:1.9.76'
dependency 'com.google.code.gson:gson:2.8.2' dependency 'com.google.code.gson:gson:2.8.2'
dependency 'com.google.guava:guava:20.0' dependency 'com.google.guava:guava:20.0'
dependency 'com.google.inject:guice:3.0' dependency 'com.google.inject:guice:3.0'
dependency 'com.nimbusds:lang-tag:1.4.3' dependency 'com.nimbusds:lang-tag:1.4.3'
dependency 'com.nimbusds:nimbus-jose-jwt:5.14' dependency 'com.nimbusds:nimbus-jose-jwt:5.14'
dependency 'com.nimbusds:oauth2-oidc-sdk:5.64.4' dependency 'com.nimbusds:oauth2-oidc-sdk:5.64.4'
dependency 'com.squareup.okhttp3:okhttp:3.12.2' dependency 'com.squareup.okhttp3:okhttp:3.12.8'
dependency 'com.squareup.okio:okio:1.13.0' dependency 'com.squareup.okio:okio:1.13.0'
dependency 'com.sun.xml.bind:jaxb-core:2.3.0.1' dependency 'com.sun.xml.bind:jaxb-core:2.3.0.1'
dependency 'com.sun.xml.bind:jaxb-impl:2.3.0.1' dependency 'com.sun.xml.bind:jaxb-impl:2.3.0.1'
dependency 'com.unboundid:unboundid-ldapsdk:4.0.10' dependency 'com.unboundid:unboundid-ldapsdk:4.0.11'
dependency 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1' dependency 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1'
dependency 'commons-cli:commons-cli:1.4' dependency 'commons-cli:commons-cli:1.4'
dependency 'commons-codec:commons-codec:1.12' dependency 'commons-codec:commons-codec:1.12'
@@ -115,7 +115,7 @@ dependencyManagement {
dependency 'org.apache.directory.shared:shared-cursor:0.9.15' dependency 'org.apache.directory.shared:shared-cursor:0.9.15'
dependency 'org.apache.directory.shared:shared-ldap-constants:0.9.15' dependency 'org.apache.directory.shared:shared-ldap-constants:0.9.15'
dependency 'org.apache.directory.shared:shared-ldap:0.9.15' dependency 'org.apache.directory.shared:shared-ldap:0.9.15'
dependency 'org.apache.httpcomponents:httpclient:4.5.7' dependency 'org.apache.httpcomponents:httpclient:4.5.11'
dependency 'org.apache.httpcomponents:httpcore:4.4.8' dependency 'org.apache.httpcomponents:httpcore:4.4.8'
dependency 'org.apache.httpcomponents:httpmime:4.5.3' dependency 'org.apache.httpcomponents:httpmime:4.5.3'
dependency 'org.apache.mina:mina-core:2.0.0-M6' dependency 'org.apache.mina:mina-core:2.0.0-M6'
@@ -128,13 +128,13 @@ dependencyManagement {
dependency 'org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.0.44' dependency 'org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.0.44'
dependency 'org.apache.tomcat.embed:tomcat-embed-websocket:8.5.23' dependency 'org.apache.tomcat.embed:tomcat-embed-websocket:8.5.23'
dependency 'org.apache.tomcat:tomcat-annotations-api:8.5.23' dependency 'org.apache.tomcat:tomcat-annotations-api:8.5.23'
dependency 'org.aspectj:aspectjrt:1.9.2' dependency 'org.aspectj:aspectjrt:1.9.5'
dependency 'org.aspectj:aspectjtools:1.9.2' dependency 'org.aspectj:aspectjtools:1.9.5'
dependency 'org.aspectj:aspectjweaver:1.9.2' dependency 'org.aspectj:aspectjweaver:1.9.5'
dependency 'org.assertj:assertj-core:3.11.1' dependency 'org.assertj:assertj-core:3.11.1'
dependency 'org.attoparser:attoparser:2.0.4.RELEASE' dependency 'org.attoparser:attoparser:2.0.4.RELEASE'
dependency 'org.bouncycastle:bcpkix-jdk15on:1.61' dependency 'org.bouncycastle:bcpkix-jdk15on:1.64'
dependency 'org.bouncycastle:bcprov-jdk15on:1.61' dependency 'org.bouncycastle:bcprov-jdk15on:1.64'
dependency 'org.codehaus.groovy:groovy-all:2.4.14' dependency 'org.codehaus.groovy:groovy-all:2.4.14'
dependency 'org.codehaus.groovy:groovy-json:2.4.14' dependency 'org.codehaus.groovy:groovy-json:2.4.14'
dependency 'org.codehaus.groovy:groovy:2.4.14' dependency 'org.codehaus.groovy:groovy:2.4.14'
@@ -160,7 +160,7 @@ dependencyManagement {
dependency 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final' dependency 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final'
dependency 'org.hibernate:hibernate-core:5.2.17.Final' dependency 'org.hibernate:hibernate-core:5.2.17.Final'
dependency 'org.hibernate:hibernate-entitymanager:5.2.18.Final' dependency 'org.hibernate:hibernate-entitymanager:5.2.18.Final'
dependency 'org.hibernate:hibernate-validator:6.0.16.Final' dependency 'org.hibernate:hibernate-validator:6.0.18.Final'
dependency 'org.hsqldb:hsqldb:2.4.1' dependency 'org.hsqldb:hsqldb:2.4.1'
dependency 'org.jasig.cas.client:cas-client-core:3.5.1' dependency 'org.jasig.cas.client:cas-client-core:3.5.1'
dependency 'org.javassist:javassist:3.22.0-CR2' dependency 'org.javassist:javassist:3.22.0-CR2'
@@ -177,11 +177,11 @@ dependencyManagement {
dependency 'org.seleniumhq.selenium:selenium-java:3.141.59' dependency 'org.seleniumhq.selenium:selenium-java:3.141.59'
dependency 'org.seleniumhq.selenium:selenium-support:3.141.59' dependency 'org.seleniumhq.selenium:selenium-support:3.141.59'
dependency 'org.skyscreamer:jsonassert:1.5.0' dependency 'org.skyscreamer:jsonassert:1.5.0'
dependency 'org.slf4j:jcl-over-slf4j:1.7.26' dependency 'org.slf4j:jcl-over-slf4j:1.7.30'
dependency 'org.slf4j:jul-to-slf4j:1.7.26' dependency 'org.slf4j:jul-to-slf4j:1.7.30'
dependency 'org.slf4j:log4j-over-slf4j:1.7.26' dependency 'org.slf4j:log4j-over-slf4j:1.7.30'
dependency 'org.slf4j:slf4j-api:1.7.26' dependency 'org.slf4j:slf4j-api:1.7.30'
dependency 'org.slf4j:slf4j-nop:1.7.26' dependency 'org.slf4j:slf4j-nop:1.7.30'
dependency 'org.sonatype.sisu.inject:cglib:2.2.1-v20090111' dependency 'org.sonatype.sisu.inject:cglib:2.2.1-v20090111'
dependency 'org.springframework.ldap:spring-ldap-core:2.3.2.RELEASE' dependency 'org.springframework.ldap:spring-ldap-core:2.3.2.RELEASE'
dependency 'org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE' dependency 'org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE'
@@ -0,0 +1,144 @@
/*
* Copyright 2002-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.security.ldap.server;
import org.junit.After;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ldap.core.ContextSource;
import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
import org.springframework.security.ldap.SpringSecurityLdapTemplate;
import javax.annotation.PreDestroy;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
/**
* Tests for {@link UnboundIdContainer}, specifically relating to LDIF file detection.
*
* @author Eleftheria Stein
*/
public class UnboundIdContainerLdifTests {
AnnotationConfigApplicationContext appCtx;
@After
public void closeAppContext() {
if (appCtx != null) {
appCtx.close();
appCtx = null;
}
}
@Test
public void unboundIdContainerWhenCustomLdifNameThenLdifLoaded() {
appCtx = new AnnotationConfigApplicationContext(CustomLdifConfig.class);
DefaultSpringSecurityContextSource contextSource = (DefaultSpringSecurityContextSource) appCtx
.getBean(ContextSource.class);
SpringSecurityLdapTemplate template = new SpringSecurityLdapTemplate(contextSource);
assertThat(template.compare("uid=bob,ou=people", "uid", "bob")).isTrue();
}
@Configuration
static class CustomLdifConfig {
private UnboundIdContainer container = new UnboundIdContainer("dc=springframework,dc=org",
"classpath:test-server.ldif");
@Bean
UnboundIdContainer ldapContainer() {
this.container.setPort(0);
return this.container;
}
@Bean
ContextSource contextSource(UnboundIdContainer container) {
return new DefaultSpringSecurityContextSource("ldap://127.0.0.1:"
+ container.getPort() + "/dc=springframework,dc=org");
}
@PreDestroy
void shutdown() {
this.container.stop();
}
}
@Test
public void unboundIdContainerWhenWildcardLdifNameThenLdifLoaded() {
appCtx = new AnnotationConfigApplicationContext(WildcardLdifConfig.class);
DefaultSpringSecurityContextSource contextSource = (DefaultSpringSecurityContextSource) appCtx
.getBean(ContextSource.class);
SpringSecurityLdapTemplate template = new SpringSecurityLdapTemplate(contextSource);
assertThat(template.compare("uid=bob,ou=people", "uid", "bob")).isTrue();
}
@Configuration
static class WildcardLdifConfig {
private UnboundIdContainer container = new UnboundIdContainer("dc=springframework,dc=org",
"classpath*:test-server.ldif");
@Bean
UnboundIdContainer ldapContainer() {
this.container.setPort(0);
return this.container;
}
@Bean
ContextSource contextSource(UnboundIdContainer container) {
return new DefaultSpringSecurityContextSource("ldap://127.0.0.1:"
+ container.getPort() + "/dc=springframework,dc=org");
}
@PreDestroy
void shutdown() {
this.container.stop();
}
}
@Test
public void unboundIdContainerWhenMalformedLdifThenException() {
try {
appCtx = new AnnotationConfigApplicationContext(MalformedLdifConfig.class);
failBecauseExceptionWasNotThrown(IllegalStateException.class);
} catch (Exception e) {
assertThat(e.getCause()).isInstanceOf(IllegalStateException.class);
assertThat(e.getMessage()).contains("Unable to load LDIF classpath:test-server-malformed.txt");
}
}
@Configuration
static class MalformedLdifConfig {
private UnboundIdContainer container = new UnboundIdContainer("dc=springframework,dc=org",
"classpath:test-server-malformed.txt");
@Bean
UnboundIdContainer ldapContainer() {
this.container.setPort(0);
return this.container;
}
@PreDestroy
void shutdown() {
this.container.stop();
}
}
}
@@ -0,0 +1,9 @@
dn: ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups
dn ou=subgroups,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: subgroups
@@ -114,10 +114,10 @@ public class UnboundIdContainer implements InitializingBean, DisposableBean, Lif
private void importLdif(InMemoryDirectoryServer directoryServer) { private void importLdif(InMemoryDirectoryServer directoryServer) {
if (StringUtils.hasText(this.ldif)) { if (StringUtils.hasText(this.ldif)) {
Resource resource = this.context.getResource(this.ldif);
try { try {
if (resource.exists()) { Resource[] resources = this.context.getResources(this.ldif);
try (InputStream inputStream = resource.getInputStream()) { if (resources.length > 0 && resources[0].exists()) {
try (InputStream inputStream = resources[0].getInputStream()) {
directoryServer.importFromLDIF(false, new LDIFReader(inputStream)); directoryServer.importFromLDIF(false, new LDIFReader(inputStream));
} }
} }
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
VERSION=$1
until http -h --check-status --ignore-stdin https://repo1.maven.org/maven2/org/springframework/security/spring-security-core/$VERSION/; do sleep 10; clear; done; spd-say "It is now uploaded"
@@ -15,14 +15,12 @@
*/ */
package org.springframework.security.web.server.header; package org.springframework.security.web.server.header;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/** /**
* Combines multiple {@link ServerHttpHeadersWriter} instances into a single instance. * Combines multiple {@link ServerHttpHeadersWriter} instances into a single instance.
@@ -43,8 +41,9 @@ public class CompositeServerHttpHeadersWriter implements ServerHttpHeadersWriter
@Override @Override
public Mono<Void> writeHttpHeaders(ServerWebExchange exchange) { public Mono<Void> writeHttpHeaders(ServerWebExchange exchange) {
Stream<Mono<Void>> results = writers.stream().map( writer -> writer.writeHttpHeaders(exchange)); return Flux.fromIterable(this.writers)
return Mono.when(results.collect(Collectors.toList())); .concatMap(w -> w.writeHttpHeaders(exchange))
.then();
} }
} }
@@ -15,11 +15,6 @@
*/ */
package org.springframework.security.web.server.header; package org.springframework.security.web.server.header;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -28,10 +23,19 @@ import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.mock.web.server.MockServerWebExchange;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
import java.time.Duration;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/** /**
* *
* @author Rob Winch * @author Rob Winch
@@ -55,7 +59,6 @@ public class CompositeServerHttpHeadersWriterTests {
@Test @Test
public void writeHttpHeadersWhenErrorNoErrorThenError() { public void writeHttpHeadersWhenErrorNoErrorThenError() {
when(writer1.writeHttpHeaders(exchange)).thenReturn(Mono.error(new RuntimeException())); when(writer1.writeHttpHeaders(exchange)).thenReturn(Mono.error(new RuntimeException()));
when(writer2.writeHttpHeaders(exchange)).thenReturn(Mono.empty());
Mono<Void> result = writer.writeHttpHeaders(exchange); Mono<Void> result = writer.writeHttpHeaders(exchange);
@@ -64,13 +67,11 @@ public class CompositeServerHttpHeadersWriterTests {
.verify(); .verify();
verify(writer1).writeHttpHeaders(exchange); verify(writer1).writeHttpHeaders(exchange);
verify(writer2).writeHttpHeaders(exchange);
} }
@Test @Test
public void writeHttpHeadersWhenErrorErrorThenError() { public void writeHttpHeadersWhenErrorErrorThenError() {
when(writer1.writeHttpHeaders(exchange)).thenReturn(Mono.error(new RuntimeException())); when(writer1.writeHttpHeaders(exchange)).thenReturn(Mono.error(new RuntimeException()));
when(writer2.writeHttpHeaders(exchange)).thenReturn(Mono.error(new RuntimeException()));
Mono<Void> result = writer.writeHttpHeaders(exchange); Mono<Void> result = writer.writeHttpHeaders(exchange);
@@ -79,7 +80,6 @@ public class CompositeServerHttpHeadersWriterTests {
.verify(); .verify();
verify(writer1).writeHttpHeaders(exchange); verify(writer1).writeHttpHeaders(exchange);
verify(writer2).writeHttpHeaders(exchange);
} }
@Test @Test
@@ -96,4 +96,26 @@ public class CompositeServerHttpHeadersWriterTests {
verify(writer1).writeHttpHeaders(exchange); verify(writer1).writeHttpHeaders(exchange);
verify(writer2).writeHttpHeaders(exchange); verify(writer2).writeHttpHeaders(exchange);
} }
@Test
public void writeHttpHeadersSequential() throws Exception {
AtomicBoolean slowDone = new AtomicBoolean();
CountDownLatch latch = new CountDownLatch(1);
ServerHttpHeadersWriter slow = exchange ->
Mono.delay(Duration.ofMillis(100))
.doOnSuccess(__ -> slowDone.set(true))
.then();
ServerHttpHeadersWriter second = exchange ->
Mono.fromRunnable(() -> {
latch.countDown();
assertThat(slowDone.get())
.describedAs("ServerLogoutHandler should be executed sequentially")
.isTrue();
});
CompositeServerHttpHeadersWriter writer = new CompositeServerHttpHeadersWriter(slow, second);
writer.writeHttpHeaders(this.exchange).block();
assertThat(latch.await(3, TimeUnit.SECONDS)).isTrue();
}
} }