Fix logging config, add log statements
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / serviceprovider / FilterSupportImpl.java
1 /*
2  * Copyright [2005] [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 /*
18  * FilterSupportImpl.java
19  * 
20  * Provide access to the Filter to configuration information
21  * and Session data.
22  */
23 package edu.internet2.middleware.shibboleth.serviceprovider;
24
25 import java.util.Map;
26
27 import javax.servlet.http.HttpServletRequest;
28
29 import org.apache.log4j.Logger;
30 import org.opensaml.SAMLException;
31
32 import x0.maceShibbolethTargetConfig1.SessionsDocument.Sessions;
33
34 import edu.internet2.middleware.shibboleth.aap.AAP;
35 import edu.internet2.middleware.shibboleth.aap.AttributeRule;
36 import edu.internet2.middleware.shibboleth.resource.FilterSupport;
37 import edu.internet2.middleware.shibboleth.serviceprovider.ServiceProviderConfig.ApplicationInfo;
38
39 /**
40  * Provide access from the Filter to the /shibboleth configuration and Sessions.
41  * 
42  * @author Howard Gilbert
43  */
44 public class FilterSupportImpl implements FilterSupport {
45     
46     private static ServiceProviderContext context = ServiceProviderContext.getInstance();
47     private static Logger log = Logger.getLogger(ContextListener.SHIBBOLETH_SERVICE);
48
49     /**
50      * Given a Resource URL, go to the RequestMap logic to find an applicationId.
51      * 
52      * @param url The URL of the Resource presented by the browser
53      * @return applicationId string
54      */
55     public String getApplicationId(String url) {
56         ServiceProviderConfig config = context.getServiceProviderConfig();
57         String applicationId = config.mapRequest(url);
58         return applicationId;
59     }
60     
61     /**
62      * Get the "providerId" (site name) of the ServiceProvider
63      * 
64      * @param applicationId 
65      * @return providerId string
66      */
67     public String getProviderId(String applicationId) {
68         ServiceProviderConfig config = context.getServiceProviderConfig();
69         ApplicationInfo application = config.getApplication(applicationId);
70         String providerId = application.getApplicationConfig().getProviderId();
71         return providerId;
72     }
73     
74     /**
75      * Get the URL of the local AssertionConsumerServlet.
76      * 
77      * @param applicationId
78      * @return URL string
79      */
80     public String getShireUrl(String applicationId) {
81         ServiceProviderConfig config = context.getServiceProviderConfig();
82         ApplicationInfo application = config.getApplication(applicationId);
83         String shireUrl = application.getApplicationConfig().getSessions().getShireURL();
84         return shireUrl;
85     }
86     
87     /**
88      * Get the URL to which the Browser should be initially redirected.
89      * 
90      * @param applicationId
91      * @return URL string
92      */
93     public String getWayfUrl(String applicationId) {
94         ServiceProviderConfig config = context.getServiceProviderConfig();
95         ApplicationInfo application = config.getApplication(applicationId);
96         String wayfUrl = application.getApplicationConfig().getSessions().getWayfURL();
97         return wayfUrl;
98     }
99     
100         /**
101          * Does the requested resource require Shibboleth authentication?
102          * 
103          * @param url  request url
104          * @return     true if Shibboleth is required
105          */
106         public boolean isProtected(String url) {
107             // TODO Add some real logic. This is just a placeholder
108             if (url.endsWith("test.txt"))
109                 return true;
110             return false;
111         }
112
113         /**
114          * Get attributes for this Session 
115          * 
116          * @param sessionId
117          * @param applicationId
118          * @return Map of (attribute,value) pairs
119          */
120     public Map /*<String,String>*/ 
121     getSessionAttributes(String sessionId, String applicationId) {
122         SessionManager sm = context.getSessionManager();
123         Session session = 
124             sm.findSession(sessionId, applicationId);
125         if (session==null)
126             return null;
127         Map /*<String,String>*/ attributes = SessionManager.mapAttributes(session);
128         return attributes;
129     }
130
131     /**
132      * Map attribute name to pseudo-HTTP-Headers
133      * 
134      * @param attributeName
135      * @param applicationId
136      * @return null or Header name string
137      */
138     public String getHeader(String attributeName, String applicationId) {
139         ServiceProviderConfig config = context.getServiceProviderConfig();
140         ApplicationInfo application = config.getApplication(applicationId);
141         AAP[] providers = application.getAAPProviders();
142         for (int i=0;i<providers.length;i++) {
143             AAP aap = providers[i];
144             AttributeRule rule = aap.lookup(attributeName, null);
145             if (rule!=null)
146                 return rule.getHeader();
147         }
148         return null;
149     }
150
151     /**
152      * @param ipaddr
153      * @param request
154      * @param applicationId
155      * @param shireURL
156      * @param providerId
157      * @return
158      */
159     public String createSessionFromPost(
160             String ipaddr, 
161             HttpServletRequest request, 
162             String applicationId, 
163             String shireURL, 
164             String providerId,
165             String emptySessionId) {
166         String sessionid;
167         try {
168             sessionid = AssertionConsumerServlet.createSessionFromPost(
169                     ipaddr, request, applicationId, shireURL, providerId,emptySessionId);
170         } catch (SAMLException e) {
171                 log.error("Invalid POST data submitted by RM "+e);
172             return null;
173         }
174         log.info("Session created from POST submitted by RM: "+sessionid);
175         return sessionid;
176     }
177
178
179     public boolean getShireSSL(String applicationId) {
180         ServiceProviderConfig config = context.getServiceProviderConfig();
181         ApplicationInfo appinfo = config.getApplication(applicationId);
182         Sessions appSessionValues = appinfo.getApplicationConfig().getSessions();
183         return appSessionValues.getShireSSL();
184     }
185
186     /**
187      * Create empty Session so SessionID can be written as a Cookie
188      * before redirecting the Browser to the IDP.
189      * 
190      * @param applicationId
191      * @return SessionId of empty session
192      */
193     public String createSession(String applicationId) {
194         String id = context.getSessionManager().newSession(
195                 applicationId, null, null, null, null, null);
196         log.info("Session ID reserved for RM: "+id);
197         return id;
198     }
199 }