package org.apereo.cas.ws.idp.authentication;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URIBuilder;
import org.apereo.cas.authentication.AuthenticationServiceSelectionStrategy;
import org.apereo.cas.authentication.principal.Service;
import org.apereo.cas.authentication.principal.ServiceFactory;
import org.apereo.cas.ws.idp.WSFederationConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import java.util.Optional;
/**
* This is {@link WSFederationAuthenticationServiceSelectionStrategy}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class WSFederationAuthenticationServiceSelectionStrategy implements AuthenticationServiceSelectionStrategy {
private static final long serialVersionUID = 8035218407906419228L;
private static final Logger LOGGER = LoggerFactory.getLogger(WSFederationAuthenticationServiceSelectionStrategy.class);
private final int order = Ordered.HIGHEST_PRECEDENCE;
private final ServiceFactory webApplicationServiceFactory;
public WSFederationAuthenticationServiceSelectionStrategy(final ServiceFactory webApplicationServiceFactory) {
this.webApplicationServiceFactory = webApplicationServiceFactory;
}
@Override
public Service resolveServiceFrom(final Service service) {
if (service != null) {
final String serviceReply = getReplyAsParameter(service).get().getValue();
LOGGER.debug("Located service id [{}] from service authentication request at [{}]", serviceReply, service.getId());
return this.webApplicationServiceFactory.createService(serviceReply);
}
return service;
}
@Override
public boolean supports(final Service service) {
return service != null && getRealmAsParameter(service).isPresent() && getReplyAsParameter(service).isPresent();
}
private static Optional<NameValuePair> getRealmAsParameter(final Service service) {
try {
final URIBuilder builder = new URIBuilder(service.getId());
final Optional param = builder.getQueryParams()
.stream()
.filter(p -> p.getName().equals(WSFederationConstants.WTREALM))
.findFirst();
return param;
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
}
return Optional.empty();
}
private static Optional<NameValuePair> getReplyAsParameter(final Service service) {
try {
final URIBuilder builder = new URIBuilder(service.getId());
final Optional param = builder.getQueryParams()
.stream()
.filter(p -> p.getName().equals(WSFederationConstants.WREPLY))
.findFirst();
return param;
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
}
return Optional.empty();
}
@Override
public int getOrder() {
return this.order;
}
}