120 lines
3.4 KiB
D
120 lines
3.4 KiB
D
|
module window.password;
|
|||
|
|
|||
|
import std.conv;
|
|||
|
import std.string;
|
|||
|
|
|||
|
import std.stdio;
|
|||
|
|
|||
|
public import deimos.ncurses;
|
|||
|
public import deimos.form;
|
|||
|
public import core.stdc.locale;
|
|||
|
|
|||
|
enum {
|
|||
|
COLOR_WINDOW = 1,
|
|||
|
COLOR_BACKGROUND = 2
|
|||
|
}
|
|||
|
|
|||
|
void password() {
|
|||
|
setlocale(LC_ALL,"");
|
|||
|
initscr();
|
|||
|
raw();
|
|||
|
noecho();
|
|||
|
curs_set(2);
|
|||
|
|
|||
|
start_color();
|
|||
|
init_pair(COLOR_WINDOW, COLOR_WHITE, COLOR_RED);
|
|||
|
init_pair(COLOR_BACKGROUND, COLOR_WHITE, COLOR_BLUE);
|
|||
|
|
|||
|
int width, height;
|
|||
|
getmaxyx(stdscr, height, width);
|
|||
|
|
|||
|
bkgd(COLOR_PAIR(COLOR_BACKGROUND));
|
|||
|
|
|||
|
refresh();
|
|||
|
|
|||
|
WINDOW *win = newwin(5, 44, height/2 - 3, width/2 - 22);
|
|||
|
keypad(win, TRUE);
|
|||
|
box(win, 0, 0);
|
|||
|
wbkgd(win, COLOR_PAIR(COLOR_WINDOW));
|
|||
|
wrefresh(win);
|
|||
|
|
|||
|
FIELD*[3] fields;
|
|||
|
fields[0] = new_field(1, 16, 0, 2, 0, 0);
|
|||
|
fields[1] = new_field(1, 20, 0, 18, 0, 0);
|
|||
|
fields[2] = null;
|
|||
|
set_field_buffer(fields[0], 0, "Введите пароль:");
|
|||
|
set_field_opts(fields[0], O_VISIBLE | O_PUBLIC | O_AUTOSKIP);
|
|||
|
set_field_type(fields[1], TYPE_REGEXP, `^\**[-0-9A-Za-zА-Яа-я*,./!?%&#:$^_=+@~\]* *$`.ptr);
|
|||
|
set_field_opts(fields[1], O_VISIBLE | O_PUBLIC | O_EDIT | O_ACTIVE);
|
|||
|
set_field_back(fields[0], COLOR_PAIR(COLOR_WINDOW));
|
|||
|
set_field_back(fields[1], COLOR_PAIR(COLOR_WINDOW) | A_UNDERLINE);
|
|||
|
|
|||
|
FORM *form = new_form(cast(FIELD**)fields);
|
|||
|
set_form_win(form, win);
|
|||
|
set_form_sub(form, derwin(win, 1, 38, 2, 2));
|
|||
|
post_form(form);
|
|||
|
wrefresh(win);
|
|||
|
|
|||
|
dstring password;
|
|||
|
bool stop = false;
|
|||
|
|
|||
|
int status;
|
|||
|
|
|||
|
dchar ch;
|
|||
|
int ret;
|
|||
|
|
|||
|
while (!stop) {
|
|||
|
ret = wget_wch(win, &ch);
|
|||
|
switch (ret) {
|
|||
|
case KEY_CODE_YES:
|
|||
|
switch (ch) {
|
|||
|
case KEY_BACKSPACE:
|
|||
|
form_driver_w(form, KEY_CODE_YES, REQ_DEL_PREV);
|
|||
|
if (password.length)
|
|||
|
password = password[0 .. $ - 1];
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
case OK:
|
|||
|
switch (ch) {
|
|||
|
case KEY_BACKSPACE:
|
|||
|
form_driver_w(form, KEY_CODE_YES, REQ_DEL_PREV);
|
|||
|
if (password.length)
|
|||
|
password = password[0 .. $ - 1];
|
|||
|
break;
|
|||
|
case 32:
|
|||
|
break;
|
|||
|
case 10:
|
|||
|
case KEY_ENTER:
|
|||
|
stop = true;
|
|||
|
break;
|
|||
|
default:
|
|||
|
status = form_driver_w(form, OK, ch);
|
|||
|
if( status == OK ) {
|
|||
|
status = form_driver_w(form, KEY_CODE_YES, REQ_VALIDATION);
|
|||
|
if (status == OK) {
|
|||
|
password ~= ch.to!dchar;
|
|||
|
form_driver_w(form, KEY_CODE_YES, REQ_DEL_PREV);
|
|||
|
form_driver_w(form, OK, '*'.to!int);
|
|||
|
} else {
|
|||
|
status = form_driver_w(form, KEY_CODE_YES, REQ_DEL_PREV);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
unpost_form(form);
|
|||
|
free_form(form);
|
|||
|
free_field(fields[0]);
|
|||
|
free_field(fields[1]);
|
|||
|
endwin();
|
|||
|
|
|||
|
writefln("Password: %s\n", password);
|
|||
|
}
|