Display an error message and certificate on tls error

This commit is contained in:
Quentin Rameau 2017-04-29 14:49:04 +02:00
parent c870098b82
commit 1dc3cd513a
2 changed files with 55 additions and 3 deletions

View file

@ -11,15 +11,16 @@ LIBPREFIX = $(PREFIX)/lib/surf
X11INC = /usr/X11R6/include X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib X11LIB = /usr/X11R6/lib
GTKINC = `pkg-config --cflags gtk+-3.0 webkit2gtk-4.0` GTKINC = `pkg-config --cflags gtk+-3.0 gcr-3 webkit2gtk-4.0`
GTKLIB = `pkg-config --libs gtk+-3.0 webkit2gtk-4.0` GTKLIB = `pkg-config --libs gtk+-3.0 gcr-3 webkit2gtk-4.0`
# includes and libs # includes and libs
INCS = -I$(X11INC) $(GTKINC) INCS = -I$(X11INC) $(GTKINC)
LIBS = -L$(X11LIB) -lX11 $(GTKLIB) -lgthread-2.0 LIBS = -L$(X11LIB) -lX11 $(GTKLIB) -lgthread-2.0
# flags # flags
CPPFLAGS = -DVERSION=\"${VERSION}\" -DWEBEXTDIR=\"${LIBPREFIX}\" -D_DEFAULT_SOURCE CPPFLAGS = -DVERSION=\"${VERSION}\" -DWEBEXTDIR=\"${LIBPREFIX}\" \
-D_DEFAULT_SOURCE -DGCR_API_SUBJECT_TO_CHANGE
SURF_CFLAGS = $(INCS) $(CPPFLAGS) $(CFLAGS) SURF_CFLAGS = $(INCS) $(CPPFLAGS) $(CFLAGS)
SURF_LDFLAGS = $(LIBS) $(LDFLAGS) SURF_LDFLAGS = $(LIBS) $(LDFLAGS)

51
surf.c
View file

@ -22,6 +22,7 @@
#include <glib/gstdio.h> #include <glib/gstdio.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gtk/gtkx.h> #include <gtk/gtkx.h>
#include <gcr/gcr.h>
#include <JavaScriptCore/JavaScript.h> #include <JavaScriptCore/JavaScript.h>
#include <webkit2/webkit2.h> #include <webkit2/webkit2.h>
#include <X11/X.h> #include <X11/X.h>
@ -187,6 +188,9 @@ static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event,
static gboolean winevent(GtkWidget *w, GdkEvent *e, Client *c); static gboolean winevent(GtkWidget *w, GdkEvent *e, Client *c);
static void showview(WebKitWebView *v, Client *c); static void showview(WebKitWebView *v, Client *c);
static GtkWidget *createwindow(Client *c); static GtkWidget *createwindow(Client *c);
static gboolean loadfailedtls(WebKitWebView *v, gchar *uri,
GTlsCertificate *cert,
GTlsCertificateFlags err, Client *c);
static void loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c); static void loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c);
static void progresschanged(WebKitWebView *v, GParamSpec *ps, Client *c); static void progresschanged(WebKitWebView *v, GParamSpec *ps, Client *c);
static void titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c); static void titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c);
@ -1070,6 +1074,8 @@ newview(Client *c, WebKitWebView *rv)
G_CALLBACK(decidepolicy), c); G_CALLBACK(decidepolicy), c);
g_signal_connect(G_OBJECT(v), "insecure-content-detected", g_signal_connect(G_OBJECT(v), "insecure-content-detected",
G_CALLBACK(insecurecontent), c); G_CALLBACK(insecurecontent), c);
g_signal_connect(G_OBJECT(v), "load-failed-with-tls-errors",
G_CALLBACK(loadfailedtls), c);
g_signal_connect(G_OBJECT(v), "load-changed", g_signal_connect(G_OBJECT(v), "load-changed",
G_CALLBACK(loadchanged), c); G_CALLBACK(loadchanged), c);
g_signal_connect(G_OBJECT(v), "mouse-target-changed", g_signal_connect(G_OBJECT(v), "mouse-target-changed",
@ -1281,6 +1287,51 @@ createwindow(Client *c)
return w; return w;
} }
gboolean
loadfailedtls(WebKitWebView *v, gchar *uri, GTlsCertificate *cert,
GTlsCertificateFlags err, Client *c)
{
GString *errmsg = g_string_new(NULL);
gchar *html, *pem;
c->tlserr = err;
if (err & G_TLS_CERTIFICATE_UNKNOWN_CA)
g_string_append(errmsg,
"The signing certificate authority is not known.<br>");
if (err & G_TLS_CERTIFICATE_BAD_IDENTITY)
g_string_append(errmsg,
"The certificate does not match the expected identity "
"of the site that it was retrieved from.<br>");
if (err & G_TLS_CERTIFICATE_NOT_ACTIVATED)
g_string_append(errmsg,
"The certificate's activation time "
"is still in the future.<br>");
if (err & G_TLS_CERTIFICATE_EXPIRED)
g_string_append(errmsg, "The certificate has expired.<br>");
if (err & G_TLS_CERTIFICATE_REVOKED)
g_string_append(errmsg,
"The certificate has been revoked according to "
"the GTlsConnection's certificate revocation list.<br>");
if (err & G_TLS_CERTIFICATE_INSECURE)
g_string_append(errmsg,
"The certificate's algorithm is considered insecure.<br>");
if (err & G_TLS_CERTIFICATE_GENERIC_ERROR)
g_string_append(errmsg,
"Some error occurred validating the certificate.<br>");
g_object_get(cert, "certificate-pem", &pem, NULL);
html = g_strdup_printf("<p>Could not validate TLS for “%s”<br>%s</p>"
"<p><pre>%s</pre><p>", uri, errmsg->str, pem);
g_free(pem);
g_string_free(errmsg, TRUE);
webkit_web_view_load_alternate_html(c->view, html, uri, NULL);
g_free(html);
return TRUE;
}
void void
loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c) loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c)
{ {