summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2019-02-17 14:58:54 +0100
committerFlorian Bruhin <me@the-compiler.org>2019-02-17 15:01:06 +0100
commit267537d58ab30ac405acdc0e25fd9eefd91df413 (patch)
treea0d4b68b235a687e051cad622761003f8d7ca2d8
parent0599e11dd42aaa48b1ce8fce9b4b59458bc97ca8 (diff)
downloadqutebrowser-267537d58ab30ac405acdc0e25fd9eefd91df413.tar.gz
qutebrowser-267537d58ab30ac405acdc0e25fd9eefd91df413.zip
Implement basic client certificate support
Certificate selection when there are multiple matches isn't implemented yet. See #3992, #3011, #4587.
-rw-r--r--doc/changelog.asciidoc2
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py33
2 files changed, 35 insertions, 0 deletions
diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc
index 9b318a07a..ac1a9f898 100644
--- a/doc/changelog.asciidoc
+++ b/doc/changelog.asciidoc
@@ -35,6 +35,8 @@ Added
are used for hints, and also allows adding custom hint groups.
- New `:yank markdown` feature which yanks the current URL and title in
markdown format.
+- Basic support for client certificates with Qt 5.12. Selecting the certificate
+ to show when there are multiple matching certificates isn't implemented yet.
Changed
~~~~~~~
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index 60a9379d4..3965c00cf 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -1463,6 +1463,37 @@ class WebEngineTab(browsertab.AbstractTab):
if reload_needed:
self._reload_url = navigation.url
+ def _on_select_client_certificate(self, selection):
+ """Handle client certificates.
+
+ Currently, we simply pick the first available certificate and show an
+ additional note if there are multiple matches.
+ """
+ certificate = selection.certificates()[0]
+ text = ('<b>Subject:</b> {subj}<br/>'
+ '<b>Issuer:</b> {issuer}<br/>'
+ '<b>Serial:</b> {serial}'.format(
+ subj=html_utils.escape(certificate.subjectDisplayName()),
+ issuer=html_utils.escape(certificate.issuerDisplayName()),
+ serial=bytes(certificate.serialNumber()).decode('ascii')))
+ if len(selection.certificates()) > 1:
+ text += ('<br/><br/><b>Note:</b> Multiple matching certificates '
+ 'were found, but certificate selection is not '
+ 'implemented yet!')
+ urlstr = selection.host().host()
+
+ present = message.ask(
+ title='Present client certificate to {}?'.format(urlstr),
+ text=text,
+ mode=usertypes.PromptMode.yesno,
+ abort_on=[self.shutting_down, self.load_started],
+ url=urlstr)
+
+ if present:
+ selection.select(certificate)
+ else:
+ selection.selectNone()
+
def _connect_signals(self):
view = self._widget
page = view.page()
@@ -1479,6 +1510,8 @@ class WebEngineTab(browsertab.AbstractTab):
page.navigation_request.connect(self._on_navigation_request)
try:
page.printRequested.connect(self._on_print_requested)
+ page.selectClientCertificate.connect(
+ self._on_select_client_certificate)
except AttributeError:
# Added in Qt 5.12
pass