Browse Source

Merge pull request #183 from LorianColtof/master

Add command line option to lock TTY switching
master
Ingo Bürk 7 years ago
committed by GitHub
parent
commit
581f225484
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
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