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 }