[Development] Add "Security" options dialog for Windows viewer.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4215 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/win/vncviewer/OptionsDialog.cxx b/win/vncviewer/OptionsDialog.cxx
index c2c2fc9..b3d72f2 100644
--- a/win/vncviewer/OptionsDialog.cxx
+++ b/win/vncviewer/OptionsDialog.cxx
@@ -26,9 +26,14 @@
#include <rfb/CConnection.h>
#include <commdlg.h>
#include <rfb/LogWriter.h>
+#include <rfb/Security.h>
+#include <list>
+
+using namespace rdr;
using namespace rfb;
using namespace rfb::win32;
+using namespace std;
static LogWriter vlog("Options");
@@ -349,6 +354,138 @@
OptionsInfo* dlg;
};
+class SecurityPage : public PropSheetPage {
+public:
+ SecurityPage(OptionsInfo* dlg_, Security *security_)
+ : PropSheetPage(GetModuleHandle(0), MAKEINTRESOURCE(IDD_SECURITY)),
+ dlg(dlg_), security(security_) {
+ }
+ virtual void initDialog() {
+ enableVeNCryptFeatures(false);
+
+ /* Process non-VeNCrypt sectypes */
+ list<U8> secTypes = security->GetEnabledSecTypes();
+ list<U8>::iterator i;
+
+ 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;
+ }
+ }
+
+ /* Process VeNCrypt subtypes */
+ if (isItemChecked(IDC_VENCRYPT)) {
+ list<U32> secTypesExt = security->GetEnabledExtSecTypes();
+ list<U32>::iterator iext;
+ for (iext = secTypesExt.begin(); iext != secTypesExt.end(); iext++) {
+ switch (*iext) {
+ case secTypePlain:
+ setItemChecked(IDC_ENC_NONE, true);
+ setItemChecked(IDC_AUTH_PLAIN, true);
+ break;
+ case secTypeTLSNone:
+ setItemChecked(IDC_ENC_TLS, true);
+ setItemChecked(IDC_AUTH_NONE, true);
+ break;
+ case secTypeTLSVnc:
+ setItemChecked(IDC_ENC_TLS, true);
+ setItemChecked(IDC_AUTH_VNC, true);
+ break;
+ case secTypeTLSPlain:
+ setItemChecked(IDC_ENC_TLS, true);
+ setItemChecked(IDC_AUTH_PLAIN, true);
+ break;
+ case secTypeX509None:
+ setItemChecked(IDC_ENC_X509, true);
+ setItemChecked(IDC_AUTH_NONE, true);
+ enableItem(IDC_LOAD_CACERT, true);
+ enableItem(IDC_LOAD_CRLCERT, true);
+ break;
+ case secTypeX509Vnc:
+ setItemChecked(IDC_ENC_X509, true);
+ setItemChecked(IDC_AUTH_VNC, true);
+ enableItem(IDC_LOAD_CACERT, true);
+ enableItem(IDC_LOAD_CRLCERT, true);
+ break;
+ case secTypeX509Plain:
+ setItemChecked(IDC_ENC_X509, true);
+ setItemChecked(IDC_AUTH_PLAIN, true);
+ enableItem(IDC_LOAD_CACERT, true);
+ enableItem(IDC_LOAD_CRLCERT, true);
+ break;
+ }
+ }
+ }
+ }
+ virtual bool onCommand(int id, int cmd) {
+ switch (id) {
+ case IDC_VENCRYPT:
+ enableVeNCryptFeatures(isItemChecked(IDC_VENCRYPT));
+ break;
+ case IDC_ENC_NONE:
+ break;
+ case IDC_ENC_TLS:
+ break;
+ case IDC_ENC_X509:
+ if (isItemChecked(IDC_ENC_X509)) {
+ enableItem(IDC_LOAD_CACERT, true);
+ enableItem(IDC_LOAD_CRLCERT, true);
+ } else {
+ enableItem(IDC_LOAD_CACERT, false);
+ enableItem(IDC_LOAD_CRLCERT, false);
+ }
+ break;
+ case IDC_LOAD_CACERT:
+ break;
+ case IDC_LOAD_CRLCERT:
+ break;
+ case IDC_AUTH_NONE:
+ break;
+ case IDC_AUTH_VNC:
+ break;
+ case IDC_AUTH_PLAIN:
+ break;
+ default:
+ throw rdr::Exception("Unhandled action in SecurityPage");
+ }
+ return true;
+ }
+protected:
+ OptionsInfo* dlg;
+private:
+ Security *security;
+
+ void enableVeNCryptFeatures(bool enable) {
+ if (enable) {
+ enableItem(IDC_ENC_TLS, true);
+ enableItem(IDC_ENC_X509, true);
+ enableItem(IDC_AUTH_PLAIN, true);
+ } else {
+ disableFeature(IDC_ENC_TLS);
+ disableFeature(IDC_ENC_X509);
+ disableFeature(IDC_AUTH_PLAIN);
+ enableItem(IDC_LOAD_CACERT, false);
+ enableItem(IDC_LOAD_CRLCERT, false);
+ }
+ }
+
+ void disableFeature(int id) {
+ enableItem(id, false);
+ setItemChecked(id, false);
+ }
+};
+
OptionsDialog::OptionsDialog() : visible(false) {
}
@@ -369,6 +506,7 @@
InputsPage inputsPage(&info); pages.push_back(&inputsPage);
MiscPage miscPage(&info); pages.push_back(&miscPage);
DefaultsPage defPage(&info); if (view) pages.push_back(&defPage);
+ SecurityPage secPage(&info, view->security); pages.push_back(&secPage);
// Show the property sheet
ViewerOptions dialog(info, pages);