s o m e t h i n g a b o u t m e

enter your password

появилась потребность реализовать ввод логина/пароля в рамках лабораторной работы по защите информации. т.к. преподу абсолютно все равно - интегрирована защита в ОС (как я пытался изначально сделать, юзая корявые shell скрипты) или сделана в отдельном приложении (!), решил писать все лабораторные на java, эмулируя командную строку (изначально пугали необходимостью резидентов и проч. в лабе, а все сошлось к банальным приложениям на делфе. как обычно).

Начав делать ввод пароля, натолкнулся на интересные вещи - по запросу преподавателя нужны были “*” вместо пароля (плевать ему, что это не секьюрно и лучше вообще не светить количество символов в пароле). Если б без звездочек - пересобрал бы shadow или использовал бы кривой Console.getPassword(), но тут, бля, звездочки.

Тут оказалось, что в джаве нет поддержки по-символьного ввода и нет поддержки режима ввода без echo (под посимвольным вводом я понимаю реакцию метода read на нажатие кнопки в консоли. в джаве в стандартном режиме считать из консоли можно лишь по return). Гугл подсказал несколько workaround-ов и указал на этот баг 9-летней (!) давности (продолжил свою жизнь тут). Частично проблема исправлена в 1.6 классом Console, но криво (например, очень мне нравится код наподобие try {bla-bla} catch (IOException e) {}) и то создан только метод getPassword(), причем без поддержки echo/-echo режимов, а только полная аналогия никсового getpass().

Пришлось выкручиватся, т.к. лезть в swing принципиально не хотелось :)

Варианты решения проблемы:

  • забить на звездочки и использовать
    System.console().getPassword();
  • играться с /dev/tty через exec.
  • использовать, например, jcurses

Решил попробовать второй вариан - и он все-таки заработал, не очень красиво, но хитрость забавляет :) Вот код:


p = Runtime.getRuntime().exec(new String[] {
                                                             "sh", "-c", "stty" +
                                                             (on ? " echo -cbreak" : " -echo cbreak") +
                                                             " < /dev/tty"});
p.waitFor();

т.е. на on == true включает echo и отключает cbreak, на false - наоборот.

screen

Теперь осталось дописать подобие интерактивной консоли и можно парить сразу 3 лабы :)

RSS feed | Trackback URI

3 Comments »

Comment by t0n Subscribed to comments via email
2007-04-11 00:56:14

можно даже перенаправлять вывод\ввод
application -> tty, tty - > application ;)

Comment by Traut
2007-04-11 01:05:37

только зачем? :) отдавать данные по stdin? нужно былоб тогда писать авторизацию на шеле, и писать связку с джавой. фээээ

или я не понял что ты имел ввиду? :)

 
 
Comment by t0n Subscribed to comments via email
2007-04-15 01:28:33

оффтоп: признавайся, как раскрашенный код вставил? :) я вначале думал, что скриншот. в HTML-сорце ничего не разобрал…

з.ы. вышли, плиз, на мыло мне эту лабу :) хочу сделать кавер :))

 
Name (required)
E-mail (required - never shown publicly)
URI
Subscribe to comments via email
Your Comment (smaller size | larger size)
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.