Implements a Proxy detection (WPAD) interface for Linux, Mac OSX and Windows. Offers a GUI for manual proxy settings and automatic WPAD detection. The GUI is based on QT.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
7.7 KiB
232 lines
7.7 KiB
/*! @file |
|
|
|
@id $Id$ |
|
*/ |
|
// 1 2 3 4 5 6 7 8 |
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 |
|
|
|
#ifndef PROXY_HXX |
|
#define PROXY_HXX |
|
|
|
#include <proxyface/autoproxy.hxx> |
|
#include <proxyface/ui_proxy.hxx> |
|
#include <proxyface/proxyauth.hxx> |
|
|
|
#include <QtGui/QMovie> |
|
#include <QtGui/QDialog> |
|
#include <QtGui/QPushButton> |
|
#include <QtNetwork/QNetworkProxy> |
|
#include <QtNetwork/QAuthenticator> |
|
#include <QtCore/QUrl> |
|
#include <QtCore/QSettings> |
|
|
|
#include <QtCore/QDebug> |
|
#include <cassert> |
|
|
|
namespace gui { |
|
|
|
class Proxy: public QDialog, public Ui::Proxy { |
|
|
|
Q_OBJECT |
|
|
|
public: |
|
|
|
Proxy(QString testUrl, QWidget* p=0): |
|
QDialog(p), _lastDefaultProxy(QNetworkProxy()), |
|
_proxyAuth(this), _found(false) { |
|
setupUi(this); |
|
_testUrl->insertItem(0, testUrl); |
|
_internetWait->setMovie(new QMovie(":/icons/indicator.gif")); |
|
_internetWait->movie()->start(); |
|
QSettings s("SwissSign", "ProxySettings"); |
|
_save->setChecked(s.contains("default-type")); |
|
_type->setCurrentIndex(s.value("default-type", 0).toInt()); |
|
_url->setText(s.value("default-server", QString()).toString()); |
|
_port->setValue(s.value("default-port", 0).toInt()); |
|
_lastDefaultProxy = QNetworkProxy(); |
|
_lastType = _type->currentIndex(); |
|
_lastUrl = _url->text(); |
|
_lastPort = _port->value(); |
|
if (!connect(&_auto, SIGNAL(proxyFound(const QUrl&, |
|
const QNetworkProxy&)), |
|
SIGNAL(proxyFound(const QUrl&, const QNetworkProxy&)))) |
|
qFatal("cannot if (!connect"); |
|
if (!connect(&_auto, SIGNAL(proxyFound(const QUrl&, |
|
const QNetworkProxy&)), |
|
SLOT(proxyFoundSlot(const QUrl&, const QNetworkProxy&)))) |
|
qFatal("cannot connect"); |
|
if (!connect(&_auto, SIGNAL(proxyError(QNetworkReply::NetworkError)), |
|
SIGNAL(proxyError(QNetworkReply::NetworkError)))) |
|
qFatal("cannot connect"); |
|
if (!connect(&_auto, SIGNAL(proxyError(QNetworkReply::NetworkError)), |
|
SLOT(proxyErrorSlot(QNetworkReply::NetworkError)))) |
|
qFatal("cannot connect"); |
|
if (!connect(&_auto, SIGNAL(temporaryError(QNetworkReply::NetworkError, |
|
QString, QString)), |
|
SIGNAL(temporaryError(QNetworkReply::NetworkError, |
|
QString, QString)))) |
|
qFatal("cannot connect"); |
|
if (!connect(&_auto, SIGNAL(proxyAuthenticationRequired |
|
(const QNetworkProxy&, QAuthenticator*)), |
|
SLOT(proxyAuthenticationRequired(const QNetworkProxy&, |
|
QAuthenticator*)))) |
|
qFatal("cannot connect"); |
|
if (!connect(&_auto, SIGNAL(authenticationRequired |
|
(QNetworkReply*, QAuthenticator*)), |
|
SLOT(authenticationRequired |
|
(QNetworkReply*, QAuthenticator*)))) |
|
qFatal("cannot connect"); |
|
acceptValues(); |
|
} |
|
|
|
void checkUrl(const QString& url) { |
|
if (_testUrl->findText(url)==-1) |
|
_testUrl->addItem(url); |
|
_testUrl->setCurrentIndex(_testUrl->findText(url)); |
|
acceptValues(); |
|
} |
|
|
|
void ping() { |
|
_auto.ping(_testUrl->currentText()); |
|
} |
|
|
|
void retry() { |
|
on__test_clicked(); |
|
} |
|
|
|
void reset() { |
|
_type->setCurrentIndex(_lastType); |
|
_url->setText(_lastUrl); |
|
_port->setValue(_lastPort); |
|
QNetworkProxy::setApplicationProxy(_lastDefaultProxy); |
|
acceptValues(); |
|
} |
|
|
|
void acceptValues() { |
|
on__test_clicked(); |
|
switch (_type->currentIndex()) { |
|
case 0: try { |
|
_url->setEnabled(false); |
|
_port->setEnabled(false); |
|
_url->setText(""); |
|
_port->setValue(0); |
|
} catch (...) {} break; |
|
} |
|
if (_save->isChecked()) { |
|
QSettings s("SwissSign", "ProxySettings"); |
|
s.setValue("default-type", _type->currentIndex()); |
|
s.setValue("default-server", _url->text()); |
|
s.setValue("default-port", _port->value()); |
|
} else { |
|
QSettings s("SwissSign", "ProxySettings"); |
|
s.clear(); |
|
} |
|
_lastDefaultProxy = QNetworkProxy(); |
|
_lastType = _type->currentIndex(); |
|
_lastUrl = _url->text(); |
|
_lastPort = _port->value(); |
|
} |
|
|
|
Q_SIGNALS: |
|
|
|
void detecting(); |
|
void proxyFound(const QUrl&, const QNetworkProxy&); |
|
void proxyError(QNetworkReply::NetworkError); |
|
void temporaryError(QNetworkReply::NetworkError, QString, QString); |
|
|
|
public Q_SLOTS: |
|
|
|
void proxyAuthenticationRequired(const QNetworkProxy& p, |
|
QAuthenticator* auth) { |
|
qDebug()<<"proxyAuthenticationRequired"; |
|
_proxyAuth._realm->setText(auth->realm()); |
|
_auto.pause(); |
|
if (_found || _proxyAuth.exec()==QDialog::Accepted) { |
|
auth->setUser(_proxyAuth._username->text()); |
|
auth->setPassword(_proxyAuth._password->text()); |
|
_found = false; |
|
} |
|
_auto.restart(); |
|
} |
|
|
|
void authenticationRequired(QNetworkReply*, QAuthenticator* auth) { |
|
} |
|
|
|
void proxyFoundSlot(const QUrl&, const QNetworkProxy& p) { |
|
_found = true; |
|
_stackInternet->setCurrentIndex(SERVER_FOUND); |
|
QNetworkProxy prx(p.type()==QNetworkProxy::DefaultProxy |
|
?QNetworkProxy::applicationProxy():p); |
|
if (prx.type()==QNetworkProxy::DefaultProxy) return; |
|
if (!_url->isEnabled()) _url->setText(prx.hostName()); |
|
if (!_port->isEnabled()) _port->setValue(prx.port()); |
|
if (p.type()==QNetworkProxy::DefaultProxy) return; |
|
prx.setUser(_proxyAuth._username->text()); |
|
prx.setPassword(_proxyAuth._password->text()); |
|
QNetworkProxy::setApplicationProxy(prx); |
|
} |
|
|
|
void proxyErrorSlot(QNetworkReply::NetworkError){ |
|
_stackInternet->setCurrentIndex(SERVER_NOT_FOUND); |
|
} |
|
|
|
void on__type_currentIndexChanged(int index) { |
|
_url->setEnabled(index!=0); |
|
_port->setEnabled(index!=0); |
|
} |
|
|
|
void on__test_clicked() { |
|
_auto.reset(); |
|
_stackInternet->setCurrentIndex(WAITING_FOR_SERVER); |
|
detecting(); |
|
switch (_type->currentIndex()) { |
|
case 0: try { |
|
QNetworkProxy::setApplicationProxy |
|
(QNetworkProxy(QNetworkProxy::NoProxy)); |
|
_auto.proxy(_testUrl->currentText()); |
|
} catch (...) {} break; |
|
case 1: { |
|
QNetworkProxy::setApplicationProxy |
|
(QNetworkProxy |
|
(QNetworkProxy::HttpProxy, _url->text(), _port->value())); |
|
_auto.ping(_testUrl->currentText()); |
|
} break; |
|
case 2: { |
|
QNetworkProxy::setApplicationProxy |
|
(QNetworkProxy |
|
(QNetworkProxy::Socks5Proxy, _url->text(), _port->value(), |
|
"marwae", "marwae")); |
|
_auto.ping(_testUrl->currentText()); |
|
} break; |
|
} |
|
} |
|
|
|
virtual void accept() { |
|
acceptValues(); |
|
QDialog::accept(); |
|
} |
|
|
|
virtual void reject() { |
|
reset(); |
|
QDialog::reject(); |
|
} |
|
|
|
private: |
|
|
|
enum Network {SERVER_FOUND = 0, SERVER_NOT_FOUND, WAITING_FOR_SERVER}; |
|
|
|
private: |
|
|
|
proxy::Face _auto; |
|
int _lastType; |
|
QString _lastUrl; |
|
int _lastPort; |
|
QNetworkProxy _lastDefaultProxy; |
|
ProxyAuth _proxyAuth; |
|
bool _found; |
|
|
|
}; |
|
|
|
} |
|
|
|
#endif
|
|
|