f3980d45e13971d5f567376413d71b05f0906f9b
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / aa / AAServlet.java
1 /* 
2  * The Shibboleth License, Version 1. 
3  * Copyright (c) 2002 
4  * University Corporation for Advanced Internet Development, Inc. 
5  * All rights reserved
6  * 
7  * 
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions are met:
10  * 
11  * Redistributions of source code must retain the above copyright notice, this 
12  * list of conditions and the following disclaimer.
13  * 
14  * Redistributions in binary form must reproduce the above copyright notice, 
15  * this list of conditions and the following disclaimer in the documentation 
16  * and/or other materials provided with the distribution, if any, must include 
17  * the following acknowledgment: "This product includes software developed by 
18  * the University Corporation for Advanced Internet Development 
19  * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement 
20  * may appear in the software itself, if and wherever such third-party 
21  * acknowledgments normally appear.
22  * 
23  * Neither the name of Shibboleth nor the names of its contributors, nor 
24  * Internet2, nor the University Corporation for Advanced Internet Development, 
25  * Inc., nor UCAID may be used to endorse or promote products derived from this 
26  * software without specific prior written permission. For written permission, 
27  * please contact shibboleth@shibboleth.org
28  * 
29  * Products derived from this software may not be called Shibboleth, Internet2, 
30  * UCAID, or the University Corporation for Advanced Internet Development, nor 
31  * may Shibboleth appear in their name, without prior written permission of the 
32  * University Corporation for Advanced Internet Development.
33  * 
34  * 
35  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
36  * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
37  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
38  * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK 
39  * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. 
40  * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY 
41  * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, 
42  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
43  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
44  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
46  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
47  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48  */
49
50 package edu.internet2.middleware.shibboleth.aa;
51
52 import java.io.*;
53 import java.util.*;
54 import javax.servlet.*;
55 import javax.servlet.http.*;
56 import javax.naming.*;
57 import javax.naming.directory.*;
58 import org.opensaml.*;
59 import org.w3c.dom.*;
60 import edu.internet2.middleware.shibboleth.*;
61 import edu.internet2.middleware.shibboleth.common.*;
62 import edu.internet2.middleware.shibboleth.hs.*;
63 import edu.internet2.middleware.eduPerson.*;
64 import org.apache.log4j.Logger;
65 import org.apache.log4j.MDC;
66 import org.doomdark.uuid.UUIDGenerator;
67
68 /**
69  *  Attribute Authority & Release Policy
70  *  Handles Initialization and incoming requests to AA
71  *
72  * @author     Parviz Dousti (dousti@cmu.edu)
73  * @created    June, 2002
74  */
75
76 public class AAServlet extends HttpServlet {
77
78     String myName;
79     String dirUrl;
80     String uidSyntax;
81     String arpFactoryMethod;
82     String arpFactoryData;
83     String ctxFactory;
84     AAResponder responder;
85     HandleRepositoryFactory hrf;
86     ArpFactory arpFactory;
87     private static Logger log = Logger.getLogger(AAServlet.class.getName());    
88     
89     public void init()
90         throws ServletException{
91                 
92         MDC.put("serviceId", "[AA Core]");
93         
94         try{
95
96             edu.internet2.middleware.eduPerson.Init.init();
97             myName = getInitParameter("domain");
98             dirUrl = getInitParameter("dirUrl");
99             uidSyntax = getInitParameter("ldapUserDnPhrase");
100             ctxFactory = getInitParameter("ctxFactoryClass");
101             if(ctxFactory == null)
102                 ctxFactory = "com.sun.jndi.ldap.LdapCtxFactory";
103             arpFactoryMethod = getInitParameter("arpFactoryMethod");
104             arpFactoryData = getInitParameter("arpFactoryData");
105             if(arpFactoryMethod.equalsIgnoreCase("file") &&
106                arpFactoryData == null){
107                 String realPath = getServletContext().getRealPath("/");
108                 realPath += "arps";
109                 log.debug("shib dir = "+ realPath);
110                 arpFactoryData = realPath;
111             }
112
113
114       
115             arpFactory = ArpRepository.getInstance(arpFactoryMethod, arpFactoryData);
116
117             log.info("Using "+ctxFactory+" as directory for attributes.");
118
119             Hashtable env = new Hashtable(11);
120             env.put(Context.INITIAL_CONTEXT_FACTORY, ctxFactory);
121
122             env.put(Context.PROVIDER_URL, dirUrl);
123             DirContext ctx = new InitialDirContext(env);
124             
125             responder = new AAResponder(arpFactory, ctx, myName);
126
127             hrf = getHandleRepository();
128
129             log.info("AA all initialized at "+new Date());
130
131         }catch(NamingException ne){
132             log.fatal("AA init failed: "+ne);
133             throw new ServletException("Init failed: "+ne);
134         }catch(AAException ae){
135             log.fatal("AA init failed: "+ae);
136             throw new ServletException("Init failed: "+ae);
137         }catch(HandleException he){
138             log.fatal("AA init failed: "+he);
139             throw new ServletException("Init failed: "+he);
140         }
141     }
142
143     public void doPost(HttpServletRequest req, HttpServletResponse resp)
144         throws ServletException, IOException {
145                 
146         log.info("Recieved a request.");
147         MDC.put("serviceId", UUIDGenerator.getInstance().generateRandomBasedUUID());
148         MDC.put("remoteAddr", req.getRemoteAddr());
149         log.info("Handling request.");
150
151         SAMLAttribute[] attrs = null;
152         SAMLException ourSE = null;
153         AASaml saml = null;
154         String userName = null;
155             
156         try{
157             saml = new AASaml(myName);
158             saml.receive(req);
159             String resource = saml.getResource();
160             String handle = saml.getHandle();
161             String shar = saml.getShar();
162             String issuedBy = saml.getIssuer();
163             log.info("AA: handle:"+handle);
164             log.info("AA: issuer:"+issuedBy);
165             log.info("AA: shar:"+shar);
166
167
168             if(handle.equalsIgnoreCase("foo")){
169                 // for testing only
170                 userName = "dummy"; 
171             }else{
172                 if(hrf == null){
173                     throw new HandleException("No HandleRepository found! Has HS initialized?");
174                 }else{
175                     HandleEntry he = hrf.getHandleEntry(handle);
176                     userName = he.getUsername();
177                     if(userName == null)
178                         throw new HandleException("HandleServer returns null for user name!");
179                 }
180             }
181
182             attrs = responder.getReleaseAttributes(userName, uidSyntax, handle, shar, resource);
183             log.info("Got "+attrs.length+" attributes for "+userName);
184             saml.respond(resp, attrs, null);
185             log.info("Successfully responded about "+userName);
186
187         }catch (org.opensaml.SAMLException se) {
188             log.error("AA failed for "+userName+" because of: "+se);
189             try{
190                 saml.fail(resp, new SAMLException(SAMLException.RESPONDER, "AA got a SAML Exception: "+se));
191             }catch(Exception ee){
192                 throw new ServletException("AA failed to even make a SAML Failure message because "+ee+"  Origianl problem: "+se);
193             }
194         }catch (HandleException he) {
195             log.error("AA failed for "+userName+" because of: "+he);
196             try{
197                 QName[] codes=new QName[2];
198                 codes[0]=SAMLException.REQUESTER[0];
199                 codes[1]=new QName(
200                                    edu.internet2.middleware.shibboleth.common.XML.SHIB_NS,
201                                    "InvalidHandle");
202                 saml.fail(resp, new SAMLException(codes, "AA got a HandleException: "+he));
203             }catch(Exception ee){
204                 throw new ServletException("AA failed to even make a SAML Failure message because "+ee+"  Origianl problem: "+he);
205             }
206         }catch (Exception e) {
207             log.error("AA failed for "+userName+" because of: "+e);
208             try{
209                 saml.fail(resp, new SAMLException(SAMLException.RESPONDER, "AA got an Exception: "+e));
210             }catch(Exception ee){
211                 throw new ServletException("AA failed to even make a SAML Failure message because "+ee+"  Origianl problem: "+e);
212             }
213
214         }
215     }
216
217
218     private synchronized HandleRepositoryFactory getHandleRepository()
219         throws HandleException, AAException{
220
221         ServletConfig sc = getServletConfig();
222         ServletContext sctx = sc.getServletContext(); 
223         HandleRepositoryFactory hrf = (HandleRepositoryFactory)sctx.getAttribute("HandleRepository");
224
225         log.debug("Context attribute for HandleRepository: "+hrf);
226             
227             
228         if(hrf == null){
229             // make one
230             String repositoryType = this.getServletContext().getInitParameter("repository");
231             if(repositoryType == null)
232                 throw new AAException("repository parameter not set. Unknown Handle repository type");
233             hrf = HandleRepositoryFactory.getInstance(                                                Constants.POLICY_CLUBSHIB, 
234                                                                                                       repositoryType,
235                                                                                                       this );
236             sctx.setAttribute("HandleRepository", hrf);
237             log.info("A new HandleRepository created by AA: "+hrf);
238             
239         }
240         return hrf;
241     }
242
243
244 }