Initial revision


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/vncconfig/Authentication.h b/vncconfig/Authentication.h
new file mode 100644
index 0000000..5923c2c
--- /dev/null
+++ b/vncconfig/Authentication.h
@@ -0,0 +1,137 @@
+/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
+ *    
+ * 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 WINVNCCONF_AUTHENTICATION
+#define WINVNCCONF_AUTHENTICATION
+
+#include <rfb_win32/Registry.h>
+#include <rfb_win32/Dialog.h>
+#include <rfb_win32/Win32Util.h>
+#include <rfb/ServerCore.h>
+#include <rfb/secTypes.h>
+#include <rfb/vncAuth.h>
+
+
+extern rfb::VncAuthPasswdConfigParameter vncAuthPasswd;
+
+namespace rfb {
+
+  namespace win32 {
+
+    class VncPasswdDialog : public Dialog {
+    public:
+      VncPasswdDialog(const RegKey& rk) : Dialog(GetModuleHandle(0)), regKey(rk), warnPasswdInsecure(false) {}
+      bool showDialog() {
+        return Dialog::showDialog(MAKEINTRESOURCE(IDD_AUTH_VNC_PASSWD));
+      }
+      bool onOk() {
+        TCharArray password1 = getItemString(IDC_PASSWORD1);
+        TCharArray password2 = getItemString(IDC_PASSWORD2);;
+        if (_tcscmp(password1.buf, password2.buf) != 0) {
+          MsgBox(0, _T("The supplied passwords do not match"),
+                 MB_ICONEXCLAMATION | MB_OK);
+          return false;
+        }
+        if (warnPasswdInsecure &&
+          (MsgBox(0, _T("Please note that your VNC password cannot be stored securely on this system.  ")
+                     _T("Are you sure you wish to continue?"),
+                  MB_YESNO | MB_ICONWARNING) == IDNO))
+          return false;
+        char passwd[9];
+        memset(passwd, 0, sizeof(passwd));
+        strCopy(passwd, CStr(password1.buf), sizeof(passwd));
+        vncAuthObfuscatePasswd(passwd);
+        regKey.setBinary(_T("Password"), passwd, 8);
+        return true;
+      }
+      void setWarnPasswdInsecure(bool warn) {
+        warnPasswdInsecure = warn;
+      }
+    protected:
+      const RegKey& regKey;
+      bool warnPasswdInsecure;
+    };
+
+    class AuthenticationPage : public PropSheetPage {
+    public:
+      AuthenticationPage(const RegKey& rk)
+        : PropSheetPage(GetModuleHandle(0), MAKEINTRESOURCE(IDD_AUTHENTICATION)),
+        passwd(rk), regKey(rk) {}
+      void initDialog() {
+        CharArray sec_types_str;
+        sec_types_str.buf = rfb::Server::sec_types.getData();
+        std::list<int> sec_types = parseSecTypes(sec_types_str.buf);
+
+        useNone = useVNC = false;
+        std::list<int>::iterator i;
+        for (i=sec_types.begin(); i!=sec_types.end(); i++) {
+          if ((*i) == secTypeNone) useNone = true;
+          else if ((*i) == secTypeVncAuth) useVNC = true;
+        }
+
+        setItemChecked(IDC_AUTH_NONE, useNone);
+        setItemChecked(IDC_AUTH_VNC, useVNC);
+        setItemChecked(IDC_QUERY_CONNECT, rfb::Server::queryConnect);
+      }
+      bool onCommand(int id, int cmd) {
+        switch (id) {
+        case IDC_AUTH_VNC_PASSWD:
+          passwd.showDialog();
+          return true;
+        case IDC_AUTH_NONE:
+        case IDC_AUTH_VNC:
+        case IDC_QUERY_CONNECT:
+          setChanged((rfb::Server::queryConnect != isItemChecked(IDC_QUERY_CONNECT)) ||
+                     (useNone != isItemChecked(IDC_AUTH_NONE)) ||
+                     (useVNC != isItemChecked(IDC_AUTH_VNC)));
+          return false;
+        };
+        return false;
+      }
+      bool onOk() {
+        useVNC = isItemChecked(IDC_AUTH_VNC);
+        useNone = isItemChecked(IDC_AUTH_NONE);
+        if (useVNC) {
+          CharArray password = vncAuthPasswd.getVncAuthPasswd();
+          if (!password.buf || strlen(password.buf) == 0) {
+            MsgBox(0, _T("The VNC authentication method is enabled, but no password is specified!  ")
+                      _T("The password dialog will now be shown."), MB_ICONEXCLAMATION | MB_OK);
+            passwd.showDialog();
+          }
+          regKey.setString(_T("SecurityTypes"), _T("VncAuth"));
+        } else if (useNone) {
+          regKey.setString(_T("SecurityTypes"), _T("None"));
+        }
+        regKey.setString(_T("ReverseSecurityTypes"), _T("None"));
+        regKey.setBool(_T("QueryConnect"), isItemChecked(IDC_QUERY_CONNECT));
+        return true;
+      }
+      void setWarnPasswdInsecure(bool warn) {
+        passwd.setWarnPasswdInsecure(warn);
+      }
+    protected:
+      RegKey regKey;
+      VncPasswdDialog passwd;
+      bool useNone;
+      bool useVNC;
+    };
+
+  };
+
+};
+
+#endif