summaryrefslogtreecommitdiff
path: root/ucbhelper
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2018-06-28 16:19:51 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2018-06-29 08:26:39 +0200
commit0e375686e2f2c6c626f50c06c5323c0982d7f602 (patch)
treed7e5b67c874f992e0a233e2351a4237d27b59e98 /ucbhelper
parentffa431d2bfe9058571ad6bb6db43c3b857754ced (diff)
tdf#114227 Add support for OS proxy to ucbhelper::InternetProxyDecider on Unix
Also make m_nProxyType a scoped enum so the code is a little easier to follow. Change-Id: Ic2862a1de8fe1005c4fb25147b3effc49b95140c Reviewed-on: https://gerrit.libreoffice.org/56599 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'ucbhelper')
-rw-r--r--ucbhelper/source/client/proxydecider.cxx63
1 files changed, 51 insertions, 12 deletions
diff --git a/ucbhelper/source/client/proxydecider.cxx b/ucbhelper/source/client/proxydecider.cxx
index fdf4506add26..080e176863ab 100644
--- a/ucbhelper/source/client/proxydecider.cxx
+++ b/ucbhelper/source/client/proxydecider.cxx
@@ -118,12 +118,14 @@ public:
class InternetProxyDecider_Impl :
public cppu::WeakImplHelper< util::XChangesListener >
{
+ // see officecfg/registry/schema/org/openoffice/Inet.xcs for the definition of these values
+ enum class ProxyType { NoProxy, Automatic, Manual };
mutable osl::Mutex m_aMutex;
InternetProxyServer m_aHttpProxy;
InternetProxyServer m_aHttpsProxy;
InternetProxyServer m_aFtpProxy;
const InternetProxyServer m_aEmptyProxy;
- sal_Int32 m_nProxyType;
+ ProxyType m_nProxyType;
uno::Reference< util::XChangesNotifier > m_xNotifier;
std::vector< NoProxyListEntry > m_aNoProxyList;
mutable HostnameCache m_aHostnames;
@@ -284,7 +286,7 @@ bool getConfigInt32Value(
InternetProxyDecider_Impl::InternetProxyDecider_Impl(
const uno::Reference< uno::XComponentContext >& rxContext )
- : m_nProxyType( 0 ),
+ : m_nProxyType( ProxyType::NoProxy ),
m_aHostnames()
{
try
@@ -317,8 +319,10 @@ InternetProxyDecider_Impl::InternetProxyDecider_Impl(
if ( xNameAccess.is() )
{
// *** Proxy type ***
+ sal_Int32 tmp = 0;
getConfigInt32Value(
- xNameAccess, PROXY_TYPE_KEY, m_nProxyType );
+ xNameAccess, PROXY_TYPE_KEY, tmp );
+ m_nProxyType = static_cast<ProxyType>(tmp);
// *** No proxy list ***
OUString aNoProxyList;
@@ -435,9 +439,9 @@ bool InternetProxyDecider_Impl::shouldUseProxy( const OUString & rHost,
return true;
}
-#ifdef _WIN32
namespace
{
+#ifdef _WIN32
struct GetPACProxyData
{
const OUString& m_rProtocol;
@@ -563,8 +567,40 @@ InternetProxyServer GetPACProxy(const OUString& rProtocol, const OUString& rHost
}
return aData.m_ProxyServer;
}
+
+#else // .. _WIN32
+
+// Read the settings from the OS which are stored in env vars
+//
+InternetProxyServer GetUnixSystemProxy(const OUString & rProtocol,
+ const OUString & /*rHost*/,
+ sal_Int32 /*nPort*/)
+{
+ // TODO this could be improved to read the "no_proxy" env variable
+ InternetProxyServer aProxy;
+ OUString protocolLower = rProtocol.toAsciiLowerCase() + "_proxy";
+ OString protocolLowerStr = OUStringToOString( protocolLower, RTL_TEXTENCODING_ASCII_US );
+ const char* pEnvProxy = getenv(protocolLowerStr.getStr());
+ if (!pEnvProxy)
+ return aProxy;
+ // expecting something like "https://example.ct:80"
+ OUString tmp = OUString::createFromAscii(pEnvProxy);
+ if (tmp.getLength() < (rProtocol.getLength() + 3))
+ return aProxy;
+ tmp = tmp.copy(rProtocol.getLength() + 3);
+ sal_Int32 x = tmp.indexOf(':');
+ if (x == -1)
+ return aProxy;
+ int nPort = tmp.copy(x + 1).toInt32();
+ if (nPort == 0)
+ return aProxy;
+ aProxy.aName = tmp.copy(0, x);
+ aProxy.nPort = nPort;
+ return aProxy;
+}
+
+#endif // else .. _WIN32
}
-#endif // _WIN32
InternetProxyServer InternetProxyDecider_Impl::getProxy(
const OUString & rProtocol,
@@ -573,22 +609,23 @@ InternetProxyServer InternetProxyDecider_Impl::getProxy(
{
osl::Guard< osl::Mutex > aGuard( m_aMutex );
- if ( m_nProxyType == 0 )
+ if ( m_nProxyType == ProxyType::NoProxy )
{
// Never use proxy.
return m_aEmptyProxy;
}
-#ifdef _WIN32
// If get from system
- if (m_nProxyType == 1 && !rHost.isEmpty())
+ if (m_nProxyType == ProxyType::Automatic && !rHost.isEmpty())
{
+#ifdef _WIN32
InternetProxyServer aProxy(GetPACProxy(rProtocol, rHost, nPort));
+#else
+ InternetProxyServer aProxy(GetUnixSystemProxy(rProtocol, rHost, nPort));
+#endif // _WIN32
if (!aProxy.aName.isEmpty())
return aProxy;
}
-#endif // _WIN32
-
if ( !rHost.isEmpty() && !m_aNoProxyList.empty() )
{
@@ -667,7 +704,6 @@ InternetProxyServer InternetProxyDecider_Impl::getProxy(
return m_aEmptyProxy;
}
-
// virtual
void SAL_CALL InternetProxyDecider_Impl::changesOccurred(
const util::ChangesEvent& Event )
@@ -687,11 +723,14 @@ void SAL_CALL InternetProxyDecider_Impl::changesOccurred(
{
if ( aKey == PROXY_TYPE_KEY )
{
- if ( !( rElem.Element >>= m_nProxyType ) )
+ sal_Int32 tmp;
+ if ( !( rElem.Element >>= tmp ) )
{
OSL_FAIL( "InternetProxyDecider - changesOccurred - "
"Error getting config item value!" );
}
+ else
+ m_nProxyType = static_cast<ProxyType>(tmp);
}
else if ( aKey == NO_PROXY_LIST_KEY )
{