1 package org.argeo.cms.internal.auth;
2
3 import java.io.Console;
4 import java.io.IOException;
5 import java.io.PrintWriter;
6 import java.util.Arrays;
7
8 import javax.security.auth.callback.Callback;
9 import javax.security.auth.callback.CallbackHandler;
10 import javax.security.auth.callback.NameCallback;
11 import javax.security.auth.callback.PasswordCallback;
12 import javax.security.auth.callback.TextOutputCallback;
13 import javax.security.auth.callback.UnsupportedCallbackException;
14
15 import org.argeo.cms.CmsException;
16
17
18 public class ConsoleCallbackHandler implements CallbackHandler {
19
20 @Override
21 public void handle(Callback[] callbacks) throws IOException,
22 UnsupportedCallbackException {
23 Console console = System.console();
24 if (console == null)
25 throw new CmsException("No console available");
26
27 PrintWriter writer = console.writer();
28 for (int i = 0; i < callbacks.length; i++) {
29 if (callbacks[i] instanceof TextOutputCallback) {
30 TextOutputCallback callback = (TextOutputCallback) callbacks[i];
31 writer.write(callback.getMessage());
32 } else if (callbacks[i] instanceof NameCallback) {
33 NameCallback callback = (NameCallback) callbacks[i];
34 writer.write(callback.getPrompt());
35 if (callback.getDefaultName() != null)
36 writer.write(" (" + callback.getDefaultName() + ")");
37 writer.write(" : ");
38 String answer = console.readLine();
39 if (callback.getDefaultName() != null
40 && answer.trim().equals(""))
41 callback.setName(callback.getDefaultName());
42 else
43 callback.setName(answer);
44 } else if (callbacks[i] instanceof PasswordCallback) {
45 PasswordCallback callback = (PasswordCallback) callbacks[i];
46 writer.write(callback.getPrompt());
47 char[] answer = console.readPassword();
48 callback.setPassword(answer);
49 Arrays.fill(answer, ' ');
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 }
67 }
68
69 }