First pass to clean up config and fix multi serivce instance bug
[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 import org.opensaml.xml.util.DatatypeHelper;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 import edu.internet2.middleware.shibboleth.common.session.SessionManager;
37 import edu.internet2.middleware.shibboleth.idp.authn.AuthenticationEngine;
38
39 /**
40  * A filter that adds the current users {@link Session} the request, if the user has a session.
41  */
42 public class IdPSessionFilter implements Filter {
43
44     /** Class Logger. */
45     private final Logger log = LoggerFactory.getLogger(IdPSessionFilter.class);
46
47     /** IdP session manager. */
48     private SessionManager<Session> sessionManager;
49
50     /** {@inheritDoc} */
51     public void destroy() {
52
53     }
54
55     /** {@inheritDoc} */
56     public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
57             ServletException {
58         HttpServletRequest httpRequest = (HttpServletRequest) request;
59         HttpServletResponse httpResponse = (HttpServletResponse) response;
60
61         Session idpSession = null;
62         Cookie idpSessionCookie = getIdPSessionCookie(httpRequest);
63         if (idpSessionCookie != null) {
64             idpSession = sessionManager.getSession(idpSessionCookie.getValue());
65             if (idpSession != null) {
66                 log.trace("Updating IdP session activity time and adding session object to the request");
67                 idpSession.setLastActivityInstant(new DateTime());
68                 httpRequest.setAttribute(Session.HTTP_SESSION_BINDING_ATTRIBUTE, idpSession);
69             }
70         }
71
72         filterChain.doFilter(request, response);
73     }
74
75     /** {@inheritDoc} */
76     public void init(FilterConfig filterConfig) throws ServletException {
77         String sessionManagerId = filterConfig.getInitParameter("sessionManagedId");
78         if (DatatypeHelper.isEmpty(sessionManagerId)) {
79             sessionManagerId = "shibboleth.SessionManager";
80         }
81
82         sessionManager = (SessionManager<Session>) filterConfig.getServletContext().getAttribute(sessionManagerId);
83     }
84
85     /**
86      * Gets the IdP session cookie from the current request, if the user currently has a session.
87      * 
88      * @param request current HTTP request
89      * 
90      * @return the user's current IdP session cookie, if they have a current session, otherwise null
91      */
92     protected Cookie getIdPSessionCookie(HttpServletRequest request) {
93         log.trace("Attempting to retrieve IdP session cookie.");
94         Cookie[] requestCookies = request.getCookies();
95
96         if (requestCookies != null) {
97             for (Cookie requestCookie : requestCookies) {
98                 if (DatatypeHelper.safeEquals(requestCookie.getName(), AuthenticationEngine.IDP_SESSION_COOKIE_NAME)) {
99                     log.trace("Found IdP session cookie.");
100                     return requestCookie;
101                 }
102             }
103         }
104
105         log.trace("No IdP session cookie sent by the client.");
106         return null;
107     }
108 }