View Javadoc

1   /***
2    * 
3    */
4   package de.cohesion.bssh.impl.io;
5   
6   import java.io.IOException;
7   import java.io.InputStream;
8   import java.io.PushbackInputStream;
9   import java.util.Arrays;
10  
11  /***
12   * @author schulzs
13   */
14  public class PasswordHelper {
15  
16  	public static final char[] getPassword(InputStream in, String prompt)
17  			throws IOException {
18  		MaskingThread maskingthread = new MaskingThread(prompt);
19  		Thread thread = new Thread(maskingthread);
20  		thread.start();
21  
22  		char[] lineBuffer;
23  		char[] buf;
24  
25  		buf = lineBuffer = new char[128];
26  
27  		int room = buf.length;
28  		int offset = 0;
29  		int c;
30  
31  		loop: while (true) {
32  			switch (c = in.read()) {
33  			case -1:
34  			case '\n':
35  				break loop;
36  
37  			case '\r':
38  				int c2 = in.read();
39  				if ((c2 != '\n') && (c2 != -1)) {
40  					if (!(in instanceof PushbackInputStream)) {
41  						in = new PushbackInputStream(in);
42  					}
43  					((PushbackInputStream) in).unread(c2);
44  				} else {
45  					break loop;
46  				}
47  
48  			default:
49  				if (--room < 0) {
50  					buf = new char[offset + 128];
51  					room = buf.length - offset - 1;
52  					System.arraycopy(lineBuffer, 0, buf, 0, offset);
53  					Arrays.fill(lineBuffer, ' ');
54  					lineBuffer = buf;
55  				}
56  				buf[offset++] = (char) c;
57  				break;
58  			}
59  		}
60  		maskingthread.stopMasking();
61  		if (offset == 0) {
62  			return null;
63  		}
64  		char[] ret = new char[offset];
65  		System.arraycopy(buf, 0, ret, 0, offset);
66  		Arrays.fill(buf, ' ');
67  		return ret;
68  	}
69  }