oopss. forgot to save before last comit
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / idp / session / IdPSessionFilter.java
1 /*
2  * Copyright 2008 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.session;
18
19 import java.io.IOException;
20
21 import javax.servlet.Filter;
22 import javax.servlet.FilterChain;
23 import javax.servlet.FilterConfig;
24 import javax.servlet.ServletException;
25 import javax.servlet.ServletRequest;
26 import javax.servlet.ServletResponse;
27 import javax.servlet.http.Cookie;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.joda.time.DateTime;
32
33 import edu.internet2.middleware.shibboleth.common.session.SessionManager;
34
35 /**
36  * A filter that adds the current users {@link Session} the request, if the user has a session.
37  */
38 public class IdPSessionFilter implements Filter {
39
40     /** Name of the IdP Cookie containing the IdP session ID. */
41     public static final String IDP_SESSION_COOKIE_NAME = "_idp_session";
42
43     /** IdP session manager. */
44     private SessionManager<Session> sessionManager;
45
46     /** {@inheritDoc} */
47     public void destroy() {
48
49     }
50
51     /** {@inheritDoc} */
52     public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
53             ServletException {
54         HttpServletRequest httpRequest = (HttpServletRequest) request;
55         HttpServletResponse httpResponse = (HttpServletResponse) response;
56         
57         Session idpSession = null;
58         Cookie idpSessionCookie = getIdPSessionCookie(httpRequest);
59         if (idpSessionCookie != null) {
60              idpSession = sessionManager.getSession(idpSessionCookie.getValue());
61             if (idpSession != null) {
62                 idpSession.setLastActivityInstant(new DateTime());
63                 httpRequest.setAttribute(Session.HTTP_SESSION_BINDING_ATTRIBUTE, idpSession);
64             }
65         }
66         
67         addIdPSessionCookieToResponse(httpRequest, httpResponse, idpSession);
68
69         filterChain.doFilter(request, response);
70     }
71
72     /** {@inheritDoc} */
73     public void init(FilterConfig filterConfig) throws ServletException {
74         sessionManager = (SessionManager<Session>) filterConfig.getServletContext().getAttribute("sessionManager");
75     }
76
77     /**
78      * Gets the IdP session cookie from the current request, if the user currently has a session.
79      * 
80      * @param request current HTTP request
81      * 
82      * @return the user's current IdP session cookie, if they have a current session, otherwise null
83      */
84     protected Cookie getIdPSessionCookie(HttpServletRequest request) {
85         Cookie[] requestCookies = request.getCookies();
86
87         if (requestCookies != null) {
88             for (Cookie requestCookie : requestCookies) {
89                 if (requestCookie.getDomain().equals(request.getLocalName())
90                         && requestCookie.getPath().equals(request.getContextPath())
91                         && requestCookie.getName().equalsIgnoreCase(IDP_SESSION_COOKIE_NAME)) {
92                     return requestCookie;
93                 }
94             }
95         }
96
97         return null;
98     }
99
100     /**
101      * Adds a cookie, containing the user's IdP session ID, to the response.
102      * 
103      * @param request current HTTP request
104      * @param response current HTTP response
105      * @param userSession user's currentSession
106      */
107     protected void addIdPSessionCookieToResponse(HttpServletRequest request, HttpServletResponse response,
108             Session userSession) {        
109         Cookie sessionCookie = new Cookie(IDP_SESSION_COOKIE_NAME, userSession.getSessionID());
110         sessionCookie.setDomain(request.getLocalName());
111         sessionCookie.setPath(request.getContextPath());
112         sessionCookie.setSecure(false);
113
114         int maxAge = (int) (userSession.getInactivityTimeout() / 1000);
115         sessionCookie.setMaxAge(maxAge);
116
117         response.addCookie(sessionCookie);
118     }
119 }