Commit bbf222ca authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

wininet: Add support for reading connection settings binary blobs from registry.

parent fac555fe
...@@ -643,6 +643,79 @@ static WCHAR *get_http_proxy( const WCHAR *proxy ) ...@@ -643,6 +643,79 @@ static WCHAR *get_http_proxy( const WCHAR *proxy )
return ret; return ret;
} }
static LONG connection_settings_read( const connection_settings *settings, DWORD *pos, DWORD size, WCHAR **str)
{
int len, wlen;
*str = NULL;
if (*pos + sizeof(int) >= size)
return ERROR_SUCCESS;
memcpy( &len, settings->data + *pos, sizeof(int) );
*pos += sizeof(int);
if (*pos + len >= size)
{
*pos = size;
return ERROR_SUCCESS;
}
wlen = MultiByteToWideChar( CP_UTF8, 0, (const char *)settings->data + *pos, len, NULL, 0 );
if (wlen)
{
*str = malloc( (wlen + 1) * sizeof(WCHAR) );
if (!*str)
{
*pos = size;
return ERROR_OUTOFMEMORY;
}
MultiByteToWideChar( CP_UTF8, 0, (const char *)settings->data + *pos, len, *str, wlen );
(*str)[wlen] = 0;
*pos += len;
}
return ERROR_SUCCESS;
}
static LONG load_connection_settings( HKEY key, const WCHAR *connection, proxyinfo_t *lpwpi )
{
connection_settings *settings = NULL;
DWORD type, pos, size = 0;
LONG res;
while ((res = RegQueryValueExW( key, connection, NULL, &type, (BYTE*)settings, &size )) == ERROR_MORE_DATA ||
(!res && !settings))
{
connection_settings *new_settings = realloc(settings, size);
if(!new_settings)
{
free( settings );
return ERROR_OUTOFMEMORY;
}
settings = new_settings;
}
memset(lpwpi, 0, sizeof(*lpwpi));
if (res || type != REG_BINARY || size < FIELD_OFFSET( connection_settings, data ))
{
lpwpi->flags |= PROXY_TYPE_DIRECT | PROXY_TYPE_AUTO_DETECT;
free( settings );
return ERROR_SUCCESS;
}
lpwpi->flags = settings->flags;
size -= FIELD_OFFSET( connection_settings, data );
pos = 0;
res = connection_settings_read( settings, &pos, size, &lpwpi->proxy );
if (!res)
res = connection_settings_read( settings, &pos, size, &lpwpi->proxyBypass );
if (!res)
res = connection_settings_read( settings, &pos, size, &lpwpi->autoconf_url );
if (res)
{
FreeProxyInfo( lpwpi );
return res;
}
return ERROR_SUCCESS;
}
/*********************************************************************** /***********************************************************************
* INTERNET_LoadProxySettings * INTERNET_LoadProxySettings
* *
...@@ -657,7 +730,7 @@ static WCHAR *get_http_proxy( const WCHAR *proxy ) ...@@ -657,7 +730,7 @@ static WCHAR *get_http_proxy( const WCHAR *proxy )
static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi )
{ {
DWORD type, len, val; DWORD type, len, val;
HKEY key; HKEY key, con;
LONG ret; LONG ret;
memset( lpwpi, 0, sizeof(*lpwpi) ); memset( lpwpi, 0, sizeof(*lpwpi) );
...@@ -665,19 +738,30 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) ...@@ -665,19 +738,30 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi )
if ((ret = RegOpenKeyW( HKEY_CURRENT_USER, szInternetSettings, &key ))) if ((ret = RegOpenKeyW( HKEY_CURRENT_USER, szInternetSettings, &key )))
return ret; return ret;
if (!(ret = RegOpenKeyW( key, L"Connections", &con )))
{
load_connection_settings( con, L"DefaultConnectionSettings", lpwpi );
RegCloseKey( con );
}
len = sizeof(DWORD); len = sizeof(DWORD);
if (RegQueryValueExW( key, L"ProxyEnable", NULL, &type, (BYTE *)&val, &len ) || type != REG_DWORD) if (RegQueryValueExW( key, L"ProxyEnable", NULL, &type, (BYTE *)&val, &len ) || type != REG_DWORD)
{ {
val = 0; val = !!(lpwpi->flags & PROXY_TYPE_PROXY);
if((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE *)&val, sizeof(DWORD) ))) if((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE *)&val, sizeof(DWORD) )))
{ {
RegCloseKey( key ); RegCloseKey( key );
FreeProxyInfo( lpwpi );
return ret; return ret;
} }
} }
else if (val)
{
lpwpi->flags |= PROXY_TYPE_PROXY;
}
else else
{ {
lpwpi->flags |= (val ? PROXY_TYPE_PROXY : PROXY_TYPE_DIRECT); lpwpi->flags &= ~PROXY_TYPE_PROXY;
} }
/* figure out how much memory the proxy setting takes */ /* figure out how much memory the proxy setting takes */
...@@ -688,12 +772,18 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) ...@@ -688,12 +772,18 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi )
if (!(szProxy = malloc( len ))) if (!(szProxy = malloc( len )))
{ {
RegCloseKey( key ); RegCloseKey( key );
FreeProxyInfo( lpwpi );
return ERROR_OUTOFMEMORY; return ERROR_OUTOFMEMORY;
} }
RegQueryValueExW( key, L"ProxyServer", NULL, &type, (BYTE*)szProxy, &len ); RegQueryValueExW( key, L"ProxyServer", NULL, &type, (BYTE*)szProxy, &len );
free( lpwpi->proxy );
lpwpi->proxy = szProxy; lpwpi->proxy = szProxy;
TRACE("proxy server (from registry%s) = %s\n", lpwpi->flags & PROXY_TYPE_PROXY ? "" : ", disabled", }
if (lpwpi->proxy)
{
TRACE("proxy (from registry%s) = %s\n", lpwpi->flags & PROXY_TYPE_PROXY ? "" : ", disabled",
debugstr_w(lpwpi->proxy)); debugstr_w(lpwpi->proxy));
} }
else else
...@@ -713,6 +803,7 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) ...@@ -713,6 +803,7 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi )
} }
RegQueryValueExW( key, L"ProxyOverride", NULL, &type, (BYTE*)szProxy, &len ); RegQueryValueExW( key, L"ProxyOverride", NULL, &type, (BYTE*)szProxy, &len );
free( lpwpi->proxyBypass );
lpwpi->proxyBypass = szProxy; lpwpi->proxyBypass = szProxy;
TRACE("http proxy bypass (from registry) = %s\n", debugstr_w(lpwpi->proxyBypass)); TRACE("http proxy bypass (from registry) = %s\n", debugstr_w(lpwpi->proxyBypass));
} }
...@@ -734,6 +825,7 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) ...@@ -734,6 +825,7 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi )
RegQueryValueExW( key, L"AutoConfigURL", NULL, &type, (BYTE*)autoconf_url, &len ); RegQueryValueExW( key, L"AutoConfigURL", NULL, &type, (BYTE*)autoconf_url, &len );
lpwpi->flags |= PROXY_TYPE_AUTO_PROXY_URL; lpwpi->flags |= PROXY_TYPE_AUTO_PROXY_URL;
free( lpwpi->autoconf_url );
lpwpi->autoconf_url = autoconf_url; lpwpi->autoconf_url = autoconf_url;
TRACE("AutoConfigURL = %s\n", debugstr_w(lpwpi->autoconf_url)); TRACE("AutoConfigURL = %s\n", debugstr_w(lpwpi->autoconf_url));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment