summaryrefslogtreecommitdiff
path: root/libproxy/modules/config_w32reg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libproxy/modules/config_w32reg.cpp')
-rw-r--r--libproxy/modules/config_w32reg.cpp174
1 files changed, 0 insertions, 174 deletions
diff --git a/libproxy/modules/config_w32reg.cpp b/libproxy/modules/config_w32reg.cpp
deleted file mode 100644
index 675c755..0000000
--- a/libproxy/modules/config_w32reg.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 Nathaniel McCallum <nathaniel@natemccallum.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- ******************************************************************************/
-
-#include <algorithm>
-#include "../extension_config.hpp"
-using namespace libproxy;
-
-#define W32REG_OFFSET_PAC (1 << 2)
-#define W32REG_OFFSET_WPAD (1 << 3)
-#define W32REG_BASEKEY "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
-#define W32REG_BUFFLEN 1024
-
-static bool get_registry(const char *key, const char *name, char **sval, uint32_t *slen, uint32_t *ival) {
- HKEY hkey;
- LONG result;
- DWORD type;
- DWORD buflen = W32REG_BUFFLEN;
- BYTE buffer[W32REG_BUFFLEN];
-
- // Don't allow the caller to specify both sval and ival
- if (sval && ival)
- return false;
-
- // Open the key
- if (RegOpenKeyExA(HKEY_CURRENT_USER, key, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
- return false;
-
- // Read the value
- result = RegQueryValueExA(hkey, name, NULL, &type, buffer, &buflen);
-
- // Close the key
- RegCloseKey(hkey);
-
- // Evaluate
- if (result != ERROR_SUCCESS)
- return false;
- switch (type)
- {
- case REG_BINARY:
- case REG_EXPAND_SZ:
- case REG_SZ:
- if (!sval) return false;
- if (slen) *slen = buflen;
- *sval = new char[buflen];
- return memcpy(*sval, buffer, buflen) != NULL;
- case REG_DWORD:
- if (ival) return memcpy(ival, buffer, buflen < sizeof(uint32_t) ? buflen : sizeof(uint32_t)) != NULL;
- }
- return false;
-}
-
-static bool is_enabled(uint8_t type) {
- char *data = NULL;
- uint32_t dlen = 0;
- bool result = false;
-
- // Get the binary value DefaultConnectionSettings
- if (!get_registry(W32REG_BASEKEY "\\Connections", "DefaultConnectionSettings", &data, &dlen, NULL))
- return false;
-
- // WPAD and PAC are contained in the 9th value
- if (dlen >= 9)
- result = (data[8] & type) == type; // Check to see if the bit is set
-
- delete data;
- return result;
-}
-
-static map<string, string> parse_manual(string data) {
- // ProxyServer comes in two formats:
- // 1.2.3.4:8080 or ftp=1.2.3.4:8080;https=1.2.3.4:8080...
- map<string, string> rval;
-
- // If we have the second format, do recursive parsing,
- // then handle just the first entry
- if (data.find(";") != string::npos) {
- rval = parse_manual(data.substr(data.find(";")+1));
- data = data.substr(0, data.find(";"));
- }
-
- // If we have the first format, just assign HTTP and we're done
- if (data.find("=") == string::npos) {
- rval["http"] = string("http://") + data;
- return rval;
- }
-
- // Otherwise set the value for this single entry and return
- string protocol = data.substr(0, data.find("="));
- try { rval[protocol] = url(protocol + "://" + data.substr(data.find("=")+1)).to_string(); }
- catch (parse_error&) {}
-
- return rval;
-}
-
-class w32reg_config_extension : public config_extension {
-public:
- vector<url> get_config(const url &dst) {
- char *tmp = NULL;
- uint32_t enabled = 0;
- vector<url> response;
-
- // WPAD
- if (is_enabled(W32REG_OFFSET_WPAD)) {
- response.push_back(url("wpad://"));
- return response;
- }
-
- // PAC
- if (is_enabled(W32REG_OFFSET_PAC) &&
- get_registry(W32REG_BASEKEY, "AutoConfigURL", &tmp, NULL, NULL) &&
- url::is_valid(string("pac+") + tmp)) {
- response.push_back(url(string("pac+") + tmp));
- delete tmp;
- return response;
- }
-
- // Manual proxy
- // Check to see if we are enabled and get the value of ProxyServer
- if (get_registry(W32REG_BASEKEY, "ProxyEnable", NULL, NULL, &enabled) && enabled &&
- get_registry(W32REG_BASEKEY, "ProxyServer", &tmp, NULL, NULL)) {
- map<string, string> manual = parse_manual(tmp);
- delete tmp;
-
- // First we look for an exact match
- if (manual.find(dst.get_scheme()) != manual.end())
- response.push_back(manual[dst.get_scheme()]);
-
- // Next we look for http
- else if (manual.find("http") != manual.end())
- response.push_back(manual["http"]);
-
- // Last we look for socks
- else if (manual.find("socks") != manual.end())
- response.push_back(manual["socks"]);
-
- return response;
- }
-
- // Direct
- response.push_back(url("direct://"));
- return response;
- }
-
- string get_ignore(const url &dst) {
- char *tmp;
- if (get_registry(W32REG_BASEKEY, "ProxyOverride", &tmp, NULL, NULL)) {
- string po = tmp;
- delete tmp;
- const char windowsDelimiter = ';';
- const char libproxyDelimiter = ',';
- replace(po.begin(), po.end(), windowsDelimiter, libproxyDelimiter );
- if (po.length()>0)
- return po;
- }
- return "";
- }
-};
-
-MM_MODULE_INIT_EZ(w32reg_config_extension, true, NULL, NULL);