package org.apereo.cas.support.saml.authentication.principal; import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import org.apereo.cas.authentication.principal.AbstractServiceFactory; import org.apereo.cas.support.saml.SamlProtocolConstants; import org.apereo.cas.support.saml.util.GoogleSaml20ObjectBuilder; import org.jdom.Document; import org.jdom.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; /** * Builds {@link GoogleAccountsService} objects. * * @author Misagh Moayyed * @since 4.2 */ public class GoogleAccountsServiceFactory extends AbstractServiceFactory<GoogleAccountsService> { private static final Logger LOGGER = LoggerFactory.getLogger(GoogleAccountsServiceFactory.class); private final GoogleSaml20ObjectBuilder googleSaml20ObjectBuilder; public GoogleAccountsServiceFactory(final GoogleSaml20ObjectBuilder googleSaml20ObjectBuilder) { this.googleSaml20ObjectBuilder = googleSaml20ObjectBuilder; } @Override public GoogleAccountsService createService(final HttpServletRequest request) { final String relayState = request.getParameter(SamlProtocolConstants.PARAMETER_SAML_RELAY_STATE); final String xmlRequest = this.googleSaml20ObjectBuilder.decodeSamlAuthnRequest( request.getParameter(SamlProtocolConstants.PARAMETER_SAML_REQUEST)); if (StringUtils.isBlank(xmlRequest)) { LOGGER.trace("SAML AuthN request not found in the request"); return null; } final Document document = this.googleSaml20ObjectBuilder.constructDocumentFromXml(xmlRequest); if (document == null) { return null; } final Element root = document.getRootElement(); final String assertionConsumerServiceUrl = root.getAttributeValue("AssertionConsumerServiceURL"); final String requestId = root.getAttributeValue("ID"); final GoogleAccountsService s = new GoogleAccountsService(assertionConsumerServiceUrl, relayState, requestId); s.setLoggedOutAlready(true); return s; } @Override public GoogleAccountsService createService(final String id) { throw new NotImplementedException("This operation is not supported."); } }