1 /*
2  * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /**
25  * @test
26  * @author Vincent Ryan
27  * @bug 4814522
28  * @summary Check that a LdapLoginModule can be initialized using various
29  *          options.
30  *          (LdapLoginModule replaces the JndiLoginModule for LDAP access)
31  */
32 
33 import java.io.IOException;
34 import java.util.Collections;
35 import java.util.Map;
36 import java.util.HashMap;
37 
38 import javax.security.auth.*;
39 import javax.security.auth.login.*;
40 import javax.security.auth.callback.*;
41 import com.sun.security.auth.module.LdapLoginModule;
42 
43 public class CheckOptions {
44 
45     private static final String USER_PROVIDER_OPTION = "UsErPrOvIdeR";
46 
main(String[] args)47     public static void main(String[] args) throws Exception {
48         init();
49         testInvalidOptions();
50         testNullCallbackHandler();
51         testWithCallbackHandler();
52     }
53 
init()54     private static void init() throws Exception {
55     }
56 
testInvalidOptions()57     private static void testInvalidOptions() throws Exception {
58 
59         // empty set of options
60 
61         LdapLoginModule ldap = new LdapLoginModule();
62         Subject subject = new Subject();
63         ldap.initialize(subject, null, null, Collections.EMPTY_MAP);
64 
65         try {
66             ldap.login();
67             throw new SecurityException("expected a LoginException");
68 
69         } catch (LoginException le) {
70             // expected behaviour
71             System.out.println("Caught a LoginException, as expected");
72         }
73 
74         // bad value for userProvider option
75 
76         Map<String, String> options = new HashMap<>();
77         options.put(USER_PROVIDER_OPTION, "ldap://localhost:23456");
78         ldap.initialize(subject, null, null, options);
79 
80         try {
81             ldap.login();
82             throw new SecurityException("expected a LoginException");
83 
84         } catch (LoginException le) {
85             // expected behaviour
86             System.out.println("Caught a LoginException, as expected");
87         }
88     }
89 
testNullCallbackHandler()90     private static void testNullCallbackHandler() throws Exception {
91 
92         // empty set of options
93 
94         LdapLoginModule ldap = new LdapLoginModule();
95         Subject subject = new Subject();
96         Map<String, String> options = new HashMap<>();
97         ldap.initialize(subject, null, null, options);
98 
99         try {
100             ldap.login();
101             throw new SecurityException("expected LoginException");
102 
103         } catch (LoginException le) {
104             // expected behaviour
105             System.out.println("Caught a LoginException, as expected");
106         }
107     }
108 
testWithCallbackHandler()109     private static void testWithCallbackHandler() throws Exception {
110 
111         LdapLoginModule ldap = new LdapLoginModule();
112         Subject subject = new Subject();
113         Map<String, String> options = new HashMap<>();
114 
115         CallbackHandler goodHandler = new MyCallbackHandler(true);
116         ldap.initialize(subject, goodHandler, null, options);
117 
118         try {
119             ldap.login();
120             throw new SecurityException("expected LoginException");
121 
122         } catch (LoginException le) {
123             // expected behaviour
124             System.out.println("Caught a LoginException, as expected");
125         }
126 
127         CallbackHandler badHandler = new MyCallbackHandler(false);
128         ldap.initialize(subject, badHandler, null, options);
129 
130         try {
131             ldap.login();
132             throw new SecurityException("expected LoginException");
133 
134         } catch (LoginException le) {
135             // expected behaviour
136             System.out.println("Caught a LoginException, as expected");
137         }
138     }
139 
140     private static class MyCallbackHandler implements CallbackHandler {
141 
142         private final boolean good;
143 
MyCallbackHandler(boolean good)144         public MyCallbackHandler(boolean good) {
145             this.good = good;
146         }
147 
handle(Callback[] callbacks)148         public void handle(Callback[] callbacks)
149                 throws IOException, UnsupportedCallbackException {
150 
151             for (int i = 0; i < callbacks.length; i++) {
152 
153                 if (callbacks[i] instanceof NameCallback) {
154                     NameCallback nc = (NameCallback) callbacks[i];
155 
156                     if (good) {
157                         nc.setName("foo");
158                     } else {
159                         // do nothing
160                     }
161 
162                 } else if (callbacks[i] instanceof PasswordCallback) {
163                     PasswordCallback pc = (PasswordCallback) callbacks[i];
164 
165                     if (good) {
166                         pc.setPassword("foo".toCharArray());
167                     } else {
168                         // do nothing
169                     }
170                 }
171             }
172         }
173     }
174 }
175