1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package edu.internet2.middleware.shibboleth.idp.profile;
19
20 import java.io.File;
21 import java.io.OutputStreamWriter;
22
23 import javax.servlet.http.HttpServletRequest;
24 import javax.servlet.http.HttpServletResponse;
25
26 import org.opensaml.Configuration;
27 import org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider;
28 import org.opensaml.ws.transport.InTransport;
29 import org.opensaml.ws.transport.OutTransport;
30 import org.opensaml.ws.transport.http.HttpServletRequestAdapter;
31 import org.opensaml.ws.transport.http.HttpServletResponseAdapter;
32 import org.opensaml.xml.XMLObject;
33 import org.opensaml.xml.io.Marshaller;
34 import org.opensaml.xml.parse.ParserPool;
35 import org.opensaml.xml.util.DatatypeHelper;
36 import org.opensaml.xml.util.XMLHelper;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 import edu.internet2.middleware.shibboleth.common.profile.ProfileException;
41 import edu.internet2.middleware.shibboleth.common.profile.provider.AbstractRequestURIMappedProfileHandler;
42
43
44
45
46
47 public class SAMLMetadataProfileHandler extends AbstractRequestURIMappedProfileHandler {
48
49
50 private final Logger log = LoggerFactory.getLogger(SAMLMetadataProfileHandler.class);
51
52
53 private FilesystemMetadataProvider metadataProvider;
54
55
56
57
58
59
60
61 public SAMLMetadataProfileHandler(String metadataFile, ParserPool pool) {
62 try {
63 metadataProvider = new FilesystemMetadataProvider(new File(metadataFile));
64 metadataProvider.setParserPool(pool);
65 metadataProvider.setRequireValidMetadata(false);
66 metadataProvider.initialize();
67 } catch (Exception e) {
68 log.error("Unable to read metadata file " + metadataFile, e);
69 }
70 }
71
72
73 public void processRequest(InTransport in, OutTransport out) throws ProfileException {
74 XMLObject metadata;
75
76 HttpServletRequest httpRequest = ((HttpServletRequestAdapter)in).getWrappedRequest();
77 HttpServletResponse httpResponse = ((HttpServletResponseAdapter)out).getWrappedResponse();
78
79 String acceptHeder = DatatypeHelper.safeTrimOrNullString(httpRequest.getHeader("Accept"));
80 if(acceptHeder != null && !acceptHeder.contains("application/samlmetadata+xml")){
81 httpResponse.setContentType("application/xml");
82 }else{
83 httpResponse.setContentType("application/samlmetadata+xml");
84 }
85
86 try {
87 String requestedEntity = DatatypeHelper.safeTrimOrNullString(((HttpServletRequestAdapter) in)
88 .getParameterValue("entity"));
89 if (requestedEntity != null) {
90 metadata = metadataProvider.getEntityDescriptor(requestedEntity);
91 } else {
92 metadata = metadataProvider.getMetadata();
93 }
94
95 if (metadata != null) {
96 Marshaller marshaller = Configuration.getMarshallerFactory().getMarshaller(metadata);
97 XMLHelper.writeNode(marshaller.marshall(metadata), new OutputStreamWriter(out.getOutgoingStream()));
98 }
99 } catch (Exception e) {
100 log.error("Unable to retrieve and return metadata", e);
101 throw new ProfileException(e);
102 }
103 }
104 }