231b6d797ad896e379d474af0a616a35234400b3
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / idp / profile / saml1 / AbstractProfileHandler.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.saml1;
18
19 import javax.servlet.ServletRequest;
20 import javax.servlet.ServletResponse;
21
22 import org.apache.log4j.Logger;
23 import org.opensaml.Configuration;
24 import org.opensaml.common.SAMLObject;
25 import org.opensaml.common.SAMLVersion;
26 import org.opensaml.common.binding.BindingException;
27 import org.opensaml.common.binding.MessageDecoder;
28 import org.opensaml.common.binding.MessageEncoder;
29 import org.opensaml.common.impl.SecureRandomIdentifierGenerator;
30 import org.opensaml.xml.XMLObjectBuilderFactory;
31
32 import edu.internet2.middleware.shibboleth.common.attribute.filtering.FilteringEngine;
33 import edu.internet2.middleware.shibboleth.common.attribute.resolver.AttributeResolver;
34 import edu.internet2.middleware.shibboleth.common.profile.ProfileHandler;
35 import edu.internet2.middleware.shibboleth.common.relyingparty.RelyingPartyConfiguration;
36
37 /**
38  * Common implementation details for profile handlers.
39  */
40 public abstract class AbstractProfileHandler implements ProfileHandler {
41
42     /** SAML Version for this profile handler. */
43     public static final SAMLVersion SAML_VERSION = SAMLVersion.VERSION_11;
44
45     /** Class logger. */
46     private static Logger log = Logger.getLogger(AbstractProfileHandler.class);
47     
48     /** For building XML. */
49     private XMLObjectBuilderFactory builderFactory;
50
51     /** For generating random ids. */
52     private SecureRandomIdentifierGenerator idGenerator;
53
54     /** For decoding requests. */
55     private MessageDecoder<ServletRequest> decoder;
56
57     /** For encoding responses. */
58     private MessageEncoder<ServletResponse> encoder;
59
60     /** Relying party configuration. */
61     private RelyingPartyConfiguration relyingPartyConfiguration;
62
63     /** For resolving attributes. */
64     private AttributeResolver resolver;
65
66     /** To determine releasable attributes. */
67     private FilteringEngine engine;
68
69     /**
70      * Default constructor.
71      */
72     public AbstractProfileHandler() {
73         builderFactory = Configuration.getBuilderFactory();
74         idGenerator = new SecureRandomIdentifierGenerator();
75     }
76
77     /**
78      * Returns the XML builder factory.
79      * 
80      * @return Returns the builderFactory.
81      */
82     public XMLObjectBuilderFactory getBuilderFactory() {
83         return builderFactory;
84     }
85
86     /**
87      * Returns the id generator.
88      * 
89      * @return Returns the idGenerator.
90      */
91     public SecureRandomIdentifierGenerator getIdGenerator() {
92         return idGenerator;
93     }
94
95     /**
96      * Sets the decoder.
97      * 
98      * @param d <code>MessageDecoder</code>
99      */
100     public void setDecoder(MessageDecoder<ServletRequest> d) {
101         decoder = d;
102     }
103
104     /**
105      * Returns the decoder.
106      * 
107      * @return <code>MessageDecoder</code>
108      */
109     public MessageDecoder<ServletRequest> getDecoder() {
110         return decoder;
111     }
112
113     /**
114      * Sets the encoder.
115      * 
116      * @param e <code>MessageEncoder</code>
117      */
118     public void setEncoder(MessageEncoder<ServletResponse> e) {
119         encoder = e;
120     }
121
122     /**
123      * Returns the encoder.
124      * 
125      * @return <code>MessageEncoder</code>
126      */
127     public MessageEncoder<ServletResponse> getEncoder() {
128         return encoder;
129     }
130
131     /**
132      * Sets the attribute resolver.
133      * 
134      * @param r <code>AttributeResolver</code>
135      */
136     public void setAttributeResolver(AttributeResolver r) {
137         resolver = r;
138     }
139
140     /**
141      * Returns the attribute resolver.
142      * 
143      * @return <code>AttributeResolver</code>
144      */
145     public AttributeResolver getAttributeResolver() {
146         return resolver;
147     }
148
149     /**
150      * Sets the filter engine.
151      * 
152      * @param e <code>FilterEngine</code>
153      */
154     public void setFilterEngine(FilteringEngine e) {
155         engine = e;
156     }
157
158     /**
159      * Returns the filter engine.
160      * 
161      * @return <code>FilterEngine</code>
162      */
163     public FilteringEngine getFilteringEngine() {
164         return engine;
165     }
166
167     /**
168      * Returns the relying party configuration.
169      * 
170      * @return Returns the relyingParty.
171      */
172     public RelyingPartyConfiguration getRelyingPartyConfiguration() {
173         return relyingPartyConfiguration;
174     }
175
176     /**
177      * Sets the relying party configuration.
178      * 
179      * @param c The relyingParty to set.
180      */
181     public void setRelyingPartyConfiguration(RelyingPartyConfiguration c) {
182         relyingPartyConfiguration = c;
183     }
184     
185     /**
186      * This decodes the attribute query message from the supplied request.
187      * 
188      * @param request <code>ServletRequest</code>
189      * @return <code>SAMLObject</code>
190      * @throws BindingException if the request cannot be decoded
191      */
192     protected SAMLObject decodeMessage(ServletRequest request) throws BindingException {
193         // call decode method on decoder
194         decoder.setRequest(request);
195         decoder.decode();
196         if (log.isDebugEnabled()) {
197             log.debug("decoded servlet request");
198         }
199
200         // get SAMLMessage from the decoder
201         final SAMLObject message = decoder.getSAMLMessage();
202         if (log.isDebugEnabled()) {
203             log.debug("retrieved attribute query message from decoder: " + message);
204         }
205
206         return message;
207     }
208     
209
210     /**
211      * This encodes the supplied response.
212      * 
213      * @param response <code>SAMLObject</code>
214      * @throws BindingException if the response cannot be encoded
215      */
216     protected void encodeResponse(SAMLObject response) throws BindingException {
217         encoder.setSAMLMessage(response);
218         encoder.encode();
219         if (log.isDebugEnabled()) {
220             log.debug("encoded saml1 response");
221         }
222     }    
223 }