From 40e9098a741b1a213b55cd6a400aa1c7eb4f47e8 Mon Sep 17 00:00:00 2001 From: Dominik Bendle Date: Tue, 29 Jan 2019 16:10:16 +0100 Subject: [PATCH] Add option show-failed-attempts Keeps track of unsuccessful authentication attempts via an int counter in the state struct. Displays on the unlock indicator, but will be replaced by the Caps Lock text if enabled. --- include/swaylock.h | 2 ++ main.c | 15 +++++++++++++-- render.c | 10 ++++++++++ swaylock.1.scd | 3 +++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/swaylock.h b/include/swaylock.h index 56cee3b..f3ed374 100644 --- a/include/swaylock.h +++ b/include/swaylock.h @@ -50,6 +50,7 @@ struct swaylock_args { bool show_indicator; bool show_caps_lock_text; bool show_caps_lock_indicator; + bool show_failed_attempts; bool daemonize; }; @@ -73,6 +74,7 @@ struct swaylock_state { struct swaylock_password password; struct swaylock_xkb xkb; enum auth_state auth_state; + int failed_attempts; bool run_display; struct zxdg_output_manager_v1 *zxdg_output_manager; }; diff --git a/main.c b/main.c index 488d46f..c16dba3 100644 --- a/main.c +++ b/main.c @@ -508,6 +508,7 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, {"scaling", required_argument, NULL, 's'}, {"tiling", no_argument, NULL, 't'}, {"no-unlock-indicator", no_argument, NULL, 'u'}, + {"show-failed-attempts", no_argument, NULL, 'F'}, {"version", no_argument, NULL, 'v'}, {"bs-hl-color", required_argument, NULL, LO_BS_HL_COLOR}, {"caps-lock-bs-hl-color", required_argument, NULL, LO_CAPS_LOCK_BS_HL_COLOR}, @@ -567,6 +568,8 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, "Same as --scaling=tile.\n" " -u, --no-unlock-indicator " "Disable the unlock indicator.\n" + " -F, --show-failed-attempts " + "Show current count of failed authentication attempts.\n" " -v, --version " "Show the version number and quit.\n" " --bs-hl-color " @@ -644,7 +647,7 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, optind = 1; while (1) { int opt_idx = 0; - c = getopt_long(argc, argv, "c:defhi:Llnrs:tuvC:", long_options, + c = getopt_long(argc, argv, "c:deFfhi:Llnrs:tuvC:", long_options, &opt_idx); if (c == -1) { break; @@ -716,6 +719,11 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, state->args.show_indicator = false; } break; + case 'F': + if (state) { + state->args.show_failed_attempts = true; + } + break; case 'v': fprintf(stdout, "swaylock version " SWAYLOCK_VERSION "\n"); exit(EXIT_SUCCESS); @@ -961,6 +969,7 @@ static void comm_in(int fd, short mask, void *data) { } else { state.auth_state = AUTH_STATE_INVALID; schedule_indicator_clear(&state); + ++state.failed_attempts; damage_state(&state); } } @@ -970,6 +979,7 @@ int main(int argc, char **argv) { initialize_pw_backend(argc, argv); enum line_mode line_mode = LM_LINE; + state.failed_attempts = 0; state.args = (struct swaylock_args){ .mode = BACKGROUND_MODE_FILL, .font = strdup("sans-serif"), @@ -978,7 +988,8 @@ int main(int argc, char **argv) { .ignore_empty = false, .show_indicator = true, .show_caps_lock_indicator = false, - .show_caps_lock_text = true + .show_caps_lock_text = true, + .show_failed_attempts = false }; wl_list_init(&state.images); set_default_colors(&state.args.colors); diff --git a/render.c b/render.c index 25b75f0..cf6de2a 100644 --- a/render.c +++ b/render.c @@ -86,6 +86,7 @@ void render_frame(struct swaylock_surface *surface) { // Draw a message char *text = NULL; + char attempts[4]; // like i3lock: count no more than 999 set_color_for_state(cairo, state, &state->args.colors.text); cairo_select_font_face(cairo, state->args.font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); @@ -103,8 +104,17 @@ void render_frame(struct swaylock_surface *surface) { case AUTH_STATE_INPUT: case AUTH_STATE_INPUT_NOP: case AUTH_STATE_BACKSPACE: + // Caps Lock has higher priority if (state->xkb.caps_lock && state->args.show_caps_lock_text) { text = "Caps Lock"; + } else if (state->args.show_failed_attempts && + state->failed_attempts > 0) { + if (state->failed_attempts > 999) { + text = "999+"; + } else { + snprintf(attempts, sizeof(attempts), "%d", state->failed_attempts); + text = attempts; + } } break; default: diff --git a/swaylock.1.scd b/swaylock.1.scd index 9f7d88c..9c5ab46 100644 --- a/swaylock.1.scd +++ b/swaylock.1.scd @@ -54,6 +54,9 @@ Locks your Wayland session. *-l, --indicator-caps-lock* Show the current Caps Lock state also on the indicator. +*-F, --show-failed-attempts* + Show the number of failed authentication attempts on the indicator. + *-s, --scaling* Scaling mode for images: _stretch_, _fill_, _fit_, _center_, or _tile_. Use the additional mode _solid\_color_ to display only the background color, even