Prepared to have individual proxies per scheme.

Wed, 26 May 2010 17:53:53 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 26 May 2010 17:53:53 +0200
changeset 286
652f5159f1c3
parent 284
06d3067f8a63
child 287
52b4c72080d2

Prepared to have individual proxies per scheme.

E5Network/E5NetworkProxyFactory.py file | annotate | diff | comparison | revisions
Helpviewer/Network/NetworkAccessManager.py file | annotate | diff | comparison | revisions
PluginManager/PluginRepositoryDialog.py file | annotate | diff | comparison | revisions
Preferences/ConfigurationPages/NetworkPage.py file | annotate | diff | comparison | revisions
Preferences/__init__.py file | annotate | diff | comparison | revisions
UI/UserInterface.py file | annotate | diff | comparison | revisions
--- a/E5Network/E5NetworkProxyFactory.py	Wed May 26 08:37:24 2010 +0200
+++ b/E5Network/E5NetworkProxyFactory.py	Wed May 26 17:53:53 2010 +0200
@@ -1,85 +1,101 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a network proxy factory.
-"""
-
-import sys
-import os
-
-from PyQt4.QtCore import QUrl
-from PyQt4.QtGui import QMessageBox
-from PyQt4.QtNetwork import QNetworkProxyFactory, QNetworkProxy, QNetworkProxyQuery
-
-import Preferences
-
-class E5NetworkProxyFactory(QNetworkProxyFactory):
-    """
-    Class implementing a network proxy factory.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        QNetworkProxyFactory.__init__(self)
-    
-    def queryProxy(self, query):
-        """
-        Public method to determine a proxy for a given query.
-        
-        @param query reference to the query object (QNetworkProxyQuery)
-        @return list of proxies in order of preference (list of QNetworkProxy)
-        """
-        if query.queryType() == QNetworkProxyQuery.UrlRequest and \
-           query.protocolTag() in ["http", "https", "ftp"] and \
-           Preferences.getUI("UseProxy"):
-            if Preferences.getUI("UseSystemProxy"):
-                proxyList = QNetworkProxyFactory.systemProxyForQuery(query)
-                if sys.platform not in ["darwin", "nt"] and \
-                   len(proxyList) == 1 and \
-                   proxyList[0].type() == QNetworkProxy.NoProxy:
-                    # try it the Python way
-                    # scan the environment for variables named <scheme>_proxy
-                    # scan over whole environment to make this case insensitive
-                    for name, value in os.environ.items():
-                        name = name.lower()
-                        if value and name[-6:] == '_proxy' and \
-                           name[:-6] == query.protocolTag().lower():
-                            url = QUrl(value)
-                            if url.scheme() in ["http", "https"]:
-                                proxyType = QNetworkProxy.HttpProxy
-                            else:
-                                proxyType = QNetworkProxy.FtpCachingProxy
-                            proxy = QNetworkProxy(proxyType, url.host(), url.port(), 
-                                                  url.userName(), url.password())
-                            proxyList = [proxy]
-                            break
-                proxyList[0].setUser(Preferences.getUI("ProxyUser"))
-                proxyList[0].setPassword(Preferences.getUI("ProxyPassword"))
-                return proxyList
-            else:
-                host = Preferences.getUI("ProxyHost")
-                if not host:
-                    QMessageBox.critical(None,
-                        self.trUtf8("Proxy Configuration Error"),
-                        self.trUtf8("""Proxy usage was activated"""
-                                    """ but no proxy host configured."""))
-                    return [QNetworkProxy(QNetworkProxy.DefaultProxy)]
-                else:
-                    pProxyType = Preferences.getUI("ProxyType")
-                    if pProxyType == 0:
-                        proxyType = QNetworkProxy.HttpProxy
-                    elif pProxyType == 1:
-                        proxyType = QNetworkProxy.HttpCachingProxy
-                    elif pProxyType == 2:
-                        proxyType = QNetworkProxy.Socks5Proxy
-                    proxy = QNetworkProxy(proxyType, host, 
-                        Preferences.getUI("ProxyPort"),
-                        Preferences.getUI("ProxyUser"),
-                        Preferences.getUI("ProxyPassword"))
-                    return [proxy, QNetworkProxy(QNetworkProxy.DefaultProxy)]
-        else:
-            return [QNetworkProxy(QNetworkProxy.NoProxy)]
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a network proxy factory.
+"""
+
+import sys
+import os
+
+from PyQt4.QtCore import QUrl, Qt, QCoreApplication
+from PyQt4.QtGui import QMessageBox, QDialog
+from PyQt4.QtNetwork import QNetworkProxyFactory, QNetworkProxy, QNetworkProxyQuery
+
+from UI.AuthenticationDialog import AuthenticationDialog
+
+import Preferences
+
+class E5NetworkProxyFactory(QNetworkProxyFactory):
+    """
+    Class implementing a network proxy factory.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        QNetworkProxyFactory.__init__(self)
+    
+    def queryProxy(self, query):
+        """
+        Public method to determine a proxy for a given query.
+        
+        @param query reference to the query object (QNetworkProxyQuery)
+        @return list of proxies in order of preference (list of QNetworkProxy)
+        """
+        if query.queryType() == QNetworkProxyQuery.UrlRequest and \
+           query.protocolTag() in ["http", "https", "ftp"] and \
+           Preferences.getUI("UseProxy"):
+            if Preferences.getUI("UseSystemProxy"):
+                proxyList = QNetworkProxyFactory.systemProxyForQuery(query)
+                if sys.platform not in ["darwin", "nt"] and \
+                   len(proxyList) == 1 and \
+                   proxyList[0].type() == QNetworkProxy.NoProxy:
+                    # try it the Python way
+                    # scan the environment for variables named <scheme>_proxy
+                    # scan over whole environment to make this case insensitive
+                    for name, value in os.environ.items():
+                        name = name.lower()
+                        if value and name[-6:] == '_proxy' and \
+                           name[:-6] == query.protocolTag().lower():
+                            url = QUrl(value)
+                            if url.scheme() in ["http", "https"]:
+                                proxyType = QNetworkProxy.HttpProxy
+                            else:
+                                proxyType = QNetworkProxy.FtpCachingProxy
+                            proxy = QNetworkProxy(proxyType, url.host(), url.port(), 
+                                                  url.userName(), url.password())
+                            proxyList = [proxy]
+                            break
+                proxyList[0].setUser(Preferences.getUI("ProxyUser/Http"))
+                proxyList[0].setPassword(Preferences.getUI("ProxyPassword/Http"))
+                return proxyList
+            else:
+                host = Preferences.getUI("ProxyHost/Http")
+                if not host:
+                    QMessageBox.critical(None,
+                        self.trUtf8("Proxy Configuration Error"),
+                        self.trUtf8("""Proxy usage was activated"""
+                                    """ but no proxy host configured."""))
+                    return [QNetworkProxy(QNetworkProxy.DefaultProxy)]
+                else:
+                    proxy = QNetworkProxy(QNetworkProxy.HttpProxy, host, 
+                        Preferences.getUI("ProxyPort/Http"),
+                        Preferences.getUI("ProxyUser/Http"),
+                        Preferences.getUI("ProxyPassword/Http"))
+                    return [proxy, QNetworkProxy(QNetworkProxy.DefaultProxy)]
+        else:
+            return [QNetworkProxy(QNetworkProxy.NoProxy)]
+
+def proxyAuthenticationRequired(proxy, auth):
+    """
+    Module slot to handle a proxy authentication request.
+    
+    @param proxy reference to the proxy object (QNetworkProxy)
+    @param auth reference to the authenticator object (QAuthenticator)
+    """
+    info = QCoreApplication.translate("E5NetworkProxyFactory", "<b>Connect to proxy '{0}' using:</b>")\
+        .format(Qt.escape(proxy.hostName()))
+    
+    dlg = AuthenticationDialog(info, proxy.user(), True)
+    if dlg.exec_() == QDialog.Accepted:
+        username, password = dlg.getData()
+        auth.setUser(username)
+        auth.setPassword(password)
+        if dlg.shallSave():
+            Preferences.setUI("ProxyUser/Http", username)
+            Preferences.setUI("ProxyPassword/Http", password)
+            proxy.setUser(username)
+            proxy.setPassword(password)
--- a/Helpviewer/Network/NetworkAccessManager.py	Wed May 26 08:37:24 2010 +0200
+++ b/Helpviewer/Network/NetworkAccessManager.py	Wed May 26 17:53:53 2010 +0200
@@ -18,7 +18,7 @@
 except ImportError:
     SSL_AVAILABLE = False
 
