Browse Source

Add option to lock TTY switching

master
Lorian Coltof 7 years ago
parent
commit
dcfcba3ed4
3 changed files with 56 additions and 2 deletions
  1. +4
    -0
      Makefile.am
  2. +5
    -0
      i3lock.1
  3. +47
    -2
      i3lock.c

+ 4
- 0
Makefile.am View File

@ -56,3 +56,7 @@ EXTRA_DIST = \
LICENSE \ LICENSE \
README.md \ README.md \
I3LOCK_VERSION I3LOCK_VERSION
# SUID the executable so it has permissions to lock TTY switching
install-exec-hook:
chmod +s $(DESTDIR)$(bindir)/i3lock$(EXEEXT)

+ 5
- 0
i3lock.1 View File

@ -28,6 +28,7 @@ i3lock \- improved screen locker
.RB [\|\-u\|] .RB [\|\-u\|]
.RB [\|\-e\|] .RB [\|\-e\|]
.RB [\|\-f\|] .RB [\|\-f\|]
.RB [\|\-l\|]
.SH DESCRIPTION .SH DESCRIPTION
.B i3lock .B i3lock
@ -106,6 +107,10 @@ your computer with the enter key.
Show the number of failed attempts, if any. Show the number of failed attempts, if any.
.TP .TP
.B \-l, \-\-lock-console
Lock the console to disable TTY switching (Linux only).
.TP
.B \-\-debug .B \-\-debug
Enables debug logging. Enables debug logging.
Note, that this will log the password used for authentication to stdout. Note, that this will log the password used for authentication to stdout.


+ 47
- 2
i3lock.c View File

@ -40,6 +40,11 @@
#endif #endif
#include <xcb/xcb_aux.h> #include <xcb/xcb_aux.h>
#include <xcb/randr.h> #include <xcb/randr.h>
#if defined(__linux__)
#include <fcntl.h>
#include <linux/vt.h>
#include <sys/ioctl.h>
#endif
#include "i3lock.h" #include "i3lock.h"
#include "xcb.h" #include "xcb.h"
@ -866,6 +871,11 @@ int main(int argc, char *argv[]) {
int ret; int ret;
struct pam_conv conv = {conv_callback, NULL}; struct pam_conv conv = {conv_callback, NULL};
#endif #endif
#if defined(__linux__)
bool lock_tty_switching = false;
int term = -1;
#endif
int curs_choice = CURS_NONE; int curs_choice = CURS_NONE;
int o; int o;
int longoptind = 0; int longoptind = 0;
@ -884,6 +894,7 @@ int main(int argc, char *argv[]) {
{"ignore-empty-password", no_argument, NULL, 'e'}, {"ignore-empty-password", no_argument, NULL, 'e'},
{"inactivity-timeout", required_argument, NULL, 'I'}, {"inactivity-timeout", required_argument, NULL, 'I'},
{"show-failed-attempts", no_argument, NULL, 'f'}, {"show-failed-attempts", no_argument, NULL, 'f'},
{"lock-console", no_argument, NULL, 'l'},
{NULL, no_argument, NULL, 0}}; {NULL, no_argument, NULL, 0}};
if ((pw = getpwuid(getuid())) == NULL) if ((pw = getpwuid(getuid())) == NULL)
@ -891,7 +902,7 @@ int main(int argc, char *argv[]) {
if ((username = pw->pw_name) == NULL) if ((username = pw->pw_name) == NULL)
errx(EXIT_FAILURE, "pw->pw_name is NULL.\n"); errx(EXIT_FAILURE, "pw->pw_name is NULL.\n");
char *optstring = "hvnbdc:p:ui:teI:f";
char *optstring = "hvnbdc:p:ui:teI:fl";
while ((o = getopt_long(argc, argv, optstring, longopts, &longoptind)) != -1) { while ((o = getopt_long(argc, argv, optstring, longopts, &longoptind)) != -1) {
switch (o) { switch (o) {
case 'v': case 'v':
@ -949,9 +960,16 @@ int main(int argc, char *argv[]) {
case 'f': case 'f':
show_failed_attempts = true; show_failed_attempts = true;
break; break;
case 'l':
#if defined(__linux__)
lock_tty_switching = true;
#else
errx(EXIT_FAILURE, "TTY switch locking is only supported on Linux.");
#endif
break;
default: default:
errx(EXIT_FAILURE, "Syntax: i3lock [-v] [-n] [-b] [-d] [-c color] [-u] [-p win|default]" errx(EXIT_FAILURE, "Syntax: i3lock [-v] [-n] [-b] [-d] [-c color] [-u] [-p win|default]"
" [-i image.png] [-t] [-e] [-I timeout] [-f]");
" [-i image.png] [-t] [-e] [-I timeout] [-f] [-l]");
} }
} }
@ -1117,6 +1135,21 @@ int main(int argc, char *argv[]) {
if (main_loop == NULL) if (main_loop == NULL)
errx(EXIT_FAILURE, "Could not initialize libev. Bad LIBEV_FLAGS?\n"); errx(EXIT_FAILURE, "Could not initialize libev. Bad LIBEV_FLAGS?\n");
#if defined(__linux__)
/* Lock tty switching */
if (lock_tty_switching) {
if ((term = open("/dev/console", O_RDWR)) == -1) {
perror("error locking TTY switching: opening console failed");
}
if (term != -1 && (ioctl(term, VT_LOCKSWITCH)) == -1) {
perror("error locking TTY switching: locking console failed");
}
}
#endif
/* Explicitly call the screen redraw in case "locking…" message was displayed */ /* Explicitly call the screen redraw in case "locking…" message was displayed */
auth_state = STATE_AUTH_IDLE; auth_state = STATE_AUTH_IDLE;
redraw_screen(); redraw_screen();
@ -1144,6 +1177,18 @@ int main(int argc, char *argv[]) {
return 0; return 0;
} }
#if defined(__linux__)
/* Restore tty switching */
if (lock_tty_switching) {
if (term != -1 && (ioctl(term, VT_UNLOCKSWITCH)) == -1) {
perror("error unlocking TTY switching: unlocking console failed");
}
close(term);
}
#endif
DEBUG("restoring focus to X11 window 0x%08x\n", stolen_focus); DEBUG("restoring focus to X11 window 0x%08x\n", stolen_focus);
xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
xcb_ungrab_keyboard(conn, XCB_CURRENT_TIME); xcb_ungrab_keyboard(conn, XCB_CURRENT_TIME);


Loading…
Cancel
Save