Wed, 26 May 2010 17:53:53 +0200
Prepared to have individual proxies per scheme.
--- 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.