use the new session manager interface
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / provider / UPNNameIdentifierMapping.java
1 /*
2  * Copyright [2005] [University Corporation for Advanced Internet Development, Inc.] Licensed under the Apache License,
3  * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy
4  * of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in
5  * writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
6  * OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
7  * limitations under the License.
8  */
9
10 package edu.internet2.middleware.shibboleth.common.provider;
11
12 import java.security.Principal;
13
14 import org.apache.log4j.Logger;
15 import org.opensaml.SAMLException;
16 import org.opensaml.SAMLNameIdentifier;
17 import org.w3c.dom.Element;
18
19 import edu.internet2.middleware.shibboleth.common.IdentityProvider;
20 import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
21 import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
22 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
23 import edu.internet2.middleware.shibboleth.common.ServiceProvider;
24
25 /**
26  * <code>NameIdentifierMapping</code> implementation for sending User Principal Names as referenced in "WS-Federation:
27  * Passive Requestor Interoperability Profile". Should allow for basic interoperability with ADFS. IdPs that service
28  * multiple account domains will need a slightly more complex implementation.
29  * 
30  * @author Walter Hoehn
31  */
32 public class UPNNameIdentifierMapping extends BaseNameIdentifierMapping {
33
34         private static Logger log = Logger.getLogger(UPNNameIdentifierMapping.class.getName());
35         private String scope;
36
37         public UPNNameIdentifierMapping(Element config) throws NameIdentifierMappingException {
38
39                 super(config);
40
41                 scope = config.getAttribute("scope");
42                 if (scope == null || scope.equals("")) {
43                         log.error("No (scope) attribute specified.");
44                         throw new NameIdentifierMappingException(
45                                         "Unable to load UPN Name Identifier Mapping.  A UPN scope must be specified.");
46                 }
47         }
48
49         public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
50                         throws NameIdentifierMappingException, InvalidNameIdentifierException {
51
52                 String[] splitName = nameId.getName().split("@");
53
54                 if (splitName == null || splitName.length < 2) {
55                         log.error("Improper UPN formatting.  Unable to distinguish local principal from scope.");
56                         throw new InvalidNameIdentifierException("Name Identifier does not contain a valid UPN.", null);
57                 }
58                 if (splitName[1] == null || (!splitName[1].equals(scope))) {
59                         log.error("Invalid UPN scope.  Expected (" + scope + "), but received (" + splitName[1] + ").");
60                         throw new InvalidNameIdentifierException("Name Identifier does not contain a valid UPN.", null);
61                 }
62                 if (splitName[0] == null || splitName[0].equals("")) {
63                         log.error("Improper UPN formatting.  Unable to parse local principal.");
64                         throw new InvalidNameIdentifierException("Name Identifier does not contain a valid UPN.", null);
65                 }
66
67                 return new LocalPrincipal(splitName[0]);
68         }
69
70         public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
71                         throws NameIdentifierMappingException {
72
73                 if (principal == null) {
74                         log.error("A principal must be supplied for Name Identifier creation.");
75                         throw new IllegalArgumentException("A principal must be supplied for Name Identifier creation.");
76                 }
77
78                 try {
79                         SAMLNameIdentifier nameid = SAMLNameIdentifier.getInstance(getNameIdentifierFormat().toString());
80                         nameid.setName(principal.getName() + "@" + scope);
81                         nameid.setNameQualifier(idProv.getProviderId());
82                         return nameid;
83                 } catch (SAMLException e) {
84                         throw new NameIdentifierMappingException("Unable to generate Name Identifier: " + e);
85                 }
86         }
87 }