Update to current Trust interface
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / ShibBrowserProfile.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 package edu.internet2.middleware.shibboleth.common;
18
19 import java.util.ArrayList;
20
21 import javax.servlet.http.HttpServletRequest;
22
23 import org.apache.log4j.Logger;
24 import org.opensaml.NoSuchProviderException;
25 import org.opensaml.ReplayCache;
26 import org.opensaml.SAMLBrowserProfile;
27 import org.opensaml.SAMLBrowserProfileFactory;
28 import org.opensaml.SAMLException;
29 import org.opensaml.TrustException;
30
31 import edu.internet2.middleware.shibboleth.metadata.EntityDescriptor;
32 import edu.internet2.middleware.shibboleth.metadata.IDPSSODescriptor;
33 import edu.internet2.middleware.shibboleth.metadata.MetadataException;
34 import edu.internet2.middleware.shibboleth.serviceprovider.ServiceProviderConfig;
35 import edu.internet2.middleware.shibboleth.serviceprovider.ServiceProviderContext;
36 import edu.internet2.middleware.shibboleth.serviceprovider.ServiceProviderConfig.ApplicationInfo;
37
38 /**
39  * Basic Shibboleth POST browser profile implementation with basic support for signing
40  * 
41  * @author Scott Cantor @created April 11, 2002
42  */
43 public class ShibBrowserProfile implements SAMLBrowserProfile {
44
45         private static Logger   log                     = Logger.getLogger(ShibBrowserProfile.class.getName());
46
47     /** Policy URIs to attach or check against */
48     protected ArrayList     policies    = new ArrayList();
49
50     protected SAMLBrowserProfile profile = SAMLBrowserProfileFactory.getInstance(); 
51     private static ServiceProviderContext context = ServiceProviderContext.getInstance();
52     private String applicationId = null;
53     
54     /**
55      * Identify the <Application> from which to get plugins.
56      * 
57      * @param applicationId 
58      */
59     public ShibBrowserProfile(String applicationId) throws NoSuchProviderException {
60         this.applicationId = applicationId;
61     }
62
63
64     /**
65      * @see org.opensaml.SAMLBrowserProfile#receive(java.lang.StringBuffer, javax.servlet.http.HttpServletRequest, java.lang.String, int, org.opensaml.ReplayCache, org.opensaml.SAMLBrowserProfile.ArtifactMapper, int)
66      */
67     public BrowserProfileResponse receive(
68             StringBuffer issuer,
69             HttpServletRequest reqContext,
70             String recipient,
71             int supportedProfiles,
72             ReplayCache replayCache,
73             ArtifactMapper artifactMapper,
74             int minorVersion
75             ) throws SAMLException {
76         
77         String providerId = null;
78         issuer.setLength(0);
79         
80         // Let SAML do all the decoding and parsing
81         BrowserProfileResponse bpr = profile.receive(issuer, reqContext, recipient, supportedProfiles, replayCache, artifactMapper, minorVersion);
82         
83         /*
84          * Now find the Metadata for the Entity that send this assertion.
85          * From the C++, look first for issuer, then namequalifier (for 1.1 compat.)
86          */
87         EntityDescriptor entity = null;
88         String asn_issuer = bpr.assertion.getIssuer();
89         String qualifier = bpr.authnStatement.getSubject().getNameIdentifier().getNameQualifier();
90         ServiceProviderConfig config = context.getServiceProviderConfig();
91         ApplicationInfo appinfo = config.getApplication(applicationId);
92         
93         entity = appinfo.lookup(asn_issuer);
94         providerId=asn_issuer;
95         if (entity==null) {
96             providerId=qualifier;
97             entity= appinfo.lookup(qualifier);
98         }
99         if (entity==null) {
100             log.error("assertion issuer not found in metadata(Issuer ="+
101                     issuer+", NameQualifier="+qualifier);
102             throw new MetadataException("ShibBrowserProfile.receive() metadata lookup failed, unable to process assertion");
103         }
104         issuer.append(providerId);
105         
106         IDPSSODescriptor role = entity.getIDPSSODescriptor(
107                 minorVersion==1?
108                     org.opensaml.XML.SAML11_PROTOCOL_ENUM :
109                     org.opensaml.XML.SAML10_PROTOCOL_ENUM
110                 );
111         
112         if (bpr.response.isSigned()) {
113             boolean signatureValid = appinfo.validate(bpr.response,role);
114             if (!signatureValid) {
115                 throw new TrustException("ShibBrowserProfile cannot validate signature on response from SSO");
116             }
117         }
118         if (bpr.assertion.isSigned()) {
119             boolean signatureValid = appinfo.validate(bpr.assertion,role);
120             if (!signatureValid) {
121                 throw new TrustException("ShibBrowserProfile cannot validate signature on assertion from SSO");
122             }
123         }
124         
125         return bpr;
126     }
127 }