7b9e8af1b83536f5b8a5039cb6d6b3e9b99b5198
[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: get info from requestmap
108             return true;
109         }
110
111         /**
112          * Get attributes for this Session 
113          * 
114          * @param sessionId
115          * @param applicationId
116          * @return Map of (attribute,value) pairs
117          */
118     public Map /*<String,String>*/ 
119     getSessionAttributes(String sessionId, String applicationId) {
120         SessionManager sm = context.getSessionManager();
121         Session session = 
122             sm.findSession(sessionId, applicationId);
123         if (session==null)
124             return null;
125         Map /*<String,String>*/ attributes = SessionManager.mapAttributes(session);
126         return attributes;
127     }
128
129     /**
130      * Map attribute name to pseudo-HTTP-Headers
131      * 
132      * @param attributeName
133      * @param applicationId
134      * @return null or Header name string
135      */
136     public String getHeader(String attributeName, String applicationId) {
137         ServiceProviderConfig config = context.getServiceProviderConfig();
138         ApplicationInfo application = config.getApplication(applicationId);
139         AAP[] providers = application.getAAPProviders();
140         for (int i=0;i<providers.length;i++) {
141             AAP aap = providers[i];
142             AttributeRule rule = aap.lookup(attributeName, null);
143             if (rule!=null)
144                 return rule.getHeader();
145         }
146         return null;
147     }
148
149     /**
150      * @param ipaddr
151      * @param request
152      * @param applicationId
153      * @param shireURL
154      * @param providerId
155      * @return
156      */
157     public String createSessionFromPost(
158             String ipaddr, 
159             HttpServletRequest request, 
160             String applicationId, 
161             String shireURL, 
162             String providerId,
163             String emptySessionId) {
164         String sessionid;
165         try {
166             sessionid = AssertionConsumerServlet.createSessionFromPost(
167                     ipaddr, request, applicationId, shireURL, providerId,emptySessionId);
168         } catch (SAMLException e) {
169                 log.error("Invalid POST data submitted by RM "+e);
170             return null;
171         }
172         log.info("Session created from POST submitted by RM: "+sessionid);
173         return sessionid;
174     }
175
176
177     public boolean getShireSSL(String applicationId) {
178         ServiceProviderConfig config = context.getServiceProviderConfig();
179         ApplicationInfo appinfo = config.getApplication(applicationId);
180         Sessions appSessionValues = appinfo.getApplicationConfig().getSessions();
181         return appSessionValues.getShireSSL();
182     }
183
184     /**
185      * Create empty Session so SessionID can be written as a Cookie
186      * before redirecting the Browser to the IDP.
187      * 
188      * @param applicationId
189      * @return SessionId of empty session
190      */
191     public String createSession(String applicationId) {
192         String id = context.getSessionManager().reserveSession(applicationId);
193         return id;
194     }
195 }