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 }