summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
Diffstat (limited to 'riscos')
-rw-r--r--riscos/401login.c10
-rw-r--r--riscos/dialog.c44
-rw-r--r--riscos/gui.h7
-rw-r--r--riscos/plugin.c13
-rw-r--r--riscos/sslcert.c182
5 files changed, 230 insertions, 26 deletions
diff --git a/riscos/401login.c b/riscos/401login.c
index 01479a069..ecc99e4f7 100644
--- a/riscos/401login.c
+++ b/riscos/401login.c
@@ -28,8 +28,8 @@
static void ro_gui_401login_close(wimp_w w);
static bool ro_gui_401login_apply(wimp_w w);
-static void ro_gui_401login_open(struct browser_window *bw, char *host,
- char *realm, char *fetchurl);
+static void ro_gui_401login_open(struct browser_window *bw, const char *host,
+ const char *realm, const char *fetchurl);
static wimp_window *dialog_401_template;
@@ -58,7 +58,7 @@ void ro_gui_401login_init(void)
* Open the login dialog
*/
void gui_401login_open(struct browser_window *bw, struct content *c,
- char *realm)
+ const char *realm)
{
char *murl, *host;
url_func_result res;
@@ -77,8 +77,8 @@ void gui_401login_open(struct browser_window *bw, struct content *c,
* Open a 401 login window.
*/
-void ro_gui_401login_open(struct browser_window *bw, char *host, char *realm,
- char *fetchurl)
+void ro_gui_401login_open(struct browser_window *bw, const char *host,
+ const char *realm, const char *fetchurl)
{
struct session_401 *session;
wimp_w w;
diff --git a/riscos/dialog.c b/riscos/dialog.c
index e41dfb9b5..3a5225e8b 100644
--- a/riscos/dialog.c
+++ b/riscos/dialog.c
@@ -91,6 +91,11 @@ void ro_gui_dialog_init(void)
ro_gui_401login_init();
#endif
+ /* certificate verification window */
+#ifdef WITH_SSL
+ ro_gui_cert_init();
+#endif
+
/* hotlist window */
ro_gui_hotlist_initialise();
@@ -353,6 +358,15 @@ void ro_gui_dialog_close(wimp_w close)
wimp_caret caret;
os_error *error;
+ /* Check if we're a persistent window */
+ for (i = 0; i < MAX_PERSISTENT; i++) {
+ if (persistent_dialog[i].dialog == close) {
+ /* We are => invalidate record */
+ persistent_dialog[i].dialog = NULL;
+ break;
+ }
+ }
+
/* Give the caret back to the parent window. This code relies on
the fact that only tree windows and browser windows open
persistent dialogues, as the caret gets placed to no icon.
@@ -363,24 +377,18 @@ void ro_gui_dialog_close(wimp_w close)
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
} else if (caret.w == close) {
- /* Check if we are a persistent window
- */
- for (i = 0; i < MAX_PERSISTENT; i++) {
- if (persistent_dialog[i].dialog == close) {
- persistent_dialog[i].dialog = NULL;
- error = xwimp_set_caret_position(
- persistent_dialog[i].parent,
- wimp_ICON_WINDOW, -100, -100,
- 32, -1);
- /* parent may have been closed first */
- if ((error) && (error->errnum != 0x287)) {
- LOG(("xwimp_set_caret_position: "
- "0x%x: %s",
- error->errnum,
- error->errmess));
- warn_user("WimpError", error->errmess);
- }
- break;
+ /* Check if we are a persistent window */
+ if (i < MAX_PERSISTENT) {
+ error = xwimp_set_caret_position(
+ persistent_dialog[i].parent,
+ wimp_ICON_WINDOW, -100, -100,
+ 32, -1);
+ /* parent may have been closed first */
+ if ((error) && (error->errnum != 0x287)) {
+ LOG(("xwimp_set_caret_position: 0x%x: %s",
+ error->errnum,
+ error->errmess));
+ warn_user("WimpError", error->errmess);
}
}
}
diff --git a/riscos/gui.h b/riscos/gui.h
index 629316ccb..e4d70bca3 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -124,6 +124,11 @@ void ro_gui_mouse_action(struct gui_window *g);
void ro_gui_401login_init(void);
#endif
+/* in sslcert.c */
+#ifdef WITH_SSL
+void ro_gui_cert_init(void);
+#endif
+
/* in window.c */
void ro_gui_window_quit(void);
void ro_gui_window_click(struct gui_window *g, wimp_pointer *mouse);
@@ -302,7 +307,7 @@ bool ro_gui_theme_install_apply(wimp_w w);
#define ICON_SEARCH_CANCEL 4
#define ICON_SEARCH_STATUS 5
#define ICON_SEARCH_MENU 8
-#define ICON_SEARCH_SHOW_ALL 9
+#define ICON_SEARCH_SHOW_ALL 9
#define ICON_THEME_INSTALL_MESSAGE 0
#define ICON_THEME_INSTALL_INSTALL 1
diff --git a/riscos/plugin.c b/riscos/plugin.c
index b1c26df2c..115045b7c 100644
--- a/riscos/plugin.c
+++ b/riscos/plugin.c
@@ -164,7 +164,7 @@ static void plugin_stream_free(struct plugin_stream *p);
static bool plugin_start_fetch(struct plugin_stream *p, const char *url);
static void plugin_stream_callback(content_msg msg, struct content *c,
intptr_t p1, intptr_t p2, union content_msg_data data);
-static void plugin_fetch_callback(fetch_msg msg, void *p, const char *data,
+static void plugin_fetch_callback(fetch_msg msg, void *p, const void *data,
unsigned long size);
/**
@@ -1707,6 +1707,12 @@ void plugin_stream_callback(content_msg msg, struct content *c,
/* ignore this */
break;
+#ifdef WITH_SSL
+ case CONTENT_MSG_SSL:
+ plugin_destroy_stream(p, plugin_STREAM_DESTROY_ERROR);
+ break;
+#endif
+
case CONTENT_MSG_READY:
case CONTENT_MSG_DONE:
case CONTENT_MSG_REFORMAT:
@@ -1721,7 +1727,7 @@ void plugin_stream_callback(content_msg msg, struct content *c,
/**
* Callback for plugin fetch
*/
-void plugin_fetch_callback(fetch_msg msg, void *p, const char *data,
+void plugin_fetch_callback(fetch_msg msg, void *p, const void *data,
unsigned long size)
{
struct plugin_stream *s = p;
@@ -1754,6 +1760,9 @@ void plugin_fetch_callback(fetch_msg msg, void *p, const char *data,
case FETCH_REDIRECT:
case FETCH_NOTMODIFIED:
case FETCH_AUTH:
+#ifdef WITH_SSL
+ case FETCH_CERT_ERR:
+#endif
default:
/* not possible */
assert(0);
diff --git a/riscos/sslcert.c b/riscos/sslcert.c
new file mode 100644
index 000000000..74a9ffdcd
--- /dev/null
+++ b/riscos/sslcert.c
@@ -0,0 +1,182 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2006 John M Bell <jmb202@ecs.soton.ac.uk>
+ */
+
+/** \file
+ * SSL Certificate verification UI (implementation)
+ */
+
+#include "netsurf/utils/config.h"
+
+#ifdef WITH_SSL
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include "oslib/wimp.h"
+#include "netsurf/content/certdb.h"
+#include "netsurf/content/content.h"
+#include "netsurf/content/fetch.h"
+#include "netsurf/desktop/browser.h"
+#include "netsurf/desktop/gui.h"
+#include "netsurf/riscos/dialog.h"
+#include "netsurf/riscos/wimp_event.h"
+#include "netsurf/utils/log.h"
+#include "netsurf/utils/utils.h"
+
+#define ICON_CERT_VERSION 1
+#define ICON_CERT_VALID_FROM 2
+#define ICON_CERT_TYPE 3
+#define ICON_CERT_VALID_TO 4
+#define ICON_CERT_SERIAL 5
+#define ICON_CERT_ISSUER 6
+#define ICON_CERT_SUBJECT 7
+#define ICON_CERT_REJECT 8
+#define ICON_CERT_ACCEPT 9
+
+static wimp_window *dialog_cert_template;
+
+struct session_cert {
+ char version[16], valid_from[32], valid_to[32], type[8], serial[32],
+ issuer[256], subject[256];
+ char *url;
+ struct browser_window *bw;
+};
+
+static void ro_gui_cert_open(struct browser_window *bw, const char *url,
+ const struct ssl_cert_info *certdata);
+static void ro_gui_cert_close(wimp_w w);
+static bool ro_gui_cert_apply(wimp_w w);
+
+/**
+ * Load the cert window template
+ */
+
+void ro_gui_cert_init(void)
+{
+ dialog_cert_template = ro_gui_dialog_load_template("sslcert");
+}
+
+/**
+ * Open the certificate verification dialog
+ */
+
+void gui_cert_verify(struct browser_window *bw, struct content *c,
+ const struct ssl_cert_info *certs, unsigned long num)
+{
+ assert(bw && c && certs);
+
+ /** \todo Display entire certificate chain */
+ ro_gui_cert_open(bw, c->url, certs);
+}
+
+void ro_gui_cert_open(struct browser_window *bw, const char *url,
+ const struct ssl_cert_info *certdata)
+{
+ struct session_cert *session;
+ wimp_w w;
+
+ session = malloc(sizeof(struct session_cert));
+ if (!session) {
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ session->url = strdup(url);
+ if (!session->url) {
+ free(session);
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ session->bw = bw;
+
+ snprintf(session->version, sizeof session->version, "%ld",
+ certdata->version);
+ snprintf(session->valid_from, sizeof session->valid_from, "%s",
+ certdata->not_before);
+ snprintf(session->type, sizeof session->type, "%d",
+ certdata->cert_type);
+ snprintf(session->valid_to, sizeof session->valid_to, "%s",
+ certdata->not_after);
+ snprintf(session->serial, sizeof session->serial, "%ld",
+ certdata->serial);
+ snprintf(session->issuer, sizeof session->issuer, "%s",
+ certdata->issuer);
+ snprintf(session->subject, sizeof session->subject, "%s",
+ certdata->subject);
+
+ dialog_cert_template->icons[ICON_CERT_VERSION].data.indirected_text.text = session->version;
+ dialog_cert_template->icons[ICON_CERT_VERSION].data.indirected_text.size = strlen(session->version) + 1;
+ dialog_cert_template->icons[ICON_CERT_VALID_FROM].data.indirected_text.text = session->valid_from;
+ dialog_cert_template->icons[ICON_CERT_VALID_FROM].data.indirected_text.size = strlen(session->valid_from) + 1;
+ dialog_cert_template->icons[ICON_CERT_TYPE].data.indirected_text.text = session->type;
+ dialog_cert_template->icons[ICON_CERT_TYPE].data.indirected_text.size = strlen(session->type) + 1;
+ dialog_cert_template->icons[ICON_CERT_VALID_TO].data.indirected_text.text = session->valid_to;
+ dialog_cert_template->icons[ICON_CERT_VALID_TO].data.indirected_text.size = strlen(session->valid_to) + 1;
+ dialog_cert_template->icons[ICON_CERT_SERIAL].data.indirected_text.text = session->serial;
+ dialog_cert_template->icons[ICON_CERT_SERIAL].data.indirected_text.size = strlen(session->serial) + 1;
+ dialog_cert_template->icons[ICON_CERT_ISSUER].data.indirected_text.text = session->issuer;
+ dialog_cert_template->icons[ICON_CERT_ISSUER].data.indirected_text.size = strlen(session->issuer) + 1;
+ dialog_cert_template->icons[ICON_CERT_SUBJECT].data.indirected_text.text = session->subject;
+ dialog_cert_template->icons[ICON_CERT_SUBJECT].data.indirected_text.size = strlen(session->subject) + 1;
+
+ w = wimp_create_window(dialog_cert_template);
+
+ ro_gui_wimp_event_register_cancel(w, ICON_CERT_REJECT);
+ ro_gui_wimp_event_register_ok(w, ICON_CERT_ACCEPT, ro_gui_cert_apply);
+ ro_gui_wimp_event_register_close_window(w, ro_gui_cert_close);
+ ro_gui_wimp_event_set_user_data(w, session);
+
+ ro_gui_dialog_open_persistent(bw->window->window, w, false);
+}
+
+/**
+ * Handle closing of certificate verification dialog
+ */
+void ro_gui_cert_close(wimp_w w)
+{
+ os_error *error;
+ struct session_cert *session;
+
+ session = (struct session_cert *)ro_gui_wimp_event_get_user_data(w);
+
+ assert(session);
+
+ free(session->url);
+ free(session);
+
+ ro_gui_wimp_event_finalise(w);
+
+ error = xwimp_delete_window(w);
+ if (error)
+ LOG(("xwimp_delete_window: 0x%x: %s",
+ error->errnum, error->errmess));
+}
+
+/**
+ * Handle acceptance of certificate
+ */
+bool ro_gui_cert_apply(wimp_w w)
+{
+ struct session_cert *session;
+
+ session = (struct session_cert *)ro_gui_wimp_event_get_user_data(w);
+
+ assert(session);
+
+ if (!certdb_insert(session->url)) {
+ LOG(("certdb_insert failed"));
+ return false;
+ }
+
+ browser_window_go(session->bw, session->url, 0);
+
+ return true;
+}
+
+#endif