From 243fd7c5046857f05eb13b646bbafdbe314db09f Mon Sep 17 00:00:00 2001 From: Adam Tkac Date: Wed, 8 Dec 2010 13:47:41 +0000 Subject: [PATCH] [Development] Add glue code for -SecurityTypes option and GUI Security dialog. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4216 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- win/vncviewer/CConn.cxx | 38 ++++++++++ win/vncviewer/CConn.h | 7 +- win/vncviewer/OptionsDialog.cxx | 124 ++++++++++++++++++++++++++++---- 3 files changed, 154 insertions(+), 15 deletions(-) diff --git a/win/vncviewer/CConn.cxx b/win/vncviewer/CConn.cxx index f289d384..6a6561d7 100644 --- a/win/vncviewer/CConn.cxx +++ b/win/vncviewer/CConn.cxx @@ -16,6 +16,10 @@ * USA. */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -25,6 +29,9 @@ #include #include #include +#ifdef HAVE_GNUTLS +#include +#endif #include #include @@ -97,6 +104,9 @@ bool CConn::initialise(network::Socket* s, bool reverse) { applyOptions(options); CSecurity::upg = this; +#ifdef HAVE_GNUTLS + CSecurityTLS::msg = this; +#endif // Start the RFB protocol sock = s; @@ -473,6 +483,34 @@ CConn::close(const char* reason) { sock->shutdown(); } +bool CConn::showMsgBox(int flags, const char* title, const char* text) +{ + UINT winflags = 0; + int ret; + + /* Translate flags */ + if ((flags & M_OK) != 0) + winflags |= MB_OK; + if ((flags & M_OKCANCEL) != 0) + winflags |= MB_OKCANCEL; + if ((flags & M_YESNO) != 0) + winflags |= MB_YESNO; + if ((flags & M_ICONERROR) != 0) + winflags |= MB_ICONERROR; + if ((flags & M_ICONQUESTION) != 0) + winflags |= MB_ICONQUESTION; + if ((flags & M_ICONWARNING) != 0) + winflags |= MB_ICONWARNING; + if ((flags & M_ICONINFORMATION) != 0) + winflags |= MB_ICONINFORMATION; + if ((flags & M_DEFBUTTON1) != 0) + winflags |= MB_DEFBUTTON1; + if ((flags & M_DEFBUTTON2) != 0) + winflags |= MB_DEFBUTTON2; + + ret = MessageBox(NULL, text, title, flags); + return (ret == IDOK || ret == IDYES) ? true : false; +} void CConn::showOptionsDialog() { diff --git a/win/vncviewer/CConn.h b/win/vncviewer/CConn.h index 37711540..62b131e1 100644 --- a/win/vncviewer/CConn.h +++ b/win/vncviewer/CConn.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,8 @@ namespace rfb { class CConn : public CConnection, UserPasswdGetter, DesktopWindow::Callback, - rdr::FdInStreamBlockCallback + rdr::FdInStreamBlockCallback, + UserMsgBox { public: CConn(); @@ -77,6 +79,9 @@ namespace rfb { // - Get the server's preferred format const PixelFormat& getServerDefaultPF() const { return serverDefaultPF; } + // - Display message box + virtual bool showMsgBox(int flags, const char* title, const char* text); + // Global user-config registry key static RegKey userConfigKey; diff --git a/win/vncviewer/OptionsDialog.cxx b/win/vncviewer/OptionsDialog.cxx index b3d72f2e..abdd921c 100644 --- a/win/vncviewer/OptionsDialog.cxx +++ b/win/vncviewer/OptionsDialog.cxx @@ -354,6 +354,8 @@ protected: OptionsInfo* dlg; }; +#ifdef HAVE_GNUTLS +/* XXX: This class contains bunch of similar code to unix/vncviewer/CConn.cxx */ class SecurityPage : public PropSheetPage { public: SecurityPage(OptionsInfo* dlg_, Security *security_) @@ -369,18 +371,18 @@ public: for (i = secTypes.begin(); i != secTypes.end(); i++) { switch (*i) { - case secTypeVeNCrypt: - enableVeNCryptFeatures(true); - setItemChecked(IDC_VENCRYPT, true); - break; - case secTypeNone: - setItemChecked(IDC_ENC_NONE, true); - setItemChecked(IDC_AUTH_NONE, true); - break; - case secTypeVncAuth: - setItemChecked(IDC_ENC_NONE, true); - setItemChecked(IDC_AUTH_VNC, true); - break; + case secTypeVeNCrypt: + enableVeNCryptFeatures(true); + setItemChecked(IDC_VENCRYPT, true); + break; + case secTypeNone: + setItemChecked(IDC_ENC_NONE, true); + setItemChecked(IDC_AUTH_NONE, true); + break; + case secTypeVncAuth: + setItemChecked(IDC_ENC_NONE, true); + setItemChecked(IDC_AUTH_VNC, true); + break; } } @@ -428,34 +430,126 @@ public: } } } + virtual bool onCommand(int id, int cmd) { switch (id) { case IDC_VENCRYPT: - enableVeNCryptFeatures(isItemChecked(IDC_VENCRYPT)); + if (isItemChecked(IDC_VENCRYPT)) { + enableVeNCryptFeatures(true); + security->EnableSecType(secTypeVeNCrypt); + } else { + enableVeNCryptFeatures(false); + security->DisableSecType(secTypeVeNCrypt); + } break; + + /* Process types without encryption */ case IDC_ENC_NONE: + if (isItemChecked(IDC_ENC_NONE)) { + vlog.debug("here"); + if (isItemChecked(IDC_AUTH_NONE)) + security->EnableSecType(secTypeNone); + if (isItemChecked(IDC_AUTH_VNC)) + security->EnableSecType(secTypeVncAuth); + if (isItemChecked(IDC_AUTH_PLAIN)) + security->EnableSecType(secTypePlain); + } else { + security->DisableSecType(secTypeNone); + security->DisableSecType(secTypeVncAuth); + security->DisableSecType(secTypePlain); + } break; + + /* Process security types which use TLS encryption */ case IDC_ENC_TLS: + if (isItemChecked(IDC_ENC_TLS)) { + if (isItemChecked(IDC_AUTH_NONE)) + security->EnableSecType(secTypeTLSNone); + if (isItemChecked(IDC_AUTH_VNC)) + security->EnableSecType(secTypeTLSVnc); + if (isItemChecked(IDC_AUTH_PLAIN)) + security->EnableSecType(secTypeTLSPlain); + } else { + security->DisableSecType(secTypeTLSNone); + security->DisableSecType(secTypeTLSVnc); + security->DisableSecType(secTypeTLSPlain); + } break; + + /* Process security types which use X509 encryption */ case IDC_ENC_X509: if (isItemChecked(IDC_ENC_X509)) { enableItem(IDC_LOAD_CACERT, true); enableItem(IDC_LOAD_CRLCERT, true); + if (isItemChecked(IDC_AUTH_NONE)) + security->EnableSecType(secTypeX509None); + if (isItemChecked(IDC_AUTH_VNC)) + security->EnableSecType(secTypeX509Vnc); + if (isItemChecked(IDC_AUTH_PLAIN)) + security->EnableSecType(secTypeX509Plain); } else { enableItem(IDC_LOAD_CACERT, false); enableItem(IDC_LOAD_CRLCERT, false); + security->DisableSecType(secTypeX509None); + security->DisableSecType(secTypeX509Vnc); + security->DisableSecType(secTypeX509Plain); } break; + case IDC_LOAD_CACERT: break; + case IDC_LOAD_CRLCERT: break; + + /* Process *None security types */ case IDC_AUTH_NONE: + if (isItemChecked(IDC_AUTH_NONE)) { + if (isItemChecked(IDC_ENC_NONE)) + security->EnableSecType(secTypeNone); + if (isItemChecked(IDC_ENC_TLS)) + security->EnableSecType(secTypeTLSNone); + if (isItemChecked(IDC_ENC_X509)) + security->EnableSecType(secTypeX509None); + } else { + security->DisableSecType(secTypeNone); + security->DisableSecType(secTypeTLSNone); + security->DisableSecType(secTypeX509None); + } break; + + /* Process *Vnc security types */ case IDC_AUTH_VNC: + if (isItemChecked(IDC_AUTH_VNC)) { + if (isItemChecked(IDC_ENC_NONE)) + security->EnableSecType(secTypeVncAuth); + if (isItemChecked(IDC_ENC_TLS)) + security->EnableSecType(secTypeTLSVnc); + if (isItemChecked(IDC_ENC_X509)) + security->EnableSecType(secTypeX509Vnc); + } else { + security->DisableSecType(secTypeVncAuth); + security->DisableSecType(secTypeTLSVnc); + security->DisableSecType(secTypeX509Vnc); + } break; + + /* Process *Plain security types */ case IDC_AUTH_PLAIN: + if (isItemChecked(IDC_AUTH_PLAIN)) { + if (isItemChecked(IDC_ENC_NONE)) + security->EnableSecType(secTypePlain); + if (isItemChecked(IDC_ENC_TLS)) + security->EnableSecType(secTypeTLSPlain); + if (isItemChecked(IDC_ENC_X509)) + security->EnableSecType(secTypeX509Plain); + } else { + security->DisableSecType(secTypePlain); + security->DisableSecType(secTypeTLSPlain); + security->DisableSecType(secTypeX509Plain); + } break; + default: throw rdr::Exception("Unhandled action in SecurityPage"); } @@ -485,7 +579,7 @@ private: setItemChecked(id, false); } }; - +#endif OptionsDialog::OptionsDialog() : visible(false) { } @@ -506,7 +600,9 @@ bool OptionsDialog::showDialog(CConn* view, bool capture) { InputsPage inputsPage(&info); pages.push_back(&inputsPage); MiscPage miscPage(&info); pages.push_back(&miscPage); DefaultsPage defPage(&info); if (view) pages.push_back(&defPage); +#ifdef HAVE_GNUTLS SecurityPage secPage(&info, view->security); pages.push_back(&secPage); +#endif // Show the property sheet ViewerOptions dialog(info, pages); -- 2.39.5