Unify how we check passwords between different OSes - slock - simple X display … | |
git clone git://git.suckless.org/slock | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 04143fd68dbc656905714eff5c208fadb3464e25 | |
parent 9698224090ff2989659717815bfa076d5d436a70 | |
Author: Quentin Rameau <[email protected]> | |
Date: Wed, 7 Sep 2016 13:02:42 +0200 | |
Unify how we check passwords between different OSes | |
Diffstat: | |
M config.mk | 9 ++------- | |
M slock.c | 47 +++++++++--------------------… | |
2 files changed, 15 insertions(+), 41 deletions(-) | |
--- | |
diff --git a/config.mk b/config.mk | |
@@ -20,16 +20,11 @@ CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} | |
LDFLAGS = -s ${LIBS} | |
COMPATSRC = explicit_bzero.c | |
-# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS and add -DHAVE_BSD_AUTH | |
+# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS | |
# On OpenBSD and Darwin remove -lcrypt from LIBS | |
#LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr | |
-#CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_BSD_AUTH -D_BSD_SOURCE | |
+#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE | |
#COMPATSRC = | |
# compiler and linker | |
CC = cc | |
- | |
-# Install mode. On BSD systems MODE=2755 and GROUP=auth | |
-# On others MODE=4755 and GROUP=root | |
-#MODE=2755 | |
-#GROUP=auth | |
diff --git a/slock.c b/slock.c | |
@@ -18,11 +18,6 @@ | |
#include <X11/Xlib.h> | |
#include <X11/Xutil.h> | |
-#if HAVE_BSD_AUTH | |
-#include <login_cap.h> | |
-#include <bsd_auth.h> | |
-#endif | |
- | |
#include "arg.h" | |
#include "util.h" | |
@@ -88,7 +83,6 @@ dontkillme(void) | |
} | |
#endif | |
-#ifndef HAVE_BSD_AUTH | |
/* only run as root */ | |
static const char * | |
getpw(void) | |
@@ -96,6 +90,7 @@ getpw(void) | |
const char *rval; | |
struct passwd *pw; | |
+ /* Check if the current user has a password entry */ | |
errno = 0; | |
if (!(pw = getpwuid(getuid()))) { | |
if (errno) | |
@@ -109,10 +104,20 @@ getpw(void) | |
if (rval[0] == 'x' && rval[1] == '\0') { | |
struct spwd *sp; | |
if (!(sp = getspnam(getenv("USER")))) | |
- die("slock: cannot retrieve shadow entry (make sure to… | |
+ die("slock: getspnam: cannot retrieve shadow entry (ma… | |
rval = sp->sp_pwdp; | |
} | |
-#endif | |
+#else | |
+ if (rval[0] == '*' && rval[1] == '\0') { | |
+#ifdef __OpenBSD__ | |
+ if (!(pw = getpwnam_shadow(getenv("USER")))) | |
+ die("slock: getpwnam_shadow: cannot retrieve shadow en… | |
+ rval = pw->pw_passwd; | |
+#else | |
+ die("slock: getpwuid: cannot retrieve shadow entry (make sure … | |
+#endif /* __OpenBSD__ */ | |
+ } | |
+#endif /* HAVE_SHADOW_H */ | |
/* drop privileges */ | |
if (geteuid() == 0 && | |
@@ -120,14 +125,9 @@ getpw(void) | |
die("slock: cannot drop privileges\n"); | |
return rval; | |
} | |
-#endif | |
static void | |
-#ifdef HAVE_BSD_AUTH | |
-readpw(Display *dpy) | |
-#else | |
readpw(Display *dpy, const char *pws) | |
-#endif | |
{ | |
char buf[32], passwd[256], *encrypted; | |
int num, screen, running, failure; | |
@@ -163,15 +163,11 @@ readpw(Display *dpy, const char *pws) | |
switch (ksym) { | |
case XK_Return: | |
passwd[len] = 0; | |
-#ifdef HAVE_BSD_AUTH | |
- running = !auth_userokay(getlogin(), NULL, "au… | |
-#else | |
errno = 0; | |
if (!(encrypted = crypt(passwd, pws))) | |
fprintf(stderr, "slock: crypt: %s\n", … | |
else | |
running = !!strcmp(encrypted, pws); | |
-#endif | |
if (running) { | |
XBell(dpy, 100); | |
failure = True; | |
@@ -320,9 +316,7 @@ usage(void) | |
int | |
main(int argc, char **argv) { | |
-#ifndef HAVE_BSD_AUTH | |
const char *pws; | |
-#endif | |
Display *dpy; | |
int s, nlocks; | |
@@ -338,20 +332,9 @@ main(int argc, char **argv) { | |
dontkillme(); | |
#endif | |
- /* Check if the current user has a password entry */ | |
- errno = 0; | |
- if (!getpwuid(getuid())) { | |
- if (errno == 0) | |
- die("slock: no password entry for current user\n"); | |
- else | |
- die("slock: getpwuid: %s\n", strerror(errno)); | |
- } | |
- | |
-#ifndef HAVE_BSD_AUTH | |
pws = getpw(); | |
if (strlen(pws) < 2) | |
die("slock: failed to get user password hash.\n"); | |
-#endif | |
if (!(dpy = XOpenDisplay(NULL))) | |
die("slock: cannot open display\n"); | |
@@ -396,11 +379,7 @@ main(int argc, char **argv) { | |
} | |
/* everything is now blank. Wait for the correct password */ | |
-#ifdef HAVE_BSD_AUTH | |
- readpw(dpy); | |
-#else | |
readpw(dpy, pws); | |
-#endif | |
/* password ok, unlock everything and quit */ | |
cleanup(dpy); |