#if !defined(lint) && !defined(DOS) static char rcsid[] = "$Id: kblock.c 1025 2008-04-08 22:59:38Z hubert@u.washington.edu $"; #endif /* * ======================================================================== * Copyright 2013-2021 Eduardo Chappa * Copyright 2006-2008 University of Washington * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * ======================================================================== */ #include "headers.h" #include "kblock.h" #include "status.h" #include "titlebar.h" #include "radio.h" #include "../pith/conf.h" #include "../pith/state.h" #ifdef KEYBOARD_LOCK /* * Internal prototypes */ void redraw_kl_body(void); void redraw_klocked_body(void); void draw_klocked_body(char *, char *); static char *klockin, *klockame; void redraw_kl_body(void) { ClearScreen(); set_titlebar(_("KEYBOARD LOCK"), ps_global->mail_stream, ps_global->context_current, ps_global->cur_folder, NULL, 1, FolderName, 0, 0, NULL); PutLine0(6,3 , _("You may lock this keyboard so that no one else can access your mail")); PutLine0(8, 3 , _("while you are away. The screen will be locked after entering the ")); PutLine0(10, 3 , _("password to be used for unlocking the keyboard when you return.")); fflush(stdout); } void redraw_klocked_body(void) { ClearScreen(); set_titlebar(_("KEYBOARD LOCK"), ps_global->mail_stream, ps_global->context_current, ps_global->cur_folder, NULL, 1, FolderName, 0, 0, NULL); PutLine2(6, 3, _("This keyboard is locked by %s <%s>."),klockame, klockin); PutLine0(8, 3, _("To unlock, enter password used to lock the keyboard.")); fflush(stdout); } void draw_klocked_body(char *login, char *username) { klockin = login; klockame = username; redraw_klocked_body(); } /*---------------------------------------------------------------------- Execute the lock keyboard command Args: None Result: keyboard is locked until user gives password ---*/ int lock_keyboard(void) { struct pine *ps = ps_global; char inpasswd[80], passwd[80], pw[80]; HelpType help = NO_HELP; int i, times, old_suspend, flags; passwd[0] = '\0'; redraw_kl_body(); ps->redrawer = redraw_kl_body; times = atoi(ps->VAR_KBLOCK_PASSWD_COUNT); if(times < 1 || times > 5){ dprint((2, "Kblock-passwd-count var out of range (1 to 5) [%d]\n", times)); times = 1; } inpasswd[0] = '\0'; for(i = 0; i < times; i++){ pw[0] = '\0'; while(1){ /* input password to use for locking */ int rc; char prompt[50]; if(i > 1) snprintf(prompt, sizeof(prompt), _("Retype password to LOCK keyboard (Yes, again) : ")); else if(i) snprintf(prompt, sizeof(prompt), _("Retype password to LOCK keyboard : ")); else snprintf(prompt, sizeof(prompt), _("Enter password to LOCK keyboard : ")); flags = F_ON(F_QUELL_ASTERISKS, ps_global) ? OE_PASSWD_NOAST : OE_PASSWD; rc = optionally_enter(pw, -FOOTER_ROWS(ps), 0, sizeof(pw), prompt, NULL, help, &flags); if(rc == 3) help = help == NO_HELP ? h_kb_lock : NO_HELP; else if(rc == 1 || pw[0] == '\0'){ q_status_message(SM_ORDER, 0, 2, _("Keyboard lock cancelled")); return(-1); } else if(rc != 4) break; } if(!inpasswd[0]){ strncpy(inpasswd, pw, sizeof(inpasswd)); inpasswd[sizeof(inpasswd)-1] = '\0'; } else if(strcmp(inpasswd, pw)){ q_status_message(SM_ORDER, 0, 2, _("Mismatch with initial password: keyboard lock cancelled")); return(-1); } } if(want_to(_("Really lock keyboard with entered password"), 'y', 'n', NO_HELP, WT_NORM) != 'y'){ q_status_message(SM_ORDER, 0, 2, _("Keyboard lock cancelled")); return(-1); } draw_klocked_body(ps->VAR_USER_ID ? ps->VAR_USER_ID : "", ps->VAR_PERSONAL_NAME ? ps->VAR_PERSONAL_NAME : ""); ps->redrawer = redraw_klocked_body; if((old_suspend = F_ON(F_CAN_SUSPEND, ps_global)) != 0) F_TURN_OFF(F_CAN_SUSPEND, ps_global); while(strcmp(inpasswd, passwd)){ if(passwd[0]) q_status_message(SM_ORDER | SM_DING, 3, 3, _("Password to UNLOCK doesn't match password used to LOCK")); help = NO_HELP; while(1){ int rc; flags = OE_DISALLOW_CANCEL | (F_ON(F_QUELL_ASTERISKS, ps_global) ? OE_PASSWD_NOAST : OE_PASSWD); rc = optionally_enter(passwd, -FOOTER_ROWS(ps), 0, sizeof(passwd), _("Enter password to UNLOCK keyboard : "),NULL, help, &flags); if(rc == 3) { help = help == NO_HELP ? h_oe_keylock : NO_HELP; continue; } if(rc != 4) break; } } if(old_suspend) F_TURN_ON(F_CAN_SUSPEND, ps_global); q_status_message(SM_ORDER, 0, 3, _("Keyboard Unlocked")); return(0); } #endif /* KEYBOARD_LOCK */