diff options
Diffstat (limited to 'qutebrowser/browser/webkit/certificateerror.py')
-rw-r--r-- | qutebrowser/browser/webkit/certificateerror.py | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/qutebrowser/browser/webkit/certificateerror.py b/qutebrowser/browser/webkit/certificateerror.py index 09237dae9..553538193 100644 --- a/qutebrowser/browser/webkit/certificateerror.py +++ b/qutebrowser/browser/webkit/certificateerror.py @@ -19,19 +19,25 @@ """A wrapper over a list of QSslErrors.""" -from typing import Sequence +from typing import Sequence, Optional -from PyQt5.QtNetwork import QSslError +from qutebrowser.qt.network import QSslError, QNetworkReply -from qutebrowser.utils import usertypes, utils, debug, jinja +from qutebrowser.utils import usertypes, utils, debug, jinja, urlutils class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper): """A wrapper over a list of QSslErrors.""" - def __init__(self, errors: Sequence[QSslError]) -> None: + def __init__(self, reply: QNetworkReply, errors: Sequence[QSslError]) -> None: + super().__init__() + self._reply = reply self._errors = tuple(errors) # needs to be hashable + try: + self._host_tpl: Optional[urlutils.HostTupleType] = urlutils.host_tuple(reply.url()) + except ValueError: + self._host_tpl = None def __str__(self) -> str: return '\n'.join(err.errorString() for err in self._errors) @@ -43,16 +49,25 @@ class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper): string=str(self)) def __hash__(self) -> int: - return hash(self._errors) + return hash((self._host_tpl, self._errors)) def __eq__(self, other: object) -> bool: if not isinstance(other, CertificateErrorWrapper): return NotImplemented - return self._errors == other._errors + return self._errors == other._errors and self._host_tpl == other._host_tpl def is_overridable(self) -> bool: return True + def defer(self) -> None: + raise usertypes.UndeferrableError("Never deferrable") + + def accept_certificate(self) -> None: + super().accept_certificate() + self._reply.ignoreSslErrors() + + # Not overriding reject_certificate because that's default in QNetworkReply + def html(self): if len(self._errors) == 1: return super().html() |