d5104d82a30e340677656a8b2af208547dd49c39
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / provider / AQHNameIdentifierMapping.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.provider;
18
19 import java.io.Serializable;
20
21 import org.apache.log4j.Logger;
22 import javax.xml.namespace.QName;
23 import org.opensaml.SAMLException;
24 import org.w3c.dom.Element;
25
26 import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
27 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
28
29 /**
30  * Base class for {@link NameIdentifierMapping}implementations that support Shibboleth Attribute Query Handles.
31  * 
32  * @author Walter Hoehn
33  */
34 public abstract class AQHNameIdentifierMapping extends BaseNameIdentifierMapping {
35
36         private static Logger log = Logger.getLogger(AQHNameIdentifierMapping.class.getName());
37         /** Time in seconds for which handles are valid */
38         protected long handleTTL = 1800;
39         protected static QName[] errorCodes = {SAMLException.REQUESTER,
40                         new QName(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS, "InvalidHandle")};
41
42         public AQHNameIdentifierMapping(Element config) throws NameIdentifierMappingException {
43
44                 super(config);
45
46                 String rawTTL = ((Element) config).getAttribute("handleTTL");
47                 try {
48                         if (rawTTL != null && !rawTTL.equals("")) {
49                                 handleTTL = Long.parseLong(rawTTL);
50                                 if (handleTTL < 30) {
51                                         log.warn("You have set the Attribute Query Handle \"Time To Live\' to a very low "
52                                                         + "value.  It is recommended that you increase it.");
53                                 }
54                         }
55                         log.debug("Attribute Query Handle TTL set to (" + handleTTL + ") seconds.");
56
57                 } catch (NumberFormatException nfe) {
58                         log.error("Value for attribute \"handleTTL\" mus be a long integer.");
59                         throw new NameIdentifierMappingException("Could not load Name Identifier Mapping with configured data.");
60                 }
61         }
62
63         protected HandleEntry createHandleEntry(LocalPrincipal principal) {
64
65                 return new HandleEntry(principal, handleTTL);
66         }
67 }
68
69 class HandleEntry implements Serializable {
70
71         static final long serialVersionUID = 1L;
72         protected LocalPrincipal principal;
73         protected long expirationTime;
74
75         /**
76          * Creates a HandleEntry
77          * 
78          * @param principal
79          *            the principal represented by this entry.
80          * @param TTL
81          *            the time, in seconds, for which the handle should be valid.
82          */
83         protected HandleEntry(LocalPrincipal principal, long TTL) {
84
85                 this.principal = principal;
86                 expirationTime = System.currentTimeMillis() + (TTL * 1000);
87         }
88
89         protected boolean isExpired() {
90
91                 return (System.currentTimeMillis() >= expirationTime);
92         }
93
94         public long getExpirationTime() {
95
96                 return expirationTime;
97         }
98
99         public void setExpirationTime(long expr) {
100
101                 expirationTime = expr;
102         }
103 }