From 69df3768033a87e1ad5942a2b7e8073926c8026a Mon Sep 17 00:00:00 2001 From: Adam Tkac Date: Tue, 2 Nov 2010 09:16:49 +0000 Subject: [PATCH] [Development] Implement PasswordValidator class on Windows (Martin Koegler) git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4183 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- common/rfb/CMakeLists.txt | 1 + common/rfb/Makefile.am | 4 +++ common/rfb/SSecurityPlain.cxx | 5 +++ common/rfb/WinPasswdValidator.cxx | 51 +++++++++++++++++++++++++++++++ common/rfb/WinPasswdValidator.h | 37 ++++++++++++++++++++++ configure.ac | 3 ++ 6 files changed, 101 insertions(+) create mode 100644 common/rfb/WinPasswdValidator.cxx create mode 100644 common/rfb/WinPasswdValidator.h diff --git a/common/rfb/CMakeLists.txt b/common/rfb/CMakeLists.txt index 6bfb5fef..5ae9ade0 100644 --- a/common/rfb/CMakeLists.txt +++ b/common/rfb/CMakeLists.txt @@ -62,6 +62,7 @@ add_library(rfb STATIC UpdateTracker.cxx VNCSConnectionST.cxx VNCServerST.cxx + WinPasswdValidator.cxx # Windows specific code ZRLEEncoder.cxx ZRLEDecoder.cxx encodings.cxx diff --git a/common/rfb/Makefile.am b/common/rfb/Makefile.am index 796c10b6..519cbd07 100644 --- a/common/rfb/Makefile.am +++ b/common/rfb/Makefile.am @@ -67,4 +67,8 @@ librfb_la_CPPFLAGS += -I$(top_srcdir)/common/jpeg -I$(top_builddir)/common/jpeg librfb_la_LIBADD += $(top_builddir)/common/jpeg/libjpeg.la endif +if BUILD_WIN +librfb_la_SOURCES += WinPasswdValidator.h WinPasswdValidator.cxx +endif + EXTRA_DIST = CMakeLists.txt diff --git a/common/rfb/SSecurityPlain.cxx b/common/rfb/SSecurityPlain.cxx index 84ef0997..f5a5cc73 100644 --- a/common/rfb/SSecurityPlain.cxx +++ b/common/rfb/SSecurityPlain.cxx @@ -28,6 +28,9 @@ #ifdef HAVE_PAM #include #endif +#ifdef BUILD_WIN +#include +#endif using namespace rfb; @@ -61,6 +64,8 @@ SSecurityPlain::SSecurityPlain() { #ifdef HAVE_PAM valid = new UnixPasswordValidator(); +#elif BUILD_WIN + valid = new WinPasswdValidator(); #else valid = NULL; #endif diff --git a/common/rfb/WinPasswdValidator.cxx b/common/rfb/WinPasswdValidator.cxx new file mode 100644 index 00000000..7f8fbf28 --- /dev/null +++ b/common/rfb/WinPasswdValidator.cxx @@ -0,0 +1,51 @@ +/* Copyright (C) 2005-2006 Martin Koegler + * Copyright (C) 2006 OCCAM Financial Technology + * Copyright (C) 2010 TigerVNC Team + * + * This 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. + * + * This software 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 this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#include +#include +#include + +using namespace rfb; + +// This method will only work for Windows NT, 2000, and XP (and possibly Vista) +bool WinPasswdValidator::validateInternal(rfb::SConnection* sc, + const char* username, + const char* password) +{ + TCHAR* user = (TCHAR*) strDup(username); + TCHAR* pass = (TCHAR*) strDup(password); + TCHAR* domain = (TCHAR*) strDup("."); + HANDLE handle; + + BOOL ret = LogonUser(user, domain, pass, LOGON32_LOGON_NETWORK, + LOGON32_PROVIDER_DEFAULT, &handle); + delete [] user; + delete [] pass; + delete [] domain; + + if (ret != 0) { + CloseHandle(handle); + return true; + } + + int err = GetLastError(); + + return false; +} diff --git a/common/rfb/WinPasswdValidator.h b/common/rfb/WinPasswdValidator.h new file mode 100644 index 00000000..ef2310a9 --- /dev/null +++ b/common/rfb/WinPasswdValidator.h @@ -0,0 +1,37 @@ +/* Copyright (C) 2005-2006 Martin Koegler + * Copyright (C) 2006 OCCAM Financial Technology + * Copyright (C) 2010 TigerVNC Team + * + * This 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. + * + * This software 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 this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#ifndef __RFB_WINPASSWDVALIDATOR_H__ +#define __RFB_WINPASSWDVALIDATOR_H__ + +#include + +namespace rfb +{ + class WinPasswdValidator : public PasswordValidator { + public: + WinPasswdValidator() {}; + virtual ~WinPasswdValidator() {}; + protected: + bool validateInternal(SConnection *sc, const char* username, const char* password); + }; +} + +#endif /* WINPASSWDVALIDATOR_H */ diff --git a/configure.ac b/configure.ac index 560f5fc9..811342ab 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,9 @@ mingw*) ;; esac AM_CONDITIONAL([BUILD_WIN], [test "x$BUILD_WIN" = xyes]) +if test "x$BUILD_WIN" = xyes; then + AC_DEFINE([BUILD_WIN],1,[is it a windows build]) +fi dnl FIXME: Check for MIT-SHM properly, add a corresponding --with option. if test "$USE_MITSHM" = yes; then -- 2.39.5