wfreerdp-server: add configurable server keys
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Fri, 7 Sep 2012 02:33:36 +0000 (04:33 +0200)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Fri, 7 Sep 2012 02:33:36 +0000 (04:33 +0200)
server/Windows/wfreerdp.c

index fa12f65..bcda73c 100644 (file)
@@ -93,6 +93,80 @@ static DWORD WINAPI wf_peer_socket_listener(LPVOID lpParam)
        return 0;\r
 }\r
 \r
+static void wf_peer_read_settings(freerdp_peer* client)\r
+{\r
+       HKEY hKey;\r
+       int length;\r
+       LONG status;\r
+       DWORD dwType;\r
+       DWORD dwSize;\r
+       TCHAR* PrivateKeyFile;\r
+       TCHAR* CertificateFile;\r
+       char* PrivateKeyFileA;\r
+       char* CertificateFileA;\r
+\r
+       PrivateKeyFile = CertificateFile = NULL;\r
+\r
+       status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\FreeRDP\\Server"), 0, KEY_READ | KEY_WOW64_64KEY, &hKey);\r
+\r
+       if (status != ERROR_SUCCESS)\r
+               return;\r
+\r
+       status = RegQueryValueEx(hKey, _T("CertificateFile"), NULL, &dwType, NULL, &dwSize);\r
+\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               CertificateFile = (LPTSTR) malloc(dwSize + sizeof(TCHAR));\r
+               status = RegQueryValueEx(hKey, _T("CertificateFile"), NULL, &dwType, (BYTE*) CertificateFile, &dwSize);\r
+       }\r
+\r
+       status = RegQueryValueEx(hKey, _T("PrivateKeyFile"), NULL, &dwType, NULL, &dwSize);\r
+\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               PrivateKeyFile = (LPTSTR) malloc(dwSize + sizeof(TCHAR));\r
+               status = RegQueryValueEx(hKey, _T("PrivateKeyFile"), NULL, &dwType, (BYTE*) PrivateKeyFile, &dwSize);\r
+       }\r
+\r
+       if (CertificateFile)\r
+       {\r
+#ifdef UNICODE\r
+               length = WideCharToMultiByte(CP_UTF8, 0, CertificateFile, lstrlenW(CertificateFile), NULL, 0, NULL, NULL);\r
+               CertificateFileA = (char*) malloc(length + 1);\r
+               WideCharToMultiByte(CP_UTF8, 0, CertificateFile, lstrlenW(CertificateFile), CertificateFileA, length, NULL, NULL);\r
+               CertificateFileA[length] = '\0';\r
+               free(CertificateFile);\r
+#else\r
+               CertificateFileA = (char*) CertificateFile;\r
+#endif\r
+               client->settings->cert_file = CertificateFileA;\r
+       }\r
+       else\r
+       {\r
+               client->settings->cert_file = _strdup("server.crt");\r
+       }\r
+\r
+       if (PrivateKeyFile)\r
+       {\r
+#ifdef UNICODE\r
+               length = WideCharToMultiByte(CP_UTF8, 0, PrivateKeyFile, lstrlenW(PrivateKeyFile), NULL, 0, NULL, NULL);\r
+               PrivateKeyFileA = (char*) malloc(length + 1);\r
+               WideCharToMultiByte(CP_UTF8, 0, PrivateKeyFile, lstrlenW(PrivateKeyFile), PrivateKeyFileA, length, NULL, NULL);\r
+               PrivateKeyFileA[length] = '\0';\r
+               free(PrivateKeyFile);\r
+#else\r
+               PrivateKeyFileA = (char*) PrivateKeyFile;\r
+#endif\r
+               client->settings->privatekey_file = PrivateKeyFileA;\r
+       }\r
+       else\r
+       {\r
+               client->settings->privatekey_file = _strdup("server.key");\r
+       }\r
+\r
+       RegCloseKey(hKey);\r
+}\r
+\r
 static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)\r
 {\r
        DWORD nCount;\r
@@ -103,8 +177,8 @@ static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)
        wf_peer_init(client);\r
 \r
        /* Initialize the real server settings here */\r
-       client->settings->cert_file = xstrdup("server.crt");\r
-       client->settings->privatekey_file = xstrdup("server.key");\r
+\r
+       wf_peer_read_settings(client);\r
 \r
        client->PostConnect = wf_peer_post_connect;\r
        client->Activate = wf_peer_activate;\r