diff --git a/.gitignore b/.gitignore index 9ad189c..2e72fdb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ loqy +.gitignore diff --git a/main.c b/main.c index edb7c78..1d766a1 100644 --- a/main.c +++ b/main.c @@ -15,21 +15,23 @@ #include #include -/* user and group to drop privileges to */ -static const char *user = "overlord"; -static const char *group = "wheel"; -static const char *message = "Password"; #define PASS_LEN 1024 #define PASS_BOX_LEN 20 #define FONT_SIZE 12 -typedef struct { unsigned long flags; - unsigned long functions; - unsigned long decorations; - long inputMode; - unsigned long status; -} Hints; +/* user and group to drop privileges to */ +static const char *user = "overlord"; +static const char *group = "wheel"; +static const char *message = "Password"; + + +typedef struct{unsigned long flags; + unsigned long functions; + unsigned long decorations; + long inputMode; + unsigned long status; +}Hints; @@ -38,18 +40,17 @@ typedef struct { unsigned long flags; char pass_buffer[PASS_LEN], passwd[PASS_LEN]; - -void catch_fire (char*, int); -void draw_ui (Display*, Window, Visual*, Colormap, int, int, int); -void window_attr (Display*, Window, int, int, int); -void anullate (char*, int); +void anullate(char*, int); +void catch_fire(char*, int); +void draw_ui(Display*, Window, Visual*, Colormap, int, int, int); void get_passwd(Display*, Window w, Visual *v, Colormap cmap, int width, int height, int screen, const char*); static const char *generate_hash(void); +void window_attr(Display*, Window, int, int, int); -int main(void) { +int main(void){ struct passwd *pwd; struct group *grp; @@ -60,42 +61,44 @@ int main(void) { Display *d = XOpenDisplay(NULL); - if ( d == NULL ) + if(d == NULL) catch_fire("Cannot open display\n", 1); - if (!(pwd = getpwnam(user))) + if(!(pwd = getpwnam(user))) catch_fire("Cannot get user", 6); duid = pwd->pw_uid; - if (!(grp = getgrnam(group))) + if(!(grp = getgrnam(group))) catch_fire("Can't get group", 7); dgid = grp->gr_gid; - int s = DefaultScreen(d); - int depth = DefaultDepth(d, s); - int width = DisplayWidth(d, s); + int s = DefaultScreen(d); + int depth = DefaultDepth(d, s); + int width = DisplayWidth(d, s); int height = DisplayHeight(d, s); Window w; Visual *visual = DefaultVisual(d, s); - Colormap cmap = DefaultColormap(d, s); + Colormap cmap = DefaultColormap(d, s); // IGNORES WM RULES XSetWindowAttributes attributes; attributes.override_redirect = True; - attributes.background_pixel = BlackPixel(d, s); + attributes.background_pixel = BlackPixel(d, s); + // MAKE THE WINDOW w = XCreateWindow(d, XRootWindow(d, s), 0, 0, width, height, 0, depth, InputOutput, visual, CWBackPixel | CWOverrideRedirect, &attributes); + // SET WINDOW ATTRIBUTES window_attr(d, w, s, width, height); // DRAW THE RECTANGLES AND STRINGS @@ -120,11 +123,23 @@ int main(void) { // CHECK THE DAMNED PASSWORD get_passwd(d, w, visual, cmap, width, height, s, hash); + XCloseDisplay(d); return 0; } -void catch_fire (char *string, int error){ + + + +void anullate(char *str, int size){ + memset(str, 0, size); +} + + + + + +void catch_fire(char *string, int error){ fprintf(stderr, string); exit(error); } @@ -135,8 +150,6 @@ void catch_fire (char *string, int error){ void draw_ui(Display *d, Window w, Visual *visual, Colormap cmap, int width, int height, int s){ - - //FONT SHENANIGANS char font_name[strlen("monospace-") +2]; sprintf(font_name, "monospace-%d", FONT_SIZE); @@ -145,9 +158,8 @@ void draw_ui(Display *d, Window w, Visual *visual, Colormap cmap, int width, int // FONT COLORS - XftColor xft_black; + XftColor xft_black, xft_white; XftColorAllocName (d, visual, cmap, "black", &xft_black); - XftColor xft_white; XftColorAllocName (d, visual, cmap, "white", &xft_white); @@ -172,11 +184,11 @@ void draw_ui(Display *d, Window w, Visual *visual, Colormap cmap, int width, int XftDrawRect(xftdraw, &xft_black, black_rect_x, black_rect_y, black_rect_width, black_rect_height); + // PRINT PASS MESSAGE XftDrawString8(xftdraw, &xft_black, font, white_rect_x + FONT_SIZE/2, height/2 + FONT_SIZE/2 , message, strlen(message)); - // PRINT ASTERISKS char pass_asterisks[PASS_BOX_LEN + 1]; int i = 0; @@ -187,14 +199,12 @@ void draw_ui(Display *d, Window w, Visual *visual, Colormap cmap, int width, int XftDrawString8(xftdraw, &xft_white, font, black_rect_x + FONT_SIZE/2, height/2 + FONT_SIZE/2 , pass_asterisks, strlen(pass_asterisks)); - - } -void window_attr (Display *d, Window w, int s, int width, int height){ +void window_attr(Display *d, Window w, int s, int width, int height){ int mode_count; @@ -204,7 +214,7 @@ void window_attr (Display *d, Window w, int s, int width, int height){ video_mode = modes[0]; - // COCKS FOR FULLSCREEN QOQS + // DISABLE DECORATIONS Hints hints; hints.flags = 2; hints.decorations = 0; @@ -213,8 +223,6 @@ void window_attr (Display *d, Window w, int s, int width, int height){ - - XSelectInput(d, w, ExposureMask | KeyPressMask); XMapWindow(d, w); @@ -224,6 +232,7 @@ void window_attr (Display *d, Window w, int s, int width, int height){ XF86VidModeSetViewPort(d, s, 0, 0); XMoveResizeWindow(d, w, 0, 0, width, height); XMapRaised(d, w); + XGrabPointer(d, w, True, 0, GrabModeAsync, GrabModeAsync, w, 0L, CurrentTime); XGrabKeyboard(d, w, True, GrabModeAsync, GrabModeAsync, CurrentTime); @@ -234,15 +243,6 @@ void window_attr (Display *d, Window w, int s, int width, int height){ - -void anullate(char *str, int size){ - memset(str, 0, size); -} - - - - - void get_passwd(Display *d, Window w, Visual *v, Colormap cmap, int width, int height, int screen, const char *hash){ int num, failure = 0, check = 1; @@ -253,80 +253,79 @@ void get_passwd(Display *d, Window w, Visual *v, Colormap cmap, int width, int h // CHECK PASSWORD - while (1) { + while(1){ XNextEvent(d, &e); - if (e.type == KeyPress) { + if(e.type == KeyPress){ + anullate(pass_buffer, sizeof(pass_buffer)); - num = XLookupString(&e.xkey, pass_buffer, sizeof(pass_buffer), &ksym, 0); - if (IsKeypadKey(ksym)) { + + if(IsKeypadKey(ksym)){ + if(ksym == XK_KP_Enter) + ksym = XK_Return; - if (ksym == XK_KP_Enter) - ksym = XK_Return; - - else if (ksym >= XK_KP_0 && ksym <= XK_KP_9) - ksym = (ksym - XK_KP_0) + XK_0; + else if(ksym >= XK_KP_0 && ksym <= XK_KP_9) + ksym = (ksym - XK_KP_0) + XK_0; } - if (IsFunctionKey(ksym) || - IsKeypadKey(ksym) || - IsMiscFunctionKey(ksym) || - IsPFKey(ksym) || - IsPrivateKeypadKey(ksym)) - continue; + + if (IsFunctionKey(ksym) || + IsKeypadKey(ksym) || + IsMiscFunctionKey(ksym) || + IsPFKey(ksym) || + IsPrivateKeypadKey(ksym)) + continue; - switch (ksym) { + + switch(ksym){ case XK_Return: passwd[len] = '\0'; - - if (!(input_hash = crypt(passwd, hash))){ + if(!(input_hash = crypt(passwd, hash))){ fprintf(stderr, "loqy : crypt error : %s\n", strerror(errno)); - fprintf(stderr, "%d %d\n", errno, EINVAL); - } + fprintf(stderr, "%d %d\n", errno, EINVAL); + } else - check = !!strcmp(input_hash, hash); + check = !!strcmp(input_hash, hash); - if (check) { + if(check){ + XBell(d, 100); + failure = 1; + } - XBell(d, 100); - failure = 1; - } + anullate(passwd, sizeof(passwd)); + len = 0; + break; - anullate(passwd, sizeof(passwd)); - len = 0; - break; + case XK_Escape: + anullate(passwd, sizeof(passwd)); + len = 0; + break; - case XK_Escape: - anullate(passwd, sizeof(passwd)); - len = 0; - break; + case XK_BackSpace: + if(len) + passwd[--len] = '\0'; + break; - case XK_BackSpace: - if (len) - passwd[--len] = '\0'; - break; - - default: - if (num && !iscntrl((int)pass_buffer[0]) && (len + num < sizeof(passwd))) { - memcpy(passwd + len, pass_buffer, num); - len += num; + default: + if(num && !iscntrl((int)pass_buffer[0]) && (len + num < sizeof(passwd))){ + memcpy(passwd + len, pass_buffer, num); + len += num; } - break; + break; } - draw_ui(d, w, v, cmap, width, height, screen); + draw_ui(d, w, v, cmap, width, height, screen); - if(!check) - exit(0); - - } - } + if(!check) + exit(0); + } + } } @@ -338,22 +337,20 @@ static const char *generate_hash(void){ const char *hash; struct passwd *pw; - if( !(pw = getpwuid(getuid())) ) + if(!(pw = getpwuid(getuid()))) catch_fire("Cannot get password info\n", 2); - hash = pw->pw_passwd; - if (!strcmp(hash, "x")) { + if(!strcmp(hash, "x")){ struct spwd *sp; - if (!(sp = getspnam(pw->pw_name))) - catch_fire("cannot retrieve shadow entry. " - "Make sure to suid or sgid slock.\n", 69); + if(!(sp = getspnam(pw->pw_name))) + catch_fire("cannot retrieve shadow entry. ", 69); hash = sp->sp_pwdp; } - if (!strcmp(hash, "*")) { - catch_fire("slock: getpwuid: cannot retrieve shadow entry. " - "Make sure to suid or sgid slock.\n", 98); - } + + if(!strcmp(hash, "*")) + catch_fire("slock: getpwuid: cannot retrieve shadow entry. ", 98); + return hash; }