-from E5Network.E5NetworkProxyFactory import E5NetworkProxyFactory
+from E5Network.E5NetworkProxyFactory import E5NetworkProxyFactory, proxyAuthenticationRequired
 
 from UI.AuthenticationDialog import AuthenticationDialog
 
@@ -80,7 +80,7 @@
         
         self.connect(self, 
             SIGNAL('proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)'),
-            self.__proxyAuthenticationRequired)
+            proxyAuthenticationRequired)
         self.connect(self, 
             SIGNAL('authenticationRequired(QNetworkReply *, QAuthenticator *)'), 
             self.__authenticationRequired)
@@ -181,27 +181,6 @@
                 Helpviewer.HelpWindow.HelpWindow.passwordManager().setLogin(
                     reply.url(), auth.realm(), username, password)
     
-    def __proxyAuthenticationRequired(self, proxy, auth):
-        """
-        Private slot to handle a proxy authentication request.
-        
-        @param proxy reference to the proxy object (QNetworkProxy)
-        @param auth reference to the authenticator object (QAuthenticator)
-        """
-        info = self.trUtf8("<b>Connect to proxy '{0}' using:</b>")\
-            .format(Qt.escape(proxy.hostName()))
-        
-        dlg = AuthenticationDialog(info, proxy.user(), True)
-        if dlg.exec_() == QDialog.Accepted:
-            username, password = dlg.getData()
-            auth.setUser(username)
-            auth.setPassword(password)
-            if dlg.shallSave():
-                Preferences.setUI("ProxyUser", username)
-                Preferences.setUI("ProxyPassword", password)
-                proxy.setUser(username)
-                proxy.setPassword(password)
-    
     def __sslErrors(self, reply, errors):
         """
         Private slot to handle SSL errors.
--- a/PluginManager/PluginRepositoryDialog.py	Wed May 26 08:37:24 2010 +0200
+++ b/PluginManager/PluginRepositoryDialog.py	Wed May 26 17:53:53 2010 +0200
@@ -19,13 +19,13 @@
 
 from .Ui_PluginRepositoryDialog import Ui_PluginRepositoryDialog
 
-from UI.AuthenticationDialog import AuthenticationDialog
-
 from E5XML.XMLUtilities import make_parser
 from E5XML.XMLErrorHandler import XMLErrorHandler, XMLFatalParseError
 from E5XML.XMLEntityResolver import XMLEntityResolver
 from E5XML.PluginRepositoryHandler import PluginRepositoryHandler
 
+from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired
+
 import Utilities
 import Preferences
 
@@ -76,7 +76,7 @@
         self.__networkManager = QNetworkAccessManager(self)
         self.connect(self.__networkManager, 
             SIGNAL('proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)'),
-            self.__proxyAuthenticationRequired)
+            proxyAuthenticationRequired)
         self.connect(self.__networkManager, 
             SIGNAL('sslErrors(QNetworkReply *, const QList<QSslError> &)'), 
             self.__sslErrors)
@@ -488,25 +488,6 @@
         
         return aversion == version
     
-    def __proxyAuthenticationRequired(self, proxy, auth):
-        """
-        Private slot to handle a proxy authentication request.
-        
-        @param proxy reference to the proxy object (QNetworkProxy)
-        @param auth reference to the authenticator object (QAuthenticator)
-        """
-        info = self.trUtf8("<b>Connect to proxy '{0}' using:</b>")\
-            .format(Qt.escape(proxy.hostName()))
-        
-        dlg = AuthenticationDialog(info, proxy.user(), True)
-        if dlg.exec_() == QDialog.Accepted:
-            username, password = dlg.getData()
-            auth.setUser(username)
-            auth.setPassword(password)
-            if dlg.shallSave():
-                Preferences.setUI("ProxyUser", username)
-                Preferences.setUI("ProxyPassword", password)
-    
     def __sslErrors(self, reply, errors):
         """
         Private slot to handle SSL errors.
