1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package net.sf.jguard.ext.authentication.callbacks;
29
30 import java.io.UnsupportedEncodingException;
31 import java.security.cert.X509Certificate;
32 import java.util.Arrays;
33 import java.util.List;
34
35 import javax.security.auth.callback.Callback;
36 import javax.security.auth.callback.CallbackHandler;
37 import javax.security.auth.callback.NameCallback;
38 import javax.security.auth.callback.PasswordCallback;
39
40 import net.sf.jguard.core.CoreConstants;
41 import net.sf.jguard.ext.authentication.certificates.CertificateConverter;
42
43 import org.bouncycastle.util.encoders.Base64;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47
48
49
50
51
52 public class CallbackHandlerUtils {
53 private static final String DIGEST_REALM = "Digest realm=\"";
54 private static final Logger logger = LoggerFactory.getLogger(CallbackHandlerUtils.class.getName());
55 private static final String ISO_8859_1 = "ISO-8859-1";
56 private static final String BASIC = "Basic ";
57
58 public static final String JAVAX_SERVLET_REQUEST_X509CERTIFICATE = "javax.servlet.request.X509Certificate";
59
60 public static void fillBasicCredentials(Callback[] callbacks, String login, String password) {
61 for(int i=0;i<callbacks.length;i++){
62 if(callbacks[i] instanceof NameCallback){
63 NameCallback nc = (NameCallback)callbacks[i];
64 nc.setName(login);
65
66 }else if(callbacks[i] instanceof PasswordCallback){
67 PasswordCallback pc = (PasswordCallback)callbacks[i];
68 pc.setPassword(password.toCharArray());
69 }else if (callbacks[i] instanceof JCaptchaCallback){
70 JCaptchaCallback jc = (JCaptchaCallback)callbacks[i];
71
72
73 jc.setSkipJCaptchaChallenge(true);
74 }
75 }
76 }
77
78 public static boolean grabClientCertCredentials(Callback[] callbacks,
79 Object[] objects) {
80 X509Certificate[] certificates = null;
81 javax.security.cert.X509Certificate[] oldCerts = null;
82 if(objects == null || objects.length==0){
83 return false;
84 }
85
86 if(objects instanceof X509Certificate[]) {
87 certificates= (X509Certificate[]) objects;
88
89 }else if(objects instanceof javax.security.cert.X509Certificate[]) {
90 oldCerts = (javax.security.cert.X509Certificate[])objects;
91 List<X509Certificate> newCerts = null;
92 for(int i =0;i<oldCerts.length;i++){
93 newCerts = Arrays.asList(certificates);
94 newCerts.add(CertificateConverter.convertOldToNew(oldCerts[i]));
95 }
96 certificates = (X509Certificate[]) newCerts.toArray();
97 }else{
98 logger.warn(" X509certificates are needed but not provided by the client ");
99 return false;
100 }
101 CallbackHandlerUtils.fillCertCredentials(callbacks,certificates);
102
103 return true;
104 }
105
106 public static boolean grabBasicCredentials(String encodedLoginAndPwd,String encoding,Callback[] callbacks){
107 boolean result = false;
108 String login="";
109 String password="";
110 if(encodedLoginAndPwd==null ||encodedLoginAndPwd.equals("")){
111 login =CoreConstants.GUEST;
112 password =CoreConstants.GUEST;
113
114 }else{
115 encodedLoginAndPwd = encodedLoginAndPwd.substring(6).trim();
116 String decodedLoginAndPassword = null;
117
118
119 if(encoding==null){
120 encoding=CallbackHandlerUtils.ISO_8859_1;
121 }
122 logger.debug(encoding);
123
124 try {
125 decodedLoginAndPassword = new String(Base64.decode(encodedLoginAndPwd.getBytes()),encoding);
126 } catch (UnsupportedEncodingException e) {
127 e.printStackTrace();
128 logger.debug(" encoding "+encoding+" is not supported by the platform ");
129 }
130
131 String[] parts = decodedLoginAndPassword.split(":");
132 if(parts.length == 2 ){
133 login = parts[0].trim();
134 password = parts[1].trim();
135
136 result = true;
137 }
138 if(("".equals(login) && "".equals(password))||(parts.length==0)){
139 login =CoreConstants.GUEST;
140 password =CoreConstants.GUEST;
141 }
142
143 }
144
145 CallbackHandlerUtils.fillBasicCredentials(callbacks,login,password);
146 return result;
147 }
148
149
150
151
152
153
154
155
156 public static String buildBasicAuthHeader(String login,String password,String encoding){
157 if(encoding==null){
158 encoding=CallbackHandlerUtils.ISO_8859_1;
159 }
160 StringBuffer decodedString = new StringBuffer();
161 decodedString.append(login);
162 decodedString.append(" : ");
163 decodedString.append(password);
164 String encodedString;
165 try {
166 encodedString = new String(Base64.encode(decodedString.toString().getBytes(encoding)));
167 } catch (UnsupportedEncodingException e) {
168 encodedString = new String(Base64.encode(decodedString.toString().getBytes()));
169 }
170 StringBuffer header = new StringBuffer();
171 header.append(CallbackHandlerUtils.BASIC);
172 header.append(encodedString);
173 header.append("==");
174 return header.toString();
175 }
176
177
178 public static String buildDigestChallenge(String realm){
179
180 StringBuffer responseValue= new StringBuffer();
181
182
183
184 responseValue.append(CallbackHandlerUtils.DIGEST_REALM);
185 responseValue.append(realm);
186 responseValue.append("\"");
187 responseValue.append(",");
188
189 responseValue.append("qop=\"");
190 responseValue.append(getQop());
191 responseValue.append("\"");
192 responseValue.append(",");
193
194 responseValue.append("nonce=\"");
195 responseValue.append(getNonce());
196 responseValue.append("\"");
197 responseValue.append(",");
198
199 responseValue.append("opaque=");
200 responseValue.append("\"");
201 responseValue.append(getOpaque());
202 responseValue.append("\"");
203
204 responseValue.append("algorithm=");
205 responseValue.append("\"");
206 responseValue.append(getAlgorithm());
207 responseValue.append("\"");
208
209 responseValue.append("stale=");
210 responseValue.append("\"");
211 responseValue.append(getStale());
212 responseValue.append("\"");
213
214 return responseValue.toString();
215 }
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231 private static String getStale() {
232 return "false";
233 }
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248 private static String getQop() {
249 return "auth,auth-int";
250 }
251
252
253
254
255
256
257
258
259 private static String getOpaque() {
260 return "5ccc069c403ebaf9f0171e9517f40e41";
261 }
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291 private static String getAlgorithm() {
292 return "MD5";
293 }
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335 private static String getNonce(){
336 return "dcd98b7102dd2f0e8b11d0f600bfb0c093";
337 }
338
339 public static void fillCertCredentials(Callback[] callbacks,X509Certificate[] certificates) {
340 for(int i=0;i<callbacks.length;i++){
341 if(callbacks[i] instanceof CertificatesCallback){
342 CertificatesCallback cc = (CertificatesCallback)callbacks[i];
343 cc.setCertificates(certificates);
344 break;
345 }
346 }
347 }
348 }