Commented out XMLBuilder code for now so AttributeQuery will compile.
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / idp / profile / saml2 / AbstractSAML2ProfileHandler.java
1 /*
2  * Copyright [2007] [University Corporation for Advanced Internet Development, Inc.]
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package edu.internet2.middleware.shibboleth.idp.profile.saml2;
18
19 import java.util.List;
20
21 import javax.servlet.ServletRequest;
22 import javax.servlet.ServletResponse;
23
24 import org.apache.log4j.Logger;
25 import org.joda.time.DateTime;
26 import org.opensaml.Configuration;
27 import org.opensaml.common.IdentifierGenerator;
28 import org.opensaml.common.SAMLObject;
29 import org.opensaml.common.SAMLObjectBuilder;
30 import org.opensaml.common.SAMLVersion;
31 import org.opensaml.common.binding.BindingException;
32 import org.opensaml.common.binding.MessageDecoder;
33 import org.opensaml.common.binding.MessageEncoder;
34 import org.opensaml.common.impl.SecureRandomIdentifierGenerator;
35 import org.opensaml.saml2.core.Assertion;
36 import org.opensaml.saml2.core.Audience;
37 import org.opensaml.saml2.core.AudienceRestriction;
38 import org.opensaml.saml2.core.Conditions;
39 import org.opensaml.saml2.core.Issuer;
40 import org.opensaml.saml2.core.Response;
41 import org.opensaml.saml2.core.Status;
42 import org.opensaml.saml2.core.StatusCode;
43 import org.opensaml.saml2.core.StatusMessage;
44 import org.opensaml.saml2.core.Subject;
45 import org.opensaml.xml.XMLObjectBuilder;
46 import org.opensaml.xml.XMLObjectBuilderFactory;
47
48 import edu.internet2.middleware.shibboleth.idp.profile.AbstractSAMLProfileHandler;
49
50 /**
51  * Common implementation details for profile handlers.
52  */
53 public abstract class AbstractSAML2ProfileHandler extends AbstractSAMLProfileHandler {
54
55     /** SAML Version for this profile handler. */
56     public static final SAMLVersion SAML_VERSION = SAMLVersion.VERSION_20;
57
58     /** Class logger. */
59     private static Logger log = Logger.getLogger(AbstractSAML2ProfileHandler.class);
60
61     /** For building XML. */
62     private XMLObjectBuilderFactory builderFactory;
63
64     /** For generating random ids. */
65     private IdentifierGenerator idGenerator;
66
67     /** Builder for Response elements. */
68     //protected SAMLObjectBuilder<Response> responseBuilder;
69
70     /** Builder for Status elements. */
71     //private SAMLObjectBuilder<Status> statusBuilder;
72
73     /** Builder for StatusCode elements. */
74     //private SAMLObjectBuilder<StatusCode> statusCodeBuilder;
75
76     /** Builder for StatusMessage elements. */
77     //private SAMLObjectBuilder<StatusMessage> statusMessageBuilder;
78
79     /** Builder for Issuer elements. */
80     //protected SAMLObjectBuilder<Issuer> issuerBuilder;
81
82     /**
83      * Default constructor.
84      */
85     public AbstractSAML2ProfileHandler() {
86         builderFactory = Configuration.getBuilderFactory();
87         idGenerator = new SecureRandomIdentifierGenerator();
88
89         /*
90         responseBuilder = (SAMLObjectBuilder<Response>) builderFactory.getBuilder(Response.DEFAULT_ELEMENT_NAME);
91         statusBuilder = (SAMLObjectBuilder<Status>) builderFactory.getBuilder(Status.DEFAULT_ELEMENT_NAME);
92         statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory.getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
93         statusMessageBuilder = (SAMLObjectBuilder<StatusMessage>) builderFactory
94                 .getBuilder(StatusMessage.DEFAULT_ELEMENT_NAME);
95         issuerBuilder = (SAMLObjectBuilder<Issuer>) builderFactory.getBuilder(Issuer.DEFAULT_ELEMENT_NAME);
96         */
97     }
98
99     /**
100      * Returns the XML builder factory.
101      * 
102      * @return Returns the builderFactory.
103      */
104     public XMLObjectBuilderFactory getBuilderFactory() {
105         return builderFactory;
106     }
107
108     /**
109      * Returns the id generator.
110      * 
111      * @return Returns the idGenerator.
112      */
113     public IdentifierGenerator getIdGenerator() {
114         return idGenerator;
115     }
116
117     /**
118      * Build a status message, with an optional second-level failure message.
119      * 
120      * @param topLevelCode The top-level status code. Should be from saml-core-2.0-os, sec. 3.2.2.2
121      * @param secondLevelCode An optional second-level failure code. Should be from saml-core-2.0-is, sec 3.2.2.2. If
122      *            null, no second-level Status element will be set.
123      * @param secondLevelFailureMessage An optional second-level failure message.
124      * 
125      * @return a Status object.
126      */
127     /*
128     protected Status buildStatus(String topLevelCode, String secondLevelCode, String secondLevelFailureMessage) {
129
130         Status status = statusBuilder.buildObject();
131         StatusCode statusCode = statusCodeBuilder.buildObject();
132
133         statusCode.setValue(topLevelCode);
134         if (secondLevelCode != null) {
135             StatusCode secondLevelStatusCode = statusCodeBuilder.buildObject();
136             secondLevelStatusCode.setValue(secondLevelCode);
137             statusCode.setStatusCode(secondLevelStatusCode);
138         }
139
140         if (secondLevelFailureMessage != null) {
141             StatusMessage msg = statusMessageBuilder.buildObject();
142             msg.setMessage(secondLevelFailureMessage);
143             status.setStatusMessage(msg);
144         }
145
146         return status;
147     }
148     */
149
150     /**
151      * Build a SAML 2 Response element with basic fields populated.
152      * 
153      * Failure handlers can send the returned response element to the RP. Success handlers should add the assertions
154      * before sending it.
155      * 
156      * @param inResponseTo The ID of the request this is in response to.
157      * @param issueInstant The timestamp of this response
158      * @param issuer The URI of the RP issuing the response.
159      * @param status The response's status code.
160      * 
161      * @return The populated Response object.
162      */
163     /*
164     protected Response buildResponse(String inResponseTo, DateTime issueInstant, String issuer, final Status status) {
165
166         Response response = responseBuilder.buildObject();
167
168         Issuer i = issuerBuilder.buildObject();
169         i.setValue(issuer);
170
171         response.setVersion(SAML_VERSION);
172         response.setID(getIdGenerator().generateIdentifier());
173         response.setInResponseTo(inResponseTo);
174         response.setIssueInstant(issueInstant);
175         response.setIssuer(i);
176         response.setStatus(status);
177
178         return response;
179     }
180     */
181
182     /*
183     protected Assertion buildAssertion(final Subject subject, final Conditions conditions, String issuer,
184             final String[] audiences) {
185
186         Assertion assertion = (Assertion) assertionBuilder.buildObject();
187         assertion.setID(getIdGenerator().generateIdentifier());
188         assertion.setVersion(SAML_VERSION);
189         assertion.setIssueInstant(new DateTime());
190         assertion.setConditions(conditions);
191         assertion.setSubject(subject);
192
193         Issuer i = (Issuer) issuerBuilder.buildObject();
194         i.setValue(issuer);
195         assertion.setIssuer(i);
196
197         // if audiences were specified, set an AudienceRestriction condition
198         if (audiences != null && audiences.length > 0) {
199
200             Conditions conditions = assertion.getConditions();
201             List<AudienceRestriction> audienceRestrictionConditions = conditions.getAudienceRestrictions();
202
203             for (String audienceURI : audiences) {
204
205                 Audience audience = audienceBuilder.buildObject();
206                 audience.setAudienceURI(audienceURI);
207
208                 AudienceRestriction audienceRestriction = audienceRestrictionBuilder
209                         .buildObject();
210                 List<Audience> audienceList = audienceRestriction.getAudiences();
211                 audienceList.add(audience);
212
213                 audienceRestrictionConditions.add(audienceRestriction);
214             }
215         }
216
217         return assertion;
218     }
219     */
220 }