diff options
| author | arg@mig29 <unknown> | 2006-10-31 08:35:54 +0100 | 
|---|---|---|
| committer | arg@mig29 <unknown> | 2006-10-31 08:35:54 +0100 | 
| commit | 27d8d248275ca3eb63882202dcc21ecf2f81e72a (patch) | |
| tree | cdf25b7fa1de226f5212ba657bad5abd76866037 | |
| parent | 8a7a68c4c09cbc8b03cb2765ac83e99ca1cc808b (diff) | |
| download | slock-27d8d248275ca3eb63882202dcc21ecf2f81e72a.tar.gz slock-27d8d248275ca3eb63882202dcc21ecf2f81e72a.tar.xz  | |
applied Vincent's path with some modifications
| -rw-r--r-- | slock.c | 80 | 
1 files changed, 43 insertions, 37 deletions
@@ -3,32 +3,55 @@   */  #define _XOPEN_SOURCE 500 -#if HAVE_SHADOW_H -#include <shadow.h> -#else -#include <pwd.h> -#endif -  #include <ctype.h> +#include <pwd.h>  #include <stdlib.h>  #include <stdio.h>  #include <string.h>  #include <unistd.h> +#if HAVE_SHADOW_H +#include <shadow.h> +#endif  #include <sys/types.h>  #include <X11/keysym.h>  #include <X11/Xlib.h>  #include <X11/Xutil.h> +const char * +get_password() { /* only run as root */ +	const char *rval; +	struct passwd *pw; + +	if(geteuid() != 0) { +		fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr); +		exit(EXIT_FAILURE); +	} +	pw = getpwuid(getuid()); +	endpwent(); +	rval =  pw->pw_passwd; + +#if HAVE_SHADOW_H +	{ +		struct spwd *sp; +		sp = getspnam(getenv("USER")); +		endspent(); +		rval = sp->sp_pwdp; +	} +#endif +	/* drop privileges */ +	if(setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) { +		fputs("slock: cannot drop privileges\n",stdout); +		exit(EXIT_FAILURE); +	} +	return rval; +} +  int  main(int argc, char **argv) {  	char curs[] = {0, 0, 0, 0, 0, 0, 0, 0};  	char buf[32], passwd[256];  	int num, screen; -#if HAVE_SHADOW_H -	struct spwd *sp; -#else -	struct passwd *pw; -#endif +	const char *pws;  	unsigned int len;  	Bool running = True;  	Cursor invisible; @@ -44,17 +67,7 @@ main(int argc, char **argv) {  		fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);  		exit(EXIT_SUCCESS);  	} -	if(geteuid() != 0) { -		fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr); -		exit(EXIT_FAILURE); -	} -#if HAVE_SHADOW_H -	sp = getspnam(getenv("USER")); -	endspent(); -#else -	pw = getpwuid(getuid()); -	endpwent(); -#endif +	pws = get_password();  	if(!(dpy = XOpenDisplay(0))) {  		fputs("slock: cannot open display\n", stderr);  		exit(EXIT_FAILURE); @@ -62,7 +75,7 @@ main(int argc, char **argv) {  	screen = DefaultScreen(dpy);  	/* init */ -	passwd[0] = 0; +	len = 0;  	wa.override_redirect = 1;  	wa.background_pixel = BlackPixel(dpy, screen); @@ -89,7 +102,6 @@ main(int argc, char **argv) {  	/* main event loop */  	while(running && !XNextEvent(dpy, &ev))  		if(ev.type == KeyPress) { -			len = strlen(passwd);  			buf[0] = 0;  			num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0);  			if(IsFunctionKey(ksym) || IsKeypadKey(ksym) @@ -98,28 +110,22 @@ main(int argc, char **argv) {  				continue;  			switch(ksym) {  			case XK_Return: -#if HAVE_SHADOW_H -				if((running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd)))) -#else -				if((running = strncmp(crypt(passwd, pw->pw_passwd), pw->pw_passwd, sizeof(passwd)))) -#endif +				passwd[len] = 0; +				if((running = strcmp(crypt(passwd, pws), pws)) != 0)  					XBell(dpy, 100); -				passwd[0] = 0; +				len = 0;  				break;  			case XK_Escape: -				passwd[0] = 0; +				len = 0;  				break;  			case XK_BackSpace:  				if(len) -					passwd[--len] = 0; +				  --len;  				break;  			default:  				if(num && !iscntrl((int) buf[0])) { -					buf[num] = 0; -					if(len) -						strncat(passwd, buf, sizeof(passwd)); -					else -						strncpy(passwd, buf, sizeof(passwd)); +					memcpy(passwd + len,buf,num); +					len += num;  				}  				break;  			}  | 
