From 9486f05e592e3878c06e10340a7777410a29e74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20L=C3=A1zni=C4=8Dka?= Date: Fri, 4 Oct 2019 20:50:02 +0200 Subject: [PATCH] cosmetic changes + enter behavior (#126) * remove trailing whitespace * always submit password on enter Moves the keypress logic for keypresses from if-else statements to switches, adds non-contextual behavior on pressing enter * wrap pam actions and handle errors at on spot * init all of text struct in input_text() This gets rid off valgrind warning on unitialized variables --- src/config.c | 2 +- src/config.h | 6 +++++ src/inputs.c | 2 ++ src/login.c | 44 +++++++++++++++++++++---------------- src/main.c | 62 ++++++++++++++++++++++++++-------------------------- 5 files changed, 65 insertions(+), 51 deletions(-) diff --git a/src/config.c b/src/config.c index 5e0caa9..60fa1c9 100644 --- a/src/config.c +++ b/src/config.c @@ -263,7 +263,7 @@ void config_defaults() config.blank_box = true; config.blank_password = false; config.console_dev = strdup("/dev/console"); - config.default_input = 2; + config.default_input = PASSWORD_INPUT; config.fg = 9; config.hide_borders = false; config.input_len = 34; diff --git a/src/config.h b/src/config.h index 93a0fb1..ec00f4d 100644 --- a/src/config.h +++ b/src/config.h @@ -3,6 +3,12 @@ #include "ctypes.h" +enum INPUTS { + SESSION_SWITCH, + LOGIN_INPUT, + PASSWORD_INPUT, +}; + struct lang { char* capslock; diff --git a/src/inputs.c b/src/inputs.c index 08c1011..08953fd 100644 --- a/src/inputs.c +++ b/src/inputs.c @@ -115,6 +115,8 @@ void input_text(struct text* target, u64 len) target->end = target->text; target->visible_start = target->text; target->len = len; + target->x = 0; + target->y = 0; } void input_desktop_free(struct desktop* target) diff --git a/src/login.c b/src/login.c index bc9a3fe..d64cc3c 100644 --- a/src/login.c +++ b/src/login.c @@ -423,6 +423,24 @@ void shell(struct passwd* pwd) reset_terminal(pwd); } +// pam_do performs the pam action specified in pam_action +// on pam_action fail, call diagnose and end pam session +int pam_do( + int (pam_action)(struct pam_handle *, int), + struct pam_handle *handle, + int flags, + struct term_buf *buf) +{ + int status = pam_action(handle, flags); + + if (status != PAM_SUCCESS) { + pam_diagnose(status, buf); + pam_end(handle, status); + } + + return status; +} + void auth( struct desktop* desktop, struct text* login, @@ -445,39 +463,31 @@ void auth( return; } - ok = pam_authenticate(handle, 0); + ok = pam_do(pam_authenticate, handle, 0, buf); if (ok != PAM_SUCCESS) { - pam_diagnose(ok, buf); - pam_end(handle, ok); return; } - ok = pam_acct_mgmt(handle, 0); + ok = pam_do(pam_acct_mgmt, handle, 0, buf); if (ok != PAM_SUCCESS) { - pam_diagnose(ok, buf); - pam_end(handle, ok); return; } - ok = pam_setcred(handle, PAM_ESTABLISH_CRED); + ok = pam_do(pam_setcred, handle, PAM_ESTABLISH_CRED, buf); if (ok != PAM_SUCCESS) { - pam_diagnose(ok, buf); - pam_end(handle, ok); return; } - ok = pam_open_session(handle, 0); + ok = pam_do(pam_open_session, handle, 0, buf); if (ok != PAM_SUCCESS) { - pam_diagnose(ok, buf); - pam_end(handle, ok); return; } @@ -621,21 +631,17 @@ void auth( desktop_load(desktop); // close pam session - ok = pam_close_session(handle, 0); + ok = pam_do(pam_close_session, handle, 0, buf); if (ok != PAM_SUCCESS) { - pam_diagnose(ok, buf); - pam_end(handle, ok); return; } - ok = pam_setcred(handle, PAM_DELETE_CRED); + ok = pam_do(pam_setcred, handle, PAM_DELETE_CRED, buf); if (ok != PAM_SUCCESS) { - pam_diagnose(ok, buf); - pam_end(handle, ok); return; } @@ -645,4 +651,4 @@ void auth( { pam_diagnose(ok, buf); } -} +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 96a555e..6e30960 100644 --- a/src/main.c +++ b/src/main.c @@ -47,7 +47,7 @@ void log_init(char** log) log[DGN_NULL] = lang.err_null; log[DGN_ALLOC] = lang.err_alloc; log[DGN_BOUNDS] = lang.err_bounds; - log[DGN_DOMAIN] = lang.err_domain; + log[DGN_DOMAIN] = lang.err_domain; log[DGN_MLOCK] = lang.err_mlock; log[DGN_XSESSIONS_DIR] = lang.err_xsessions_dir; log[DGN_XSESSIONS_OPEN] = lang.err_xsessions_open; @@ -196,45 +196,43 @@ int main(int argc, char** argv) if (event.type == TB_EVENT_KEY) { - if (event.key == TB_KEY_F1) + switch (event.key) { + case TB_KEY_F1: shutdown = true; + run = false; break; - } - else if (event.key == TB_KEY_F2) - { + case TB_KEY_F2: reboot = true; + run = false; break; - } - else if (event.key == TB_KEY_CTRL_C) - { + case TB_KEY_CTRL_C: + run = false; break; - } - else if ((event.key == TB_KEY_ARROW_UP) && (active_input > 0)) - { - --active_input; - update = true; - } - else if (((event.key == TB_KEY_ARROW_DOWN) - || (event.key == TB_KEY_ENTER)) - && (active_input < 2)) - { - ++active_input; - update = true; - } - else if (event.key == TB_KEY_TAB) - { + case TB_KEY_ARROW_UP: + if (active_input > 0) + { + --active_input; + update = true; + } + break; + case TB_KEY_ARROW_DOWN: + if (active_input < 2) + { + ++active_input; + update = true; + } + break; + case TB_KEY_TAB: ++active_input; if (active_input > 2) { - active_input = 0; + active_input = PASSWORD_INPUT; } - update = true; - } - else if (event.key == TB_KEY_ENTER) - { + break; + case TB_KEY_ENTER: save(&desktop, &login); auth(&desktop, &login, &password, &buf); update = true; @@ -242,6 +240,8 @@ int main(int argc, char** argv) if (dgn_catch()) { ++auth_fails; + // move focus back to password input + active_input = PASSWORD_INPUT; if (dgn_output_code() != DGN_PAM) { @@ -256,13 +256,13 @@ int main(int argc, char** argv) } load(&desktop, &login); - } - else - { + break; + default: (*input_handles[active_input])( input_structs[active_input], &event); update = true; + break; } } }