diff options
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/browser_private.h | 19 | ||||
-rw-r--r-- | desktop/browser_window.c | 29 | ||||
-rw-r--r-- | desktop/download.c | 3 | ||||
-rw-r--r-- | desktop/sslcert_viewer.c | 5 |
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)); |