diff options
Diffstat (limited to 'x11vnc/unixpw.c')
-rw-r--r-- | x11vnc/unixpw.c | 2281 |
1 files changed, 0 insertions, 2281 deletions
diff --git a/x11vnc/unixpw.c b/x11vnc/unixpw.c deleted file mode 100644 index ccdb195..0000000 --- a/x11vnc/unixpw.c +++ /dev/null @@ -1,2281 +0,0 @@ -/* - Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com> - All rights reserved. - -This file is part of x11vnc. - -x11vnc is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at -your option) any later version. - -x11vnc is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with x11vnc; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA -or see <http://www.gnu.org/licenses/>. - -In addition, as a special exception, Karl J. Runge -gives permission to link the code of its release of x11vnc with the -OpenSSL project's "OpenSSL" library (or with modified versions of it -that use the same license as the "OpenSSL" library), and distribute -the linked executables. You must obey the GNU General Public License -in all respects for all of the code used other than "OpenSSL". If you -modify this file, you may extend this exception to your version of the -file, but you are not obligated to do so. If you do not wish to do -so, delete this exception statement from your version. -*/ - -/* -- unixpw.c -- */ - -#ifdef __linux__ -/* some conflict with _XOPEN_SOURCE */ -extern int grantpt(int); -extern int unlockpt(int); -extern char *ptsname(int); -#endif - -#ifndef DO_NOT_DECLARE_CRYPT -extern char *crypt(const char*, const char *); -#endif - -#include "x11vnc.h" -#include "scan.h" -#include "cleanup.h" -#include "xinerama.h" -#include "connections.h" -#include "user.h" -#include "connections.h" -#include "sslhelper.h" -#include "cursor.h" -#include "rates.h" -#include <rfb/default8x16.h> - -#if LIBVNCSERVER_HAVE_FORK -#if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID -#define UNIXPW_SU -#endif -#endif - -#ifdef IGNORE_GETSPNAM -#undef LIBVNCSERVER_HAVE_GETSPNAM -#define LIBVNCSERVER_HAVE_GETSPNAM 0 -#endif - -#if LIBVNCSERVER_HAVE_PWD_H && LIBVNCSERVER_HAVE_GETPWNAM -#if LIBVNCSERVER_HAVE_CRYPT || LIBVNCSERVER_HAVE_LIBCRYPT -#define UNIXPW_CRYPT -#if LIBVNCSERVER_HAVE_GETSPNAM -#include <shadow.h> -#endif -#endif -#endif - -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H -#include <sys/ioctl.h> -#endif -#if LIBVNCSERVER_HAVE_TERMIOS_H -#include <termios.h> -#endif -#if LIBVNCSERVER_HAVE_SYS_STROPTS_H -#include <sys/stropts.h> -#endif - -#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) -#define IS_BSD -#endif -#if (defined(__MACH__) && defined(__APPLE__)) -#define IS_BSD -#endif - -int white_pixel(void); -void unixpw_screen(int init); -void unixpw_keystroke(rfbBool down, rfbKeySym keysym, int init); -void unixpw_accept(char *user); -void unixpw_deny(void); -void unixpw_msg(char *msg, int delay); -int su_verify(char *user, char *pass, char *cmd, char *rbuf, int *rbuf_size, int nodisp); -int unixpw_cmd_run(char *user, char *pass, char *cmd, char *line, int *n); -int crypt_verify(char *user, char *pass); -int cmd_verify(char *user, char *pass); -void unixpw_verify_screen(char *user, char *pass); - -static int text_x(void); -static int text_y(void); -static void set_db(void); - -int unixpw_in_progress = 0; -int unixpw_denied = 0; -int unixpw_in_rfbPE = 0; -int unixpw_login_viewonly = 0; -int unixpw_tightvnc_xfer_save = 0; -rfbBool unixpw_file_xfer_save = FALSE; -time_t unixpw_last_try_time = 0; -rfbClientPtr unixpw_client = NULL; - -int keep_unixpw = 0; -char *keep_unixpw_user = NULL; -char *keep_unixpw_pass = NULL; -char *keep_unixpw_opts = NULL; - -static unsigned char default6x13FontData[2899]={ -0x00,0x00,0xA8,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0xA8,0x00,0x00, /* 0 */ -0x00,0x00,0x00,0x00,0x20,0x70,0xF8,0x70,0x20,0x00,0x00,0x00,0x00, /* 1 */ -0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8, /* 2 */ -0x00,0x00,0xA0,0xA0,0xE0,0xA0,0xA0,0x38,0x10,0x10,0x10,0x00,0x00, /* 3 */ -0x00,0x00,0xE0,0x80,0xC0,0x80,0xB8,0x20,0x30,0x20,0x20,0x00,0x00, /* 4 */ -0x00,0x00,0x60,0x80,0x80,0x60,0x30,0x28,0x30,0x28,0x28,0x00,0x00, /* 5 */ -0x00,0x00,0x80,0x80,0x80,0xE0,0x38,0x20,0x30,0x20,0x20,0x00,0x00, /* 6 */ -0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 7 */ -0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0xF8,0x00,0x00,0x00, /* 8 */ -0x00,0x00,0x90,0xD0,0xB0,0x90,0x20,0x20,0x20,0x20,0x38,0x00,0x00, /* 9 */ -0x00,0x00,0xA0,0xA0,0xA0,0x40,0x40,0x38,0x10,0x10,0x10,0x00,0x00, /* 10 */ -0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, /* 11 */ -0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20, /* 12 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20, /* 13 */ -0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x00,0x00,0x00,0x00,0x00,0x00, /* 14 */ -0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x20,0x20,0x20,0x20,0x20,0x20, /* 15 */ -0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16 */ -0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 17 */ -0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00, /* 18 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00, /* 19 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, /* 20 */ -0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x20,0x20,0x20,0x20,0x20,0x20, /* 21 */ -0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x20,0x20,0x20,0x20,0x20,0x20, /* 22 */ -0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x00,0x00,0x00,0x00,0x00,0x00, /* 23 */ -0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x20,0x20,0x20,0x20,0x20,0x20, /* 24 */ -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* 25 */ -0x00,0x00,0x00,0x18,0x60,0x80,0x60,0x18,0x00,0xF8,0x00,0x00,0x00, /* 26 */ -0x00,0x00,0x00,0xC0,0x30,0x08,0x30,0xC0,0x00,0xF8,0x00,0x00,0x00, /* 27 */ -0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0x50,0x00,0x00, /* 28 */ -0x00,0x00,0x00,0x00,0x00,0x08,0xF8,0x20,0xF8,0x80,0x00,0x00,0x00, /* 29 */ -0x00,0x00,0x30,0x48,0x40,0x40,0xE0,0x40,0x40,0x48,0xB0,0x00,0x00, /* 30 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* 31 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32 */ -0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, /* 33 */ -0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 34 */ -0x00,0x00,0x00,0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00,0x00,0x00, /* 35 */ -0x00,0x00,0x20,0x78,0xA0,0xA0,0x70,0x28,0x28,0xF0,0x20,0x00,0x00, /* 36 */ -0x00,0x00,0x48,0xA8,0x50,0x10,0x20,0x40,0x50,0xA8,0x90,0x00,0x00, /* 37 */ -0x00,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA0,0x98,0x90,0x68,0x00,0x00, /* 38 */ -0x00,0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 39 */ -0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00, /* 40 */ -0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00, /* 41 */ -0x00,0x00,0x00,0x20,0xA8,0xF8,0x70,0xF8,0xA8,0x20,0x00,0x00,0x00, /* 42 */ -0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00, /* 43 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x20,0x40,0x00, /* 44 */ -0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, /* 45 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00, /* 46 */ -0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00,0x00, /* 47 */ -0x00,0x00,0x20,0x50,0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00,0x00, /* 48 */ -0x00,0x00,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, /* 49 */ -0x00,0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00, /* 50 */ -0x00,0x00,0xF8,0x08,0x10,0x20,0x70,0x08,0x08,0x88,0x70,0x00,0x00, /* 51 */ -0x00,0x00,0x10,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00, /* 52 */ -0x00,0x00,0xF8,0x80,0x80,0xB0,0xC8,0x08,0x08,0x88,0x70,0x00,0x00, /* 53 */ -0x00,0x00,0x70,0x88,0x80,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00, /* 54 */ -0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00, /* 55 */ -0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, /* 56 */ -0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00, /* 57 */ -0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x20,0x70,0x20,0x00, /* 58 */ -0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x30,0x20,0x40,0x00, /* 59 */ -0x00,0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00, /* 60 */ -0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, /* 61 */ -0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00, /* 62 */ -0x00,0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, /* 63 */ -0x00,0x00,0x70,0x88,0x88,0x98,0xA8,0xA8,0xB0,0x80,0x78,0x00,0x00, /* 64 */ -0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00, /* 65 */ -0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00, /* 66 */ -0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00, /* 67 */ -0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00, /* 68 */ -0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00, /* 69 */ -0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00,0x00, /* 70 */ -0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x98,0x88,0x88,0x70,0x00,0x00, /* 71 */ -0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x00, /* 72 */ -0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 73 */ -0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00, /* 74 */ -0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00, /* 75 */ -0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00, /* 76 */ -0x00,0x00,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x00, /* 77 */ -0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x00,0x00, /* 78 */ -0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 79 */ -0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x80,0x00,0x00, /* 80 */ -0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0xA8,0x70,0x08,0x00, /* 81 */ -0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x88,0x00,0x00, /* 82 */ -0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00, /* 83 */ -0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, /* 84 */ -0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 85 */ -0x00,0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00,0x00, /* 86 */ -0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00, /* 87 */ -0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00, /* 88 */ -0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00, /* 89 */ -0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x00,0x00, /* 90 */ -0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, /* 91 */ -0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00,0x00, /* 92 */ -0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, /* 93 */ -0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 94 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00, /* 95 */ -0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 96 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 97 */ -0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0x00, /* 98 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00, /* 99 */ -0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00, /* 100 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00, /* 101 */ -0x00,0x00,0x30,0x48,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x00,0x00, /* 102 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70, /* 103 */ -0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00, /* 104 */ -0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 105 */ -0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60, /* 106 */ -0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00, /* 107 */ -0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 108 */ -0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x00, /* 109 */ -0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00, /* 110 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 111 */ -0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80, /* 112 */ -0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x08, /* 113 */ -0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00, /* 114 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00, /* 115 */ -0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0x00, /* 116 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00, /* 117 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x00, /* 118 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00, /* 119 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,0x00, /* 120 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70, /* 121 */ -0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00, /* 122 */ -0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, /* 123 */ -0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, /* 124 */ -0x00,0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00, /* 125 */ -0x00,0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 126 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160 */ -0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, /* 161 */ -0x00,0x00,0x20,0x70,0xA8,0xA0,0xA0,0xA8,0x70,0x20,0x00,0x00,0x00, /* 162 */ -0x00,0x00,0x30,0x48,0x40,0x40,0xE0,0x40,0x40,0x48,0xB0,0x00,0x00, /* 163 */ -0x00,0x00,0x00,0x00,0x88,0x70,0x50,0x50,0x70,0x88,0x00,0x00,0x00, /* 164 */ -0x00,0x00,0x88,0x88,0x50,0x50,0xF8,0x20,0xF8,0x20,0x20,0x00,0x00, /* 165 */ -0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, /* 166 */ -0x00,0x30,0x48,0x40,0x30,0x48,0x48,0x30,0x08,0x48,0x30,0x00,0x00, /* 167 */ -0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168 */ -0x00,0x70,0x88,0xA8,0xD8,0xC8,0xD8,0xA8,0x88,0x70,0x00,0x00,0x00, /* 169 */ -0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00,0xF8,0x00,0x00,0x00,0x00, /* 170 */ -0x00,0x00,0x00,0x00,0x28,0x50,0xA0,0xA0,0x50,0x28,0x00,0x00,0x00, /* 171 */ -0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x00,0x00,0x00,0x00, /* 172 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00, /* 173 */ -0x00,0x70,0x88,0xE8,0xD8,0xD8,0xE8,0xD8,0x88,0x70,0x00,0x00,0x00, /* 174 */ -0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 175 */ -0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176 */ -0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0xF8,0x00,0x00,0x00, /* 177 */ -0x00,0x40,0xA0,0x20,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 178 */ -0x00,0x40,0xA0,0x40,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 179 */ -0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 180 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0xE8,0x80,0x80, /* 181 */ -0x00,0x00,0x78,0xE8,0xE8,0xE8,0xE8,0x68,0x28,0x28,0x28,0x00,0x00, /* 182 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* 183 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20, /* 184 */ -0x00,0x40,0xC0,0x40,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 185 */ -0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0xF8,0x00,0x00,0x00,0x00, /* 186 */ -0x00,0x00,0x00,0x00,0xA0,0x50,0x28,0x28,0x50,0xA0,0x00,0x00,0x00, /* 187 */ -0x00,0x40,0xC0,0x40,0x40,0xE0,0x08,0x18,0x28,0x38,0x08,0x00,0x00, /* 188 */ -0x00,0x40,0xC0,0x40,0x40,0xE0,0x10,0x28,0x08,0x10,0x38,0x00,0x00, /* 189 */ -0x00,0x40,0xA0,0x40,0x20,0xA0,0x48,0x18,0x28,0x38,0x08,0x00,0x00, /* 190 */ -0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x80,0x88,0x88,0x70,0x00,0x00, /* 191 */ -0x00,0x40,0x20,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00, /* 192 */ -0x00,0x10,0x20,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00, /* 193 */ -0x00,0x30,0x48,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00, /* 194 */ -0x00,0x28,0x50,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00, /* 195 */ -0x00,0x50,0x50,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00, /* 196 */ -0x00,0x20,0x50,0x20,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00, /* 197 */ -0x00,0x00,0x58,0xA0,0xA0,0xA0,0xB0,0xE0,0xA0,0xA0,0xB8,0x00,0x00, /* 198 */ -0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x20,0x40, /* 199 */ -0x00,0x40,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00, /* 200 */ -0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00, /* 201 */ -0x00,0x30,0x48,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00, /* 202 */ -0x00,0x50,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00, /* 203 */ -0x00,0x40,0x20,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 204 */ -0x00,0x10,0x20,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 205 */ -0x00,0x30,0x48,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 206 */ -0x00,0x50,0x50,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 207 */ -0x00,0x00,0xF0,0x48,0x48,0x48,0xE8,0x48,0x48,0x48,0xF0,0x00,0x00, /* 208 */ -0x00,0x28,0x50,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x00,0x00, /* 209 */ -0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 210 */ -0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 211 */ -0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 212 */ -0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 213 */ -0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 214 */ -0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00,0x00,0x00, /* 215 */ -0x00,0x08,0x70,0x98,0x98,0xA8,0xA8,0xA8,0xC8,0xC8,0x70,0x80,0x00, /* 216 */ -0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 217 */ -0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 218 */ -0x00,0x30,0x48,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 219 */ -0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 220 */ -0x00,0x10,0x20,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00, /* 221 */ -0x00,0x00,0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x00,0x00, /* 222 */ -0x00,0x00,0x60,0x90,0x90,0xA0,0xA0,0x90,0x88,0x88,0xB0,0x00,0x00, /* 223 */ -0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 224 */ -0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 225 */ -0x00,0x00,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 226 */ -0x00,0x00,0x28,0x50,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 227 */ -0x00,0x00,0x50,0x50,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 228 */ -0x00,0x30,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00, /* 229 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x28,0x70,0xA0,0xA8,0x50,0x00,0x00, /* 230 */ -0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x20,0x40, /* 231 */ -0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00, /* 232 */ -0x00,0x00,0x10,0x20,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00, /* 233 */ -0x00,0x00,0x30,0x48,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00, /* 234 */ -0x00,0x00,0x50,0x50,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00, /* 235 */ -0x00,0x00,0x40,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 236 */ -0x00,0x00,0x10,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 237 */ -0x00,0x00,0x30,0x48,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 238 */ -0x00,0x00,0x50,0x50,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* 239 */ -0x00,0x50,0x20,0x60,0x10,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 240 */ -0x00,0x00,0x28,0x50,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00, /* 241 */ -0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 242 */ -0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 243 */ -0x00,0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 244 */ -0x00,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 245 */ -0x00,0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00, /* 246 */ -0x00,0x00,0x00,0x20,0x20,0x00,0xF8,0x00,0x20,0x20,0x00,0x00,0x00, /* 247 */ -0x00,0x00,0x00,0x00,0x08,0x70,0x98,0xA8,0xA8,0xC8,0x70,0x80,0x00, /* 248 */ -0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00, /* 249 */ -0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00, /* 250 */ -0x00,0x00,0x30,0x48,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00, /* 251 */ -0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00, /* 252 */ -0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70, /* 253 */ -0x00,0x00,0x00,0x80,0x80,0xB0,0xC8,0x88,0x88,0xC8,0xB0,0x80,0x80, /* 254 */ -0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70, /* 255 */ -}; -static int default6x13FontMetaData[256*5]={ -0,6,13,0,-2,13,6,13,0,-2,26,6,13,0,-2,39,6,13,0,-2,52,6,13,0,-2,65,6,13,0,-2,78,6,13,0,-2,91,6,13,0,-2,104,6,13,0,-2,117,6,13,0,-2,130,6,13,0,-2,143,6,13,0,-2,156,6,13,0,-2,169,6,13,0,-2,182,6,13,0,-2,195,6,13,0,-2,208,6,13,0,-2,221,6,13,0,-2,234,6,13,0,-2,247,6,13,0,-2,260,6,13,0,-2,273,6,13,0,-2,286,6,13,0,-2,299,6,13,0,-2,312,6,13,0,-2,325,6,13,0,-2,338,6,13,0,-2,351,6,13,0,-2,364,6,13,0,-2,377,6,13,0,-2,390,6,13,0,-2,403,6,13,0,-2,416,6,13,0,-2,429,6,13,0,-2,442,6,13,0,-2,455,6,13,0,-2,468,6,13,0,-2,481,6,13,0,-2,494,6,13,0,-2,507,6,13,0,-2,520,6,13,0,-2,533,6,13,0,-2,546,6,13,0,-2,559,6,13,0,-2,572,6,13,0,-2,585,6,13,0,-2,598,6,13,0,-2,611,6,13,0,-2,624,6,13,0,-2,637,6,13,0,-2,650,6,13,0,-2,663,6,13,0,-2,676,6,13,0,-2,689,6,13,0,-2,702,6,13,0,-2,715,6,13,0,-2,728,6,13,0,-2,741,6,13,0,-2,754,6,13,0,-2,767,6,13,0,-2,780,6,13,0,-2,793,6,13,0,-2,806,6,13,0,-2,819,6,13,0,-2,832,6,13,0,-2,845,6,13,0,-2,858,6,13,0,-2,871,6,13,0,-2,884,6,13,0,-2,897,6,13,0,-2,910,6,13,0,-2,923,6,13,0,-2,936,6,13,0,-2,949,6,13,0,-2,962,6,13,0,-2,975,6,13,0,-2,988,6,13,0,-2,1001,6,13,0,-2,1014,6,13,0,-2,1027,6,13,0,-2,1040,6,13,0,-2,1053,6,13,0,-2,1066,6,13,0,-2,1079,6,13,0,-2,1092,6,13,0,-2,1105,6,13,0,-2,1118,6,13,0,-2,1131,6,13,0,-2,1144,6,13,0,-2,1157,6,13,0,-2,1170,6,13,0,-2,1183,6,13,0,-2,1196,6,13,0,-2,1209,6,13,0,-2,1222,6,13,0,-2,1235,6,13,0,-2,1248,6,13,0,-2,1261,6,13,0,-2,1274,6,13,0,-2,1287,6,13,0,-2,1300,6,13,0,-2,1313,6,13,0,-2,1326,6,13,0,-2,1339,6,13,0,-2,1352,6,13,0,-2,1365,6,13,0,-2,1378,6,13,0,-2,1391,6,13,0,-2,1404,6,13,0,-2,1417,6,13,0,-2,1430,6,13,0,-2,1443,6,13,0,-2,1456,6,13,0,-2,1469,6,13,0,-2,1482,6,13,0,-2,1495,6,13,0,-2,1508,6,13,0,-2,1521,6,13,0,-2,1534,6,13,0,-2,1547,6,13,0,-2,1560,6,13,0,-2,1573,6,13,0,-2,1586,6,13,0,-2,1599,6,13,0,-2,1612,6,13,0,-2,1625,6,13,0,-2,1638,6,13,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1651,6,13,0,-2,1664,6,13,0,-2,1677,6,13,0,-2,1690,6,13,0,-2,1703,6,13,0,-2,1716,6,13,0,-2,1729,6,13,0,-2,1742,6,13,0,-2,1755,6,13,0,-2,1768,6,13,0,-2,1781,6,13,0,-2,1794,6,13,0,-2,1807,6,13,0,-2,1820,6,13,0,-2,1833,6,13,0,-2,1846,6,13,0,-2,1859,6,13,0,-2,1872,6,13,0,-2,1885,6,13,0,-2,1898,6,13,0,-2,1911,6,13,0,-2,1924,6,13,0,-2,1937,6,13,0,-2,1950,6,13,0,-2,1963,6,13,0,-2,1976,6,13,0,-2,1989,6,13,0,-2,2002,6,13,0,-2,2015,6,13,0,-2,2028,6,13,0,-2,2041,6,13,0,-2,2054,6,13,0,-2,2067,6,13,0,-2,2080,6,13,0,-2,2093,6,13,0,-2,2106,6,13,0,-2,2119,6,13,0,-2,2132,6,13,0,-2,2145,6,13,0,-2,2158,6,13,0,-2,2171,6,13,0,-2,2184,6,13,0,-2,2197,6,13,0,-2,2210,6,13,0,-2,2223,6,13,0,-2,2236,6,13,0,-2,2249,6,13,0,-2,2262,6,13,0,-2,2275,6,13,0,-2,2288,6,13,0,-2,2301,6,13,0,-2,2314,6,13,0,-2,2327,6,13,0,-2,2340,6,13,0,-2,2353,6,13,0,-2,2366,6,13,0,-2,2379,6,13,0,-2,2392,6,13,0,-2,2405,6,13,0,-2,2418,6,13,0,-2,2431,6,13,0,-2,2444,6,13,0,-2,2457,6,13,0,-2,2470,6,13,0,-2,2483,6,13,0,-2,2496,6,13,0,-2,2509,6,13,0,-2,2522,6,13,0,-2,2535,6,13,0,-2,2548,6,13,0,-2,2561,6,13,0,-2,2574,6,13,0,-2,2587,6,13,0,-2,2600,6,13,0,-2,2613,6,13,0,-2,2626,6,13,0,-2,2639,6,13,0,-2,2652,6,13,0,-2,2665,6,13,0,-2,2678,6,13,0,-2,2691,6,13,0,-2,2704,6,13,0,-2,2717,6,13,0,-2,2730,6,13,0,-2,2743,6,13,0,-2,2756,6,13,0,-2,2769,6,13,0,-2,2782,6,13,0,-2,2795,6,13,0,-2,2808,6,13,0,-2,2821,6,13,0,-2,2834,6,13,0,-2,2847,6,13,0,-2,2860,6,13,0,-2,2873,6,13,0,-2,2886,6,13,0,-2,}; -static rfbFontData default6x13Font={default6x13FontData, default6x13FontMetaData}; - -static int in_login = 0, in_passwd = 0, tries = 0; -static int char_row = 0, char_col = 0; -static int char_x = 0, char_y = 0, char_w = 8, char_h = 16; - -static int db = 0; - -int white_pixel(void) { - static unsigned long black_pix = 0, white_pix = 1, set = 0; - - RAWFB_RET(0xffffff) - - if (depth <= 8 && ! set) { - X_LOCK; - black_pix = BlackPixel(dpy, scr); - white_pix = WhitePixel(dpy, scr); - X_UNLOCK; - set = 1; - } - if (depth <= 8) { - return (int) white_pix; - } else if (depth < 24) { - return 0xffff; - } else { - return 0xffffff; - } -} - -int black_pixel(void) { - static unsigned long black_pix = 0, white_pix = 1, set = 0; - - RAWFB_RET(0x000000) - - if (depth <= 8 && ! set) { - X_LOCK; - black_pix = BlackPixel(dpy, scr); - white_pix = WhitePixel(dpy, scr); - X_UNLOCK; - set = 1; - } - if (depth <= 8) { - return (int) black_pix; - } else if (depth < 24) { - return 0x0000; - } else { - return 0x000000; - } -} - -static void unixpw_mark(void) { - if (scaling) { - mark_rect_as_modified(0, 0, scaled_x, scaled_y, 1); - } else { - mark_rect_as_modified(0, 0, dpy_x, dpy_y, 0); - } -} - -static int text_x(void) { - return char_x + char_col * char_w; -} - -static int text_y(void) { - return char_y + char_row * char_h; -} - -static rfbScreenInfo fscreen; -static rfbScreenInfoPtr pscreen; - -static int f1_help = 0; - -void unixpw_screen(int init) { - if (unixpw_cmd) { - ; /* OK */ - } else if (unixpw_nis) { -#ifndef UNIXPW_CRYPT - rfbLog("-unixpw_nis is not supported on this OS/machine\n"); - clean_up_exit(1); -#endif - } else { -#ifndef UNIXPW_SU - rfbLog("-unixpw is not supported on this OS/machine\n"); - clean_up_exit(1); -#endif - } - if (init) { - int x, y; - char log[] = "login: "; - - zero_fb(0, 0, dpy_x, dpy_y); - - mark_rect_as_modified(0, 0, dpy_x, dpy_y, 0); - - x = nfix(dpy_x / 2 - strlen(log) * char_w, dpy_x); - y = (int) (dpy_y / 3.5); - if (unixpw_system_greeter) { - y = (int) (dpy_y / 3); - } - - if (scaling) { - x = (int) (x * scale_fac_x); - y = (int) (y * scale_fac_y); - x = nfix(x, scaled_x); - y = nfix(y, scaled_y); - } - - if (rotating) { - fscreen.serverFormat.bitsPerPixel = bpp; - fscreen.paddedWidthInBytes = rfb_bytes_per_line; - fscreen.frameBuffer = rfb_fb; - pscreen = &fscreen; - } else { - pscreen = screen; - } - - if (pscreen && pscreen->width >= 640 && pscreen->height >= 480) { - rfbDrawString(pscreen, &default6x13Font, 8, 2+1*13, "F1-Help:", white_pixel()); - } - f1_help = 0; - - if (unixpw_system_greeter) { - unixpw_system_greeter_active = 0; - if (use_dpy && strstr(use_dpy, "xdmcp")) { - if (getenv("X11VNC_SYSTEM_GREETER1")) { - char moo[] = "Press 'Escape' for System Greeter"; - rfbDrawString(pscreen, &default8x16Font, x-90, y-30, moo, white_pixel()); - } else { - char moo1[] = "Press 'Escape' for a New Session via System Greeter, or"; - char moo2[] = "otherwise login here to connect to an Existing Session:"; - rfbDrawString(pscreen, &default6x13Font, x-110, y-38, moo1, white_pixel()); - rfbDrawString(pscreen, &default6x13Font, x-110, y-25, moo2, white_pixel()); - } - set_env("X11VNC_XDM_ONLY", "0"); - unixpw_system_greeter_active = 1; - } - } - - rfbDrawString(pscreen, &default8x16Font, x, y, log, white_pixel()); - - char_x = x; - char_y = y; - char_col = strlen(log); - char_row = 0; - - set_warrow_cursor(); - } - - unixpw_mark(); -} - - -#ifdef MAXPATHLEN -static char slave_str[MAXPATHLEN]; -#else -static char slave_str[4096]; -#endif - -static int used_get_pty_ptmx = 0; - -char *get_pty_ptmx(int *fd_p) { - char *slave; - int fd = -1, i, ndevs = 4, tmp; - char *devs[] = { - "/dev/ptmx", - "/dev/ptm/clone", - "/dev/ptc", - "/dev/ptmx_bsd" - }; - - *fd_p = -1; - -#if LIBVNCSERVER_HAVE_GRANTPT - - for (i=0; i < ndevs; i++) { -#ifdef O_NOCTTY - fd = open(devs[i], O_RDWR|O_NOCTTY); -#else - fd = open(devs[i], O_RDWR); -#endif - if (fd >= 0) { - break; - } - } - - if (fd < 0) { - rfbLogPerror("open /dev/ptmx"); - return NULL; - } - -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCPKT) - tmp = 0; - ioctl(fd, TIOCPKT, (char *) &tmp); -#endif - - if (grantpt(fd) != 0) { - rfbLogPerror("grantpt"); - close(fd); - return NULL; - } - if (unlockpt(fd) != 0) { - rfbLogPerror("unlockpt"); - close(fd); - return NULL; - } - - slave = ptsname(fd); - if (! slave) { - rfbLogPerror("ptsname"); - close(fd); - return NULL; - } - -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCFLUSH) - ioctl(fd, TIOCFLUSH, (char *) 0); -#endif - - if (strlen(slave) > sizeof(slave_str)/2) { - rfbLog("get_pty_ptmx: slave string length too long.\n"); - close(fd); - return NULL; - } - - strcpy(slave_str, slave); - *fd_p = fd; - return slave_str; - -#else - return NULL; - -#endif /* GRANTPT */ -} - - -char *get_pty_loop(int *fd_p) { - char master_str[16]; - int fd = -1, i; - char c; - - *fd_p = -1; - - /* for *BSD loop over /dev/ptyXY */ - - for (c = 'p'; c <= 'z'; c++) { - for (i=0; i < 16; i++) { - sprintf(master_str, "/dev/pty%c%x", c, i); -#ifdef O_NOCTTY - fd = open(master_str, O_RDWR|O_NOCTTY); -#else - fd = open(master_str, O_RDWR); -#endif - if (fd >= 0) { - break; - } - } - if (fd >= 0) { - break; - } - } - if (fd < 0) { - return NULL; - } - -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCFLUSH) - ioctl(fd, TIOCFLUSH, (char *) 0); -#endif - - sprintf(slave_str, "/dev/tty%c%x", c, i); - *fd_p = fd; - return slave_str; -} - -char *get_pty(int *fd_p) { - used_get_pty_ptmx = 0; - if (getenv("BSD_PTY")) { - return get_pty_loop(fd_p); - } -#ifdef IS_BSD - return get_pty_loop(fd_p); -#else -#if LIBVNCSERVER_HAVE_GRANTPT - used_get_pty_ptmx = 1; - return get_pty_ptmx(fd_p); -#else - return get_pty_loop(fd_p); -#endif -#endif -} - -void try_to_be_nobody(void) { - -#if LIBVNCSERVER_HAVE_PWD_H - struct passwd *pw; - pw = getpwnam("nobody"); - - if (pw) { -#if LIBVNCSERVER_HAVE_SETUID - setuid(pw->pw_uid); -#endif -#if LIBVNCSERVER_HAVE_SETEUID - seteuid(pw->pw_uid); -#endif -#if LIBVNCSERVER_HAVE_SETGID - setgid(pw->pw_gid); -#endif -#if LIBVNCSERVER_HAVE_SETEGID - setegid(pw->pw_gid); -#endif - } -#endif /* PWD_H */ -} - - -static int slave_fd = -1, alarm_fired = 0; - -static void close_alarm (int sig) { - if (slave_fd >= 0) { - close(slave_fd); - } - alarm_fired = 1; - if (0) sig = 0; /* compiler warning */ -} - -static void kill_child (pid_t pid, int fd) { - int status; - - slave_fd = -1; - alarm_fired = 0; - if (fd >= 0) { - close(fd); - } - kill(pid, SIGTERM); - waitpid(pid, &status, WNOHANG); -} - -static int scheck(char *str, int n, char *name) { - int j, i; - - if (! str) { - return 0; - } - j = 0; - for (i=0; i<n; i++) { - if (str[i] == '\0') { - j = 1; - break; - } - if (!strcmp(name, "password")) { - if (str[i] == '\n') { - continue; - } - } - if (str[i] < ' ' || str[i] >= 0x7f) { - rfbLog("scheck: invalid character in %s.\n", name); - return 0; - } - } - if (j == 0) { - rfbLog("scheck: unterminated string in %s.\n", name); - return 0; - } - return 1; -} - -int unixpw_list_match(char *user) { - if (! unixpw_list || unixpw_list[0] == '\0') { - return 1; - } else { - char *p, *q, *str = strdup(unixpw_list); - int ok = 0; - int notmode = 0; - - if (str[0] == '!') { - notmode = 1; - ok = 1; - p = strtok(str+1, ","); - } else { - p = strtok(str, ","); - } - while (p) { - if ( (q = strchr(p, ':')) != NULL ) { - *q = '\0'; /* get rid of options. */ - } - if (!strcmp(user, p)) { - if (notmode) { - ok = 0; - } else { - ok = 1; - } - break; - } - if (!notmode && !strcmp("*", p)) { - ok = 1; - break; - } - p = strtok(NULL, ","); - } - free(str); - if (! ok) { - rfbLog("unixpw_list_match: fail for '%s'\n", user); - return 0; - } else { - rfbLog("unixpw_list_match: OK for '%s'\n", user); - return 1; - } - } -} - -int crypt_verify(char *user, char *pass) { -#ifndef UNIXPW_CRYPT - return 0; -#else - struct passwd *pwd; - char *realpw, *cr; - int n; - - if (! scheck(user, 100, "username")) { - return 0; - } - if (! scheck(pass, 100, "password")) { - return 0; - } - if (! unixpw_list_match(user)) { - return 0; - } - - pwd = getpwnam(user); - if (! pwd) { - return 0; - } - - realpw = pwd->pw_passwd; - if (realpw == NULL || realpw[0] == '\0') { - return 0; - } - - if (db > 1) fprintf(stderr, "realpw='%s'\n", realpw); - - if (strlen(realpw) < 12) { - /* e.g. "x", try getspnam(), sometimes root for inetd, etc */ -#if LIBVNCSERVER_HAVE_GETSPNAM - struct spwd *sp = getspnam(user); - if (sp != NULL && sp->sp_pwdp != NULL) { - if (db) fprintf(stderr, "using getspnam()\n"); - realpw = sp->sp_pwdp; - } else { - if (db) fprintf(stderr, "skipping getspnam()\n"); - } -#endif - } - - n = strlen(pass); - if (pass[n-1] == '\n') { - pass[n-1] = '\0'; - } - - /* XXX remove need for cast */ - cr = (char *) crypt(pass, realpw); - if (db > 1) { - fprintf(stderr, "user='%s' pass='%s' realpw='%s' cr='%s'\n", - user, pass, realpw, cr ? cr : "(null)"); - } - if (cr == NULL || cr[0] == '\0') { - return 0; - } - if (!strcmp(cr, realpw)) { - return 1; - } else { - return 0; - } -#endif /* UNIXPW_CRYPT */ -} - -int unixpw_cmd_run(char *user, char *pass, char *cmd, char *line, int *n) { - int i, len, rc; - char *str; - FILE *out; - - if (! user || ! pass) { - return 0; - } - if (! unixpw_cmd || *unixpw_cmd == '\0') { - return 0; - } - - if (! scheck(user, 100, "username")) { - return 0; - } - if (! scheck(pass, 100, "password")) { - return 0; - } - if (! unixpw_list_match(user)) { - return 0; - } - if (cmd == NULL) { - cmd = ""; - } - - len = strlen(user) + 1 + strlen(pass) + 1 + 1; - str = (char *) malloc(len); - if (! str) { - return 0; - } - str[0] = '\0'; - strcat(str, user); - strcat(str, "\n"); - strcat(str, pass); - if (!strchr(pass, '\n')) { - strcat(str, "\n"); - } - - out = tmpfile(); - if (out == NULL) { - rfbLog("unixpw_cmd_run tmpfile() failed.\n"); - clean_up_exit(1); - } - - set_env("RFB_UNIXPW_CMD_RUN", cmd); - - rc = run_user_command(unixpw_cmd, unixpw_client, "cmd_verify", - str, strlen(str), out); - - set_env("RFB_UNIXPW_CMD_RUN", ""); - - for (i=0; i < len; i++) { - str[i] = '\0'; - } - free(str); - - fflush(out); - rewind(out); - for (i=0; i < (*n) - 1; i++) { - int c = fgetc(out); - if (c == EOF) { - break; - } - line[i] = (char) c; - } - fclose(out); - *n = i; - - if (rc == 0) { - return 1; - } else { - return 0; - } -} - - -int cmd_verify(char *user, char *pass) { - int i, len, rc; - char *str; - - if (! user || ! pass) { - return 0; - } - if (! unixpw_cmd || *unixpw_cmd == '\0') { - return 0; - } - - if (! scheck(user, 100, "username")) { - return 0; - } - if (! scheck(pass, 100, "password")) { - return 0; - } - if (! unixpw_list_match(user)) { - return 0; - } - - if (unixpw_client) { - ClientData *cd = (ClientData *) unixpw_client->clientData; - if (cd) { - cd->username = strdup(user); - } - } - - len = strlen(user) + 1 + strlen(pass) + 1 + 1; - str = (char *) malloc(len); - if (! str) { - return 0; - } - str[0] = '\0'; - strcat(str, user); - strcat(str, "\n"); - strcat(str, pass); - if (!strchr(pass, '\n')) { - strcat(str, "\n"); - } - - rc = run_user_command(unixpw_cmd, unixpw_client, "cmd_verify", - str, strlen(str), NULL); - - for (i=0; i < len; i++) { - str[i] = '\0'; - } - free(str); - - if (rc == 0) { - return 1; - } else { - return 0; - } -} - -int su_verify(char *user, char *pass, char *cmd, char *rbuf, int *rbuf_size, int nodisp) { -#ifndef UNIXPW_SU - return 0; -#else - int i, j, status, fd = -1, sfd, tfd, drain_size = 65536, rsize = 0; - int slow_pw = 1; - char *slave, *bin_true = NULL, *bin_su = NULL; - pid_t pid, pidw; - struct stat sbuf; - static int first = 1; - char instr[64], cbuf[10]; - - if (first) { - set_db(); - first = 0; - } - rfbLog("su_verify: '%s' for %s.\n", user, cmd ? "command" : "login"); - fflush(stderr); - - if (! scheck(user, 100, "username")) { - return 0; - } - if (! scheck(pass, 100, "password")) { - return 0; - } - if (! unixpw_list_match(user)) { - return 0; - } - - /* unixpw */ - if (no_external_cmds || !cmd_ok("unixpw")) { - rfbLog("su_verify: cannot run external commands.\n"); - clean_up_exit(1); - } - -#define SU_DEBUG 0 -#if SU_DEBUG - if (stat("/su", &sbuf) == 0) { - bin_su = "/su"; /* Freesbie read-only-fs /bin/su not suid! */ -#else - if (0) { - ; -#endif - } else if (stat("/bin/su", &sbuf) == 0) { - bin_su = "/bin/su"; - } else if (stat("/usr/bin/su", &sbuf) == 0) { - bin_su = "/usr/bin/su"; - } - if (bin_su == NULL) { - rfbLogPerror("existence /bin/su"); - fflush(stderr); - return 0; - } - - if (stat("/bin/true", &sbuf) == 0) { - bin_true = "/bin/true"; - } if (stat("/usr/bin/true", &sbuf) == 0) { - bin_true = "/usr/bin/true"; - } - if (cmd != NULL && cmd[0] != '\0') { - /* this is for ext. cmd su -c "my cmd" after login */ - bin_true = cmd; - } - if (bin_true == NULL) { - rfbLogPerror("existence /bin/true"); - fflush(stderr); - return 0; - } - - slave = get_pty(&fd); - - if (slave == NULL) { - rfbLogPerror("get_pty failed."); - fflush(stderr); - return 0; - } - - if (db) fprintf(stderr, "cmd is: %s\n", cmd); - if (db) fprintf(stderr, "slave is: %s fd=%d\n", slave, fd); - - if (fd < 0) { - rfbLogPerror("get_pty fd < 0"); - fflush(stderr); - return 0; - } - - fcntl(fd, F_SETFD, 1); - - pid = fork(); - if (pid < 0) { - rfbLogPerror("fork"); - fflush(stderr); - close(fd); - return 0; - } - - if (pid == 0) { - /* child */ - - int ttyfd; - ttyfd = -1; /* compiler warning */ - -#if LIBVNCSERVER_HAVE_SETSID - if (setsid() == -1) { - perror("setsid"); - exit(1); - } -#else - if (setpgrp() == -1) { - perror("setpgrp"); - exit(1); - } -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCNOTTY) - ttyfd = open("/dev/tty", O_RDWR); - if (ttyfd >= 0) { - (void) ioctl(ttyfd, TIOCNOTTY, (char *) 0); - close(ttyfd); - } -#endif - -#endif /* SETSID */ - - close(0); - close(1); - close(2); - - sfd = open(slave, O_RDWR); - if (sfd < 0) { - exit(1); - } - -/* streams options fixups, handle cases as they are found: */ -#if defined(__hpux) -#if LIBVNCSERVER_HAVE_SYS_STROPTS_H -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(I_PUSH) - if (used_get_pty_ptmx) { - ioctl(sfd, I_PUSH, "ptem"); - ioctl(sfd, I_PUSH, "ldterm"); - ioctl(sfd, I_PUSH, "ttcompat"); - } -#endif -#endif -#endif - - /* n.b. sfd will be 0 since we closed 0. so dup it to 1 and 2 */ - if (fcntl(sfd, F_DUPFD, 1) == -1) { - exit(1); - } - if (fcntl(sfd, F_DUPFD, 2) == -1) { - exit(1); - } - -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCSCTTY) - ioctl(sfd, TIOCSCTTY, (char *) 0); -#endif - - if (db > 2) { - char nam[256]; - unlink("/tmp/isatty"); - tfd = open("/tmp/isatty", O_CREAT|O_WRONLY, 0600); - if (isatty(sfd)) { - close(tfd); - sprintf(nam, "stty -a < %s > /tmp/isatty 2>&1", - slave); - system(nam); - } else { - write(tfd, "NOTTTY\n", 7); - close(tfd); - } - } - - chdir("/"); - - try_to_be_nobody(); -#if LIBVNCSERVER_HAVE_GETUID - if (getuid() == 0 || geteuid() == 0) { - exit(1); - } -#else - exit(1); -#endif - - set_env("LC_ALL", "C"); - set_env("LANG", "C"); - set_env("SHELL", "/bin/sh"); - if (nodisp) { - /* this will cause timeout problems with pam_xauth */ - int k; - for (k=0; k<3; k++) { - if (getenv("DISPLAY")) { - char *s = getenv("DISPLAY"); - if (s) *(s-2) = '_'; /* quite... */ - } - if (getenv("XAUTHORITY")) { - char *s = getenv("XAUTHORITY"); - if (s) *(s-2) = '_'; /* quite... */ - } - } - } - - /* synchronize with parent: */ - write(2, "C", 1); - - if (cmd) { - execlp(bin_su, bin_su, "-", user, "-c", - bin_true, (char *) NULL); - } else { - execlp(bin_su, bin_su, user, "-c", - bin_true, (char *) NULL); - } - exit(1); - } - /* parent */ - - if (db) fprintf(stderr, "pid: %d\n", pid); - - /* - * set an alarm for blocking read() to close the master - * (presumably terminating the child. SIGTERM too...) - */ - slave_fd = fd; - alarm_fired = 0; - signal(SIGALRM, close_alarm); - alarm(10); - - /* synchronize with child: */ - cbuf[0] = '\0'; - cbuf[1] = '\0'; - for (i=0; i<10; i++) { - int n; - cbuf[0] = '\0'; - cbuf[1] = '\0'; - n = read(fd, cbuf, 1); - if (n < 0 && errno == EINTR) { - continue; - } else { - break; - } - } - - if (db) { - fprintf(stderr, "read from child: '%s'\n", cbuf); - } - - alarm(0); - signal(SIGALRM, SIG_DFL); - if (alarm_fired) { - kill_child(pid, fd); - return 0; - } - -#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCTRAP) - { - int control = 1; - ioctl(fd, TIOCTRAP, &control); - } -#endif - - /* - * In addition to checking exit code below, we watch for the - * appearance of the string "Password:". BSD does not seem to - * ask for a password trying to su to yourself. This is the - * setting in /etc/pam.d/su: - * auth sufficient pam_self.so - * it may be commented out without problem. - */ - for (i=0; i< (int) sizeof(instr); i++) { - instr[i] = '\0'; - } - - alarm_fired = 0; - signal(SIGALRM, close_alarm); - alarm(10); - - j = 0; - for (i=0; i < (int) strlen("Password:"); i++) { - char pstr[] = "password:"; - int n, problem; - - cbuf[0] = '\0'; - cbuf[1] = '\0'; - - n = read(fd, cbuf, 1); - if (n < 0 && errno == EINTR) { - i--; - if (i < -1) i = -1; - continue; - } - - if (db) { - fprintf(stderr, "%s", cbuf); - if (db > 3 && n == 1 && cbuf[0] == ':') { - char cmd0[32]; - usleep( 100 * 1000 ); - fprintf(stderr, "\n\n"); - sprintf(cmd0, "ps wu %d", pid); - system(cmd0); - sprintf(cmd0, "stty -a < %s", slave); - system(cmd0); - fprintf(stderr, "\n\n"); - } - } - - if (n == 1) { - if (isspace((unsigned char) cbuf[0])) { - i--; - if (i < -1) i = -1; - continue; - } - if (j >= (int) sizeof(instr)-1) { - rfbLog("su_verify: problem finding Password:\n"); - fflush(stderr); - return 0; - } - instr[j++] = tolower((unsigned char)cbuf[0]); - } - - problem = 0; - if (n <= 0) { - problem = 1; - } else if (strstr(pstr, instr) != pstr) { -#ifdef _AIX - if (UT.sysname && strstr(UT.sysname, "AIX")) { - /* handle: runge's Password: */ - char *luser = (char *) malloc(strlen(user) + 10); - - sprintf(luser, "%s's", user); - lowercase(luser); - if (db) fprintf(stderr, "\nAIX luser compare: \"%s\" to \"%s\"\n", luser, instr); - if (strstr(luser, instr) == luser) { - if (db) fprintf(stderr, "AIX luser compare: strstr OK.\n"); - if (!strcmp(luser, instr)) { - if (db) fprintf(stderr, "AIX luser compare: strings equal.\n"); - i = -1; - j = 0; - memset(instr, 0, sizeof(instr)); - free(luser); - continue; - } else { - i--; - if (i < -1) i = -1; - free(luser); - continue; - } - } else { - if (db) fprintf(stderr, "AIX luser compare: problem=1\n"); - problem = 1; - } - free(luser); - } else -#endif - { - problem = 1; - } - } - - if (problem) { - if (db) { - fprintf(stderr, "\"Password:\" did not " - "appear: '%s'" " n=%d\n", instr, n); - if (db > 3 && n == 1 && j < 32) { - continue; - } - } - alarm(0); - signal(SIGALRM, SIG_DFL); - kill_child(pid, fd); - return 0; - } - } - - alarm(0); - signal(SIGALRM, SIG_DFL); - if (alarm_fired) { - kill_child(pid, fd); - return 0; - } - - if (db) fprintf(stderr, "\nsending passwd: %s\n", db > 2 ? pass : "****"); - usleep(100 * 1000); - if (slow_pw) { - unsigned int k; - for (k = 0; k < strlen(pass); k++) { - write(fd, pass+k, 1); - usleep(100 * 1000); - } - } else { - write(fd, pass, strlen(pass)); - } - - alarm_fired = 0; - signal(SIGALRM, close_alarm); - alarm(15); - - /* - * try to drain the output, hopefully never as much as 4096 (motd?) - * if we don't drain we may block at waitpid. If we close(fd), the - * make cause child to die by signal. - */ - if (rbuf && *rbuf_size > 0) { - /* asked to return output of command */ - drain_size = *rbuf_size; - rsize = 0; - } - if (db) fprintf(stderr, "\ndraining:\n"); - for (i = 0; i< drain_size; i++) { - int n; - - cbuf[0] = '\0'; - cbuf[1] = '\0'; - - n = read(fd, cbuf, 1); - if (n < 0 && errno == EINTR) { - if (db) fprintf(stderr, "\nEINTR n=%d i=%d --", n, i); - i--; - if (i < 0) i = 0; - continue; - } - - if (db) fprintf(stderr, "\nn=%d i=%d errno=%d %.6f '%s'", n, i, errno, dnowx(), cbuf); - - if (n <= 0) { - break; - } - if (rbuf && *rbuf_size > 0) { - rbuf[rsize++] = cbuf[0]; - } - } - if (db && rbuf) fprintf(stderr, "\nrbuf: '%s'\n", rbuf); - - if (rbuf && *rbuf_size > 0) { - char *s = rbuf; - char *p = strdup(pass); - int n, o = 0; - - n = strlen(p); - if (p[n-1] == '\n') { - p[n-1] = '\0'; - } - /* - * usually is: Password: mypassword\r\n\r\n<output-of-command> - * and output will have \n -> \r\n - */ - if (rbuf[0] == ' ') { - s++; - o++; - } - if (strstr(s, p) == s) { - s += strlen(p); - o += strlen(p); - for (n = 0; n < 4; n++) { - if (s[0] == '\r' || s[0] == '\n') { - s++; - o++; - } - } - } - if (o > 0) { - int i = 0; - rsize -= o; - while (o < drain_size) { - rbuf[i++] = rbuf[o++]; - } - } - *rbuf_size = rsize; - strzero(p); - free(p); - } - - if (db) fprintf(stderr, "\n--\n"); - - alarm(0); - signal(SIGALRM, SIG_DFL); - if (alarm_fired) { - kill_child(pid, fd); - return 0; - } - - slave_fd = -1; - - pidw = waitpid(pid, &status, 0); - close(fd); - - if (pid != pidw) { - return 0; - } - - if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { - return 1; /* this is the only return of success. */ - } else { - return 0; - } -#endif /* UNIXPW_SU */ -} - -int unixpw_verify(char *user, char *pass) { - int ok = 0; - if (unixpw_cmd) { - if (cmd_verify(user, pass)) { - rfbLog("unixpw_verify: cmd_verify login for '%s'" - " succeeded.\n", user); - fflush(stderr); - ok = 1; - } else { - rfbLog("unixpw_verify: cmd_verify login for '%s'" - " failed.\n", user); - fflush(stderr); - usleep(3000*1000); - ok = 0; - } - } else if (unixpw_nis) { - if (crypt_verify(user, pass)) { - rfbLog("unixpw_verify: crypt_verify login for '%s'" - " succeeded.\n", user); - fflush(stderr); - ok = 1; - } else { - rfbLog("unixpw_verify: crypt_verify login for '%s'" - " failed.\n", user); - fflush(stderr); - usleep(3000*1000); - ok = 0; - } - } else { - if (su_verify(user, pass, NULL, NULL, NULL, 1)) { - rfbLog("unixpw_verify: su_verify login for '%s'" - " succeeded.\n", user); - fflush(stderr); - ok = 1; - } else { - rfbLog("unixpw_verify: su_verify login for '%s'" - " failed.\n", user); - fflush(stderr); - /* use su(1)'s sleep */ - ok = 0; - } - } - return ok; -} - -static int skip_it = 0; - -static void progress_skippy(void) { - int i, msec = get_net_latency(); /* probabaly not set yet.. */ - - if (msec > 300) { - msec = 300; - } else if (msec <= 100) { - msec = 100; - } - - skip_it = 1; - for (i = 0; i < 5; i++) { - if (i == 2) { - rfbPE(msec * 1000); - } else { - rfbPE(-1); - } - usleep(10*1000); - } - skip_it = 0; - - usleep(50*1000); -} - -void check_unixpw_userprefs(void) { - char *prefs = getenv("FD_USERPREFS"); - if (keep_unixpw_user == NULL || keep_unixpw_opts == NULL) { - return; - } -#if LIBVNCSERVER_HAVE_PWD_H - if (prefs != NULL && !strchr(prefs, '/')) { - struct passwd *pw = getpwnam(keep_unixpw_user); - if (pw != NULL) { - char *file; - FILE *f; - - file = (char *) malloc(strlen(pw->pw_dir) + 1 + strlen(prefs) + 1); - sprintf(file, "%s/%s", pw->pw_dir, prefs); - - f = fopen(file, "r"); - if (f) { - char *t, *q, buf[1024]; - memset(buf, 0, sizeof(buf)); - - fgets(buf, 1024, f); - fclose(f); - - q = strchr(buf, '\n'); - if (q) *q = '\0'; - q = strchr(buf, '\r'); - if (q) *q = '\0'; - - rfbLog("read user prefs %s: %s\n", file, buf); - - if (buf[0] == '#') buf[0] = '\0'; - - t = (char *) malloc(strlen(keep_unixpw_opts) + 1 + strlen(buf) + 1); - sprintf(t, "%s,%s", keep_unixpw_opts, buf); - free(keep_unixpw_opts); - keep_unixpw_opts = t; - } else { - rfbLog("could not read user prefs %s\n", file); - rfbLogPerror("fopen"); - } - free(file); - } - } -#endif -} - - -void unixpw_verify_screen(char *user, char *pass) { - int x, y; - char li[] = "Login incorrect"; - char ls[] = "Login succeeded"; - char log[] = "login: "; - char *colon = NULL; - ClientData *cd = NULL; - int ok; - -if (db) fprintf(stderr, "unixpw_verify: '%s' '%s'\n", user, db > 1 ? pass : "********"); - rfbLog("unixpw_verify: '%s'\n", user ? user : "(null)"); - - if (user) { - colon = strchr(user, ':'); - } - if (colon) { - *colon = '\0'; - rfbLog("unixpw_verify: colon: '%s'\n", user); - } - fflush(stderr); - if (unixpw_client) { - cd = (ClientData *) unixpw_client->clientData; - if (cd) { - char *str = (char *)malloc(strlen("UNIX:") + - strlen(user) + 1); - sprintf(str, "UNIX:%s", user); - if (cd->username) { - free(cd->username); - } - cd->username = str; - } - } - - ok = unixpw_verify(user, pass); - - if (ok) { - char_row++; - char_col = 0; - - x = text_x(); - y = text_y(); - rfbDrawString(pscreen, &default8x16Font, x, y, ls, white_pixel()); - unixpw_mark(); - - progress_skippy(); - - unixpw_accept(user); - - if (keep_unixpw) { - keep_unixpw_user = strdup(user); - keep_unixpw_pass = strdup(pass); - if (colon) { - keep_unixpw_opts = strdup(colon+1); - } else { - keep_unixpw_opts = strdup(""); - } - check_unixpw_userprefs(); - } - - if (colon) *colon = ':'; - - return; - } - if (colon) *colon = ':'; - - if (tries < 2) { - char_row++; - char_col = 0; - - x = text_x(); - y = text_y(); - rfbDrawString(pscreen, &default8x16Font, x, y, li, white_pixel()); - - char_row += 2; - - x = text_x(); - y = text_y(); - rfbDrawString(pscreen, &default8x16Font, x, y, log, white_pixel()); - - char_col = strlen(log); - - unixpw_mark(); - - unixpw_last_try_time = time(NULL); - unixpw_keystroke(0, 0, 2); - tries++; - } else { - unixpw_deny(); - } -} - -static void set_db(void) { - if (getenv("DEBUG_UNIXPW")) { - db = atoi(getenv("DEBUG_UNIXPW")); - rfbLog("DEBUG_UNIXPW: %d\n", db); - } -} - -void unixpw_keystroke(rfbBool down, rfbKeySym keysym, int init) { - int x, y, i, rc, nmax = 100; - static char user_r[100], user[100], pass[100]; - static int u_cnt = 0, p_cnt = 0, t_cnt = 0, first = 1; - static int echo = 1; - char keystr[100]; - char *str; - - if (skip_it) { - return; - } - - if (first) { - set_db(); - first = 0; - for (i=0; i < nmax; i++) { - user_r[i] = '\0'; - user[i] = '\0'; - pass[i] = '\0'; - } - } - - if (init) { - in_login = 1; - in_passwd = 0; - unixpw_denied = 0; - echo = 1; - if (init == 1) { - tries = 0; - } - - u_cnt = 0; - p_cnt = 0; - t_cnt = 0; - for (i=0; i<nmax; i++) { - user[i] = '\0'; - pass[i] = '\0'; - } - if (keep_unixpw_user) { - free(keep_unixpw_user); - keep_unixpw_user = NULL; - } - if (keep_unixpw_pass) { - strzero(keep_unixpw_pass); - free(keep_unixpw_pass); - keep_unixpw_pass = NULL; - } - if (keep_unixpw_opts) { - strzero(keep_unixpw_opts); - free(keep_unixpw_opts); - keep_unixpw_opts = NULL; - } - - return; - } - - if (unixpw_denied) { - rfbLog("unixpw_keystroke: unixpw_denied state: 0x%x\n", (int) keysym); - return; - } - if (keysym <= 0) { - rfbLog("unixpw_keystroke: bad keysym1: 0x%x\n", (int) keysym); - return; - } - - /* rfbKeySym = uint32_t */ - /* KeySym = XID = CARD32 = (unsigned long or unsigned int on LONG64) */ - X_LOCK; - str = XKeysymToString(keysym); - X_UNLOCK; - if (str == NULL) { - rfbLog("unixpw_keystroke: bad keysym2: 0x%x\n", (int) keysym); - return; - } - - rc = snprintf(keystr, 100, "%s", str); - if (rc < 1 || rc > 90) { - rfbLog("unixpw_keystroke: bad keysym3: 0x%x\n", (int) keysym); - return; - } - - if (db > 2) { - fprintf(stderr, "%s / %s 0x%x %s\n", in_login ? "login":"pass ", - down ? "down":"up ", keysym, keystr); - } - - if (keysym == XK_Return || keysym == XK_Linefeed || keysym == XK_Tab) { - /* let "up" pass down below for Return case */ - if (down) { - return; - } - } else if (! down) { - return; - } - if (keysym == XK_F1) { - char h1[] = "F1-Help: For 'login:' type in the username and press Enter, then for 'Password:' enter the password."; - char hf[] = " Once logged in, username's X session will be searched for and if found then attached to."; - char hc[] = " Once logged in, username's X session is sought and attached to, otherwise a new session is created."; - char hx[] = " Once logged in, username's X session is sought and attached to, otherwise a login greeter is presented."; - char h2[] = " Specify options after a ':' like this: username:opt,opt=val,... Where an opt may be any of:"; - char h3[] = " scale=... (n/m); scale_cursor=... (sc=); solid (so); id=; repeat; clear_mods (cm); clear_keys (ck);"; - char h4[] = " clear_all (ca); speeds=... (sp=); readtimeout=... (rd=) rotate=... (ro=); noncache (nc) (nc=n);"; - char h5[] = " geom=WxHxD (ge=); nodisplay=... (nd=); viewonly (vo); tag=...; gnome kde twm fvwm mwm dtwm wmaker"; - char h6[] = " xfce lxde enlightenment Xsession failsafe. Examples: fred:3/4,so,cm wilma:geom=1024x768x16,kde"; - int ch = 13, p; - if (!pscreen || pscreen->width < 640 || pscreen->height < 480) { - return; - } - if (f1_help) { - p = black_pixel(); - f1_help = 0; - } else { - p = white_pixel(); - f1_help = 1; - unixpw_last_try_time = time(NULL) + 45; - } - rfbDrawString(pscreen, &default6x13Font, 8, 2+1*ch, h1, p); - if (use_dpy == NULL) { - ; - } else if (strstr(use_dpy, "cmd=FINDDISPLAY")) { - rfbDrawString(pscreen, &default6x13Font, 8, 2+2*ch, hf, p); - } else if (strstr(use_dpy, "cmd=FINDCREATEDISPLAY")) { - if (strstr(use_dpy, "xdmcp")) { - rfbDrawString(pscreen, &default6x13Font, 8, 2+2*ch, hx, p); - } else { - rfbDrawString(pscreen, &default6x13Font, 8, 2+2*ch, hc, p); - } - } - rfbDrawString(pscreen, &default6x13Font, 8, 2+3*ch, h2, p); - rfbDrawString(pscreen, &default6x13Font, 8, 2+4*ch, h3, p); - rfbDrawString(pscreen, &default6x13Font, 8, 2+5*ch, h4, p); - rfbDrawString(pscreen, &default6x13Font, 8, 2+6*ch, h5, p); - rfbDrawString(pscreen, &default6x13Font, 8, 2+7*ch, h6, p); - if (!f1_help) { - rfbDrawString(pscreen, &default6x13Font, 8, 2+1*ch, "F1-Help:", white_pixel()); - } - unixpw_mark(); - return; - } - if (unixpw_system_greeter_active && keysym == XK_Escape) { - char *u = get_user_name(); - if (keep_unixpw) { - char *colon = strchr(user, ':'); - keep_unixpw_user = strdup(u); - keep_unixpw_pass = strdup(""); - if (colon) { - keep_unixpw_opts = strdup(colon+1); - } else { - keep_unixpw_opts = strdup(""); - } - check_unixpw_userprefs(); - } - unixpw_system_greeter_active = 2; - set_env("X11VNC_XDM_ONLY", "1"); - rfbLog("unixpw_system_greeter: VNC client pressed 'Escape'. Allowing\n"); - rfbLog("unixpw_system_greeter: a *FREE* (no password) connection to\n"); - rfbLog("unixpw_system_greeter: the system XDM/GDM/KDM login greeter.\n"); - if (1) { - char msg[] = " Please wait... "; - rfbDrawString(pscreen, &default8x16Font, - text_x(), text_y(), msg, white_pixel()); - unixpw_mark(); - - progress_skippy(); - } - unixpw_accept(u); - free(u); - return; - } - - if (in_login && keysym == XK_Escape && u_cnt == 0) { - echo = 0; - rfbLog("unixpw_keystroke: echo off.\n"); - return; - } - - t_cnt++; - - if (in_login) { - if (keysym == XK_BackSpace || keysym == XK_Delete) { - if (u_cnt > 0) { - user[u_cnt-1] = '\0'; - u_cnt--; - - x = text_x(); - y = text_y(); - if (scaling) { - int x2 = x / scale_fac_x; - int y2 = y / scale_fac_y; - int w2 = char_w / scale_fac_x; - int h2 = char_h / scale_fac_y; - - x2 = nfix(x2, dpy_x); - y2 = nfix(y2, dpy_y); - - zero_fb(x2 - w2, y2 - h2, x2, y2); - mark_rect_as_modified(x2 - w2, - y2 - h2, x2, y2, 0); - } else { - zero_fb(x - char_w, y - char_h, x, y); - mark_rect_as_modified(x - char_w, - y - char_h, x, y, 0); - } - char_col--; - } - - return; - } - - if (keysym == XK_Return || keysym == XK_Linefeed || keysym == XK_Tab) { - char pw[] = "Password: "; - - if (down) { - /* - * require Up so the Return Up is not processed - * by the normal session after login. - * (actually we already returned above) - */ - return; - } - - if (t_cnt == 1) { - /* accidental initial return, e.g. from xterm */ - return; - } - - in_login = 0; - in_passwd = 1; - - char_row++; - char_col = 0; - - x = text_x(); - y = text_y(); - rfbDrawString(pscreen, &default8x16Font, x, y, pw, - white_pixel()); - - char_col = strlen(pw); - unixpw_mark(); - return; - } - - if (u_cnt == 0 && keysym == XK_Up) { - /* - * Allow user to hit Up arrow at beginning to - * regain their username plus any options. - */ - int i; - for (i=0; i < nmax; i++) { - user[i] = '\0'; - } - for (i=0; i < nmax; i++) { - char str[10]; - user[u_cnt++] = user_r[i]; - if (user_r[i] == '\0') { - break; - } - str[0] = (char) user_r[i]; - str[1] = '\0'; - - x = text_x(); - y = text_y(); - if (echo) { - rfbDrawString(pscreen, &default8x16Font, x, y, - str, white_pixel()); - } - mark_rect_as_modified(x, y-char_h, x+char_w, - y, scaling); - char_col++; - usleep(10*1000); - } - return; - } - - if (keysym < ' ' || keysym >= 0x7f) { - /* require normal keyboard characters for username */ - rfbLog("unixpw_keystroke: bad keysym4: 0x%x\n", (int) keysym); - return; - } - - if (u_cnt >= nmax - 1) { - /* user[u_cnt=99] will be '\0' */ - rfbLog("unixpw_deny: username too long: %d\n", u_cnt); - for (i=0; i<nmax; i++) { - user[i] = '\0'; - pass[i] = '\0'; - } - unixpw_deny(); - return; - } - -#if 0 - user[u_cnt++] = keystr[0]; -#else - user[u_cnt++] = (char) keysym; - for (i=0; i < nmax; i++) { - /* keep a full copy of username */ - user_r[i] = user[i]; - } - keystr[0] = (char) keysym; -#endif - keystr[1] = '\0'; - - x = text_x(); - y = text_y(); - -if (db && db <= 2) fprintf(stderr, "u_cnt: %d %d/%d ks: 0x%x '%s'\n", u_cnt, x, y, keysym, keystr); - - if (echo ) { - rfbDrawString(pscreen, &default8x16Font, x, y, keystr, white_pixel()); - } - - mark_rect_as_modified(x, y-char_h, x+char_w, y, scaling); - char_col++; - - return; - - } else if (in_passwd) { - if (keysym == XK_BackSpace || keysym == XK_Delete) { - if (p_cnt > 0) { - pass[p_cnt-1] = '\0'; - p_cnt--; - } - return; - } - if (keysym == XK_Return || keysym == XK_Linefeed) { - if (down) { - /* - * require Up so the Return Up is not processed - * by the normal session after login. - * (actually we already returned above) - */ - return; - } - - if (1) { - char msg[] = " Please wait... "; - rfbDrawString(pscreen, &default8x16Font, - text_x(), text_y(), msg, white_pixel()); - unixpw_mark(); - - progress_skippy(); - } - - in_login = 0; - in_passwd = 0; - - pass[p_cnt++] = '\n'; - unixpw_verify_screen(user, pass); - for (i=0; i<nmax; i++) { - user[i] = '\0'; - pass[i] = '\0'; - } - return; - } - - if (keysym < ' ' || keysym >= 0x7f) { - /* require normal keyboard characters for password */ - return; - } - - if (p_cnt >= nmax - 2) { - /* pass[u_cnt=98] will be '\n' */ - /* pass[u_cnt=99] will be '\0' */ - rfbLog("unixpw_deny: password too long: %d\n", p_cnt); - for (i=0; i<nmax; i++) { - user[i] = '\0'; - pass[i] = '\0'; - } - unixpw_deny(); - return; - } - - pass[p_cnt++] = (char) keysym; - - return; - - } else { - /* should not happen... anyway clean up a bit. */ - u_cnt = 0; - p_cnt = 0; - for (i=0; i<nmax; i++) { - user_r[i] = '\0'; - user[i] = '\0'; - pass[i] = '\0'; - } - - return; - } -} - -static void apply_opts (char *user) { - char *p, *q, *str, *opts = NULL, *opts_star = NULL; - rfbClientPtr cl; - ClientData *cd; - int i, notmode = 0; - - if (! unixpw_client) { - rfbLog("apply_opts: unixpw_client is NULL\n"); - clean_up_exit(1); - } - cd = (ClientData *) unixpw_client->clientData; - cl = unixpw_client; - - if (! cd) { - rfbLog("apply_opts: no ClientData\n"); - } - - if (user && cd) { - if (cd->unixname) { - free(cd->unixname); - } - cd->unixname = strdup(user); - rfbLog("apply_opts: set unixname to: %s\n", cd->unixname); - } - - if (! unixpw_list) { - return; - } - str = strdup(unixpw_list); - - /* apply any per-user options. */ - if (str[0] == '!') { - p = strtok(str+1, ","); - notmode = 1; - } else { - p = strtok(str, ","); - } - while (p) { - if ( (q = strchr(p, ':')) != NULL ) { - *q = '\0'; /* get rid of options. */ - } else { - p = strtok(NULL, ","); - continue; - } - if (user && !strcmp(user, p)) { - /* will not happen in notmode */ - opts = strdup(q+1); - } - if (!strcmp("*", p)) { - opts_star = strdup(q+1); - } - p = strtok(NULL, ","); - } - free(str); - - for (i=0; i < 2; i++) { - char *s = (i == 0) ? opts_star : opts; - if (s == NULL) { - continue; - } - p = strtok(s, "+"); - while (p) { - if (!strcmp(p, "viewonly")) { - cl->viewOnly = TRUE; - if (cd) { - strncpy(cd->input, "-", CILEN); - } - } else if (!strcmp(p, "fullaccess")) { - cl->viewOnly = FALSE; - if (cd) { - strncpy(cd->input, "-", CILEN); - } - } else if ((q = strstr(p, "input=")) == p) { - q += strlen("input="); - if (cd) { - strncpy(cd->input, q, CILEN); - } - } else if (!strcmp(p, "deny")) { - cl->viewOnly = TRUE; - unixpw_deny(); - break; - } - p = strtok(NULL, "+"); - } - free(s); - } -} - -void unixpw_accept(char *user) { - apply_opts(user); - - if (!use_stunnel) { - ssl_helper_pid(0, -2); /* waitall */ - } - - if (accept_cmd && strstr(accept_cmd, "popup") == accept_cmd) { - if (use_dpy && strstr(use_dpy, "WAIT:") == use_dpy && - dpy == NULL) { - /* handled in main() */ - unixpw_client->onHold = TRUE; - } else if (! accept_client(unixpw_client)) { - unixpw_deny(); - return; - } - } - - if (started_as_root == 1 && users_list - && strstr(users_list, "unixpw=") == users_list) { - if (getuid() && geteuid()) { - rfbLog("unixpw_accept: unixpw= but not root\n"); - started_as_root = 2; - } else { - char *u = (char *)malloc(strlen(user)+1); - - u[0] = '\0'; - if (!strcmp(users_list, "unixpw=")) { - sprintf(u, "+%s", user); - } else { - char *p, *str = strdup(users_list); - p = strtok(str + strlen("unixpw="), ","); - while (p) { - if (!strcmp(p, user)) { - sprintf(u, "+%s", user); - break; - } - p = strtok(NULL, ","); - } - free(str); - } - - if (u[0] == '\0') { - rfbLog("unixpw_accept skipping switch to user: %s\n", user); - } else if (switch_user(u, 0)) { - rfbLog("unixpw_accept switched to user: %s\n", user); - } else { - rfbLog("unixpw_accept failed to switch to user: %s\n", user); - } - free(u); - } - } - - if (unixpw_login_viewonly) { - unixpw_client->viewOnly = TRUE; - } - unixpw_in_progress = 0; - /* mutex */ - screen->permitFileTransfer = unixpw_file_xfer_save; - if ((tightfilexfer = unixpw_tightvnc_xfer_save)) { - /* this doesn't work: the current client is never registered! */ -#ifdef LIBVNCSERVER_WITH_TIGHTVNC_FILETRANSFER - rfbLog("rfbRegisterTightVNCFileTransferExtension: 1\n"); - rfbRegisterTightVNCFileTransferExtension(); -#endif - } - unixpw_client = NULL; - mark_rect_as_modified(0, 0, dpy_x, dpy_y, 0); - if (macosx_console) { - refresh_screen(1); - } -} - -void unixpw_deny(void) { - int x, y, i; - char pd[] = "Permission denied."; - - rfbLog("unixpw_deny: %d, %d\n", unixpw_denied, unixpw_in_progress); - if (! unixpw_denied) { - unixpw_denied = 1; - - char_row += 2; - char_col = 0; - x = char_x + char_col * char_w; - y = char_y + char_row * char_h; - - rfbDrawString(pscreen, &default8x16Font, x, y, pd, white_pixel()); - unixpw_mark(); - - for (i=0; i<5; i++) { - rfbPE(-1); - rfbPE(-1); - usleep(500 * 1000); - } - } - - if (unixpw_client) { - rfbCloseClient(unixpw_client); - rfbClientConnectionGone(unixpw_client); - rfbPE(-1); - } - - unixpw_in_progress = 0; - /* mutex */ - screen->permitFileTransfer = unixpw_file_xfer_save; - if ((tightfilexfer = unixpw_tightvnc_xfer_save)) { -#ifdef LIBVNCSERVER_WITH_TIGHTVNC_FILETRANSFER - rfbLog("rfbRegisterTightVNCFileTransferExtension: 2\n"); - rfbRegisterTightVNCFileTransferExtension(); -#endif - } - unixpw_client = NULL; - copy_screen(); -} - -void unixpw_msg(char *msg, int delay) { - int x, y, i; - - char_row += 2; - char_col = 0; - x = char_x + char_col * char_w; - y = char_y + char_row * char_h; - - rfbDrawString(pscreen, &default8x16Font, x, y, msg, white_pixel()); - unixpw_mark(); - - for (i=0; i<5; i++) { - rfbPE(-1); - rfbPE(-1); - rfbPE(50 * 1000); - rfbPE(-1); - usleep(500 * 1000); - if (i >= delay) { - break; - } - } -} |