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