aboutsummaryrefslogtreecommitdiff
path: root/ieproxy.c
diff options
context:
space:
mode:
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>2005-12-08 23:10:22 +0000
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>2005-12-08 23:10:22 +0000
commitdf5722cc68307206c5edcc94fd7ae333d3212b59 (patch)
tree6cf9b42be4660ac58cb61c76276f28f140b44b25 /ieproxy.c
parentInline file capability now works for (diff)
downloadopenvpn-df5722cc68307206c5edcc94fd7ae333d3212b59.tar.xz
First attempt at automatic proxy detection,
Windows-only at this point. Proxy settings are taken from IE. git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@846 e7ae566f-a301-0410-adde-c780ea21d3b5
Diffstat (limited to 'ieproxy.c')
-rwxr-xr-xieproxy.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/ieproxy.c b/ieproxy.c
new file mode 100755
index 0000000..42b067b
--- /dev/null
+++ b/ieproxy.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2004 Ewan Bhamrah Harley <code@ewan.info>
+ *
+ * This program 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 program 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 program (see the file COPYING included with this
+ * distribution); if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <WinInet.h>
+#include <malloc.h>
+
+LPCTSTR getIeHttpProxyError=NULL;
+
+/* getIeHttpProxy fetches the current IE proxy settings for http */
+
+LPCTSTR getIeHttpProxy()
+{
+ DWORD psize=0;
+ INTERNET_PROXY_INFO *pinfo;
+ LPTSTR proxyString;
+ LPTSTR p;
+ LPTSTR q;
+ unsigned int len;
+
+ /* first see how big a buffer we need for the IPO structure */
+ InternetQueryOption(NULL, INTERNET_OPTION_PROXY, NULL, &psize);
+ if(!psize)
+ {
+ getIeHttpProxyError="InternetQueryOption failed to return buffer size";
+ return(NULL);
+ }
+
+ /* allocate memory for IPO */
+ pinfo = malloc (psize*sizeof(TCHAR));
+ if (pinfo == NULL)
+ {
+ getIeHttpProxyError="malloc failed (1)";
+ return(NULL);
+ }
+
+ /* now run the real query */
+ if(!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, (LPVOID) pinfo, &psize))
+ {
+ getIeHttpProxyError="InternetQueryOption() failed to find proxy info";
+ free(pinfo);
+ return(NULL);
+ }
+
+
+ /* see what sort of result we got */
+
+ if(pinfo->dwAccessType == INTERNET_OPEN_TYPE_DIRECT)
+ {
+ /* No proxy configured */
+ free(pinfo);
+ return("");
+ }
+ else if(pinfo->dwAccessType == INTERNET_OPEN_TYPE_PROXY)
+ {
+ /* we have a proxy - now parse result string */
+ /* if result string does NOT contain an '=' sign then */
+ /* there is a single proxy for all protocols */
+ for (p=(LPTSTR)pinfo->lpszProxy; *p && *p != '='; p++);
+ if(!*p)
+ {
+ /* single proxy */
+ /* allocate a new string to return */
+ len = 1+strlen(pinfo->lpszProxy);
+ proxyString = malloc (len*sizeof(TCHAR));
+ if (proxyString == NULL)
+ {
+ getIeHttpProxyError="malloc failed (2)";
+ free(pinfo);
+ return(NULL);
+ }
+ strncpy(proxyString, pinfo->lpszProxy,len);
+ proxyString[len]=0;
+ free(pinfo);
+ return(proxyString);
+ }
+ else
+ {
+ /* multiple space seperated proxies defined in the form */
+ /* protocol=proxyhost[:port] */
+ /* we want the one marked "http=", if any. */
+ p=(LPTSTR)pinfo->lpszProxy;
+ while(*p && strncmp(p, "http=", 5))
+ {
+ for(; *p && *p != ' '; p++);
+ if(*p) p++;
+ }
+ if(*p)
+ {
+ /* found the proxy */
+ p+=5;
+ for(q=p; *q && *q != ' '; q++);
+ /* allocate a buffer for the proxy information */
+ len=1+(q-p);
+ proxyString=malloc(len*sizeof(TCHAR));
+ if(proxyString==NULL)
+ {
+ getIeHttpProxyError="malloc failed (3)";
+ free(pinfo);
+ return(NULL);
+ }
+ strncpy(proxyString, p, len);
+ proxyString[len]=0;
+ free(pinfo);
+ return(proxyString);
+ }
+ else
+ {
+ /* No http proxy in list */
+ free(pinfo);
+ return("");
+ }
+ }
+ }
+ else
+ {
+ /* InternetQueryOption returned a proxy type we don't know about*/
+ getIeHttpProxyError="Unknown Proxy Type";
+ free(pinfo);
+ return(NULL);
+ }
+}