summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2019-08-05 18:11:13 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2019-08-05 18:12:47 +0100
commitbfb1bb119241d85bb9b400881328496e12a39aed (patch)
tree4f05e7c9e1d61cb5229895da7d4f318f94ef90f1 /desktop
parentbccf101714f2ca165b1fd754879f3813993d26ca (diff)
downloadnetsurf-bfb1bb119241d85bb9b400881328496e12a39aed.tar.gz
netsurf-bfb1bb119241d85bb9b400881328496e12a39aed.tar.bz2
Migrate SSL certificate storage to the browser window
* Fetchers now provide the certificates before headers * This is propagated all the way to the browser window * When a query occurs, we retrieve it from there and fire the query with those stored certificates. * The serial number is a bignum, store it as hex. Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'desktop')
-rw-r--r--desktop/browser_private.h19
-rw-r--r--desktop/browser_window.c29
-rw-r--r--desktop/download.c3
-rw-r--r--desktop/sslcert_viewer.c5
4 files changed, 49 insertions, 7 deletions
diff --git a/desktop/browser_private.h b/desktop/browser_private.h
index 0883c54ac..7e2d7e76d 100644
--- a/desktop/browser_private.h
+++ b/desktop/browser_private.h
@@ -25,6 +25,7 @@
#ifndef NETSURF_DESKTOP_BROWSER_PRIVATE_H_
#define NETSURF_DESKTOP_BROWSER_PRIVATE_H_
+#include "content/fetch.h"
#include "desktop/frame_types.h"
struct box;
@@ -89,6 +90,14 @@ struct browser_fetch_parameters {
};
/**
+ * The SSL context for a fetch, as provided by the fetchers
+ */
+struct browser_ssl_info {
+ struct ssl_cert_info certs[MAX_SSL_CERTS]; /**< The certificate chain */
+ size_t num; /**< The number of certificates in the chain */
+};
+
+/**
* Browser window data.
*/
struct browser_window {
@@ -104,6 +113,11 @@ struct browser_window {
struct browser_fetch_parameters current_parameters;
/**
+ * The SSL information for the current content
+ */
+ struct browser_ssl_info current_ssl_info;
+
+ /**
* Content handle of page in process of being loaded or NULL
* if no page is being loaded.
*/
@@ -115,6 +129,11 @@ struct browser_window {
struct browser_fetch_parameters loading_parameters;
/**
+ * The SSL information for the loading content
+ */
+ struct browser_ssl_info loading_ssl_info;
+
+ /**
* Favicon
*/
struct {
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index 4678660bf..2adf8a9ca 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -688,10 +688,16 @@ static nserror browser_window_content_ready(struct browser_window *bw)
bw->current_content = bw->loading_content;
bw->loading_content = NULL;
+
+ /* Transfer the fetch parameters */
browser_window__free_fetch_parameters(&bw->current_parameters);
bw->current_parameters = bw->loading_parameters;
memset(&bw->loading_parameters, 0, sizeof(bw->loading_parameters));
+ /* Transfer the SSL info */
+ bw->current_ssl_info = bw->loading_ssl_info;
+ bw->loading_ssl_info.num = 0;
+
/* Format the new content to the correct dimensions */
browser_window_get_dimensions(bw, &width, &height);
width /= bw->scale;
@@ -825,6 +831,14 @@ browser_window_callback(hlcache_handle *c, const hlcache_event *event, void *pw)
nserror res = NSERROR_OK;
switch (event->type) {
+ case CONTENT_MSG_SSL_CERTS:
+ /* SSL certificate information has arrived, store it */
+ assert(event->data.certs.num < MAX_SSL_CERTS);
+ memcpy(&bw->loading_ssl_info.certs[0],
+ event->data.certs.certs,
+ sizeof(struct ssl_cert_info) * event->data.certs.num);
+ bw->loading_ssl_info.num = event->data.certs.num;
+ break;
case CONTENT_MSG_LOG:
browser_window_console_log(bw,
event->data.log.src,
@@ -1138,16 +1152,22 @@ browser_window_callback(hlcache_handle *c, const hlcache_event *event, void *pw)
break;
- case CONTENT_MSG_QUERY:
+ case CONTENT_MSG_QUERY: {
/** \todo QUERY - Decide what is right here */
/* For now, we directly invoke the known global handler for queries */
+ llcache_query query = *(event->data.query_msg->query);
+ if (query.type == LLCACHE_QUERY_SSL) {
+ query.data.ssl.certs = &bw->loading_ssl_info.certs[0];
+ query.data.ssl.num = bw->loading_ssl_info.num;
+ }
+
return netsurf_llcache_query_handler(
- event->data.query_msg->query,
+ &query,
NULL,
event->data.query_msg->cb,
event->data.query_msg->cb_pw);
break;
-
+ }
case CONTENT_MSG_QUERY_FINISHED:
/** \todo QUERY - Decide what is right here */
break;
@@ -2844,6 +2864,9 @@ browser_window__navigate_internal(struct browser_window *bw,
NSLOG(netsurf, INFO, "Loading '%s'", nsurl_access(params->url));
+ /* Clear SSL info for load */
+ bw->loading_ssl_info.num = 0;
+
/* Set up retrieval parameters */
if (!(params->flags & BW_NAVIGATE_UNVERIFIABLE)) {
fetch_flags |= LLCACHE_RETRIEVE_VERIFIABLE;
diff --git a/desktop/download.c b/desktop/download.c
index eca818b64..ba5d9bd65 100644
--- a/desktop/download.c
+++ b/desktop/download.c
@@ -181,6 +181,9 @@ static nserror download_callback(llcache_handle *handle,
nserror error = NSERROR_OK;
switch (event->type) {
+ case LLCACHE_EVENT_GOT_CERTS:
+ /* Nominally not interested in these */
+ break;
case LLCACHE_EVENT_HAD_HEADERS:
error = download_context_process_headers(ctx);
if (error != NSERROR_OK) {
diff --git a/desktop/sslcert_viewer.c b/desktop/sslcert_viewer.c
index f40af5968..2936e89e6 100644
--- a/desktop/sslcert_viewer.c
+++ b/desktop/sslcert_viewer.c
@@ -71,7 +71,6 @@ struct sslcert_session_data {
struct sslcert_entry {
treeview_node *entry;
char version[24];
- char serial[24];
char type[24];
struct treeview_field_data data[SSLCERT_V_N_FIELDS - 1];
};
@@ -134,11 +133,9 @@ sslcert_viewer_set_treeview_field_data(struct sslcert_entry *e,
&e->data[SSLCERT_V_SUBJECT],
cert->subject, ssl_d);
- written = snprintf(e->serial, sizeof(e->serial), "%li", cert->serial);
- assert(written < sizeof(e->serial));
sslcert_viewer_field_builder(SSLCERT_V_SERIAL,
&e->data[SSLCERT_V_SERIAL],
- e->serial, ssl_d);
+ cert->serialnum, ssl_d);
written = snprintf(e->type, sizeof(e->type), "%i", cert->cert_type);
assert(written < sizeof(e->type));