Began implementing support for sending type 2 artifacts.
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / artifact / provider / BaseArtifactMapper.java
1 /*
2  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
3  * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
4  * provided that the following conditions are met: Redistributions of source code must retain the above copyright
5  * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above
6  * copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials
7  * provided with the distribution, if any, must include the following acknowledgment: "This product includes software
8  * developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2 Project.
9  * Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
10  * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor
11  * the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
12  * products derived from this software without specific prior written permission. For written permission, please contact
13  * shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the
14  * University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name, without prior
15  * written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS PROVIDED BY THE
16  * COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE
18  * DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO
19  * EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC.
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 package edu.internet2.middleware.shibboleth.artifact.provider;
27
28 import java.net.URI;
29 import java.security.MessageDigest;
30 import java.security.NoSuchAlgorithmException;
31
32 import org.apache.log4j.Logger;
33 import org.opensaml.SAMLAssertion;
34 import org.opensaml.artifact.Artifact;
35 import org.opensaml.artifact.SAMLArtifactType0001;
36 import org.opensaml.artifact.SAMLArtifactType0002;
37 import org.opensaml.artifact.Util;
38
39 import edu.internet2.middleware.shibboleth.artifact.ArtifactMapper;
40 import edu.internet2.middleware.shibboleth.artifact.ArtifactMapping;
41 import edu.internet2.middleware.shibboleth.common.RelyingParty;
42 import edu.internet2.middleware.shibboleth.common.ShibbolethConfigurationException;
43
44 /**
45  * Functionality common to most <code>ArtifactMapper</code> implementations, including creation and basic
46  * encoding/decoding of arifiacts. Defers storage and lookup to subclasses.
47  * 
48  * @author Walter Hoehn
49  */
50 public abstract class BaseArtifactMapper implements ArtifactMapper {
51
52         private static Logger log = Logger.getLogger(BaseArtifactMapper.class.getName());
53         // TODO init from config
54         private URI type2SourceLocation;
55
56         private MessageDigest md;
57
58         public BaseArtifactMapper() throws ShibbolethConfigurationException {
59
60                 try {
61                         md = MessageDigest.getInstance("SHA-1");
62                 } catch (NoSuchAlgorithmException e) {
63                         log.error("No support found for SHA-1 digest algorithm: " + e);
64                         throw new ShibbolethConfigurationException(
65                                         "The IdP Artifact Mapper requires JCE support for the SHA-1 digest algorithm.");
66                 }
67
68         }
69
70         public Artifact generateArtifact(SAMLAssertion assertion, RelyingParty relyingParty) {
71
72                 // Generate the artifact
73                 Artifact artifact;
74
75                 // If the relying party prefers type 2 and we have the proper data, use it
76                 if (relyingParty.getPreferredArtifactType() == 2 && type2SourceLocation != null) {
77                         synchronized (md) {
78                                 artifact = new SAMLArtifactType0002(Util.generateSourceId(md, relyingParty.getIdentityProvider()
79                                                 .getProviderId()), type2SourceLocation);
80                         }
81                         // Else, use type 1
82                 } else {
83                         if (relyingParty.getPreferredArtifactType() == 2) {
84                                 log.warn("The relying party prefers Type 2 artifacts, but the mapper does not "
85                                                 + "have a sourceLocation configured.  Using Type 1.");
86                         } else if (relyingParty.getPreferredArtifactType() != 1) {
87                                 log.warn("The relying party prefers Type " + relyingParty.getPreferredArtifactType()
88                                                 + " artifacts, but the mapper does not " + "support this type.  Using Type 1.");
89                         }
90
91                         synchronized (md) {
92                                 artifact = new SAMLArtifactType0001(Util.generateSourceId(md, relyingParty.getIdentityProvider()
93                                                 .getProviderId()));
94                         }
95                 }
96
97                 // Delegate adding to extenders
98                 addAssertionImpl(artifact, new ArtifactMapping(artifact, assertion, relyingParty));
99
100                 // Return the encoded artifact
101                 return artifact;
102         }
103
104         /**
105          * Subclasses should implement artifact storage with this method.
106          */
107         protected abstract void addAssertionImpl(Artifact artifact, ArtifactMapping mapping);
108
109 }