This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/master by this push:
new cce3457 Upgrading CXF, Spring Boot and Wicket Spring Boot (#300)
cce3457 is described below
commit cce345771e11cceed3b7817aadd27aaffdb358b3
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Fri Dec 24 12:53:34 2021 +0100
Upgrading CXF, Spring Boot and Wicket Spring Boot (#300)
---
.../panels/SAML2SPEntityDirectoryPanel.java | 2 -
.../client/console/SyncopeWebApplication.java | 1 +
.../client/enduser/SyncopeWebApplication.java | 1 +
.../rest/api/service/AuthProfileService.java | 3 -
.../rest/cxf/service/AbstractSearchService.java | 2 -
.../ConsoleCodeConsumerResource.java | 2 +-
.../{ => oidcc4ui}/ConsoleLogoutResource.java | 2 +-
.../saml2sp4ui/AssertionConsumerResource.java | 4 -
.../ConsoleAssertionConsumerResource.java | 2 +-
.../{ => saml2sp4ui}/ConsoleLogoutResource.java | 2 +-
.../buildtools/SyncopeBuildToolsApplication.java | 45 ++++--
.../fit/buildtools/cxf/GreenMailService.java | 32 ++++-
.../fit/buildtools/cxf/GreenMailServiceImpl.java | 57 --------
.../fit/buildtools/cxf/ProvisioningImpl.java | 12 +-
.../syncope/fit/buildtools/cxf/UserService.java | 121 ++++++++++++++--
.../fit/buildtools/cxf/UserServiceImpl.java | 153 ---------------------
.../syncope/fit/enduser/AnonymousITCase.java | 2 -
.../org/apache/syncope/fit/AbstractITCase.java | 2 +-
.../org/apache/syncope/fit/sra/SAML2SRAITCase.java | 108 +++++++++------
.../apache/syncope/fit/ui/SAML2SP4UIITCase.java | 89 +++++++-----
pom.xml | 6 +-
21 files changed, 315 insertions(+), 333 deletions(-)
diff --git
a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPEntityDirectoryPanel.java
b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPEntityDirectoryPanel.java
index faafbfc..ad2ffee 100644
---
a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPEntityDirectoryPanel.java
+++
b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2SPEntityDirectoryPanel.java
@@ -18,8 +18,6 @@
*/
package org.apache.syncope.client.console.panels;
-import static org.apache.wicket.Component.RENDER;
-
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
import java.util.ArrayList;
import java.util.Collection;
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
index 182c114..4c4ec81 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
@@ -189,6 +189,7 @@ public class SyncopeWebApplication extends
WicketBootSecuredWebApplication {
try {
AbstractResource instance =
resource.getDeclaredConstructor().newInstance();
+ LOG.debug("Mounting {} under {}", resource.getName(),
annotation.path());
mountResource(annotation.path(), new
ResourceReference(annotation.key()) {
protected static final long serialVersionUID =
-128426276529456602L;
diff --git
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
index 95a0d5e..72849f1 100644
---
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
+++
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
@@ -168,6 +168,7 @@ public class SyncopeWebApplication extends
WicketBootStandardWebApplication {
try {
AbstractResource instance =
resource.getDeclaredConstructor().newInstance();
+ LOG.debug("Mounting {} under {}", resource.getName(),
annotation.path());
mountResource(annotation.path(), new
ResourceReference(annotation.key()) {
private static final long serialVersionUID =
-128426276529456602L;
diff --git
a/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthProfileService.java
b/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthProfileService.java
index 0919c7e..6971aa3 100644
---
a/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthProfileService.java
+++
b/common/am/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AuthProfileService.java
@@ -18,9 +18,6 @@
*/
package org.apache.syncope.common.rest.api.service;
-import static
org.apache.syncope.common.rest.api.service.JAXRSService.PARAM_PAGE;
-import static
org.apache.syncope.common.rest.api.service.JAXRSService.PARAM_SIZE;
-
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.headers.Header;
diff --git
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractSearchService.java
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractSearchService.java
index 28537e0..7b0ccbb 100644
---
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractSearchService.java
+++
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractSearchService.java
@@ -18,8 +18,6 @@
*/
package org.apache.syncope.core.rest.cxf.service;
-import static org.apache.syncope.core.rest.cxf.service.AbstractService.LOG;
-
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.cxf.jaxrs.ext.search.SearchBean;
import org.apache.cxf.jaxrs.ext.search.SearchCondition;
diff --git
a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleCodeConsumerResource.java
b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/oidcc4ui/ConsoleCodeConsumerResource.java
similarity index 96%
rename from
ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleCodeConsumerResource.java
rename to
ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/oidcc4ui/ConsoleCodeConsumerResource.java
index 8809e23..6ab412e 100644
---
a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleCodeConsumerResource.java
+++
b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/oidcc4ui/ConsoleCodeConsumerResource.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.client.console.resources;
+package org.apache.syncope.client.console.resources.oidcc4ui;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.client.console.pages.OIDCClientLogin;
diff --git
a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleLogoutResource.java
b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/oidcc4ui/ConsoleLogoutResource.java
similarity index 96%
rename from
ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleLogoutResource.java
rename to
ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/oidcc4ui/ConsoleLogoutResource.java
index 7116f88..c4400ce 100644
---
a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleLogoutResource.java
+++
b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/oidcc4ui/ConsoleLogoutResource.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.client.console.resources;
+package org.apache.syncope.client.console.resources.oidcc4ui;
import org.apache.syncope.client.console.pages.OIDCClientLogout;
import org.apache.syncope.client.ui.commons.annotations.Resource;
diff --git
a/ext/saml2sp4ui/client-common-ui/src/main/java/org/apache/syncope/client/ui/commons/resources/saml2sp4ui/AssertionConsumerResource.java
b/ext/saml2sp4ui/client-common-ui/src/main/java/org/apache/syncope/client/ui/commons/resources/saml2sp4ui/AssertionConsumerResource.java
index b65aac3..8c3e0bc 100644
---
a/ext/saml2sp4ui/client-common-ui/src/main/java/org/apache/syncope/client/ui/commons/resources/saml2sp4ui/AssertionConsumerResource.java
+++
b/ext/saml2sp4ui/client-common-ui/src/main/java/org/apache/syncope/client/ui/commons/resources/saml2sp4ui/AssertionConsumerResource.java
@@ -32,15 +32,11 @@ import org.apache.wicket.Session;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public abstract class AssertionConsumerResource extends
AbstractSAML2SP4UIResource {
private static final long serialVersionUID = 3858609271031003370L;
- protected static final Logger LOG =
LoggerFactory.getLogger(AssertionConsumerResource.class);
-
protected static final ObjectMapper MAPPER =
new
ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
diff --git
a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleAssertionConsumerResource.java
b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/saml2sp4ui/ConsoleAssertionConsumerResource.java
similarity index 96%
rename from
ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleAssertionConsumerResource.java
rename to
ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/saml2sp4ui/ConsoleAssertionConsumerResource.java
index 8f5aa13..c7c1385 100644
---
a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleAssertionConsumerResource.java
+++
b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/saml2sp4ui/ConsoleAssertionConsumerResource.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.client.console.resources;
+package org.apache.syncope.client.console.resources.saml2sp4ui;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.client.console.pages.SAML2SPLogin;
diff --git
a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleLogoutResource.java
b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/saml2sp4ui/ConsoleLogoutResource.java
similarity index 95%
rename from
ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleLogoutResource.java
rename to
ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/saml2sp4ui/ConsoleLogoutResource.java
index 0a175fa..ad5894d 100644
---
a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/ConsoleLogoutResource.java
+++
b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/resources/saml2sp4ui/ConsoleLogoutResource.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.client.console.resources;
+package org.apache.syncope.client.console.resources.saml2sp4ui;
import org.apache.syncope.client.console.pages.SAML2SPBeforeLogout;
import org.apache.syncope.client.ui.commons.SAML2SP4UIConstants;
diff --git
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
index ae9ce5e..55ee22b 100644
---
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
+++
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
@@ -19,20 +19,23 @@
package org.apache.syncope.fit.buildtools;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
-
import java.util.List;
-
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
+import javax.sql.DataSource;
import javax.xml.ws.Endpoint;
+import net.tirasa.connid.bundles.soap.provisioning.interfaces.Provisioning;
import org.apache.cxf.Bus;
import org.apache.cxf.endpoint.Server;
import
org.apache.cxf.jaxrs.spring.JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.syncope.fit.buildtools.cxf.DateParamConverterProvider;
+import org.apache.syncope.fit.buildtools.cxf.GreenMailService;
import org.apache.syncope.fit.buildtools.cxf.ProvisioningImpl;
+import org.apache.syncope.fit.buildtools.cxf.UserService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -44,11 +47,10 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
-@SpringBootApplication(scanBasePackages = "org.apache.syncope.fit.buildtools",
- exclude = {
- ErrorMvcAutoConfiguration.class,
- WebMvcAutoConfiguration.class,
- HttpMessageConvertersAutoConfiguration.class })
+@SpringBootApplication(exclude = {
+ ErrorMvcAutoConfiguration.class,
+ WebMvcAutoConfiguration.class,
+ HttpMessageConvertersAutoConfiguration.class })
public class SyncopeBuildToolsApplication extends SpringBootServletInitializer
{
public static void main(final String[] args) {
@@ -71,9 +73,6 @@ public class SyncopeBuildToolsApplication extends
SpringBootServletInitializer {
private Bus bus;
@Autowired
- private ProvisioningImpl provisioningImpl;
-
- @Autowired
private ApplicationContext ctx;
@Bean
@@ -84,21 +83,39 @@ public class SyncopeBuildToolsApplication extends
SpringBootServletInitializer {
}
@Bean
- public Endpoint soapProvisioning() {
- EndpointImpl soapProvisioning = new EndpointImpl(provisioningImpl);
+ @Autowired
+ public Provisioning provisioningImpl(@Qualifier("testDataSource") final
DataSource dataSource) {
+ return new ProvisioningImpl(dataSource);
+ }
+
+ @Bean
+ @Autowired
+ public Endpoint soapProvisioning(final Provisioning provisioning) {
+ EndpointImpl soapProvisioning = new EndpointImpl(provisioning);
soapProvisioning.setBus(bus);
soapProvisioning.publish("/soap");
return soapProvisioning;
}
@Bean
- public Server restProvisioning() {
+ public GreenMailService greenMailService() {
+ return new GreenMailService();
+ }
+
+ @Bean
+ public UserService userService() {
+ return new UserService();
+ }
+
+ @Bean
+ @Autowired
+ public Server restProvisioning(final GreenMailService greenMailService,
final UserService userService) {
SpringJAXRSServerFactoryBean restProvisioning = new
SpringJAXRSServerFactoryBean();
restProvisioning.setApplicationContext(ctx);
restProvisioning.setBus(bus);
restProvisioning.setAddress("/rest");
restProvisioning.setStaticSubresourceResolution(true);
-
restProvisioning.setBasePackages(List.of("org.apache.syncope.fit.buildtools.cxf"));
+ restProvisioning.setServiceBeans(List.of(greenMailService,
userService));
restProvisioning.setProviders(List.of(new JacksonJsonProvider(), new
DateParamConverterProvider()));
return restProvisioning.create();
}
diff --git
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailService.java
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailService.java
index ff009c0..0cd5ced 100644
---
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailService.java
+++
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailService.java
@@ -18,17 +18,43 @@
*/
package org.apache.syncope.fit.buildtools.cxf;
+import com.icegreen.greenmail.smtp.InterruptableSmtpServer;
+import com.icegreen.greenmail.util.GreenMail;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import org.apache.cxf.jaxrs.ext.MessageContext;
+import org.apache.syncope.fit.buildtools.GreenMailStartStopListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@Path("greenMail")
-public interface GreenMailService {
+public class GreenMailService {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(GreenMailService.class);
+
+ @Context
+ private MessageContext messageContext;
@POST
@Path("start")
- void start();
+ public void start() {
+ GreenMail greenMail = (GreenMail) messageContext.getServletContext().
+ getAttribute(GreenMailStartStopListener.GREENMAIL);
+ if (greenMail != null) {
+ ((InterruptableSmtpServer)
greenMail.getSmtp()).setRejectRequests(false);
+ LOG.info("SMTP server is accepting requests");
+ }
+ }
@POST
@Path("stop")
- void stop();
+ public void stop() {
+ GreenMail greenMail = (GreenMail) messageContext.getServletContext().
+ getAttribute(GreenMailStartStopListener.GREENMAIL);
+ if (greenMail != null) {
+ ((InterruptableSmtpServer)
greenMail.getSmtp()).setRejectRequests(true);
+ LOG.info("SMTP server is rejecting requests");
+ }
+ }
}
diff --git
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailServiceImpl.java
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailServiceImpl.java
deleted file mode 100644
index b4a455e..0000000
---
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/GreenMailServiceImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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
- *
- * http://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.apache.syncope.fit.buildtools.cxf;
-
-import com.icegreen.greenmail.smtp.InterruptableSmtpServer;
-import com.icegreen.greenmail.util.GreenMail;
-import javax.ws.rs.core.Context;
-import org.apache.cxf.jaxrs.ext.MessageContext;
-import org.apache.syncope.fit.buildtools.GreenMailStartStopListener;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-@Service
-public class GreenMailServiceImpl implements GreenMailService {
-
- private static final Logger LOG =
LoggerFactory.getLogger(GreenMailService.class);
-
- @Context
- private MessageContext messageContext;
-
- @Override
- public void start() {
- GreenMail greenMail = (GreenMail) messageContext.getServletContext().
- getAttribute(GreenMailStartStopListener.GREENMAIL);
- if (greenMail != null) {
- ((InterruptableSmtpServer)
greenMail.getSmtp()).setRejectRequests(false);
- LOG.info("SMTP server is accepting requests");
- }
- }
-
- @Override
- public void stop() {
- GreenMail greenMail = (GreenMail) messageContext.getServletContext().
- getAttribute(GreenMailStartStopListener.GREENMAIL);
- if (greenMail != null) {
- ((InterruptableSmtpServer)
greenMail.getSmtp()).setRejectRequests(true);
- LOG.info("SMTP server is rejecting requests");
- }
- }
-}
diff --git
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/ProvisioningImpl.java
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/ProvisioningImpl.java
index c324242..e22f210 100644
---
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/ProvisioningImpl.java
+++
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/ProvisioningImpl.java
@@ -29,7 +29,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
-import javax.annotation.Resource;
import javax.jws.WebService;
import javax.sql.DataSource;
import net.tirasa.connid.bundles.soap.exceptions.ProvisioningException;
@@ -43,18 +42,19 @@ import org.identityconnectors.common.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.DataSourceUtils;
-import org.springframework.stereotype.Service;
@WebService(
endpointInterface =
"net.tirasa.connid.bundles.soap.provisioning.interfaces.Provisioning",
serviceName = "Provisioning")
-@Service
public class ProvisioningImpl implements Provisioning {
private static final Logger LOG =
LoggerFactory.getLogger(Provisioning.class);
- @Resource(name = "testDataSource")
- private DataSource dataSource;
+ private final DataSource dataSource;
+
+ public ProvisioningImpl(final DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
@Override
public String delete(final String accountid) throws ProvisioningException {
@@ -184,7 +184,7 @@ public class ProvisioningImpl implements Provisioning {
try {
String queryString = "SELECT * FROM user" +
(Optional.ofNullable(query)
- .map(operand -> " WHERE " + operand.toString()).orElse(""));
+ .map(operand -> " WHERE " +
operand.toString()).orElse(""));
queryString = queryString.replaceAll("__NAME__", "userId").
replaceAll("__UID__", "userId").
diff --git
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserService.java
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserService.java
index 509a44b..e586d38 100644
---
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserService.java
+++
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserService.java
@@ -19,56 +19,159 @@
package org.apache.syncope.fit.buildtools.cxf;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javax.ws.rs.ClientErrorException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
+import javax.ws.rs.ForbiddenException;
import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
@Path("users")
-public interface UserService {
+public class UserService {
+
+ private static final Map<UUID, UserMetadata> USERS = new HashMap<>();
+
+ @Context
+ private UriInfo uriInfo;
@GET
@Produces({ MediaType.APPLICATION_JSON })
- List<User> list();
+ public List<User> list() {
+ return USERS.values().stream().
+ filter(meta -> !meta.isDeleted()).
+ map(UserMetadata::getUser).
+ collect(Collectors.toList());
+ }
@GET
@Path("changelog")
@Produces({ MediaType.APPLICATION_JSON })
- List<UserMetadata> changelog(@QueryParam("from") Date from);
+ public List<UserMetadata> changelog(@QueryParam("from") final Date from) {
+ Stream<UserMetadata> users = USERS.values().stream();
+ if (from != null) {
+ users = users.filter(meta -> meta.getLastChangeDate().after(from));
+ }
+ return users.collect(Collectors.toList());
+ }
@GET
@Path("{key}")
@Produces({ MediaType.APPLICATION_JSON })
- User read(@PathParam("key") UUID key);
+ public User read(@PathParam("key") final UUID key) {
+ UserMetadata meta = USERS.get(key);
+ if (meta == null || meta.isDeleted()) {
+ throw new NotFoundException(key.toString());
+ }
+ return meta.getUser();
+ }
@POST
@Consumes({ MediaType.APPLICATION_JSON })
- Response create(User user);
+ public Response create(final User user) {
+ if (user.getKey() == null) {
+ user.setKey(UUID.randomUUID());
+ }
+ if (user.getStatus() == null) {
+ user.setStatus(User.Status.ACTIVE);
+ }
+
+ UserMetadata meta = USERS.get(user.getKey());
+ if (meta != null && !meta.isDeleted()) {
+ throw new ClientErrorException("User already exists: " +
user.getKey(), Response.Status.CONFLICT);
+ }
+
+ meta = new UserMetadata();
+ meta.setLastChangeDate(new Date());
+ meta.setUser(user);
+ USERS.put(user.getKey(), meta);
+
+ return
Response.created(uriInfo.getAbsolutePathBuilder().path(user.getKey().toString()).build()).build();
+ }
@PUT
@Path("{key}")
@Consumes({ MediaType.APPLICATION_JSON })
- void update(@PathParam("key") UUID key, User user);
+ public void update(@PathParam("key") final UUID key, final User
updatedUser) {
+ UserMetadata meta = USERS.get(key);
+ if (meta == null || meta.isDeleted()) {
+ throw new NotFoundException(key.toString());
+ }
+
+ if (updatedUser.getUsername() != null) {
+ meta.getUser().setUsername(updatedUser.getUsername());
+ }
+ if (updatedUser.getPassword() != null) {
+ meta.getUser().setPassword(updatedUser.getPassword());
+ }
+ if (updatedUser.getFirstName() != null) {
+ meta.getUser().setFirstName(updatedUser.getFirstName());
+ }
+ if (updatedUser.getSurname() != null) {
+ meta.getUser().setSurname(updatedUser.getSurname());
+ }
+ if (updatedUser.getEmail() != null) {
+ meta.getUser().setEmail(updatedUser.getEmail());
+ }
+ if (updatedUser.getStatus() != null) {
+ meta.getUser().setStatus(updatedUser.getStatus());
+ }
+
+ meta.setLastChangeDate(new Date());
+ }
@DELETE
@Path("{key}")
- void delete(@PathParam("key") UUID key);
+ public void delete(@PathParam("key") final UUID key) {
+ UserMetadata meta = USERS.get(key);
+ if (meta == null || meta.isDeleted()) {
+ throw new NotFoundException(key.toString());
+ }
+
+ meta.setDeleted(true);
+ meta.setLastChangeDate(new Date());
+ }
@POST
@Path("authenticate")
@Produces({ MediaType.APPLICATION_JSON })
- User authenticate(@QueryParam("username") String username,
@QueryParam("password") String password);
+ public User authenticate(
+ @QueryParam("username") final String username,
+ @QueryParam("password") final String password) {
+
+ Optional<User> user = USERS.values().stream().
+ filter(meta -> !meta.isDeleted() &&
username.equals(meta.getUser().getUsername())).
+ findFirst().map(UserMetadata::getUser);
+
+ if (user.isEmpty()) {
+ throw new NotFoundException(username);
+ }
+ if (!password.equals(user.get().getPassword())) {
+ throw new ForbiddenException();
+ }
+
+ return user.get();
+ }
@POST
@Path("clear")
- void clear();
+ public void clear() {
+ USERS.clear();
+ }
}
diff --git
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserServiceImpl.java
b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserServiceImpl.java
deleted file mode 100644
index b671f8e..0000000
---
a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/cxf/UserServiceImpl.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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
- *
- * http://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.apache.syncope.fit.buildtools.cxf;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javax.ws.rs.ClientErrorException;
-import javax.ws.rs.ForbiddenException;
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import org.springframework.stereotype.Service;
-
-@Service
-public class UserServiceImpl implements UserService {
-
- private static final Map<UUID, UserMetadata> USERS = new HashMap<>();
-
- @Context
- private UriInfo uriInfo;
-
- @Override
- public List<User> list() {
- return USERS.values().stream().
- filter(meta -> !meta.isDeleted()).
- map(UserMetadata::getUser).
- collect(Collectors.toList());
- }
-
- @Override
- public List<UserMetadata> changelog(final Date from) {
- Stream<UserMetadata> users = USERS.values().stream();
- if (from != null) {
- users = users.filter(meta -> meta.getLastChangeDate().after(from));
- }
- return users.collect(Collectors.toList());
- }
-
- @Override
- public User read(final UUID key) {
- UserMetadata meta = USERS.get(key);
- if (meta == null || meta.isDeleted()) {
- throw new NotFoundException(key.toString());
- }
- return meta.getUser();
- }
-
- @Override
- public Response create(final User user) {
- if (user.getKey() == null) {
- user.setKey(UUID.randomUUID());
- }
- if (user.getStatus() == null) {
- user.setStatus(User.Status.ACTIVE);
- }
-
- UserMetadata meta = USERS.get(user.getKey());
- if (meta != null && !meta.isDeleted()) {
- throw new ClientErrorException("User already exists: " +
user.getKey(), Response.Status.CONFLICT);
- }
-
- meta = new UserMetadata();
- meta.setLastChangeDate(new Date());
- meta.setUser(user);
- USERS.put(user.getKey(), meta);
-
- return
Response.created(uriInfo.getAbsolutePathBuilder().path(user.getKey().toString()).build()).build();
- }
-
- @Override
- public void update(final UUID key, final User updatedUser) {
- UserMetadata meta = USERS.get(key);
- if (meta == null || meta.isDeleted()) {
- throw new NotFoundException(key.toString());
- }
-
- if (updatedUser.getUsername() != null) {
- meta.getUser().setUsername(updatedUser.getUsername());
- }
- if (updatedUser.getPassword() != null) {
- meta.getUser().setPassword(updatedUser.getPassword());
- }
- if (updatedUser.getFirstName() != null) {
- meta.getUser().setFirstName(updatedUser.getFirstName());
- }
- if (updatedUser.getSurname() != null) {
- meta.getUser().setSurname(updatedUser.getSurname());
- }
- if (updatedUser.getEmail() != null) {
- meta.getUser().setEmail(updatedUser.getEmail());
- }
- if (updatedUser.getStatus() != null) {
- meta.getUser().setStatus(updatedUser.getStatus());
- }
-
- meta.setLastChangeDate(new Date());
- }
-
- @Override
- public void delete(final UUID key) {
- UserMetadata meta = USERS.get(key);
- if (meta == null || meta.isDeleted()) {
- throw new NotFoundException(key.toString());
- }
-
- meta.setDeleted(true);
- meta.setLastChangeDate(new Date());
- }
-
- @Override
- public User authenticate(final String username, final String password) {
- Optional<User> user = USERS.values().stream().
- filter(meta -> !meta.isDeleted() &&
username.equals(meta.getUser().getUsername())).
- findFirst().map(UserMetadata::getUser);
-
- if (user.isEmpty()) {
- throw new NotFoundException(username);
- }
- if (!password.equals(user.get().getPassword())) {
- throw new ForbiddenException();
- }
-
- return user.get();
- }
-
- @Override
- public void clear() {
- USERS.clear();
- }
-}
diff --git
a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AnonymousITCase.java
b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AnonymousITCase.java
index 2d22b27..02f55a6 100644
---
a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AnonymousITCase.java
+++
b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AnonymousITCase.java
@@ -18,8 +18,6 @@
*/
package org.apache.syncope.fit.enduser;
-import static
org.apache.syncope.fit.enduser.AbstractEnduserITCase.securityQuestionService;
-import static org.apache.syncope.fit.enduser.AbstractEnduserITCase.userService;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index ce42c1b..cd8ce72 100644
--- a/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ b/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -120,7 +120,7 @@ public class AbstractITCase {
assertNotEquals(-1, begin);
int end = responseBody.indexOf("\"/>", begin);
assertNotEquals(-1, end);
- String relayState = responseBody.substring(begin + 25, end);
+ String relayState =
StringEscapeUtils.unescapeXml(responseBody.substring(begin + 25, end));
assertNotNull(relayState);
begin = responseBody.indexOf("name=\"SAMLRequest\" value=\"");
diff --git
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/SAML2SRAITCase.java
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/SAML2SRAITCase.java
index 0cd2e5c..f65c287 100644
---
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/SAML2SRAITCase.java
+++
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/SAML2SRAITCase.java
@@ -104,21 +104,23 @@ public class SAML2SRAITCase extends AbstractSRAITCase {
HttpGet get = new HttpGet(SRA_ADDRESS + "/public/get?" + QUERY_STRING);
get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- CloseableHttpResponse response = httpclient.execute(get, context);
-
- ObjectNode headers = checkGetResponse(response,
get.getURI().toASCIIString().replace("/public", ""));
- assertFalse(headers.has(HttpHeaders.COOKIE));
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ ObjectNode headers = checkGetResponse(response,
get.getURI().toASCIIString().replace("/public", ""));
+ assertFalse(headers.has(HttpHeaders.COOKIE));
+ }
// 2. protected
get = new HttpGet(SRA_ADDRESS + "/protected/get?" + QUERY_STRING);
String originalRequestURI = get.getURI().toASCIIString();
get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ String responseBody;
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
// 2a. post SAML request
- String responseBody = EntityUtils.toString(response.getEntity());
Triple<String, String, String> parsed =
parseSAMLRequestForm(responseBody);
HttpPost post = new HttpPost(parsed.getLeft());
@@ -127,22 +129,42 @@ public class SAML2SRAITCase extends AbstractSRAITCase {
post.setEntity(new UrlEncodedFormEntity(
List.of(new BasicNameValuePair("RelayState",
parsed.getMiddle()),
new BasicNameValuePair("SAMLRequest",
parsed.getRight())), Consts.UTF_8));
- response = httpclient.execute(post, context);
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ String location;
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ }
// 2b. authenticate
- get = new
HttpGet(response.getFirstHeader(HttpHeaders.LOCATION).getValue());
- get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
- get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ post = new HttpPost(location);
+ post.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
+ post.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
+
+ boolean isOk = false;
+ try (CloseableHttpResponse response =
+ authenticateToCas("bellini", "password", responseBody,
httpclient, context)) {
+
+ switch (response.getStatusLine().getStatusCode()) {
+ case HttpStatus.SC_OK:
+ isOk = true;
+ responseBody = EntityUtils.toString(response.getEntity());
+ break;
- responseBody = EntityUtils.toString(response.getEntity());
- response = authenticateToCas("bellini", "password", responseBody,
httpclient, context);
+ case HttpStatus.SC_MOVED_TEMPORARILY:
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ break;
+
+ default:
+ fail();
+ }
+ }
// 2c. WA attribute consent screen
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
- responseBody = EntityUtils.toString(response.getEntity());
+ if (isOk) {
String execution = extractCASExecution(responseBody);
List<NameValuePair> form = new ArrayList<>();
@@ -156,18 +178,21 @@ public class SAML2SRAITCase extends AbstractSRAITCase {
post.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
post.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
post.setEntity(new UrlEncodedFormEntity(form, Consts.UTF_8));
- response = httpclient.execute(post, context);
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue().replace(":8080",
":9080");
+ }
}
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
- get = new
HttpGet(response.getFirstHeader(HttpHeaders.LOCATION).getValue());
+ get = new HttpGet(location);
get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
// 2d. post SAML response
- responseBody = EntityUtils.toString(response.getEntity());
parsed = parseSAMLResponseForm(responseBody);
post = new HttpPost(parsed.getLeft());
@@ -176,25 +201,28 @@ public class SAML2SRAITCase extends AbstractSRAITCase {
post.setEntity(new UrlEncodedFormEntity(
List.of(new BasicNameValuePair("RelayState",
parsed.getMiddle()),
new BasicNameValuePair("SAMLResponse",
parsed.getRight())), Consts.UTF_8));
- response = httpclient.execute(post, context);
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ }
// 2e. finally get requested content
- get = new
HttpGet(response.getFirstHeader(HttpHeaders.LOCATION).getValue());
+ get = new HttpGet(location);
get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
-
- headers = checkGetResponse(response,
originalRequestURI.replace("/protected", ""));
- assertFalse(headers.get(HttpHeaders.COOKIE).asText().isBlank());
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ ObjectNode headers = checkGetResponse(response,
originalRequestURI.replace("/protected", ""));
+ assertFalse(headers.get(HttpHeaders.COOKIE).asText().isBlank());
+ }
// 3. logout
get = new HttpGet(SRA_ADDRESS + "/protected/logout");
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
// 3a. post SAML request
- responseBody = EntityUtils.toString(response.getEntity());
parsed = parseSAMLRequestForm(responseBody);
post = new HttpPost(parsed.getLeft());
@@ -203,15 +231,17 @@ public class SAML2SRAITCase extends AbstractSRAITCase {
post.setEntity(new UrlEncodedFormEntity(
List.of(new BasicNameValuePair("RelayState",
parsed.getMiddle()),
new BasicNameValuePair("SAMLRequest",
parsed.getRight())), Consts.UTF_8));
- response = httpclient.execute(post, context);
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ }
- get = new
HttpGet(response.getFirstHeader(HttpHeaders.LOCATION).getValue());
+ get = new HttpGet(location);
get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
-
// 3b. check logout
- checkLogout(response);
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ checkLogout(response);
+ }
}
}
diff --git
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
index 151c06d..26057e1 100644
---
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
+++
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
@@ -181,40 +181,62 @@ public class SAML2SP4UIITCase extends AbstractUIITCase {
// 1. fetch login page
HttpGet get = new HttpGet(baseURL);
- CloseableHttpResponse response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ }
// 2. click on the SAML 2.0 IdP
get = new HttpGet(baseURL + SAML2SP4UIConstants.URL_CONTEXT
+ "/login?idp=http%3A//localhost%3A9080/syncope-wa/saml");
- response = httpclient.execute(get, context);
-
- // 2a. post SAML request
- String responseBody = EntityUtils.toString(response.getEntity());
+ String responseBody;
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
Triple<String, String, String> parsed =
parseSAMLRequestForm(responseBody);
+ // 2a. post SAML request
HttpPost post = new HttpPost(parsed.getLeft());
post.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
post.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
post.setEntity(new UrlEncodedFormEntity(
List.of(new BasicNameValuePair("RelayState",
parsed.getMiddle()),
new BasicNameValuePair("SAMLRequest",
parsed.getRight())), Consts.UTF_8));
- response = httpclient.execute(post, context);
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ String location;
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ }
// 2b. authenticate
- get = new
HttpGet(response.getFirstHeader(HttpHeaders.LOCATION).getValue());
- get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
- get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
-
- responseBody = EntityUtils.toString(response.getEntity());
- response = authenticateToCas(username, password, responseBody,
httpclient, context);
+ post = new HttpPost(location);
+ post.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
+ post.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
+ post.addHeader(HttpHeaders.REFERER, get.getURI().toASCIIString());
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
+ boolean isOk = false;
+ try (CloseableHttpResponse response =
+ authenticateToCas(username, password, responseBody,
httpclient, context)) {
+
+ switch (response.getStatusLine().getStatusCode()) {
+ case HttpStatus.SC_OK:
+ isOk = true;
+ responseBody = EntityUtils.toString(response.getEntity());
+ break;
+
+ case HttpStatus.SC_MOVED_TEMPORARILY:
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ break;
+
+ default:
+ fail();
+ }
+ }
// 2c. WA attribute consent screen
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
- responseBody = EntityUtils.toString(response.getEntity());
+ if (isOk) {
String execution = extractCASExecution(responseBody);
List<NameValuePair> form = new ArrayList<>();
@@ -228,18 +250,21 @@ public class SAML2SP4UIITCase extends AbstractUIITCase {
post.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
post.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
post.setEntity(new UrlEncodedFormEntity(form, Consts.UTF_8));
- response = httpclient.execute(post, context);
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue().replace(":8080",
":9080");
+ }
}
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
- get = new
HttpGet(response.getFirstHeader(HttpHeaders.LOCATION).getValue());
+ get = new HttpGet(location);
get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
- response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+ responseBody = EntityUtils.toString(response.getEntity());
+ }
// 2d. post SAML response
- responseBody = EntityUtils.toString(response.getEntity());
parsed = parseSAMLResponseForm(responseBody);
post = new HttpPost(parsed.getLeft());
@@ -248,15 +273,17 @@ public class SAML2SP4UIITCase extends AbstractUIITCase {
post.setEntity(new UrlEncodedFormEntity(
List.of(new BasicNameValuePair("RelayState",
parsed.getMiddle()),
new BasicNameValuePair("SAMLResponse",
parsed.getRight())), Consts.UTF_8));
- response = httpclient.execute(post, context);
- assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ try (CloseableHttpResponse response = httpclient.execute(post,
context)) {
+ assertEquals(HttpStatus.SC_MOVED_TEMPORARILY,
response.getStatusLine().getStatusCode());
+ location =
response.getFirstHeader(HttpHeaders.LOCATION).getValue();
+ }
// 3. verify that user is now authenticated
- get = new HttpGet(baseURL + StringUtils.removeStart(
- response.getFirstHeader(HttpHeaders.LOCATION).getValue(),
"../"));
- response = httpclient.execute(get, context);
- assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
-
assertTrue(EntityUtils.toString(response.getEntity()).contains(username));
+ get = new HttpGet(baseURL + StringUtils.removeStart(location, "../"));
+ try (CloseableHttpResponse response = httpclient.execute(get,
context)) {
+ assertEquals(HttpStatus.SC_OK,
response.getStatusLine().getStatusCode());
+
assertTrue(EntityUtils.toString(response.getEntity()).contains(username));
+ }
}
@Override
diff --git a/pom.xml b/pom.xml
index abfd8a3..52f72d7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -403,13 +403,13 @@ under the License.
<connid.scimv11.version>1.0.1</connid.scimv11.version>
<connid.servicenow.version>1.0.0</connid.servicenow.version>
- <cxf.version>3.4.5</cxf.version>
+ <cxf.version>3.5.0</cxf.version>
<bouncycastle.version>1.70</bouncycastle.version>
<nimbus-jose-jwt.version>9.15.2</nimbus-jose-jwt.version>
<jackson.version>2.13.1</jackson.version>
- <spring-boot.version>2.6.1</spring-boot.version>
+ <spring-boot.version>2.6.2</spring-boot.version>
<spring-cloud-gateway.version>3.1.0</spring-cloud-gateway.version>
<openjpa.version>3.2.0</openjpa.version>
@@ -472,7 +472,7 @@ under the License.
<wicketstuff.version>9.6.0</wicketstuff.version>
<wicket-jqueryui.version>9.5.0</wicket-jqueryui.version>
<wicket-bootstrap.version>5.0.6</wicket-bootstrap.version>
- <wicket-spring-boot.version>3.0.4</wicket-spring-boot.version>
+ <wicket-spring-boot.version>3.1.6</wicket-spring-boot.version>
<antlr4.version>4.9.3</antlr4.version>