46cc57d9ceb9b67f9b63218657e0a62c47655a1c
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / idp / profile / saml1 / ShibbolethSSOEndpointSelector.java
1 /*
2  * Copyright [2007] [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.profile.saml1;
18
19 import java.util.List;
20
21 import org.apache.log4j.Logger;
22 import org.opensaml.common.binding.BasicEndpointSelector;
23 import org.opensaml.saml2.metadata.Endpoint;
24 import org.opensaml.xml.util.DatatypeHelper;
25
26 /**
27  * An endpoint selector that may optionally take a SP-provided assertion consumer service URL, validate it against
28  * metadata, and return an endpoint based on it. If no URL is provided the {@link BasicEndpointSelector} selection is
29  * used.
30  */
31 public class ShibbolethSSOEndpointSelector extends BasicEndpointSelector {
32
33     /** Class logger. */
34     private final Logger log = Logger.getLogger(ShibbolethSSOEndpointSelector.class);
35
36     /** Assertion consumer service URL provided by SP. */
37     private String spAssertionConsumerService;
38
39     /**
40      * Gets the assertion consumer service URL provided by SP.
41      * 
42      * @return assertion consumer service URL provided by SP
43      */
44     public String getSpAssertionConsumerService() {
45         return spAssertionConsumerService;
46     }
47
48     /**
49      * Sets the assertion consumer service URL provided by SP.
50      * 
51      * @param acs assertion consumer service URL provided by SP
52      */
53     public void setSpAssertionConsumerService(String acs) {
54         spAssertionConsumerService = DatatypeHelper.safeTrimOrNullString(acs);
55     }
56
57     /** {@inheritDoc} */
58     public Endpoint selectEndpoint() {
59         if (spAssertionConsumerService != null) {
60             return selectEndpointByACS();
61         } else {
62             return super.selectEndpoint();
63         }
64     }
65
66     /**
67      * Selects the endpoint, from metadata, corresponding to the SP-provdided ACS URL.
68      * 
69      * @return endpoint corresponding to the SP-provdided ACS URL
70      */
71     protected Endpoint selectEndpointByACS() {
72         List<Endpoint> endpoints = getEntityRoleMetadata().getEndpoints();
73         if (log.isDebugEnabled()) {
74             log.debug("Relying party role contains " + endpoints.size() + " endpoints");
75             log.debug("Selecting endpoint from metadata corresponding to provided ACS URL: "
76                     + getSpAssertionConsumerService());
77         }
78         if (endpoints != null && endpoints.size() > 0) {
79             for (Endpoint endpoint : endpoints) {
80                 if(endpoint == null){
81                     continue;
82                 }
83                 
84                 if(endpoint.getLocation().equalsIgnoreCase(spAssertionConsumerService)){
85                     return endpoint;
86                 }
87                 
88                 if(!DatatypeHelper.isEmpty(endpoint.getResponseLocation()) && endpoint
89                                 .getResponseLocation().equalsIgnoreCase(spAssertionConsumerService)){
90                     return endpoint;
91                 }
92             }
93         }
94
95         if(log.isDebugEnabled()){
96             log.debug("No endpoint meets selection criteria for SAML entity " + getEntityMetadata().getEntityID());
97         }
98         return null;
99     }
100 }