More name mapping updates.
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / hs / provider / AQHNameIdentifierMapping.java
1 /*
2  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation
3  * for Advanced Internet Development, Inc. All rights reserved
4  * 
5  * 
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  * 
9  * Redistributions of source code must retain the above copyright notice, this
10  * list of conditions and the following disclaimer.
11  * 
12  * Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution, if any, must include
15  * the following acknowledgment: "This product includes software developed by
16  * the University Corporation for Advanced Internet Development
17  * <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement
18  * may appear in the software itself, if and wherever such third-party
19  * acknowledgments normally appear.
20  * 
21  * Neither the name of Shibboleth nor the names of its contributors, nor
22  * Internet2, nor the University Corporation for Advanced Internet Development,
23  * Inc., nor UCAID may be used to endorse or promote products derived from this
24  * software without specific prior written permission. For written permission,
25  * please contact shibboleth@shibboleth.org
26  * 
27  * Products derived from this software may not be called Shibboleth, Internet2,
28  * UCAID, or the University Corporation for Advanced Internet Development, nor
29  * may Shibboleth appear in their name, without prior written permission of the
30  * University Corporation for Advanced Internet Development.
31  * 
32  * 
33  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
34  * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
35  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
36  * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
37  * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
38  * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
39  * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY
40  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
41  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
45  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46  */
47 package edu.internet2.middleware.shibboleth.hs.provider;
48
49 import java.io.Serializable;
50
51 import org.apache.log4j.Logger;
52 import org.w3c.dom.Element;
53
54 import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
55 import edu.internet2.middleware.shibboleth.common.BaseNameIdentifierMapping;
56 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
57
58 /**
59  * @author Walter Hoehn
60  */
61 public abstract class AQHNameIdentifierMapping extends BaseNameIdentifierMapping {
62
63         private static Logger log = Logger.getLogger(AQHNameIdentifierMapping.class.getName());
64         /** Time in seconds for which handles are valid */
65         protected long handleTTL = 1800;
66         private String id;
67
68         public AQHNameIdentifierMapping(Element config) throws NameIdentifierMappingException {
69                 super(config);
70                 String id = ((Element) config).getAttribute("id");
71                 if (id != null || !id.equals("")) {
72                         this.id = id;
73                 }
74
75                 String rawTTL = ((Element) config).getAttribute("handleTTL");
76                 try {
77                         if (rawTTL != null && !rawTTL.equals("")) {
78                                 handleTTL = Long.parseLong(rawTTL);
79                                 if (handleTTL < 30) {
80                                         log.warn(
81                                                 "You have set the Attribute Query Handle \"Time To Live\' to a very low "
82                                                         + "value.  It is recommended that you increase it.");
83                                 }
84                         }
85                         log.debug("Attribute Query Handle TTL set to (" + handleTTL + ") milliseconds.");
86
87                 } catch (NumberFormatException nfe) {
88                         log.error("Value for attribute \"handleTTL\" mus be a long integer.");
89                         throw new NameIdentifierMappingException("Could not load Name Identifier Mapping with configured data.");
90                 }
91         }
92
93         protected HandleEntry createHandleEntry(AuthNPrincipal principal) {
94                 return new HandleEntry(principal, handleTTL);
95         }
96
97         public String getId() {
98                 return id;
99         }
100
101 }
102
103 class HandleEntry implements Serializable {
104
105         static final long serialVersionUID = 1L;
106         protected AuthNPrincipal principal;
107         protected long expirationTime;
108
109         /**
110          * Creates a HandleEntry
111          * 
112          * @param principal
113          *            the principal represented by this entry.
114          * @param TTL
115          *            the time, in seconds, for which the handle should be valid.
116          */
117         protected HandleEntry(AuthNPrincipal principal, long TTL) {
118                 this.principal = principal;
119                 expirationTime = System.currentTimeMillis() + (TTL * 1000);
120         }
121
122         protected boolean isExpired() {
123                 return (System.currentTimeMillis() > expirationTime);
124         }
125 }