Add system proxy support for quassel-client
authorJavier Llorente <javier@opensuse.org>
Sun, 7 Feb 2016 23:36:17 +0000 (00:36 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 1 Mar 2018 20:22:12 +0000 (21:22 +0100)
src/client/clientauthhandler.cpp
src/client/coreaccount.cpp
src/client/coreaccount.h
src/qtui/settingspages/coreaccounteditdlg.ui
src/qtui/settingspages/coreaccountsettingspage.cpp
src/qtui/settingspages/coreaccountsettingspage.h

index ce7c58d..2c96a1c 100644 (file)
@@ -75,10 +75,21 @@ void ClientAuthHandler::connectToCore()
     QTcpSocket *socket = new QTcpSocket(this);
 #endif
 
     QTcpSocket *socket = new QTcpSocket(this);
 #endif
 
-// TODO: Handle system proxy
 #ifndef QT_NO_NETWORKPROXY
 #ifndef QT_NO_NETWORKPROXY
-    if (_account.useProxy()) {
-        QNetworkProxy proxy(_account.proxyType(), _account.proxyHostName(), _account.proxyPort(), _account.proxyUser(), _account.proxyPassword());
+    QNetworkProxy proxy;
+    proxy.setType(_account.proxyType());
+    if (_account.proxyType() == QNetworkProxy::Socks5Proxy ||
+            _account.proxyType() == QNetworkProxy::HttpProxy) {
+        proxy.setHostName(_account.proxyHostName());
+        proxy.setPort(_account.proxyPort());
+        proxy.setUser(_account.proxyUser());
+        proxy.setPassword(_account.proxyPassword());
+    }
+
+    if (_account.proxyType() == QNetworkProxy::DefaultProxy) {
+        QNetworkProxyFactory::setUseSystemConfiguration(true);
+    } else {
+        QNetworkProxyFactory::setUseSystemConfiguration(false);
         socket->setProxy(proxy);
     }
 #endif
         socket->setProxy(proxy);
     }
 #endif
index f46006b..e023ed7 100644 (file)
@@ -27,8 +27,7 @@ CoreAccount::CoreAccount(AccountId accountId)
     _port = 4242;
     _storePassword = false;
     _useSsl = true;
     _port = 4242;
     _storePassword = false;
     _useSsl = true;
-    _useProxy = false;
-    _proxyType = QNetworkProxy::Socks5Proxy;
+    _proxyType = QNetworkProxy::DefaultProxy;
     _proxyPort = 8080;
 }
 
     _proxyPort = 8080;
 }
 
@@ -93,12 +92,6 @@ void CoreAccount::setUseSsl(bool useSsl)
 }
 
 
 }
 
 
