Filter to strip realm from Kerberized principal names.
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / utils / KerberosPrincipalFilter.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.utils;
51
52 import java.io.IOException;
53 import java.security.Principal;
54
55 import javax.servlet.Filter;
56 import javax.servlet.FilterChain;
57 import javax.servlet.FilterConfig;
58 import javax.servlet.ServletException;
59 import javax.servlet.ServletRequest;
60 import javax.servlet.ServletResponse;
61 import javax.servlet.http.HttpServletRequest;
62 import javax.servlet.http.HttpServletRequestWrapper;
63 import javax.servlet.http.HttpServletResponse;
64
65 import org.apache.log4j.Logger;
66 import org.apache.log4j.MDC;
67
68 /**
69  * Simple Servlet Filter that strips realm information from Kerberos authenticated container-managed security
70  *
71  * @author Scott Cantor
72  */
73 public class KerberosPrincipalFilter implements Filter {
74
75         private static Logger log = Logger.getLogger(KerberosPrincipalFilter.class.getName());
76
77         /**
78          * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
79          */
80         public void init(FilterConfig config) throws ServletException {
81         }
82
83         /**
84          * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
85          */
86         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
87                 throws IOException, ServletException {
88                 if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {
89             MDC.put("serviceId", "[Kerberos Principal Filter]");
90                         log.error("Only HTTP(s) requests are supported by the KerberosPrincipalFilter.");
91                         return;
92                 }
93                 HttpServletRequest httpRequest = (HttpServletRequest) request;
94
95         String name = httpRequest.getRemoteUser();
96         int split = name.indexOf('@');
97         if (split > -1)
98             name = name.substring(0,split);
99         
100                 chain.doFilter(new KerberosPrincipalWrapper(httpRequest, new PrincipalImpl(name)), response);
101         }
102
103         /**
104          * @see javax.servlet.Filter#destroy()
105          */
106         public void destroy() {
107         }
108
109         class KerberosPrincipalWrapper extends HttpServletRequestWrapper {
110
111                 Principal principal;
112
113         KerberosPrincipalWrapper(HttpServletRequest request, Principal principal) {
114                         super(request);
115                         this.principal = principal;
116                 }
117
118                 /**
119                  * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
120                  */
121                 public String getRemoteUser() {
122                         return principal.getName();
123                 }
124
125                 /**
126                  * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
127                  */
128                 public Principal getUserPrincipal() {
129                         return principal;
130                 }
131         }
132
133     class PrincipalImpl implements Principal {
134         
135         private String name = null;
136
137         PrincipalImpl(String name) {
138             this.name=name;
139         }
140         /**
141          * @see java.security.Principal#getName()
142          */
143         public String getName() {
144             return name;
145         }
146         /**
147          * @see java.lang.Object#equals(java.lang.Object)
148          */
149         public boolean equals(Object obj) {
150             return name.equals(obj);
151         }
152
153         /**
154          * @see java.lang.Object#toString()
155          */
156         public String toString() {
157             return name;
158         }
159
160     }
161 }