diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-12-01 15:49:08 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-12-01 15:49:08 +0000 |
commit | 6fc2666d07f28cd845b5697853b9b0e61f8848c5 (patch) | |
tree | 441933bf0787bba0143c702dd25baf78a14925f7 /content/content.c | |
parent | 9741df214d7b291c8de40e9b21d4411e523d0bb3 (diff) | |
download | netsurf-6fc2666d07f28cd845b5697853b9b0e61f8848c5.tar.gz netsurf-6fc2666d07f28cd845b5697853b9b0e61f8848c5.tar.bz2 |
Allow contents to indicate if they believe they may not be secure.
HTML contents reference many other objects. The browser window
needs to know if any of them may not be secure, in which case it
needs to report that in its page state. If other content types
might refer to sub-contents, they will need to define the callback
too.
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'content/content.c')
-rw-r--r-- | content/content.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/content/content.c b/content/content.c index 82a87c536..c0119eac9 100644 --- a/content/content.c +++ b/content/content.c @@ -28,6 +28,7 @@ #include "netsurf/inttypes.h" #include "utils/log.h" #include "utils/messages.h" +#include "utils/corestrings.h" #include "netsurf/browser_window.h" #include "netsurf/bitmap.h" #include "netsurf/content.h" @@ -564,6 +565,50 @@ bool content_exec(struct hlcache_handle *h, const char *src, size_t srclen) } /* exported interface, documented in content/content.h */ +bool content_saw_insecure_objects(struct hlcache_handle *h) +{ + struct content *c = hlcache_handle_get_content(h); + lwc_string *scheme = nsurl_get_component(content_get_url(c), NSURL_SCHEME); + bool match; + + /* Is this an internal scheme? If so, we trust here and stop */ + if ((lwc_string_isequal(scheme, corestring_lwc_about, + &match) == lwc_error_ok && + (match == true)) || + (lwc_string_isequal(scheme, corestring_lwc_data, + &match) == lwc_error_ok && + (match == true)) || + (lwc_string_isequal(scheme, corestring_lwc_resource, + &match) == lwc_error_ok && + (match == true))) { + /* No insecurity to find */ + return false; + } + + /* Okay, not internal, am *I* secure? */ + if ((lwc_string_isequal(scheme, corestring_lwc_https, + &match) == lwc_error_ok) + && (match == false)) { + /* I did see something insecure -- ME! */ + return true; + } + + /* I am supposed to be secure, but was I overridden */ + if (urldb_get_cert_permissions(content_get_url(c))) { + /* I was https:// but I was overridden, that's no good */ + return true; + } + + /* Otherwise try and chain through the handler */ + if (c->handler->saw_insecure_objects != NULL) { + return c->handler->saw_insecure_objects(c); + } + + /* If we can't see insecure objects, we can't see them */ + return false; +} + +/* exported interface, documented in content/content.h */ bool content_redraw(hlcache_handle *h, struct content_redraw_data *data, const struct rect *clip, const struct redraw_context *ctx) { |