remove javolution
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / idp / authn / Saml2LoginContext.java
1 /*
2  * Copyright [2006] [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.idp.authn;
18
19
20 import java.util.List;
21 import java.util.LinkedList;
22
23 import org.apache.log4j.Logger;
24
25 import org.opensaml.saml2.core.AuthnContextClassRef;
26 import org.opensaml.saml2.core.AuthnContextDeclRef;
27 import org.opensaml.saml2.core.AuthnContextComparisonTypeEnumeration;
28 import org.opensaml.saml2.core.AuthnRequest;
29 import org.opensaml.saml2.core.RequestedAuthnContext;
30
31
32 /**
33  * A SAML 2.0 {@link LoginContext}. 
34  * 
35  * This class can interpret {@link RequestedAuthnContext} and act accordingly.
36  */
37 public class Saml2LoginContext extends LoginContext {
38     
39     private static final Logger log = Logger.getLogger(Saml2LoginContext.class);
40     
41     /** The {@link RequestedAuthnContext} */
42     private RequestedAuthnContext ctx;
43     
44     
45     /**
46      * Creates a new instance of Saml2LoginContext.
47      *
48      * @param authnRequest A SAML 2.0 Authentication Request.
49      */
50     public Saml2LoginContext(AuthnRequest authnRequest) {
51         
52         if (authnRequest != null) {
53             forceAuth = authnRequest.isForceAuthn();
54             passiveAuth = authnRequest.isPassive();
55             ctx = authnRequest.getRequestedAuthnContext();
56         }
57     }
58     
59     
60     /** 
61      * This method evaluates a SAML2 {@link RequestedAuthnContext}
62      * and returns the list of requested authentication method URIs.
63      *
64      * If the AuthnQuery did not contain a RequestedAuthnContext,
65      * this method will return <code>null</code>.
66      *
67      * @return An array of authentication method URIs, or <code>null</code>.
68      */
69     public String[] getRequestedAuthenticationMethods() {
70
71         if (ctx == null)
72             return null;
73
74         // For the immediate future, we only support the "exact" comparator.
75         // XXX: we should probably throw an exception or somehow indicate this 
76         // as an error to the caller.
77         AuthnContextComparisonTypeEnumeration comparator = ctx.getComparison();
78         if (comparator != null && comparator != AuthnContextComparisonTypeEnumeration.EXACT) {
79             log.error("Unsupported comparision operator ( " + comparator
80                 + ") in RequestedAuthnContext. Only exact comparisions are supported.");
81             return null;
82         }
83     
84         // build a list of all requested authn classes and declrefs
85         List<String> requestedAuthnMethods = new LinkedList<String>();
86         List<AuthnContextClassRef> authnClasses = ctx.getAuthnContextClassRefs();
87         List<AuthnContextDeclRef> authnDeclRefs = ctx.getAuthnContextDeclRefs();
88     
89         if (authnClasses != null) {
90             for (AuthnContextClassRef classRef : authnClasses) {
91                 if (classRef != null) {
92                     String s = classRef.getAuthnContextClassRef();
93                     if (s != null) {
94                         requestedAuthnMethods.add(s);
95                     }
96                 }
97             }
98         }
99     
100         if (authnDeclRefs != null) {
101             for (AuthnContextDeclRef declRef : authnDeclRefs) {
102                 if (declRef != null) {
103                     String s = declRef.getAuthnContextDeclRef();
104                     if (s != null) {
105                         requestedAuthnMethods.add(s);
106                     }
107                 }
108             }
109         }
110     
111         if (requestedAuthnMethods.size() == 0) {
112             return null;
113         } else {
114             String[] methods = new String[requestedAuthnMethods.size()];
115             return requestedAuthnMethods.toArray(methods);
116         }
117
118     }
119 }