summaryrefslogblamecommitdiffstats
path: root/src/main/java/edu/kit/scc/dei/ecplean/ECPIdPAuth.java
blob: 9700d8c1fdf572945c943604a47c1c11033f8073 (plain) (tree)
1
2
3
4
5
6
7
8
9
10





                                                       



                                                 
                                                                    




                                                       
         

                                                            

                                                                                                

          
                                                                                        

                                              
                                                                                                
          
         








































                                                                                                                                                                     






                                                                 
package edu.kit.scc.dei.ecplean;

import java.io.IOException;
import java.net.URI;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathException;

import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class ECPIdPAuth extends ECPAuthenticatorBase {
	
	public ECPIdPAuth(String username, String password,
			URI idpEcpEndpoint) {
		super();
		authInfo = new ECPAuthenticationInfo(username, password, idpEcpEndpoint, null);
	}

	public ECPIdPAuth(CloseableHttpClient client, String username, String password,
			URI idpEcpEndpoint) {
		super(client);
		authInfo = new ECPAuthenticationInfo(username, password, idpEcpEndpoint, null);
	}
	
	public String authenticate(String paosMessage) throws ECPAuthenticationException {
		
		Document initResponse;
		try {
			initResponse = buildDocumentFromString(paosMessage);
		} catch (IOException e) {
			logger.debug("Parsing SP Request failed");
			throw new ECPAuthenticationException(e);
		} catch (ParserConfigurationException e) {
			logger.debug("Parsing SP Request failed");
			throw new ECPAuthenticationException(e);
		} catch (SAXException e) {
			logger.debug("Parsing SP Request failed");
			throw new ECPAuthenticationException(e);
		}
		
		String relayState;
		try {
			relayState = (String) queryDocument(initResponse, "//ecp:RelayState", XPathConstants.STRING);
		} catch (XPathException e) {
			logger.debug("Could not find relay state in PAOS answer from SP");
			throw new ECPAuthenticationException(e);
		}
		logger.info("Got relayState: " + relayState);
		String responseConsumerUrl;
		try {
			responseConsumerUrl = (String) queryDocument(initResponse, "/S:Envelope/S:Header/paos:Request/@responseConsumerURL", XPathConstants.STRING);
		} catch (XPathException e) {
			logger.debug("Could not find response consumer url in PAOS answer from SP");
			throw new ECPAuthenticationException(e);
		}
		logger.info("Got responseConsumerUrl: " + responseConsumerUrl);

		Node firstChild = initResponse.getDocumentElement().getFirstChild();
		initResponse.getDocumentElement().removeChild(firstChild);

		Document idpResponse = authenticateIdP(initResponse);
		idpResponse.getDocumentElement().getFirstChild().getFirstChild().setTextContent(relayState);

		try {
			return documentToString(idpResponse);
		} catch (TransformerException e) {
			logger.debug("documentToString failed");
			throw new ECPAuthenticationException(e);
		}
	}

}