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 | |
22 | namespace OCC { |
23 | |
24 | Q_LOGGING_CATEGORY(lcClientProxy, "sync.clientproxy" , QtInfoMsg) |
25 | |
26 | ClientProxy::ClientProxy(QObject *parent) |
27 | : QObject(parent) |
28 | { |
29 | } |
30 | |
31 | static 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 | |
47 | bool 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 | |
59 | QString printQNetworkProxy(const QNetworkProxy &proxy) |
60 | { |
61 | return QString("%1://%2:%3" ).arg(proxy.type()).arg(proxy.hostName()).arg(proxy.port()); |
62 | } |
63 | |
64 | void 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 | |
103 | const 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 | |
123 | void 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 | |
130 | SystemProxyRunnable::SystemProxyRunnable(const QUrl &url) |
131 | : QObject() |
132 | , QRunnable() |
133 | , _url(url) |
134 | { |
135 | } |
136 | |
137 | void 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 | |