--- a/Preferences/ConfigurationPages/NetworkPage.py	Wed May 26 08:37:24 2010 +0200
+++ b/Preferences/ConfigurationPages/NetworkPage.py	Wed May 26 17:53:53 2010 +0200
@@ -34,10 +34,6 @@
         
         self.downloadDirCompleter = E5DirCompleter(self.downloadDirEdit)
         
-        self.proxyTypeCombo.addItem(self.trUtf8("Transparent HTTP"), 0)
-        self.proxyTypeCombo.addItem(self.trUtf8("Caching HTTP"), 1)
-        self.proxyTypeCombo.addItem(self.trUtf8("Socks5"), 2)
-        
         # set initial values
         self.downloadDirEdit.setText(Preferences.getUI("DownloadPath"))
         self.requestFilenameCheckBox.setChecked(
@@ -49,16 +45,14 @@
             self.systemProxyButton.setChecked(True)
         else:
             self.manualProxyButton.setChecked(True)
-        self.proxyTypeCombo.setCurrentIndex(self.proxyTypeCombo.findData(\
-            Preferences.getUI("ProxyType")))
         self.proxyHostEdit.setText(\
-            Preferences.getUI("ProxyHost"))
+            Preferences.getUI("ProxyHost/Http"))
         self.proxyUserEdit.setText(\
-            Preferences.getUI("ProxyUser"))
+            Preferences.getUI("ProxyUser/Http"))
         self.proxyPasswordEdit.setText(\
-            Preferences.getUI("ProxyPassword"))
+            Preferences.getUI("ProxyPassword/Http"))
         self.proxyPortSpin.setValue(\
-            Preferences.getUI("ProxyPort"))
+            Preferences.getUI("ProxyPort/Http"))
         
     def save(self):
         """
@@ -73,15 +67,13 @@
             self.proxyGroup.isChecked())
         Preferences.setUI("UseSystemProxy", 
             self.systemProxyButton.isChecked())
-        Preferences.setUI("ProxyType", 
-            self.proxyTypeCombo.itemData(self.proxyTypeCombo.currentIndex()))
-        Preferences.setUI("ProxyHost",
+        Preferences.setUI("ProxyHost/Http",
             self.proxyHostEdit.text())
-        Preferences.setUI("ProxyUser",
+        Preferences.setUI("ProxyUser/Http",
             self.proxyUserEdit.text())
-        Preferences.setUI("ProxyPassword",
+        Preferences.setUI("ProxyPassword/Http",
             self.proxyPasswordEdit.text())
-        Preferences.setUI("ProxyPort",
+        Preferences.setUI("ProxyPort/Http",
             self.proxyPortSpin.value())
     
     @pyqtSlot()
--- a/Preferences/__init__.py	Wed May 26 08:37:24 2010 +0200
+++ b/Preferences/__init__.py	Wed May 26 17:53:53 2010 +0200
@@ -161,11 +161,24 @@
                                         # 3 = weekly
                                         # 4 = monthly
         "UseProxy" : False,
-        "UseSystemProxy" : True, 
-        "ProxyHost" : "",
-        "ProxyPort" : 80,
-        "ProxyUser" : "",
-        "ProxyPassword" : "",
+        "UseSystemProxy" : True,
+        "UseHttpProxyForAll" : False, 
+        "ProxyHost/Http" : "",
+        "ProxyHost/Https" : "",
+        "ProxyHost/Ftp" : "",
+        "ProxyHost/Socks5" : "",
+        "ProxyPort/Http" : 80,
+        "ProxyPort/Https" : 443,
+        "ProxyPort/Ftp" : 21,
+        "ProxyPort/Socks5" : 0,
+        "ProxyUser/Http" : "",
+        "ProxyUser/Https" : "",
+        "ProxyUser/Ftp" : "",
+        "ProxyUser/Socks5" : "",
+        "ProxyPassword/Http" : "",
+        "ProxyPassword/Https" : "",
+        "ProxyPassword/Ftp" : "",
+        "ProxyPassword/Socks5" : "",
         "ProxyType" : 0,            # 0 = transparent HTTP proxy
                                     # 1 = caching HTTP proxy
                                     # 2 = SOCKS5 proxy
@@ -1054,7 +1067,8 @@
                 "BrowsersListContentsByOccurrence", "LogViewerAutoRaise", 
                 "SingleApplicationMode", "TabViewManagerFilenameOnly", 
                 "CaptionShowsFilename", "ShowSplash", 
-                "SingleCloseButton", "UseProxy", "UseSystemProxy", 
+                "SingleCloseButton", 
+                "UseProxy", "UseSystemProxy", "UseHttpProxyForAll", 
                 "TopLeftByLeft", "BottomLeftByLeft", 
                 "TopRightByRight", "BottomRightByRight", 
                 "RequestDownloadFilename", 
@@ -1063,11 +1077,13 @@
         return toBool(prefClass.settings.value("UI/" + key,
             prefClass.uiDefaults[key]))
     elif key in ["TabViewManagerFilenameLength", "CaptionFilenameLength",
-                 "ProxyPort", "ProxyType", "OpenOnStartup", 
+                 "ProxyPort/Http", "ProxyPort/Https", "ProxyPort/Ftp", "ProxyPort/Socks5", 
+                 "OpenOnStartup", 
                  "PerformVersionCheck", "RecentNumber", ]:
         return int(prefClass.settings.value("UI/" + key,
             prefClass.uiDefaults[key]))
-    elif key == "ProxyPassword":
+    elif key in ["ProxyPassword/Http", "ProxyPassword/Https", 
+                 "ProxyPassword/Ftp", "ProxyPassword/Socks5", ]:
         from Utilities import pwDecode
         return pwDecode(prefClass.settings.value("UI/" + key, prefClass.uiDefaults[key]))
     elif key in ["LogStdErrColour"]:
@@ -1137,7 +1153,8 @@
         prefClass.settings.setValue("UI/" + key, value)
     elif key == "LogStdErrColour":
         prefClass.settings.setValue("UI/" + key, value.name())
-    elif key == "ProxyPassword":
+    elif key in ["ProxyPassword/Http", "ProxyPassword/Https", 
+                 "ProxyPassword/Ftp", "ProxyPassword/Socks5", ]:
         from Utilities import pwEncode
         prefClass.settings.setValue("UI/" + key, pwEncode(value))
     else:
--- a/UI/UserInterface.py	Wed May 26 08:37:24 2010 +0200
+++ b/UI/UserInterface.py	Wed May 26 17:53:53 2010 +0200
@@ -69,7 +69,6 @@
 from .LogView import LogViewer
 from .FindFileDialog import FindFileDialog
 from .FindFileNameDialog import FindFileNameDialog
-from .AuthenticationDialog import AuthenticationDialog
 
 from E5Gui.E5SingleApplication import E5SingleApplicationServer
 from E5Gui.E5Action import E5Action, createActionGroup
@@ -98,7 +97,7 @@
 from E5XML.SessionWriter import SessionWriter
 from E5XML.SessionHandler import SessionHandler
 
-from E5Network.E5NetworkProxyFactory import E5NetworkProxyFactory
+from E5Network.E5NetworkProxyFactory import E5NetworkProxyFactory, proxyAuthenticationRequired
 
 from IconEditor.IconEditorWindow import IconEditorWindow
 
@@ -620,7 +619,7 @@
         self.__networkManager = QNetworkAccessManager(self)
         self.connect(self.__networkManager, 
             SIGNAL('proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)'),
-            self.__proxyAuthenticationRequired)
+            proxyAuthenticationRequired)
         self.connect(self.__networkManager, 
                 SIGNAL('sslErrors(QNetworkReply *, const QList<QSslError> &)'), 
             self.__sslErrors)
@@ -5522,25 +5521,6 @@
         
         QMessageBox.about(self, Program, versionText)
         
-    def __proxyAuthenticationRequired(self, proxy, auth):
-        """
-        Private slot to handle a proxy authentication request.
-        
-        @param proxy reference to the proxy object (QNetworkProxy)
-        @param auth reference to the authenticator object (QAuthenticator)
-        """
-        info = self.trUtf8("<b>Connect to proxy '{0}' using:</b>")\
-            .format(Qt.escape(proxy.hostName()))
-        
-        dlg = AuthenticationDialog(info, proxy.user(), True)
-        if dlg.exec_() == QDialog.Accepted:
-            username, password = dlg.getData()
-            auth.setUser(username)
-            auth.setPassword(password)
-            if dlg.shallSave():
-                Preferences.setUI("ProxyUser", username)
-                Preferences.setUI("ProxyPassword", password)
-        
     def __sslErrors(self, reply, errors):
         """
         Private slot to handle SSL errors.

eric ide

mercurial