Moved name qualifer checking from the AA servlet into the NameIdentifierMapping....
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / BaseNameIdentifierMapping.java
1 /*
2  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
3  * All rights reserved
4  * 
5  * 
6  * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
7  * following conditions are met:
8  * 
9  * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
10  * disclaimer.
11  * 
12  * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
13  * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
14  * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
15  * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
16  * software itself, if and wherever such third-party acknowledgments normally appear.
17  * 
18  * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
19  * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
20  * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
21  * 
22  * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
23  * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
24  * University Corporation for Advanced Internet Development.
25  * 
26  * 
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
28  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
29  * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
30  * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
31  * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37
38 package edu.internet2.middleware.shibboleth.common;
39
40 import java.net.URI;
41 import java.net.URISyntaxException;
42
43 import org.apache.log4j.Logger;
44 import org.opensaml.SAMLNameIdentifier;
45 import org.w3c.dom.Element;
46
47 import edu.internet2.middleware.shibboleth.hs.HSNameIdentifierMapping;
48
49 /**
50  * Base class for processing name identifier mapping configuration.
51  * 
52  * @author Walter Hoehn
53  */
54 public abstract class BaseNameIdentifierMapping implements NameIdentifierMapping {
55
56         private static Logger log = Logger.getLogger(BaseNameIdentifierMapping.class.getName());
57         private URI format;
58
59         public BaseNameIdentifierMapping(Element config) throws NameIdentifierMappingException {
60
61                 if (!config.getLocalName().equals("NameMapping")) {
62                         throw new IllegalArgumentException();
63                 }
64
65                 String rawFormat = ((Element) config).getAttribute("format");
66                 if (rawFormat == null || rawFormat.equals("")) {
67                         log.error("Name Mapping requires a \"format\" attribute.");
68                         throw new NameIdentifierMappingException("Invalid mapping information specified.");
69                 }
70
71                 try {
72                         format = new URI(rawFormat);
73                 } catch (URISyntaxException e) {
74                         log.error("Name Mapping attribute \"format\" is not a valid URI: " + e);
75                         throw new NameIdentifierMappingException("Invalid mapping information specified.");
76                 }
77
78                 String id = ((Element) config).getAttribute("id");
79                 if (id != null && (!id.equals("")) && (!(this instanceof HSNameIdentifierMapping))) {
80                         log.error(
81                                 "\"id\" attribute is not valid for Name Mapping implementations that do are not used for Name Identifer Creation.");
82                         throw new NameIdentifierMappingException("Invalid mapping information specified.");
83                 }
84         }
85
86         public URI getNameIdentifierFormat() {
87                 return format;
88         }
89
90         public void destroy() {
91                 //nothing to do
92         }
93         
94         protected void verifyQualifier(SAMLNameIdentifier nameId, IdentityProvider idProv) throws NameIdentifierMappingException {
95                 
96                 if (idProv.getProviderId() == null || !idProv.getProviderId().equals(nameId.getNameQualifier())) {
97                         log.error("The name qualifier (" + nameId.getNameQualifier()
98                                         + ") for the referenced subject is not valid for this identity provider.");
99                         throw new NameIdentifierMappingException("The name qualifier (" + nameId.getNameQualifier()
100                                         + ") for the referenced subject is not valid for this identity provider.");
101                 }
102         }
103 }