diff options
author | Kai Koehne <kai.koehne@theqtcompany.com> | 2014-11-18 15:49:27 +0100 |
---|---|---|
committer | Kai Koehne <kai.koehne@theqtcompany.com> | 2014-11-18 16:21:36 +0100 |
commit | 1f411319e4bb849487a85e8ea051b94417372ff4 (patch) | |
tree | 2441e1e371beffba129d7a8e8303eeabf3ff911a /src/libs/installer/packagemanagerproxyfactory.cpp | |
parent | 6df883de4ae674a9b351f04e74c80bfa89d5faa6 (diff) |
Ask for proxy credentials in modal dialog
If a proxy requires authentication, DownloadFileTask will throw an
exception of type ProxyAuthenticationRequiredException. This exception
is handled in MetadataJob to first ask the user for credentials,
storing them in PackageManagerProxyFactory, and then retriggering
the download.
Change-Id: I0d69504d3f90d503d83c7b2229bc670756fa1463
GPush-Base: 9aeb0197e58d630ef7e657bb05671d6ec7b3f5ec
Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
Diffstat (limited to 'src/libs/installer/packagemanagerproxyfactory.cpp')
-rw-r--r-- | src/libs/installer/packagemanagerproxyfactory.cpp | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/src/libs/installer/packagemanagerproxyfactory.cpp b/src/libs/installer/packagemanagerproxyfactory.cpp index 9456a7015..317b3257f 100644 --- a/src/libs/installer/packagemanagerproxyfactory.cpp +++ b/src/libs/installer/packagemanagerproxyfactory.cpp @@ -37,6 +37,8 @@ #include "packagemanagercore.h" #include "settings.h" +#include <QNetworkProxy> + namespace QInstaller { PackageManagerProxyFactory::PackageManagerProxyFactory(const PackageManagerCore *const core) @@ -46,9 +48,20 @@ PackageManagerProxyFactory::PackageManagerProxyFactory(const PackageManagerCore PackageManagerProxyFactory *PackageManagerProxyFactory::clone() const { - return new PackageManagerProxyFactory(m_core); + PackageManagerProxyFactory *factory = new PackageManagerProxyFactory(m_core); + factory->m_proxyCredentials = m_proxyCredentials; + return factory; } +struct FindProxyCredential { + FindProxyCredential(const QString &host, int port) : host(host), port(port) {} + + bool operator()(const ProxyCredential &c) { return c.host == host && c.port == port; } +private: + QString host; + int port; +}; + QList<QNetworkProxy> PackageManagerProxyFactory::queryProxy(const QNetworkProxyQuery &query) { const Settings &settings = m_core->settings(); @@ -69,15 +82,44 @@ QList<QNetworkProxy> PackageManagerProxyFactory::queryProxy(const QNetworkProxyQ return list << QNetworkProxy(QNetworkProxy::NoProxy); if (query.queryType() == QNetworkProxyQuery::UrlRequest) { - if (query.url().scheme() == QLatin1String("ftp")) - return list << settings.ftpProxy(); + QNetworkProxy proxy; + if (query.url().scheme() == QLatin1String("ftp")) { + proxy = settings.ftpProxy(); + } else if (query.url().scheme() == QLatin1String("http") + || query.url().scheme() == QLatin1String("https")) { + proxy = settings.httpProxy(); + } + - if ((query.url().scheme() == QLatin1String("http")) - || (query.url().scheme() == QLatin1String("https"))) { - return list << settings.httpProxy(); + auto p = std::find_if(m_proxyCredentials.constBegin(), m_proxyCredentials.constEnd(), + FindProxyCredential(proxy.hostName(), proxy.port())); + if (p != m_proxyCredentials.constEnd()) { + proxy.setUser(p->user); + proxy.setPassword(p->password); } + return list << proxy; } return list << QNetworkProxy(QNetworkProxy::DefaultProxy); } +void PackageManagerProxyFactory::setProxyCredentials(const QNetworkProxy &proxy, + const QString &user, + const QString &password) +{ + auto p = std::find_if(m_proxyCredentials.begin(), m_proxyCredentials.end(), + FindProxyCredential(proxy.hostName(), proxy.port())); + + if (p == m_proxyCredentials.constEnd()) { + ProxyCredential proxyCredential; + proxyCredential.host = proxy.hostName(); + proxyCredential.port = proxy.port(); + proxyCredential.user = user; + proxyCredential.password = password; + m_proxyCredentials.append(proxyCredential); + } else { + p->user = user; + p->password = password; + } +} + } // QInstaller |