01: /*
02: * This is free software, licensed under the Gnu Public License (GPL)
03: * get a copy from <http://www.gnu.org/licenses/gpl.html>
04: * $Id: PasswordEraserThread.java,v 1.5 2004/03/05 23:34:38 hzeller Exp $
05: * author: Henner Zeller <H.Zeller@acm.org>
06: * inspired by hack provided in
07: * <http://java.sun.com/features/2002/09/pword_mask.html>
08: * Thanks to alec <acgnacgn@yahoo.co.uk> to point me to this.
09: */
10: package henplus;
11:
12: /**
13: * Erase password as it is typed. Since we do not have access to
14: * the tty in a way to switch off echoing, we constantly override
15: * any stuff written with spaces. This is a hack, since it is kinda
16: * busy process doing this in a loop and it may still expose letters
17: * from the password for the fraction of a second. However, this is
18: * better than nothing, right ?
19: */
20: class PasswordEraserThread extends Thread {
21: private final String eraser;
22: private boolean running;
23: private boolean onHold;
24:
25: /**
26: *@param prompt The prompt displayed to the user
27: */
28: public PasswordEraserThread(String prompt) {
29: /*
30: * we are erasing by writing the prompt followed by spaces
31: * from the beginning of the line
32: */
33: eraser = "\r" + prompt + " \r" + prompt;
34: running = true;
35: onHold = true;
36: }
37:
38: /**
39: * Begin masking until asked to stop.
40: */
41: public void run() {
42: while (running) {
43: if (onHold) {
44: try {
45: synchronized (this ) {
46: wait();
47: }
48: } catch (InterruptedException iex) {
49: // ignore.
50: }
51: if (onHold) {
52: continue;
53: }
54: }
55:
56: try {
57: Thread.sleep(1); // yield.
58: } catch (InterruptedException iex) {
59: // ignore
60: }
61: if (running && !onHold) {
62: System.out.print(eraser);
63: }
64: System.out.flush();
65: }
66: }
67:
68: public synchronized void holdOn() {
69: onHold = true;
70: notify();
71: }
72:
73: public synchronized void goOn() {
74: onHold = false;
75: notify();
76: }
77:
78: public synchronized void done() {
79: running = false;
80: notify();
81: }
82: }
|