f9f6473c6ae878a1932845ee6c29401bc7c176ad
[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 /**
53  *  Attribute Authority & Release Policy
54  *  Handles Initialization and incoming requests to AA
55  *
56  * @author     Parviz Dousti (dousti@cmu.edu)
57  * @created    June, 2002
58  */
59
60
61 import java.io.*;
62 import java.util.*;
63 import javax.servlet.*;
64 import javax.servlet.http.*;
65 import javax.naming.*;
66 import javax.naming.directory.*;
67 import org.opensaml.*;
68 import org.w3c.dom.*;
69 import edu.internet2.middleware.shibboleth.*;
70 import edu.internet2.middleware.shibboleth.common.*;
71 import edu.internet2.middleware.shibboleth.hs.*;
72 import edu.internet2.middleware.eduPerson.*;
73 import org.apache.log4j.Logger;
74
75
76
77 public class AAServlet extends HttpServlet {
78
79     String myName;
80     String dirUrl;
81     String uidSyntax;
82     String arpFactoryMethod;
83     String arpFactoryData;
84     String ctxFactory;
85     AAResponder responder;
86     HandleRepositoryFactory hrf;
87     ArpFactory arpFactory;
88     private static Logger log = Logger.getLogger(AAServlet.class.getName());    
89     
90     public void init(ServletConfig conf)
91         throws ServletException{
92         
93         try{
94             super.init(conf);
95             edu.internet2.middleware.eduPerson.Init.init();
96             myName = getInitParameter("domain");
97             dirUrl = getInitParameter("dirUrl");
98             uidSyntax = getInitParameter("ldapUserDnPhrase");
99             ctxFactory = getInitParameter("ctxFactoryClass");
100             if(ctxFactory == null)
101                 ctxFactory = "com.sun.jndi.ldap.LdapCtxFactory";
102             arpFactoryMethod = getInitParameter("arpFactoryMethod");
103             arpFactoryData = getInitParameter("arpFactoryData");
104             if(arpFactoryMethod.equalsIgnoreCase("file") &&
105                arpFactoryData == null){
106                 String realPath = getServletContext().getRealPath("/");
107                 realPath += "arps";
108                 log.debug("shib dir = "+ realPath);
109                 arpFactoryData = realPath;
110             }
111
112
113       
114             arpFactory = ArpRepository.getInstance(arpFactoryMethod, arpFactoryData);
115
116             Hashtable env = new Hashtable(11);
117             env.put(Context.INITIAL_CONTEXT_FACTORY, ctxFactory);
118
119             env.put(Context.PROVIDER_URL, dirUrl);
120             DirContext ctx = new InitialDirContext(env);
121             
122             responder = new AAResponder(arpFactory, ctx, myName);
123
124             hrf = getHandleRepository();
125
126             log.info("AA all initialized at "+new Date());
127
128         }catch(NamingException ne){
129             log.fatal("AA init failed: "+ne);
130             throw new ServletException("Init failed: "+ne);
131         }catch(AAException ae){
132             log.fatal("AA init failed: "+ae);
133             throw new ServletException("Init failed: "+ae);
134         }catch(HandleException he){
135             log.fatal("AA init failed: "+he);
136             throw new ServletException("Init failed: "+he);
137         }
138     }
139
140     public void doGet(HttpServletRequest req, HttpServletResponse resp)
141             throws ServletException, IOException {
142         resp.setContentType("text/html");
143         PrintWriter out = resp.getWriter();
144         out.println("<HTML><BODY> Sorry! GET is not supported. </BODY></HTML>");
145         return;
146     }
147         
148     public void doPost(HttpServletRequest req, HttpServletResponse resp)
149         throws ServletException, IOException {
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             log.info("AA received a query");
160             String resource = saml.getResource();
161             String handle = saml.getHandle();
162             String shar = saml.getShar();
163             String issuedBy = saml.getIssuer();
164             log.info("AA: handle:"+handle);
165             log.info("AA: issuer:"+issuedBy);
166             log.info("AA: shar:"+shar);
167
168
169             if(handle.equalsIgnoreCase("foo")){
170                 // for testing only
171                 userName = "dousti"; 
172             }else{
173                 if(hrf == null){
174                     throw new HandleException("No HandleRepository found! Has HS initialized?");
175                 }else{
176                     HandleEntry he = hrf.getHandleEntry(handle);
177                     userName = he.getUsername();
178                     if(userName == null)
179                         throw new HandleException("HandleServer returns null for user name!");
180                 }
181             }
182
183             attrs = responder.getReleaseAttributes(userName, uidSyntax, handle, shar, resource);
184             log.info("Got "+attrs.length+" attributes for "+userName);
185             saml.respond(resp, attrs, null);
186             log.info("Successfully responded about "+userName);
187
188         }catch (org.opensaml.SAMLException se) {
189             log.error("AA failed for "+userName+" because of: "+se);
190             try{
191                 saml.fail(resp, new SAMLException(SAMLException.RESPONDER, "AA got a SAML Exception: "+se));
192             }catch(Exception ee){
193                 throw new ServletException("AA failed to even make a SAML Failure message because "+ee+"  Origianl problem: "+se);
194             }
195         }catch (HandleException he) {
196             log.error("AA failed for "+userName+" because of: "+he);
197             try{
198                 QName[] codes=new QName[2];
199                 codes[0]=SAMLException.REQUESTER[0];
200                 codes[1]=new QName(
201                                    edu.internet2.middleware.shibboleth.common.XML.SHIB_NS,
202                                    "InvalidHandle");
203                 saml.fail(resp, new SAMLException(codes, "AA got a HandleException: "+he));
204             }catch(Exception ee){
205                 throw new ServletException("AA failed to even make a SAML Failure message because "+ee+"  Origianl problem: "+he);
206             }
207         }catch (Exception e) {
208             log.error("AA failed for "+userName+" because of: "+e);
209             try{
210                 saml.fail(resp, new SAMLException(SAMLException.RESPONDER, "AA got an Exception: "+e));
211             }catch(Exception ee){
212                 throw new ServletException("AA failed to even make a SAML Failure message because "+ee+"  Origianl problem: "+e);
213             }
214
215         }
216     }
217
218
219     private synchronized HandleRepositoryFactory getHandleRepository()
220         throws HandleException, AAException{
221
222         ServletConfig sc = getServletConfig();
223         ServletContext sctx = sc.getServletContext(); 
224         HandleRepositoryFactory hrf = (HandleRepositoryFactory)sctx.getAttribute("HandleRepository");
225
226         log.debug("Context attribute for HandleRepository: "+hrf);
227             
228             
229         if(hrf == null){
230             // make one
231             String repositoryType = this.getServletContext().getInitParameter("repository");
232             if(repositoryType == null)
233                 throw new AAException("repository parameter not set. Unknown Handle repository type");
234             hrf = HandleRepositoryFactory.getInstance(                                                Constants.POLICY_CLUBSHIB, 
235                                                                                                       repositoryType,
236                                                                                                       this );
237             sctx.setAttribute("HandleRepository", hrf);
238             log.info("A new HandleRepository created by AA: "+hrf);
239             
240         }
241         return hrf;
242     }
243
244
245 }