From 84967f4d7c58f479eaf8710fea69a019e70a8078 Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 17 Oct 2015 22:05:07 +0200 Subject: [PATCH] browser: detect HTTPS downgrade --- weboob/browser/browsers.py | 12 ++++++++++++ weboob/exceptions.py | 4 ++++ weboob/tools/application/console.py | 4 +++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/weboob/browser/browsers.py b/weboob/browser/browsers.py index 9c3bc85f36..03e9838d63 100644 --- a/weboob/browser/browsers.py +++ b/weboob/browser/browsers.py @@ -43,6 +43,8 @@ except ImportError: raise ImportError('Please install python-requests >= 2.0') +from weboob.exceptions import BrowserHTTPSDowngrade + from weboob.tools.log import getLogger from weboob.tools.ordereddict import OrderedDict from weboob.tools.json import json @@ -659,6 +661,16 @@ def internal_callback(response): break if response.page is None: + regexp = r'^(?P\w+)://.*' + + proto_base = re.match(regexp, response.url) + if proto_base: + proto_base = proto_base.group('proto') + proto_resp = re.match(regexp, self.BASEURL).group('proto') + + if proto_base == 'https' and proto_resp != 'https': + raise BrowserHTTPSDowngrade() + self.logger.debug('Unable to handle %s' % response.url) return callback(response) diff --git a/weboob/exceptions.py b/weboob/exceptions.py index 12e90904e0..d424a4023e 100644 --- a/weboob/exceptions.py +++ b/weboob/exceptions.py @@ -55,6 +55,10 @@ class BrowserHTTPError(BrowserUnavailable): pass +class BrowserHTTPSDowngrade(BrowserUnavailable): + pass + + class BrowserSSLError(BrowserUnavailable): pass diff --git a/weboob/tools/application/console.py b/weboob/tools/application/console.py index 8f5548db9b..4b730211d2 100644 --- a/weboob/tools/application/console.py +++ b/weboob/tools/application/console.py @@ -32,7 +32,7 @@ from weboob.core.backendscfg import BackendAlreadyExists from weboob.core.modules import ModuleLoadError from weboob.core.repositories import ModuleInstallError, IProgress -from weboob.exceptions import BrowserUnavailable, BrowserIncorrectPassword, BrowserForbidden, BrowserSSLError, BrowserQuestion +from weboob.exceptions import BrowserUnavailable, BrowserIncorrectPassword, BrowserForbidden, BrowserSSLError, BrowserQuestion, BrowserHTTPSDowngrade from weboob.tools.value import Value, ValueBool, ValueFloat, ValueInt, ValueBackendPassword from weboob.tools.misc import to_unicode from weboob.tools.compat import check_output @@ -568,6 +568,8 @@ def bcall_error_handler(self, backend, error, backtrace): self.load_backends(names=[backend.name]) elif isinstance(error, BrowserSSLError): print(u'FATAL(%s): ' % backend.name + self.BOLD + '/!\ SERVER CERTIFICATE IS INVALID /!\\' + self.NC, file=self.stderr) + elif isinstance(error, BrowserHTTPSDowngrade): + print(u'FATAL(%s): ' % backend.name + 'Downgrade from HTTPS to HTTP') elif isinstance(error, BrowserForbidden): msg = unicode(error) print(u'Error(%s): %s' % (backend.name, msg or 'Forbidden'), file=self.stderr) -- GitLab