Add repeat function
This commit is contained in:
parent
631b801c00
commit
a9cba79ff9
2 changed files with 92 additions and 26 deletions
|
@ -49,6 +49,9 @@ static int screen;
|
||||||
|
|
||||||
static char* pin;
|
static char* pin;
|
||||||
static int pin_len;
|
static int pin_len;
|
||||||
|
static char* pin_repeat;
|
||||||
|
static int pin_repeat_len;
|
||||||
|
static int repeat;
|
||||||
|
|
||||||
static Atom clip, utf8;
|
static Atom clip, utf8;
|
||||||
static Display *dpy;
|
static Display *dpy;
|
||||||
|
@ -123,16 +126,46 @@ nextrune(int cursor, int inc) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_pin(char* pin_ptr, int len, int reset) {
|
||||||
|
pin = pin_ptr;
|
||||||
|
pin_len = len;
|
||||||
|
|
||||||
|
if (reset) {
|
||||||
|
promptw = (prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
|
||||||
|
cursor = 0;
|
||||||
|
|
||||||
|
if (pin) {
|
||||||
|
pin[0] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
insert(const char *str, ssize_t n) {
|
insert(const char *str, ssize_t n) {
|
||||||
size_t len = strlen(pin);
|
size_t len = strlen(pin);
|
||||||
|
|
||||||
|
// FIXME: Pinentry crashes when increasing the pin buffer the second time.
|
||||||
|
// Other pinentry programs has a limited passwort field length.
|
||||||
if (len + n > pin_len - 1) {
|
if (len + n > pin_len - 1) {
|
||||||
|
if (repeat) {
|
||||||
|
pin_repeat_len = 2 * pin_repeat_len;
|
||||||
|
pin_repeat = secmem_realloc(pin_repeat, pin_repeat_len);
|
||||||
|
setup_pin(pin_repeat, pin_repeat_len, 0);
|
||||||
|
if (!pin_repeat) {
|
||||||
|
pin_len = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (!pinentry_setbufferlen(pinentry, 2 * pinentry->pin_len)) {
|
if (!pinentry_setbufferlen(pinentry, 2 * pinentry->pin_len)) {
|
||||||
|
pin_len = 0;
|
||||||
|
} else {
|
||||||
|
setup_pin(pinentry->pin, pinentry->pin_len, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pin_len == 0) {
|
||||||
printf("Error: Couldn't allocate secure memory\n");
|
printf("Error: Couldn't allocate secure memory\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pin_len = pinentry->pin_len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move existing text out of the way, insert new text, and update cursor */
|
/* Move existing text out of the way, insert new text, and update cursor */
|
||||||
|
@ -234,17 +267,6 @@ drawwin(void) {
|
||||||
drw_map(drw, win, 0, 0, mw, mh);
|
drw_map(drw, win, 0, 0, mw, mh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
setup_pin(char* pin_ptr, int len) {
|
|
||||||
pin = pin_ptr;
|
|
||||||
pin_len = len;
|
|
||||||
cursor = 0;
|
|
||||||
promptw = (prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
|
|
||||||
if (pin) {
|
|
||||||
pin[0] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup(void) {
|
setup(void) {
|
||||||
int x, y, i = 0;
|
int x, y, i = 0;
|
||||||
|
@ -587,17 +609,24 @@ catchsig(int sig) {
|
||||||
static void
|
static void
|
||||||
password(void) {
|
password(void) {
|
||||||
winmode = WinPin;
|
winmode = WinPin;
|
||||||
setup_pin(pinentry->pin, pinentry->pin_len);
|
repeat = 0;
|
||||||
|
setup_pin(pinentry->pin, pinentry->pin_len, 1);
|
||||||
run();
|
run();
|
||||||
|
|
||||||
if (pinentry->repeat_passphrase) {
|
if (!pinentry->canceled && pinentry->repeat_passphrase) {
|
||||||
setup_pin(pinentry->repeat_passphrase);
|
repeat = 1;
|
||||||
// TODO: Add repeat text
|
pin_repeat_len = pinentry->pin_len;
|
||||||
|
pin_repeat = secmem_malloc(pinentry->pin_len);
|
||||||
|
setup_pin(pin_repeat, pin_repeat_len, 1);
|
||||||
run();
|
run();
|
||||||
|
|
||||||
if (strcmp(pinentry->pin, pinentry->repeat_passphrase)) {
|
pinentry->repeat_okay = (strcmp(pinentry->pin, pin_repeat) == 0)? 1 : 0;
|
||||||
pinentry->repeat_okay = 0;
|
secmem_free(pin_repeat);
|
||||||
return 0;
|
|
||||||
|
if (!pinentry->repeat_okay) {
|
||||||
|
pinentry->result = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pinentry->canceled) {
|
if (pinentry->canceled) {
|
||||||
|
@ -654,7 +683,10 @@ cmdhandler(pinentry_t received_pinentry) {
|
||||||
setup();
|
setup();
|
||||||
|
|
||||||
if (pinentry->pin) {
|
if (pinentry->pin) {
|
||||||
|
do {
|
||||||
password();
|
password();
|
||||||
|
} while (!pinentry->canceled && pinentry->repeat_passphrase
|
||||||
|
&& !pinentry->repeat_okay);
|
||||||
} else {
|
} else {
|
||||||
confirm();
|
confirm();
|
||||||
}
|
}
|
||||||
|
|
44
test
44
test
|
@ -1,9 +1,43 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
echo "SETDESC testing pinentry-dmenu, type whatever
|
|
||||||
SETPROMPT whatever:
|
if [[ $1 -eq 1 ]]; then
|
||||||
|
|
||||||
|
echo "SETTITLE title
|
||||||
|
SETPROMPT prompt
|
||||||
|
SETDESC PROMPT
|
||||||
GETPIN
|
GETPIN
|
||||||
SETDESC type more of whatever:
|
BYE" | ./pinentry-dmenu
|
||||||
GETPIN
|
|
||||||
SETDESC testing confirmation
|
elif [[ $1 -eq 2 ]]; then
|
||||||
|
|
||||||
|
echo "SETTITLE title
|
||||||
|
SETPROMPT confirm
|
||||||
|
SETDESC CONFIRM
|
||||||
confirm
|
confirm
|
||||||
BYE" | ./pinentry-dmenu
|
BYE" | ./pinentry-dmenu
|
||||||
|
|
||||||
|
elif [[ $1 -eq 3 ]]; then
|
||||||
|
|
||||||
|
echo "SETTITLE title
|
||||||
|
SETPROMPT prompt
|
||||||
|
SETDESC REPEAT
|
||||||
|
SETREPEAT repeat
|
||||||
|
GETPIN
|
||||||
|
BYE" | ./pinentry-dmenu
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
echo "SETTITLE title
|
||||||
|
SETPROMPT prompt
|
||||||
|
SETDESC PROMPT
|
||||||
|
GETPIN
|
||||||
|
SETPROMPT confirm
|
||||||
|
SETDESC CONFIRM
|
||||||
|
confirm
|
||||||
|
SETPROMPT repeat
|
||||||
|
SETDESC REPEAT
|
||||||
|
SETREPEAT
|
||||||
|
GETPIN
|
||||||
|
BYE" | ./pinentry-dmenu
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in a new issue