aboutsummaryrefslogtreecommitdiffstats
path: root/vncconfig/vncconfig.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vncconfig/vncconfig.cxx')
-rw-r--r--vncconfig/vncconfig.cxx193
1 files changed, 193 insertions, 0 deletions
diff --git a/vncconfig/vncconfig.cxx b/vncconfig/vncconfig.cxx
new file mode 100644
index 00000000..2a98dbca
--- /dev/null
+++ b/vncconfig/vncconfig.cxx
@@ -0,0 +1,193 @@
+/* Copyright (C) 2002-2004 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.
+ */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <commctrl.h>
+#include <string.h>
+#ifdef WIN32
+#define strcasecmp _stricmp
+#endif
+
+#include "resource.h"
+#include <rfb/Logger_stdio.h>
+#include <rfb/LogWriter.h>
+#include <rfb/SSecurityFactoryStandard.h>
+#include <rfb_win32/Dialog.h>
+#include <rfb_win32/RegConfig.h>
+#include <rfb_win32/CurrentUser.h>
+
+using namespace rfb;
+using namespace rfb::win32;
+
+static LogWriter vlog("main");
+
+
+#include <vncconfig/Authentication.h>
+#include <vncconfig/Connections.h>
+#include <vncconfig/Sharing.h>
+#include <vncconfig/Hooking.h>
+#include <vncconfig/Inputs.h>
+#include <vncconfig/Legacy.h>
+#include <vncconfig/Desktop.h>
+
+
+TStr rfb::win32::AppName("VNC Config");
+
+
+VncAuthPasswdConfigParameter vncAuthPasswd;
+
+#ifdef _DEBUG
+BoolParameter captureDialogs("CaptureDialogs", "", false);
+#endif
+
+HKEY configKey = HKEY_CURRENT_USER;
+
+
+void
+processParams(int argc, char* argv[]) {
+ for (int i=1; i<argc; i++) {
+ if (strcasecmp(argv[i], "-service") == 0) {
+ configKey = HKEY_LOCAL_MACHINE;
+ } else if (strcasecmp(argv[i], "-user") == 0) {
+ configKey = HKEY_CURRENT_USER;
+ } else {
+ // Try to process <option>=<value>, or -<bool>
+ if (Configuration::setParam(argv[i], true))
+ continue;
+ // Try to process -<option> <value>
+ if ((argv[i][0] == '-') && (i+1 < argc)) {
+ if (Configuration::setParam(&argv[i][1], argv[i+1], true)) {
+ i++;
+ continue;
+ }
+ }
+ }
+ }
+}
+
+
+int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, char* cmdLine, int cmdShow) {
+
+ // Configure debugging output
+#ifdef _DEBUG
+ AllocConsole();
+ freopen("CONIN$","rb",stdin);
+ freopen("CONOUT$","wb",stdout);
+ freopen("CONOUT$","wb",stderr);
+ setbuf(stderr, 0);
+ initStdIOLoggers();
+ LogWriter vlog("main");
+ logParams.setParam("*:stderr:100");
+ vlog.info("Starting vncconfig applet");
+#endif
+
+ try {
+ try {
+ // Process command-line args
+ int argc = __argc;
+ char** argv = __argv;
+ processParams(argc, argv);
+
+ /* *** Required if we wish to use IP address control
+ INITCOMMONCONTROLSEX icce;
+ icce.dwSize = sizeof(icce);
+ icce.dwICC = ICC_INTERNET_CLASSES;
+ InitCommonControlsEx(&icce);
+ */
+
+ // Create the required configuration registry key
+ RegKey rootKey;
+ rootKey.createKey(configKey, _T("Software\\RealVNC\\WinVNC4"));
+
+ // Override whatever security it already had (NT only)
+ bool warnOnChangePassword = false;
+ try {
+ AccessEntries access;
+ Sid adminSID = Sid::Administrators();
+ Sid systemSID = Sid::SYSTEM();
+ access.addEntry(adminSID, KEY_ALL_ACCESS, GRANT_ACCESS);
+ access.addEntry(systemSID, KEY_ALL_ACCESS, GRANT_ACCESS);
+ UserName user;
+ if (configKey == HKEY_CURRENT_USER)
+ access.addEntry(user.buf, KEY_ALL_ACCESS, GRANT_ACCESS);
+ AccessControlList acl = CreateACL(access);
+
+ // Set the DACL, and don't allow the key to inherit its parent's DACL
+ rootKey.setDACL(acl, false);
+ } catch (rdr::SystemException& e) {
+ // Something weird happens on NT 4.0 SP5 but I can't reproduce it on other
+ // NT 4.0 service pack revisions.
+ if (e.err == ERROR_INVALID_PARAMETER) {
+ MsgBox(0, _T("Windows reported an error trying to secure the VNC Server settings for this user. ")
+ _T("Your settings may not be secure!"), MB_ICONWARNING | MB_OK);
+ } else if (e.err != ERROR_CALL_NOT_IMPLEMENTED &&
+ e.err != ERROR_NOT_LOGGED_ON) {
+ // If the call is not implemented, ignore the error and continue
+ // If we are on Win9x and no user is logged on, ignore error and continue
+ throw;
+ }
+ warnOnChangePassword = true;
+ }
+
+ // Start the RegConfig reader, to load in existing settings
+ RegistryReader config;
+ config.setKey(configKey, _T("Software\\RealVNC\\WinVNC4"));
+
+ // Build the dialog
+ std::list<PropSheetPage*> pages;
+ AuthenticationPage auth(rootKey); pages.push_back(&auth);
+ auth.setWarnPasswdInsecure(warnOnChangePassword);
+ ConnectionsPage conn(rootKey); pages.push_back(&conn);
+ InputsPage inputs(rootKey); pages.push_back(&inputs);
+ SharingPage sharing(rootKey); pages.push_back(&sharing);
+ DesktopPage desktop(rootKey); pages.push_back(&desktop);
+ HookingPage hooks(rootKey); pages.push_back(&hooks);
+ LegacyPage legacy(rootKey, configKey == HKEY_CURRENT_USER); pages.push_back(&legacy);
+
+ // Load the default icon to use
+ HICON icon = (HICON)LoadImage(inst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_SHARED);
+
+ // Create the PropertySheet handler
+ TCHAR* propSheetTitle = _T("VNC Server Properties (Service-Mode)");
+ if (configKey == HKEY_CURRENT_USER)
+ propSheetTitle = _T("VNC Server Properties (User-Mode)");
+ PropSheet sheet(inst, propSheetTitle, pages, icon);
+
+#ifdef _DEBUG
+ vlog.debug("capture dialogs=%s", captureDialogs ? "true" : "false");
+ sheet.showPropSheet(0, true, false, captureDialogs);
+#else
+ sheet.showPropSheet(0, true, false);
+#endif
+
+ return 0;
+ } catch (rdr::SystemException& e) {
+ switch (e.err) {
+ case ERROR_ACCESS_DENIED:
+ MsgBox(0, _T("You do not have sufficient access rights to run the VNC Configuration applet"),
+ MB_ICONSTOP | MB_OK);
+ return 1;
+ };
+ throw;
+ }
+ } catch (rdr::Exception& e) {
+ MsgBox(NULL, TStr(e.str()), MB_ICONEXCLAMATION | MB_OK);
+ return 1;
+ }
+}