1/*
2 * Copyright (C) by Klaas Freitag <freitag@owncloud.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * for more details.
13 */
14
15#include "clientproxy.h"
16
17#include "configfile.h"
18#include <QLoggingCategory>
19#include <QUrl>
20#include <QThreadPool>
21
22namespace OCC {
23
24Q_LOGGING_CATEGORY(lcClientProxy, "sync.clientproxy", QtInfoMsg)
25
26ClientProxy::ClientProxy(QObject *parent)
27 : QObject(parent)
28{
29}
30
31static QNetworkProxy proxyFromConfig(const ConfigFile &cfg)
32{
33 QNetworkProxy proxy;
34
35 if (cfg.proxyHostName().isEmpty())
36 return QNetworkProxy();
37
38 proxy.setHostName(cfg.proxyHostName());
39 proxy.setPort(cfg.proxyPort());
40 if (cfg.proxyNeedsAuth()) {
41 proxy.setUser(cfg.proxyUser());
42 proxy.setPassword(cfg.proxyPassword());
43 }
44 return proxy;
45}
46
47bool ClientProxy::isUsingSystemDefault()
48{
49 OCC::ConfigFile cfg;
50
51 // if there is no config file, default to system proxy.
52 if (cfg.exists()) {
53 return cfg.proxyType() == QNetworkProxy::DefaultProxy;
54 }
55
56 return false;
57}
58
59QString printQNetworkProxy(const QNetworkProxy &proxy)
60{
61 return QString("%1://%2:%3").arg(proxy.type()).arg(proxy.hostName()).arg(proxy.port());
62}
63
64void ClientProxy::setupQtProxyFromConfig()
65{
66 OCC::ConfigFile cfg;
67 int proxyType = QNetworkProxy::DefaultProxy;
68 QNetworkProxy proxy;
69
70 // if there is no config file, default to system proxy.
71 if (cfg.exists()) {
72 proxyType = cfg.proxyType();
73 proxy = proxyFromConfig(cfg);
74 }
75
76 switch (proxyType) {
77 case QNetworkProxy::NoProxy:
78 qCInfo(lcClientProxy) << "Set proxy configuration to use NO proxy";
79 QNetworkProxyFactory::setUseSystemConfiguration(false);
80 QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy);
81 break;
82 case QNetworkProxy::DefaultProxy:
83 qCInfo(lcClientProxy) << "Set proxy configuration to use system configuration";
84 QNetworkProxyFactory::setUseSystemConfiguration(true);
85 break;
86 case QNetworkProxy::Socks5Proxy:
87 proxy.setType(QNetworkProxy::Socks5Proxy);
88 qCInfo(lcClientProxy) << "Set proxy configuration to SOCKS5" << printQNetworkProxy(proxy);
89 QNetworkProxyFactory::setUseSystemConfiguration(false);
90 QNetworkProxy::setApplicationProxy(proxy);
91 break;
92 case QNetworkProxy::HttpProxy:
93 proxy.setType(QNetworkProxy::HttpProxy);
94 qCInfo(lcClientProxy) << "Set proxy configuration to HTTP" << printQNetworkProxy(proxy);
95 QNetworkProxyFactory::setUseSystemConfiguration(false);
96 QNetworkProxy::setApplicationProxy(proxy);
97 break;
98 default:
99 break;
100 }
101}
102
103const char *ClientProxy::proxyTypeToCStr(QNetworkProxy::ProxyType type)
104{
105 switch (type) {
106 case QNetworkProxy::NoProxy:
107 return "NoProxy";
108 case QNetworkProxy::DefaultProxy:
109 return "DefaultProxy";
110 case QNetworkProxy::Socks5Proxy:
111 return "Socks5Proxy";
112 case QNetworkProxy::HttpProxy:
113 return "HttpProxy";
114 case QNetworkProxy::HttpCachingProxy:
115 return "HttpCachingProxy";
116 case QNetworkProxy::FtpCachingProxy:
117 return "FtpCachingProxy";
118 default:
119 return "NoProxy";
120 }
121}
122
123void ClientProxy::lookupSystemProxyAsync(const QUrl &url, QObject *dst, const char *slot)
124{
125 SystemProxyRunnable *runnable = new SystemProxyRunnable(url);
126 QObject::connect(runnable, SIGNAL(systemProxyLookedUp(QNetworkProxy)), dst, slot);
127 QThreadPool::globalInstance()->start(runnable); // takes ownership and deletes
128}
129
130SystemProxyRunnable::SystemProxyRunnable(const QUrl &url)
131 : QObject()
132 , QRunnable()
133 , _url(url)
134{
135}
136
137void SystemProxyRunnable::run()
138{
139 qRegisterMetaType<QNetworkProxy>("QNetworkProxy");
140 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(_url));
141
142 if (proxies.isEmpty()) {
143 emit systemProxyLookedUp(QNetworkProxy(QNetworkProxy::NoProxy));
144 } else {
145 emit systemProxyLookedUp(proxies.first());
146 // FIXME Would we really ever return more?
147 }
148}
149}
150