NetSurf
ssl_cert.c
Go to the documentation of this file.
1 /*
2  * Copyright 2015 Vincent Sanders <vince@netsurf-browser.org>
3  *
4  * This file is part of NetSurf, http://www.netsurf-browser.org/
5  *
6  * NetSurf is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * NetSurf is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 /**
20  * \file
21  * Implementation of gtk certificate viewing using gtk core windows.
22  */
23 
24 #include <stdint.h>
25 #include <stdlib.h>
26 #include <gtk/gtk.h>
27 
28 #include "utils/log.h"
29 #include "netsurf/keypress.h"
30 #include "netsurf/plotters.h"
31 #include "desktop/sslcert_viewer.h"
32 
33 #include "gtk/plotters.h"
34 #include "gtk/scaffolding.h"
35 #include "gtk/resources.h"
36 #include "gtk/ssl_cert.h"
37 #include "gtk/corewindow.h"
38 
39 
40 /**
41  * GTK certificate viewing window context
42  */
44  /** GTK core window context */
46  /** GTK builder for window */
47  GtkBuilder *builder;
48  /** GTK dialog window being shown */
49  GtkDialog *dlg;
50  /** SSL certificate viewer context data */
52 };
53 
54 /**
55  * destroy a previously created certificate view
56  */
58 {
59  nserror res;
60 
61  res = sslcert_viewer_fini(crtvrfy_win->ssl_data);
62  if (res == NSERROR_OK) {
63  res = nsgtk_corewindow_fini(&crtvrfy_win->core);
64  gtk_widget_destroy(GTK_WIDGET(crtvrfy_win->dlg));
65  g_object_unref(G_OBJECT(crtvrfy_win->builder));
66  free(crtvrfy_win);
67  }
68  return res;
69 }
70 
71 static void
72 nsgtk_crtvrfy_accept(GtkButton *w, gpointer data)
73 {
74  struct nsgtk_crtvrfy_window *crtvrfy_win;
75  crtvrfy_win = (struct nsgtk_crtvrfy_window *)data;
76 
77  sslcert_viewer_accept(crtvrfy_win->ssl_data);
78 
79  nsgtk_crtvrfy_destroy(crtvrfy_win);
80 }
81 
82 static void
83 nsgtk_crtvrfy_reject(GtkWidget *w, gpointer data)
84 {
85  struct nsgtk_crtvrfy_window *crtvrfy_win;
86  crtvrfy_win = (struct nsgtk_crtvrfy_window *)data;
87 
88  sslcert_viewer_reject(crtvrfy_win->ssl_data);
89 
90  nsgtk_crtvrfy_destroy(crtvrfy_win);
91 }
92 
93 static gboolean
94 nsgtk_crtvrfy_delete_event(GtkWidget *w, GdkEvent *event, gpointer data)
95 {
96  nsgtk_crtvrfy_reject(w, data);
97  return FALSE;
98 }
99 
100 /**
101  * callback for mouse action for certificate verify on core window
102  *
103  * \param nsgtk_cw The nsgtk core window structure.
104  * \param mouse_state netsurf mouse state on event
105  * \param x location of event
106  * \param y location of event
107  * \return NSERROR_OK on success otherwise appropriate error code
108  */
109 static nserror
111  browser_mouse_state mouse_state,
112  int x, int y)
113 {
114  struct nsgtk_crtvrfy_window *crtvrfy_win;
115  /* technically degenerate container of */
116  crtvrfy_win = (struct nsgtk_crtvrfy_window *)nsgtk_cw;
117 
118  sslcert_viewer_mouse_action(crtvrfy_win->ssl_data, mouse_state, x, y);
119 
120  return NSERROR_OK;
121 }
122 
123 /**
124  * callback for keypress for certificate verify on core window
125  *
126  * \param nsgtk_cw The nsgtk core window structure.
127  * \param nskey The netsurf key code
128  * \return NSERROR_OK on success otherwise appropriate error code
129  */
130 static nserror
131 nsgtk_crtvrfy_key(struct nsgtk_corewindow *nsgtk_cw, uint32_t nskey)
132 {
133  struct nsgtk_crtvrfy_window *crtvrfy_win;
134 
135  /* technically degenerate container of */
136  crtvrfy_win = (struct nsgtk_crtvrfy_window *)nsgtk_cw;
137 
138  if (sslcert_viewer_keypress(crtvrfy_win->ssl_data, nskey)) {
139  return NSERROR_OK;
140  }
142 }
143 
144 /**
145  * callback on draw event for certificate verify on core window
146  *
147  * \param nsgtk_cw The nsgtk core window structure.
148  * \param r The rectangle of the window that needs updating.
149  * \return NSERROR_OK on success otherwise appropriate error code
150  */
151 static nserror
152 nsgtk_crtvrfy_draw(struct nsgtk_corewindow *nsgtk_cw, struct rect *r)
153 {
154  struct redraw_context ctx = {
155  .interactive = true,
156  .background_images = true,
157  .plot = &nsgtk_plotters
158  };
159  struct nsgtk_crtvrfy_window *crtvrfy_win;
160 
161  /* technically degenerate container of */
162  crtvrfy_win = (struct nsgtk_crtvrfy_window *)nsgtk_cw;
163 
164  sslcert_viewer_redraw(crtvrfy_win->ssl_data, 0, 0, r, &ctx);
165 
166  return NSERROR_OK;
167 }
168 
169 /* exported interface documented in gtk/ssl_cert.h */
171  const struct ssl_cert_info *certs,
172  unsigned long num,
173  nserror (*cb)(bool proceed, void *pw),
174  void *cbpw)
175 {
176  struct nsgtk_crtvrfy_window *ncwin;
177  nserror res;
178 
179  ncwin = malloc(sizeof(struct nsgtk_crtvrfy_window));
180  if (ncwin == NULL) {
181  return NSERROR_NOMEM;
182  }
183 
184  res = nsgtk_builder_new_from_resname("ssl", &ncwin->builder);
185  if (res != NSERROR_OK) {
186  NSLOG(netsurf, INFO, "SSL UI builder init failed");
187  free(ncwin);
188  return res;
189  }
190 
191  gtk_builder_connect_signals(ncwin->builder, NULL);
192 
193  ncwin->dlg = GTK_DIALOG(gtk_builder_get_object(ncwin->builder,
194  "wndSSLProblem"));
195 
196  /* set parent for transient dialog */
197  gtk_window_set_transient_for(GTK_WINDOW(ncwin->dlg),
199 
200  ncwin->core.scrolled = GTK_SCROLLED_WINDOW(
201  gtk_builder_get_object(ncwin->builder, "SSLScrolled"));
202 
203  ncwin->core.drawing_area = GTK_DRAWING_AREA(
204  gtk_builder_get_object(ncwin->builder, "SSLDrawingArea"));
205 
206  /* make the delete event call our destructor */
207  g_signal_connect(G_OBJECT(ncwin->dlg),
208  "delete_event",
209  G_CALLBACK(nsgtk_crtvrfy_delete_event),
210  ncwin);
211 
212  /* accept button */
213  g_signal_connect(G_OBJECT(gtk_builder_get_object(ncwin->builder,
214  "sslaccept")),
215  "clicked",
216  G_CALLBACK(nsgtk_crtvrfy_accept),
217  ncwin);
218 
219  /* reject button */
220  g_signal_connect(G_OBJECT(gtk_builder_get_object(ncwin->builder,
221  "sslreject")),
222  "clicked",
223  G_CALLBACK(nsgtk_crtvrfy_reject),
224  ncwin);
225 
226  /* initialise GTK core window */
227  ncwin->core.draw = nsgtk_crtvrfy_draw;
228  ncwin->core.key = nsgtk_crtvrfy_key;
229  ncwin->core.mouse = nsgtk_crtvrfy_mouse;
230 
231  res = nsgtk_corewindow_init(&ncwin->core);
232  if (res != NSERROR_OK) {
233  g_object_unref(G_OBJECT(ncwin->dlg));
234  free(ncwin);
235  return res;
236  }
237 
238  /* initialise certificate viewing interface */
239  res = sslcert_viewer_create_session_data(num, url, cb, cbpw, certs,
240  &ncwin->ssl_data);
241  if (res != NSERROR_OK) {
242  g_object_unref(G_OBJECT(ncwin->dlg));
243  free(ncwin);
244  return res;
245  }
246 
247  res = sslcert_viewer_init(ncwin->core.cb_table,
248  (struct core_window *)ncwin,
249  ncwin->ssl_data);
250  if (res != NSERROR_OK) {
251  g_object_unref(G_OBJECT(ncwin->dlg));
252  free(ncwin);
253  return res;
254  }
255 
256  gtk_widget_show(GTK_WIDGET(ncwin->dlg));
257 
258  return NSERROR_OK;
259 }
GtkBuilder * builder
GTK builder for window.
Definition: ssl_cert.c:47
Target independent plotting interface.
nserror nsgtk_corewindow_init(struct nsgtk_corewindow *nsgtk_cw)
initialise elements of gtk core window.
Definition: corewindow.c:712
GTK certificate viewing window context.
Definition: ssl_cert.c:43
Interface to gtk builtin resource handling.
GtkWindow * nsgtk_scaffolding_window(struct nsgtk_scaffolding *g)
Get the gtk window for a scaffolding.
Definition: scaffolding.c:1302
static nserror nsgtk_crtvrfy_destroy(struct nsgtk_crtvrfy_window *crtvrfy_win)
destroy a previously created certificate view
Definition: ssl_cert.c:57
browser_mouse_state
Mouse state.
Definition: mouse.h:43
Functionality is not implemented.
Definition: errors.h:61
struct nsgtk_corewindow core
GTK core window context.
Definition: ssl_cert.c:45
struct nsgtk_scaffolding * nsgtk_current_scaffolding(void)
Obtain the most recently used scaffolding element.
Definition: scaffolding.c:1465
nserror sslcert_viewer_accept(struct sslcert_session_data *ssl_d)
Accept a certificate chain.
Memory exhaustion.
Definition: errors.h:32
Target independent plotting GTK+ interface.
static gboolean nsgtk_crtvrfy_delete_event(GtkWidget *w, GdkEvent *event, gpointer data)
Definition: ssl_cert.c:94
nserror(* key)(struct nsgtk_corewindow *nsgtk_cw, uint32_t nskey)
callback for keypress on nsgtk core window
Definition: corewindow.h:74
static void nsgtk_crtvrfy_reject(GtkWidget *w, gpointer data)
Definition: ssl_cert.c:83
void sslcert_viewer_redraw(struct sslcert_session_data *ssl_d, int x, int y, struct rect *clip, const struct redraw_context *ctx)
Redraw the ssl certificate viewer.
GtkScrolledWindow * scrolled
scrollable area drawing area is within
Definition: corewindow.h:44
static nserror nsgtk_crtvrfy_key(struct nsgtk_corewindow *nsgtk_cw, uint32_t nskey)
callback for keypress for certificate verify on core window
Definition: ssl_cert.c:131
Interface to key press operations.
bool sslcert_viewer_keypress(struct sslcert_session_data *ssl_d, uint32_t key)
Key press handling.
bool interactive
Redraw to show interactive features.
Definition: plotters.h:59
nserror sslcert_viewer_init(struct core_window_callback_table *cw_t, void *core_window_handle, struct sslcert_session_data *ssl_d)
Initialise a ssl certificate viewer from session data.
nserror
Enumeration of error codes.
Definition: errors.h:29
nsgtk core window state
Definition: corewindow.h:39
No error.
Definition: errors.h:30
GtkDrawingArea * drawing_area
GTK drawable widget.
Definition: corewindow.h:42
#define NSLOG(catname, level, logmsg, args...)
Definition: log.h:115
const struct plotter_table nsgtk_plotters
GTK plotter table.
Definition: plotters.c:647
static void nsgtk_crtvrfy_accept(GtkButton *w, gpointer data)
Definition: ssl_cert.c:72
static nserror nsgtk_crtvrfy_draw(struct nsgtk_corewindow *nsgtk_cw, struct rect *r)
callback on draw event for certificate verify on core window
Definition: ssl_cert.c:152
SSL Certificate verification UI interface.
nserror sslcert_viewer_create_session_data(unsigned long num, struct nsurl *url, nserror(*cb)(bool proceed, void *pw), void *cbpw, const struct ssl_cert_info *certs, struct sslcert_session_data **ssl_d)
Create ssl certificate viewer session data.
static nserror nsgtk_crtvrfy_mouse(struct nsgtk_corewindow *nsgtk_cw, browser_mouse_state mouse_state, int x, int y)
callback for mouse action for certificate verify on core window
Definition: ssl_cert.c:110
nserror sslcert_viewer_fini(struct sslcert_session_data *ssl_d)
Finalise a ssl certificate viewer.
Redraw context.
Definition: plotters.h:51
struct sslcert_session_data * ssl_data
SSL certificate viewer context data.
Definition: ssl_cert.c:51
GtkDialog * dlg
GTK dialog window being shown.
Definition: ssl_cert.c:49
nserror gtk_cert_verify(struct nsurl *url, const struct ssl_cert_info *certs, unsigned long num, nserror(*cb)(bool proceed, void *pw), void *cbpw)
Prompt the user to verify a certificate with issuse.
Definition: ssl_cert.c:170
Rectangle coordinates.
Definition: types.h:40
struct core_window_callback_table * cb_table
table of callbacks for core window operations
Definition: corewindow.h:50
ssl certificate information for certificate error message
Definition: ssl_certs.h:53
nserror sslcert_viewer_reject(struct sslcert_session_data *ssl_d)
Reject a certificate chain.
nserror(* mouse)(struct nsgtk_corewindow *nsgtk_cw, browser_mouse_state mouse_state, int x, int y)
callback for mouse event on nsgtk core window
Definition: corewindow.h:85
ssl certificate verification context.
nserror nsgtk_builder_new_from_resname(const char *resname, GtkBuilder **builder_out)
Create gtk builder object for the named ui resource.
Definition: resources.c:522
void sslcert_viewer_mouse_action(struct sslcert_session_data *ssl_d, browser_mouse_state mouse, int x, int y)
Handles all kinds of mouse action.
struct nsurl nsurl
NetSurf URL object.
Definition: nsurl.h:31
nserror nsgtk_corewindow_fini(struct nsgtk_corewindow *nsgtk_cw)
finalise elements of gtk core window.
Definition: corewindow.c:766
nserror(* draw)(struct nsgtk_corewindow *nsgtk_cw, struct rect *r)
callback to draw on drawable area of nsgtk core window
Definition: corewindow.h:63