-void CoreAccount::setUseProxy(bool useProxy)
-{
-    _useProxy = useProxy;
-}
-
-
 void CoreAccount::setProxyType(QNetworkProxy::ProxyType type)
 {
     _proxyType = type;
 void CoreAccount::setProxyType(QNetworkProxy::ProxyType type)
 {
     _proxyType = type;
@@ -145,7 +138,6 @@ QVariantMap CoreAccount::toVariantMap(bool forcePassword) const
     v["HostName"] = hostName();
     v["Port"] = port();
     v["UseSSL"] = useSsl();
     v["HostName"] = hostName();
     v["Port"] = port();
     v["UseSSL"] = useSsl();
-    v["UseProxy"] = useProxy();
     v["ProxyType"] = proxyType();
     v["ProxyUser"] = proxyUser();
     v["ProxyPassword"] = proxyPassword();
     v["ProxyType"] = proxyType();
     v["ProxyUser"] = proxyUser();
     v["ProxyPassword"] = proxyPassword();
@@ -167,7 +159,6 @@ void CoreAccount::fromVariantMap(const QVariantMap &v)
     setHostName(v.value("HostName").toString());
     setPort(v.value("Port").toUInt());
     setUseSsl(v.value("UseSSL").toBool());
     setHostName(v.value("HostName").toString());
     setPort(v.value("Port").toUInt());
     setUseSsl(v.value("UseSSL").toBool());
-    setUseProxy(v.value("UseProxy").toBool());
     setProxyType((QNetworkProxy::ProxyType)v.value("ProxyType").toInt());
     setProxyUser(v.value("ProxyUser").toString());
     setProxyPassword(v.value("ProxyPassword").toString());
     setProxyType((QNetworkProxy::ProxyType)v.value("ProxyType").toInt());
     setProxyUser(v.value("ProxyUser").toString());
     setProxyPassword(v.value("ProxyPassword").toString());
index 42c862e..8913b2e 100644 (file)
@@ -47,7 +47,6 @@ public:
     inline uint port() const { return _port; }
     inline bool useSsl() const { return _useSsl; }
 
     inline uint port() const { return _port; }
     inline bool useSsl() const { return _useSsl; }
 
-    inline bool useProxy() const { return _useProxy; }
     inline QNetworkProxy::ProxyType proxyType() const { return _proxyType; }
     inline QString proxyUser() const { return _proxyUser; }
     inline QString proxyHostName() const { return _proxyHostName; }
     inline QNetworkProxy::ProxyType proxyType() const { return _proxyType; }
     inline QString proxyUser() const { return _proxyUser; }
     inline QString proxyHostName() const { return _proxyHostName; }
@@ -64,7 +63,6 @@ public:
     void setPort(uint port);
     void setUseSsl(bool);
 
     void setPort(uint port);
     void setUseSsl(bool);
 
-    void setUseProxy(bool);
     void setProxyType(QNetworkProxy::ProxyType);
     void setProxyUser(const QString &);
     void setProxyHostName(const QString &);
     void setProxyType(QNetworkProxy::ProxyType);
     void setProxyUser(const QString &);
     void setProxyHostName(const QString &);
index 647366f..3760d05 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>378</width>
-    <height>455</height>
+    <width>398</width>
+    <height>602</height>
    </rect>
   </property>
   <property name="windowTitle">
    </rect>
   </property>
   <property name="windowTitle">
     </widget>
    </item>
    <item>
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="useProxy">
+    <widget class="QGroupBox" name="groupBox_2">
      <property name="title">
      <property name="title">
-      <string>Use a Proxy</string>
-     </property>
-     <property name="checkable">
-      <bool>true</bool>
-     </property>
-     <property name="checked">
-      <bool>false</bool>
+      <string>Proxy Settings</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
      </property>
      <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0">
-       <widget class="QLabel" name="label_5">
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_7">
         <property name="text">
         <property name="text">
-         <string>Proxy Type:</string>
+         <string>Port:</string>
         </property>
        </widget>
       </item>
         </property>
        </widget>
       </item>
-      <item row="0" column="1" colspan="2">
+      <item row="1" column="2" colspan="2">
        <widget class="QComboBox" name="proxyType">
        <widget class="QComboBox" name="proxyType">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
         <item>
          <property name="text">
           <string>SOCKS 5</string>
         <item>
          <property name="text">
           <string>SOCKS 5</string>
         </item>
        </widget>
       </item>
         </item>
        </widget>
       </item>
-      <item row="0" column="3">
+      <item row="1" column="4">
        <spacer name="horizontalSpacer">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
        <spacer name="horizontalSpacer">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
        </spacer>
       </item>
         </property>
        </spacer>
       </item>
-      <item row="1" column="0">
+      <item row="2" column="0">
        <widget class="QLabel" name="label_6">
         <property name="text">
          <string>Hostname:</string>
         </property>
        </widget>
       </item>
        <widget class="QLabel" name="label_6">
         <property name="text">
          <string>Hostname:</string>
         </property>
        </widget>
       </item>
-      <item row="1" column="1" colspan="4">
+      <item row="2" column="2" colspan="4">
        <widget class="QLineEdit" name="proxyHostName">
        <widget class="QLineEdit" name="proxyHostName">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
         <property name="text">
          <string>localhost</string>
         </property>
        </widget>
       </item>
         <property name="text">
          <string>localhost</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="0">
-       <widget class="QLabel" name="label_7">
-        <property name="text">
-         <string>Port:</string>
+      <item row="4" column="2" colspan="3">
+       <widget class="QLineEdit" name="proxyUser">
+        <property name="enabled">
+         <bool>false</bool>
         </property>
        </widget>
       </item>
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="3" column="2">
        <widget class="QSpinBox" name="proxyPort">
        <widget class="QSpinBox" name="proxyPort">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
         </property>
        </widget>
       </item>
         </property>
        </widget>
       </item>
-      <item row="2" column="2" colspan="2">
+      <item row="3" column="3" colspan="2">
        <spacer name="horizontalSpacer_3">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
        <spacer name="horizontalSpacer_3">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
        </spacer>
       </item>
         </property>
        </spacer>
       </item>
-      <item row="3" column="0">
+      <item row="4" column="0">
        <widget class="QLabel" name="label_8">
         <property name="text">
          <string>User:</string>
         </property>
        </widget>
       </item>
        <widget class="QLabel" name="label_8">
         <property name="text">
          <string>User:</string>
         </property>
        </widget>
       </item>
-      <item row="3" column="1" colspan="3">
-       <widget class="QLineEdit" name="proxyUser"/>
-      </item>
-      <item row="4" column="0">
+      <item row="5" column="0">
        <widget class="QLabel" name="label_9">
         <property name="text">
          <string>Password:</string>
         </property>
        </widget>
       </item>
        <widget class="QLabel" name="label_9">
         <property name="text">
          <string>Password:</string>
         </property>
        </widget>
       </item>
-      <item row="4" column="1" colspan="3">
+      <item row="5" column="2" colspan="3">
        <widget class="QLineEdit" name="proxyPassword">
        <widget class="QLineEdit" name="proxyPassword">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
         <property name="echoMode">
          <enum>QLineEdit::Password</enum>
         </property>
        </widget>
       </item>
         <property name="echoMode">
          <enum>QLineEdit::Password</enum>
         </property>
        </widget>
       </item>
-      <item row="3" column="4">
+      <item row="4" column="5">
        <spacer name="horizontalSpacer_4">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
        <spacer name="horizontalSpacer_4">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
        </spacer>
       </item>
         </property>
        </spacer>
       </item>
-      <item row="4" column="4">
+      <item row="5" column="5">
        <spacer name="horizontalSpacer_5">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
        <spacer name="horizontalSpacer_5">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
        </spacer>
       </item>
         </property>
        </spacer>
       </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_5">
+        <property name="text">
+         <string>Proxy Type:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <layout class="QVBoxLayout" name="verticalLayoutProxyRadioGroup">
+        <item>
+         <widget class="QRadioButton" name="radioButtonNoProxy">
+          <property name="text">
+           <string>No pro&amp;xy</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">buttonGroupProxyType</string>
+          </attribute>
+         </widget>
+        </item>
+        <item>
+         <widget class="QRadioButton" name="radioButtonSystemProxy">
+          <property name="text">
+           <string>S&amp;ystem proxy</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">buttonGroupProxyType</string>
+          </attribute>
+         </widget>
+        </item>
+        <item>
+         <widget class="QRadioButton" name="radioButtonManualProxy">
+          <property name="text">
+           <string>&amp;Manual proxy configuration</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">buttonGroupProxyType</string>
+          </attribute>
+         </widget>
+        </item>
+       </layout>
+      </item>
      </layout>
     </widget>
    </item>
      </layout>
     </widget>
    </item>
   <tabstop>user</tabstop>
   <tabstop>password</tabstop>
   <tabstop>rememberPassword</tabstop>
   <tabstop>user</tabstop>
   <tabstop>password</tabstop>
   <tabstop>rememberPassword</tabstop>
-  <tabstop>useProxy</tabstop>
   <tabstop>proxyType</tabstop>
   <tabstop>proxyHostName</tabstop>
   <tabstop>proxyPort</tabstop>
   <tabstop>proxyType</tabstop>
   <tabstop>proxyHostName</tabstop>
   <tabstop>proxyPort</tabstop>
    </hints>
   </connection>
  </connections>
    </hints>
   </connection>
  </connections>
+ <buttongroups>
+  <buttongroup name="buttonGroupProxyType"/>
+ </buttongroups>
 </ui>
 </ui>
index 46852ea..b8b09fe 100644 (file)
@@ -250,12 +250,40 @@ CoreAccountEditDlg::CoreAccountEditDlg(const CoreAccount &acct, QWidget *parent)
     ui.user->setText(acct.user());
     ui.password->setText(acct.password());
     ui.rememberPassword->setChecked(acct.storePassword());
     ui.user->setText(acct.user());
     ui.password->setText(acct.password());
     ui.rememberPassword->setChecked(acct.storePassword());
-    ui.useProxy->setChecked(acct.useProxy());
-    ui.proxyHostName->setText(acct.proxyHostName());
-    ui.proxyPort->setValue(acct.proxyPort());
-    ui.proxyType->setCurrentIndex(acct.proxyType() == QNetworkProxy::Socks5Proxy ? 0 : 1);
-    ui.proxyUser->setText(acct.proxyUser());
-    ui.proxyPassword->setText(acct.proxyPassword());
+
+    ui.buttonGroupProxyType->setId(ui.radioButtonNoProxy, 0);
+    ui.buttonGroupProxyType->setId(ui.radioButtonSystemProxy, 1);
+    ui.buttonGroupProxyType->setId(ui.radioButtonManualProxy, 2);
+
+    bool manualProxy = false;
+    switch (acct.proxyType()) {
+    case QNetworkProxy::NoProxy:
+        ui.buttonGroupProxyType->button(0)->setChecked(true);
+        break;
+    case QNetworkProxy::DefaultProxy:
+        ui.buttonGroupProxyType->button(1)->setChecked(true);
+        break;
+    case QNetworkProxy::Socks5Proxy:
+        ui.buttonGroupProxyType->button(2)->setChecked(true);
+        ui.proxyType->setCurrentIndex(0);
+        manualProxy = true;
+        break;
+    case QNetworkProxy::HttpProxy:
+        ui.buttonGroupProxyType->button(2)->setChecked(true);
+        ui.proxyType->setCurrentIndex(1);
+        manualProxy = true;
+        break;
+    default:
+        break;
+    }
+
+    if (manualProxy) {
+        ui.proxyHostName->setText(acct.proxyHostName());
+        ui.proxyPort->setValue(acct.proxyPort());
+        ui.proxyType->setEnabled(true);
+        ui.proxyUser->setText(acct.proxyUser());
+        ui.proxyPassword->setText(acct.proxyPassword());
+    }
 
     if (acct.accountId().isValid())
         setWindowTitle(tr("Edit Core Account"));
 
     if (acct.accountId().isValid())
         setWindowTitle(tr("Edit Core Account"));
@@ -266,18 +294,37 @@ CoreAccountEditDlg::CoreAccountEditDlg(const CoreAccount &acct, QWidget *parent)
 
 CoreAccount CoreAccountEditDlg::account()
 {
 
 CoreAccount CoreAccountEditDlg::account()
 {
-    _account.setAccountName(ui.accountName->text().trimmed());
-    _account.setHostName(ui.hostName->text().trimmed());
-    _account.setPort(ui.port->value());
-    _account.setUser(ui.user->text().trimmed());
-    _account.setPassword(ui.password->text());
-    _account.setStorePassword(ui.rememberPassword->isChecked());
-    _account.setUseProxy(ui.useProxy->isChecked());
-    _account.setProxyHostName(ui.proxyHostName->text().trimmed());
-    _account.setProxyPort(ui.proxyPort->value());
-    _account.setProxyType(ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy);
-    _account.setProxyUser(ui.proxyUser->text().trimmed());
-    _account.setProxyPassword(ui.proxyPassword->text());
+    QNetworkProxy::ProxyType proxyType = QNetworkProxy::NoProxy;
+    int checkedId = ui.buttonGroupProxyType->checkedId();
+
+    switch (checkedId) {
+    case NoProxy: // QNetworkProxy::NoProxy
+        QNetworkProxyFactory::setUseSystemConfiguration(false);
+        _account.setProxyType(proxyType);
+        break;
+    case SystemProxy: // QNetworkProxy::DefaultProxy:
+        QNetworkProxyFactory::setUseSystemConfiguration(true);
+        _account.setProxyType(QNetworkProxy::DefaultProxy);
+        break;
+    case ManualProxy: // QNetworkProxy::Socks5Proxy || QNetworkProxy::HttpProxy
+        proxyType = ui.proxyType->currentIndex() == 0 ?
+                    QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy;
+        QNetworkProxyFactory::setUseSystemConfiguration(false);
+        _account.setAccountName(ui.accountName->text().trimmed());
+        _account.setHostName(ui.hostName->text().trimmed());
+        _account.setPort(ui.port->value());
+        _account.setUser(ui.user->text().trimmed());
+        _account.setPassword(ui.password->text());
+        _account.setStorePassword(ui.rememberPassword->isChecked());
+        _account.setProxyHostName(ui.proxyHostName->text().trimmed());
+        _account.setProxyPort(ui.proxyPort->value());
+        _account.setProxyType(proxyType);
+        _account.setProxyUser(ui.proxyUser->text().trimmed());
+        _account.setProxyPassword(ui.proxyPassword->text());
+        break;
+    default:
+        break;
+    }
     return _account;
 }
 
     return _account;
 }
 
@@ -311,6 +358,15 @@ void CoreAccountEditDlg::on_user_textChanged(const QString &text)
     setWidgetStates();
 }
 
     setWidgetStates();
 }
 
