implemented logging the number of failed attempts
Patch status: merged
Patch by koebi
Long description:
This closes #1243
To apply this patch, use:
curl http://cr.i3wm.org/patch/637/raw.patch | git am
b/i3lock.1
| 16 |
@@ -29,6 +29,7 @@ i3lock \- improved screen locker |
| 17 |
.RB [\|\-u\|] |
| 18 |
.RB [\|\-e\|] |
| 19 |
.RB [\|\-I\|] |
| 20 |
+.RB [\|\-f\|] |
| 21 |
|
| 22 |
.SH DESCRIPTION |
| 23 |
.B i3lock |
| 24 |
@@ -115,6 +116,10 @@ another try. This can be useful if the XF86ScreenSaver key is used to |
| 25 |
put a laptop to sleep and bounce on resume or if you happen to wake up |
| 26 |
your computer with the enter key. |
| 27 |
|
| 28 |
+.TP |
| 29 |
+.B \-f, \-\-show-failed-attempts |
| 30 |
+Show the number of failed attempts, if any. |
| 31 |
+ |
| 32 |
.SH SEE ALSO |
| 33 |
.IR xautolock(1) |
| 34 |
\- use i3lock as your screen saver |
b/i3lock.c
| 39 |
@@ -64,6 +64,8 @@ static struct ev_timer *dpms_timeout; |
| 40 |
static struct ev_timer *discard_passwd_timeout; |
| 41 |
extern unlock_state_t unlock_state; |
| 42 |
extern pam_state_t pam_state; |
| 43 |
+int failed_attempts = 0; |
| 44 |
+bool show_failed_attempts = false; |
| 45 |
|
| 46 |
static struct xkb_state *xkb_state; |
| 47 |
static struct xkb_context *xkb_context; |
| 48 |
@@ -239,6 +241,7 @@ static void input_done(void) {
|
| 49 |
fprintf(stderr, "Authentication failure\n"); |
| 50 |
|
| 51 |
pam_state = STATE_PAM_WRONG; |
| 52 |
+ failed_attempts += 1; |
| 53 |
clear_input(); |
| 54 |
redraw_screen(); |
| 55 |
|
| 56 |
@@ -671,13 +674,14 @@ int main(int argc, char *argv[]) {
|
| 57 |
{"tiling", no_argument, NULL, 't'},
|
| 58 |
{"ignore-empty-password", no_argument, NULL, 'e'},
|
| 59 |
{"inactivity-timeout", required_argument, NULL, 'I'},
|
| 60 |
+ {"show-failed-attempts", no_argument, NULL, 'f'},
|
| 61 |
{NULL, no_argument, NULL, 0}
|
| 62 |
}; |
| 63 |
|
| 64 |
if ((username = getenv("USER")) == NULL)
|
| 65 |
errx(EXIT_FAILURE, "USER environment variable not set, please set it.\n"); |
| 66 |
|
| 67 |
- char *optstring = "hvnbdc:p:ui:teI:"; |
| 68 |
+ char *optstring = "hvnbdc:p:ui:teI:f"; |
| 69 |
while ((o = getopt_long(argc, argv, optstring, longopts, &optind)) != -1) {
|
| 70 |
switch (o) {
|
| 71 |
case 'v': |
| 72 |
@@ -735,9 +739,12 @@ int main(int argc, char *argv[]) {
|
| 73 |
if (strcmp(longopts[optind].name, "debug") == 0) |
| 74 |
debug_mode = true; |
| 75 |
break; |
| 76 |
+ case 'f': |
| 77 |
+ show_failed_attempts = true; |
| 78 |
+ break; |
| 79 |
default: |
| 80 |
errx(EXIT_FAILURE, "Syntax: i3lock [-v] [-n] [-b] [-d] [-c color] [-u] [-p win|default]" |
| 81 |
- " [-i image.png] [-t] [-e] [-I]" |
| 82 |
+ " [-i image.png] [-t] [-e] [-I] [-f]" |
| 83 |
); |
| 84 |
} |
| 85 |
} |
b/unlock_indicator.c
| 90 |
@@ -52,6 +52,11 @@ extern bool tile; |
| 91 |
/* The background color to use (in hex). */ |
| 92 |
extern char color[7]; |
| 93 |
|
| 94 |
+/* Whether the failed attempts should be displayed. */ |
| 95 |
+extern bool show_failed_attempts; |
| 96 |
+/* Number of failed unlock attempts. */ |
| 97 |
+extern int failed_attempts; |
| 98 |
+ |
| 99 |
/******************************************************************************* |
| 100 |
* Variables defined in xcb.c. |
| 101 |
******************************************************************************/ |
| 102 |
@@ -185,6 +190,11 @@ xcb_pixmap_t draw_image(uint32_t *resolution) {
|
| 103 |
|
| 104 |
/* Display a (centered) text of the current PAM state. */ |
| 105 |
char *text = NULL; |
| 106 |
+ /* We don't want to show more than a 3-digit number. */ |
| 107 |
+ char buf[4]; |
| 108 |
+ |
| 109 |
+ cairo_set_source_rgb(ctx, 0, 0, 0); |
| 110 |
+ cairo_set_font_size(ctx, 28.0); |
| 111 |
switch (pam_state) {
|
| 112 |
case STATE_PAM_VERIFY: |
| 113 |
text = "verifying…"; |
| 114 |
@@ -193,6 +203,16 @@ xcb_pixmap_t draw_image(uint32_t *resolution) {
|
| 115 |
text = "wrong!"; |
| 116 |
break; |
| 117 |
default: |
| 118 |
+ if (show_failed_attempts && failed_attempts > 0){
|
| 119 |
+ if (failed_attempts > 999) {
|
| 120 |
+ text = "> 999"; |
| 121 |
+ } else {
|
| 122 |
+ snprintf(buf, sizeof(buf), "%d", failed_attempts); |
| 123 |
+ text = buf; |
| 124 |
+ } |
| 125 |
+ cairo_set_source_rgb(ctx, 1, 0, 0); |
| 126 |
+ cairo_set_font_size(ctx, 32.0); |
| 127 |
+ } |
| 128 |
break; |
| 129 |
} |
| 130 |
|
| 131 |
@@ -200,9 +220,6 @@ xcb_pixmap_t draw_image(uint32_t *resolution) {
|
| 132 |
cairo_text_extents_t extents; |
| 133 |
double x, y; |
| 134 |
|
| 135 |
- cairo_set_source_rgb(ctx, 0, 0, 0); |
| 136 |
- cairo_set_font_size(ctx, 28.0); |
| 137 |
- |
| 138 |
cairo_text_extents(ctx, text, &extents); |
| 139 |
x = BUTTON_CENTER - ((extents.width / 2) + extents.x_bearing); |
| 140 |
y = BUTTON_CENTER - ((extents.height / 2) + extents.y_bearing); |