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