+void CoreAccountEditDlg::on_radioButtonManualProxy_toggled(bool checked)
+{
+    ui.proxyType->setEnabled(checked);
+    ui.proxyHostName->setEnabled(checked);
+    ui.proxyPort->setEnabled(checked);
+    ui.proxyUser->setEnabled(checked);
+    ui.proxyPassword->setEnabled(checked);
+}
+
 
 /*****************************************************************************************
  * FilteredCoreAccountModel
 
 /*****************************************************************************************
  * FilteredCoreAccountModel
index e582f48..ee0572e 100644 (file)
@@ -22,6 +22,7 @@
 #define COREACCOUNTSETTINGSPAGE_H_
 
 #include <QSortFilterProxyModel>
 #define COREACCOUNTSETTINGSPAGE_H_
 
 #include <QSortFilterProxyModel>
+#include <QNetworkProxy>
 
 #include "settingspage.h"
 
 
 #include "settingspage.h"
 
@@ -102,12 +103,14 @@ private slots:
     void on_hostName_textChanged(const QString &);
     void on_accountName_textChanged(const QString &);
     void on_user_textChanged(const QString &);
     void on_hostName_textChanged(const QString &);
     void on_accountName_textChanged(const QString &);
     void on_user_textChanged(const QString &);
+    void on_radioButtonManualProxy_toggled(bool checked);
 
     void setWidgetStates();
 
 private:
     Ui::CoreAccountEditDlg ui;
     CoreAccount _account;
 
     void setWidgetStates();
 
 private:
     Ui::CoreAccountEditDlg ui;
     CoreAccount _account;
+    enum ProxyType { NoProxy, SystemProxy, ManualProxy };
 };
 
 
 };