NetSurf
sslcert_viewer.c
Go to the documentation of this file.
1 /*
2  * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net>
3  * Copyright 2013 Michael Drake <tlsa@netsurf-browser.org>
4  *
5  * This file is part of NetSurf, http://www.netsurf-browser.org/
6  *
7  * NetSurf is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; version 2 of the License.
10  *
11  * NetSurf is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 /**
21  * \file
22  * SSL Certificate verification UI implementation
23  */
24 
25 #include <assert.h>
26 #include <stdlib.h>
27 
28 #include "content/fetch.h"
29 #include "content/urldb.h"
30 #include "content/hlcache.h"
31 #include "desktop/sslcert_viewer.h"
32 #include "desktop/treeview.h"
33 #include "utils/messages.h"
34 #include "utils/log.h"
35 #include "utils/utils.h"
36 
37 /**
38  * ssl certificate viewer data fields
39  */
50 };
51 
52 typedef nserror (*response_cb)(bool proceed, void *pw);
53 
54 /**
55  * ssl certificate information for certificate error message
56  */
57 struct ssl_cert_info {
58  long version; /**< Certificate version */
59  char not_before[32]; /**< Valid from date */
60  char not_after[32]; /**< Valid to date */
61  int sig_type; /**< Signature type */
62  char serialnum[64]; /**< Serial number */
63  char issuer[256]; /**< Issuer details */
64  char subject[256]; /**< Subject details */
65  int cert_type; /**< Certificate type */
66  ssl_cert_err err; /**< Whatever is wrong with this certificate */
67 };
68 
69 /**
70  * ssl certificate verification context.
71  */
73  struct ssl_cert_info *certs; /**< Certificates */
74  unsigned long num; /**< Number of certificates in chain */
75  nsurl *url; /**< The url of the certificate */
76  response_cb cb; /**< Cert accept/reject callback */
77  void *cbpw; /**< Context passed to callback */
78 
79  treeview *tree; /**< The treeview object */
81 };
82 
83 
84 /**
85  * ssl certificate tree entry
86  */
87 struct sslcert_entry {
89  char version[24];
90  char type[24];
92 };
93 
94 
95 /**
96  * Free a ssl certificate viewer entry's treeview field data.
97  *
98  * \param e Entry to free data from
99  */
101 {
102 }
103 
104 
105 /**
106  * Build a sslcert viewer treeview field from given text
107  *
108  * \param field SSL certificate treeview field to build
109  * \param data SSL certificate entry field data to set
110  * \param value Text to set in field, ownership yielded
111  * \param ssl_d SSL certificate session data
112  * \return NSERROR_OK on success, appropriate error otherwise
113  */
114 static inline nserror
116  struct treeview_field_data *data,
117  const char *value,
118  struct sslcert_session_data *ssl_d)
119 {
120  data->field = ssl_d->fields[field].field;
121  data->value = value;
122  data->value_len = (value != NULL) ? strlen(value) : 0;
123 
124  return NSERROR_OK;
125 }
126 
127 
128 /**
129  * Set a sslcert viewer entry's data from the certificate.
130  *
131  * \param e Entry to set up
132  * \param cert Data associated with entry's certificate
133  * \param ssl_d SSL certificate session data
134  * \return NSERROR_OK on success, appropriate error otherwise
135  */
136 static nserror
138  const struct ssl_cert_info *cert,
139  struct sslcert_session_data *ssl_d)
140 {
141  unsigned int written;
142 
143  assert(e != NULL);
144  assert(cert != NULL);
145  assert(ssl_d != NULL);
146 
147  /* Set the fields up */
149  &e->data[SSLCERT_V_SUBJECT],
150  cert->subject, ssl_d);
151 
153  &e->data[SSLCERT_V_SERIAL],
154  cert->serialnum, ssl_d);
155 
156  written = snprintf(e->type, sizeof(e->type), "%i", cert->cert_type);
157  assert(written < sizeof(e->type));
159  &e->data[SSLCERT_V_TYPE],
160  e->type, ssl_d);
161 
164  cert->not_after, ssl_d);
165 
168  cert->not_before, ssl_d);
169 
170  written = snprintf(e->version, sizeof(e->version),
171  "%li", cert->version);
172  assert(written < sizeof(e->version));
174  &e->data[SSLCERT_V_VERSION],
175  e->version, ssl_d);
176 
178  &e->data[SSLCERT_V_ISSUER],
179  cert->issuer, ssl_d);
180 
181  return NSERROR_OK;
182 }
183 
184 
185 /**
186  * Create a treeview node for a certificate
187  *
188  * \param ssl_d SSL certificate session data
189  * \param n Number of SSL certificate in chain, to make node for
190  * \return NSERROR_OK on success otherwise error code.
191  */
192 static nserror
194 {
195  struct sslcert_entry *e;
196  const struct ssl_cert_info *cert = &(ssl_d->certs[n]);
197  nserror err;
198 
199  /* Create new certificate viewer entry */
200  e = malloc(sizeof(struct sslcert_entry));
201  if (e == NULL) {
202  return NSERROR_NOMEM;
203  }
204 
205  err = sslcert_viewer_set_treeview_field_data(e, cert, ssl_d);
206  if (err != NSERROR_OK) {
207  free(e);
208  return err;
209  }
210 
211  /* Create the new treeview node */
212  err = treeview_create_node_entry(ssl_d->tree, &(e->entry),
213  NULL, TREE_REL_FIRST_CHILD,
214  e->data, e, TREE_OPTION_NONE);
215  if (err != NSERROR_OK) {
217  free(e);
218  return err;
219  }
220 
221  return NSERROR_OK;
222 }
223 
224 
225 /**
226  * Initialise the treeview entry fields
227  *
228  * \param ssl_d SSL certificate session data
229  * \return NSERROR_OK on success otherwise error code.
230  */
232 {
233  int i;
234  const char *label;
235 
236  for (i = 0; i < SSLCERT_V_N_FIELDS; i++)
237  ssl_d->fields[i].field = NULL;
238 
240  label = "TreeviewLabelSubject";
241  label = messages_get(label);
242  if (lwc_intern_string(label, strlen(label),
243  &ssl_d->fields[SSLCERT_V_SUBJECT].field) !=
244  lwc_error_ok) {
245  goto error;
246  }
247 
249  label = "TreeviewLabelSerial";
250  label = messages_get(label);
251  if (lwc_intern_string(label, strlen(label),
252  &ssl_d->fields[SSLCERT_V_SERIAL].field) !=
253  lwc_error_ok) {
254  goto error;
255  }
256 
258  label = "TreeviewLabelType";
259  label = messages_get(label);
260  if (lwc_intern_string(label, strlen(label),
261  &ssl_d->fields[SSLCERT_V_TYPE].field) !=
262  lwc_error_ok) {
263  goto error;
264  }
265 
267  label = "TreeviewLabelValidUntil";
268  label = messages_get(label);
269  if (lwc_intern_string(label, strlen(label),
270  &ssl_d->fields[SSLCERT_V_VALID_UNTIL].field) !=
271  lwc_error_ok) {
272  goto error;
273  }
274 
276  label = "TreeviewLabelValidFrom";
277  label = messages_get(label);
278  if (lwc_intern_string(label, strlen(label),
279  &ssl_d->fields[SSLCERT_V_VALID_FROM].field) !=
280  lwc_error_ok) {
281  goto error;
282  }
283 
285  label = "TreeviewLabelVersion";
286  label = messages_get(label);
287  if (lwc_intern_string(label, strlen(label),
288  &ssl_d->fields[SSLCERT_V_VERSION].field) !=
289  lwc_error_ok) {
290  goto error;
291  }
292 
294  label = "TreeviewLabelIssuer";
295  label = messages_get(label);
296  if (lwc_intern_string(label, strlen(label),
297  &ssl_d->fields[SSLCERT_V_ISSUER].field) !=
298  lwc_error_ok) {
299  goto error;
300  }
301 
303  label = "TreeviewLabelCertificates";
304  label = messages_get(label);
305  if (lwc_intern_string(label, strlen(label),
306  &ssl_d->fields[SSLCERT_V_CERTIFICATES].field) !=
307  lwc_error_ok) {
308  return false;
309  }
310 
311  return NSERROR_OK;
312 
313 error:
314  for (i = 0; i < SSLCERT_V_N_FIELDS; i++)
315  if (ssl_d->fields[i].field != NULL)
316  lwc_string_unref(ssl_d->fields[i].field);
317 
318  return NSERROR_UNKNOWN;
319 }
320 
321 
322 /**
323  * Delete ssl certificate viewer entries
324  *
325  * \param e Entry to delete.
326  */
328 {
330  free(e);
331 }
332 
333 
334 /**
335  * folder operation callback
336  *
337  * \param msg treeview message
338  * \param data message context
339  * \return NSERROR_OK on success
340  */
341 static nserror
343 {
344  switch (msg.msg) {
346  case TREE_MSG_NODE_EDIT:
348  break;
349  }
350 
351  return NSERROR_OK;
352 }
353 
354 
355 /**
356  * node entry callback
357  *
358  * \param msg treeview message
359  * \param data message context
360  * \return NSERROR_OK on success
361  */
362 static nserror
364 {
365  struct sslcert_entry *e = data;
366 
367  switch (msg.msg) {
369  e->entry = NULL;
371  break;
372 
373  case TREE_MSG_NODE_EDIT:
375  break;
376  }
377 
378  return NSERROR_OK;
379 }
380 
381 
382 /**
383  * ssl certificate treeview callbacks
384  */
388 };
389 
390 
391 /* Exported interface, documented in sslcert_viewer.h */
392 nserror
394  void *core_window_handle,
395  struct sslcert_session_data *ssl_d)
396 {
397  nserror err;
398  int cert_loop;
399 
400  assert(ssl_d != NULL);
401 
402  err = treeview_init();
403  if (err != NSERROR_OK) {
404  return err;
405  }
406 
407  NSLOG(netsurf, INFO, "Building certificate viewer");
408 
409  /* Init. certificate chain treeview entry fields */
410  err = sslcert_init_entry_fields(ssl_d);
411  if (err != NSERROR_OK) {
412  ssl_d->tree = NULL;
413  return err;
414  }
415 
416  /* Create the certificate treeview */
417  err = treeview_create(&ssl_d->tree, &sslv_tree_cb_t,
418  SSLCERT_V_N_FIELDS, ssl_d->fields,
419  cw_t, core_window_handle, TREEVIEW_READ_ONLY);
420  if (err != NSERROR_OK) {
421  ssl_d->tree = NULL;
422  return err;
423  }
424 
425  /* Build treeview nodes from certificate chain */
426  for (cert_loop = ssl_d->num - 1; cert_loop >= 0; cert_loop--) {
427  err = sslcert_viewer_create_node(ssl_d, cert_loop);
428  if (err != NSERROR_OK) {
429  return err;
430  }
431  }
432 
433  NSLOG(netsurf, INFO, "Built certificate viewer");
434 
435  return NSERROR_OK;
436 }
437 
438 
439 /**
440  * Free SSL certificate session data
441  *
442  * \param ssl_d SSL certificate session data
443  */
445 {
446  assert(ssl_d != NULL);
447 
448  if (ssl_d->url) {
449  nsurl_unref(ssl_d->url);
450  ssl_d->url = NULL;
451  }
452 
453  if (ssl_d->certs) {
454  free(ssl_d->certs);
455  ssl_d->certs = NULL;
456  }
457 
458  free(ssl_d);
459 }
460 
461 
462 /* Exported interface, documented in sslcert_viewer.h */
464 {
465  int i;
466  nserror err;
467 
468  NSLOG(netsurf, INFO, "Finalising ssl certificate viewer");
469 
470  /* Destroy the treeview */
471  err = treeview_destroy(ssl_d->tree);
472 
473  /* Free treeview entry fields */
474  for (i = 0; i < SSLCERT_V_N_FIELDS; i++)
475  if (ssl_d->fields[i].field != NULL)
476  lwc_string_unref(ssl_d->fields[i].field);
477 
478  /* Destroy the sslcert_session_data */
480 
481  err = treeview_fini();
482  if (err != NSERROR_OK) {
483  return err;
484  }
485 
486  NSLOG(netsurf, INFO, "Finalised ssl certificate viewer");
487 
488  return err;
489 }
490 
491 #ifdef WITH_OPENSSL
492 
493 #include <openssl/ssl.h>
494 #include <openssl/x509v3.h>
495 
496 static nserror
497 der_to_certinfo(const uint8_t *der,
498  size_t der_length,
499  struct ssl_cert_info *info)
500 {
501  BIO *mem;
502  BUF_MEM *buf;
503  const ASN1_INTEGER *asn1_num;
504  BIGNUM *bignum;
505  X509 *cert; /**< Pointer to certificate */
506 
507  if (der == NULL) {
508  return NSERROR_OK;
509  }
510 
511  cert = d2i_X509(NULL, &der, der_length);
512  if (cert == NULL) {
513  return NSERROR_INVALID;
514  }
515 
516  /* get certificate version */
517  info->version = X509_get_version(cert);
518 
519  /* not before date */
520  mem = BIO_new(BIO_s_mem());
521  ASN1_TIME_print(mem, X509_get_notBefore(cert));
522  BIO_get_mem_ptr(mem, &buf);
523  (void) BIO_set_close(mem, BIO_NOCLOSE);
524  BIO_free(mem);
525  memcpy(info->not_before,
526  buf->data,
527  min(sizeof(info->not_before) - 1, (unsigned)buf->length));
528  info->not_before[min(sizeof(info->not_before) - 1, (unsigned)buf->length)] = 0;
529  BUF_MEM_free(buf);
530 
531  /* not after date */
532  mem = BIO_new(BIO_s_mem());
533  ASN1_TIME_print(mem,
534  X509_get_notAfter(cert));
535  BIO_get_mem_ptr(mem, &buf);
536  (void) BIO_set_close(mem, BIO_NOCLOSE);
537  BIO_free(mem);
538  memcpy(info->not_after,
539  buf->data,
540  min(sizeof(info->not_after) - 1, (unsigned)buf->length));
541  info->not_after[min(sizeof(info->not_after) - 1, (unsigned)buf->length)] = 0;
542  BUF_MEM_free(buf);
543 
544  /* signature type */
545  info->sig_type = X509_get_signature_type(cert);
546 
547  /* serial number */
548  asn1_num = X509_get_serialNumber(cert);
549  if (asn1_num != NULL) {
550  bignum = ASN1_INTEGER_to_BN(asn1_num, NULL);
551  if (bignum != NULL) {
552  char *tmp = BN_bn2hex(bignum);
553  if (tmp != NULL) {
554  strncpy(info->serialnum,
555  tmp,
556  sizeof(info->serialnum));
557  info->serialnum[sizeof(info->serialnum)-1] = '\0';
558  OPENSSL_free(tmp);
559  }
560  BN_free(bignum);
561  bignum = NULL;
562  }
563  }
564 
565  /* issuer name */
566  mem = BIO_new(BIO_s_mem());
567  X509_NAME_print_ex(mem,
568  X509_get_issuer_name(cert),
569  0, XN_FLAG_SEP_CPLUS_SPC |
570  XN_FLAG_DN_REV | XN_FLAG_FN_NONE);
571  BIO_get_mem_ptr(mem, &buf);
572  (void) BIO_set_close(mem, BIO_NOCLOSE);
573  BIO_free(mem);
574  memcpy(info->issuer,
575  buf->data,
576  min(sizeof(info->issuer) - 1, (unsigned) buf->length));
577  info->issuer[min(sizeof(info->issuer) - 1, (unsigned) buf->length)] = 0;
578  BUF_MEM_free(buf);
579 
580  /* subject */
581  mem = BIO_new(BIO_s_mem());
582  X509_NAME_print_ex(mem,
583  X509_get_subject_name(cert),
584  0,
585  XN_FLAG_SEP_CPLUS_SPC |
586  XN_FLAG_DN_REV |
587  XN_FLAG_FN_NONE);
588  BIO_get_mem_ptr(mem, &buf);
589  (void) BIO_set_close(mem, BIO_NOCLOSE);
590  BIO_free(mem);
591  memcpy(info->subject,
592  buf->data,
593  min(sizeof(info->subject) - 1, (unsigned)buf->length));
594  info->subject[min(sizeof(info->subject) - 1, (unsigned) buf->length)] = 0;
595  BUF_MEM_free(buf);
596 
597  /* type of certificate */
598  info->cert_type = X509_certificate_type(cert, X509_get_pubkey(cert));
599 
600  X509_free(cert);
601 
602  return NSERROR_OK;
603 }
604 #else
605 static nserror
606 der_to_certinfo(uint8_t *der, size_t der_length, struct ssl_cert_info *info)
607 {
609 }
610 #endif
611 
612 /* copy certificate data */
613 static nserror
615  struct ssl_cert_info **cert_info_out)
616 {
617  struct ssl_cert_info *certs;
618  size_t depth;
619  nserror res;
620 
621  certs = calloc(chain->depth, sizeof(struct ssl_cert_info));
622  if (certs == NULL) {
623  return NSERROR_NOMEM;
624  }
625 
626  for (depth = 0; depth < chain->depth;depth++) {
627  res = der_to_certinfo(chain->certs[depth].der,
628  chain->certs[depth].der_length,
629  certs + depth);
630  if (res != NSERROR_OK) {
631  free(certs);
632  return res;
633  }
634  certs[depth].err = chain->certs[depth].err;
635  }
636 
637  *cert_info_out = certs;
638  return NSERROR_OK;
639 }
640 
641 /* Exported interface, documented in sslcert_viewer.h */
642 nserror
644  nserror (*cb)(bool proceed, void *pw),
645  void *cbpw,
646  const struct cert_chain *chain,
647  struct sslcert_session_data **ssl_d)
648 {
649  struct sslcert_session_data *data;
650  nserror res;
651  assert(url != NULL);
652  assert(chain != NULL);
653 
654  data = malloc(sizeof(struct sslcert_session_data));
655  if (data == NULL) {
656  *ssl_d = NULL;
657  return NSERROR_NOMEM;
658  }
659  res = convert_chain_to_cert_info(chain, &data->certs);
660  if (res != NSERROR_OK) {
661  free(data);
662  *ssl_d = NULL;
663  return res;
664  }
665 
666  data->url = nsurl_ref(url);
667  data->num = chain->depth;
668  data->cb = cb;
669  data->cbpw = cbpw;
670 
671  data->tree = NULL;
672 
673  *ssl_d = data;
674  return NSERROR_OK;
675 }
676 
677 
678 /* Exported interface, documented in sslcert_viewer.h */
680 {
681  assert(ssl_d != NULL);
682 
683  ssl_d->cb(false, ssl_d->cbpw);
684 
685  return NSERROR_OK;
686 }
687 
688 
689 /* Exported interface, documented in sslcert_viewer.h */
691 {
692  assert(ssl_d != NULL);
693 
694  urldb_set_cert_permissions(ssl_d->url, true);
695 
696  ssl_d->cb(true, ssl_d->cbpw);
697 
698  return NSERROR_OK;
699 }
700 
701 
702 /* Exported interface, documented in sslcert_viewer.h */
703 void
705  int x, int y,
706  struct rect *clip,
707  const struct redraw_context *ctx)
708 {
709  assert(ssl_d != NULL &&
710  "sslcert_viewer_redraw() given bad session data");
711 
712  treeview_redraw(ssl_d->tree, x, y, clip, ctx);
713 }
714 
715 
716 /* Exported interface, documented in sslcert_viewer.h */
717 void
719  browser_mouse_state mouse,
720  int x, int y)
721 {
722  treeview_mouse_action(ssl_d->tree, mouse, x, y);
723 }
724 
725 
726 /* Exported interface, documented in sslcert_viewer.h */
727 bool sslcert_viewer_keypress(struct sslcert_session_data *ssl_d, uint32_t key)
728 {
729  return treeview_keypress(ssl_d->tree, key);
730 }
Whether field is default.
Definition: treeview.h:119
nserror sslcert_viewer_create_session_data(struct nsurl *url, nserror(*cb)(bool proceed, void *pw), void *cbpw, const struct cert_chain *chain, struct sslcert_session_data **ssl_d)
Create ssl certificate viewer session data.
struct treeview_field_desc fields[SSLCERT_V_N_FIELDS]
static nserror sslcert_viewer_set_treeview_field_data(struct sslcert_entry *e, const struct ssl_cert_info *cert, struct sslcert_session_data *ssl_d)
Set a sslcert viewer entry&#39;s data from the certificate.
size_t value_len
Field value length (bytes)
Definition: treeview.h:141
static void sslcert_cleanup_session(struct sslcert_session_data *ssl_d)
Free SSL certificate session data.
char type[24]
response_cb cb
Cert accept/reject callback.
const char * value
Field value.
Definition: treeview.h:140
Treeview node.
Definition: treeview.c:133
browser_mouse_state
Mouse state.
Definition: mouse.h:43
Functionality is not implemented.
Definition: errors.h:61
The treeview context.
Definition: treeview.c:232
Localised message support (interface).
unsigned long num
Number of certificates in chain.
lwc_string * field
Field name.
Definition: treeview.h:139
long version
Certificate version.
nserror sslcert_viewer_accept(struct sslcert_session_data *ssl_d)
Accept a certificate chain.
Memory exhaustion.
Definition: errors.h:32
#define min(x, y)
Definition: utils.h:46
size_t depth
the number of certificates in the chain
Definition: ssl_certs.h:63
static void sslcert_viewer_delete_entry(struct sslcert_entry *e)
Delete ssl certificate viewer entries.
Node to be launched.
Definition: treeview.h:89
static png_infop info
Definition: convert_image.c:31
High-level resource cache interface.
static nserror sslcert_viewer_tree_node_entry_cb(struct treeview_node_msg msg, void *data)
node entry callback
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.
const char * type
Definition: filetype.cpp:44
bool sslcert_viewer_keypress(struct sslcert_session_data *ssl_d, uint32_t key)
Key press handling.
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.
Invalid data.
Definition: errors.h:49
nserror
Enumeration of error codes.
Definition: errors.h:29
static nserror der_to_certinfo(uint8_t *der, size_t der_length, struct ssl_cert_info *info)
void treeview_mouse_action(treeview *tree, browser_mouse_state mouse, int x, int y)
Handles all kinds of mouse action.
Definition: treeview.c:4653
No error.
Definition: errors.h:30
enum treeview_field_flags flags
Flags for field.
Definition: treeview.h:131
#define NSLOG(catname, level, logmsg, args...)
Definition: log.h:115
uint8_t * der
data in Distinguished Encoding Rules (DER) format
Definition: ssl_certs.h:73
nserror(* response_cb)(bool proceed, void *pw)
char not_after[32]
Valid to date.
int sig_type
Signature type.
ssl_cert_err err
Whatever is wrong with this certificate.
Node to be deleted.
Definition: treeview.h:87
Unknown error - DO NOT USE.
Definition: errors.h:31
struct treeview_callback_table sslv_tree_cb_t
ssl certificate treeview callbacks
void treeview_redraw(treeview *tree, const int x, const int y, struct rect *clip, const struct redraw_context *ctx)
Redraw a treeview object.
Definition: treeview.c:2928
char version[24]
ssl certificate tree entry
bool treeview_keypress(treeview *tree, uint32_t key)
Key press handling for treeviews.
Definition: treeview.c:3937
char subject[256]
Subject details.
nserror treeview_fini(void)
Finalise the treeview module (all treeviews must have been destroyed first)
Definition: treeview.c:5294
SSL Certificate verification UI interface.
nsurl * url
The url of the certificate.
Treeview handling interface.
struct ssl_cert_info * certs
Certificates.
nserror treeview_init(void)
Prepare treeview module for treeview usage.
Definition: treeview.c:5245
char X509
Definition: curl.c:116
nserror treeview_destroy(treeview *tree)
Destroy a treeview object.
Definition: treeview.c:2105
nserror sslcert_viewer_fini(struct sslcert_session_data *ssl_d)
Finalise a ssl certificate viewer.
static nserror sslcert_viewer_create_node(struct sslcert_session_data *ssl_d, int n)
Create a treeview node for a certificate.
X509 certificate chain.
Definition: ssl_certs.h:59
Node to be edited.
Definition: treeview.h:88
Redraw context.
Definition: plotters.h:51
nserror treeview_create(treeview **tree, const struct treeview_callback_table *callbacks, int n_fields, struct treeview_field_desc fields[], const struct core_window_callback_table *cw_t, struct core_window *cw, treeview_flags flags)
Create a treeview.
Definition: treeview.c:1968
void * cbpw
Context passed to callback.
enum treeview_msg msg
The message type.
Definition: treeview.h:97
const char * messages_get(const char *key)
Fast lookup of a message by key from the standard Messages hash.
Definition: messages.c:241
static nserror convert_chain_to_cert_info(const struct cert_chain *chain, struct ssl_cert_info **cert_info_out)
nserror treeview_create_node_entry(treeview *tree, treeview_node **entry, treeview_node *relation, enum treeview_relationship rel, const struct treeview_field_data fields[], void *data, treeview_node_options_flags flags)
Create an entry node in given treeview.
Definition: treeview.c:1334
ssl_cert_err err
Whatever is wrong with this certificate.
Definition: ssl_certs.h:68
lwc_string * field
A treeview field name.
Definition: treeview.h:130
int cert_type
Certificate type.
Treeview field data.
Definition: treeview.h:138
void urldb_set_cert_permissions(struct nsurl *url, bool permit)
Set certificate verification permissions.
Definition: urldb.c:3458
static struct core_window_callback_table cw_t
Declare Core Window Callbacks:
Definition: treeview.c:534
Rectangle coordinates.
Definition: types.h:40
struct treeview_field_data data[SSLCERT_V_N_FIELDS - 1]
ssl_cert_err
ssl certificate error status
Definition: ssl_certs.h:36
static nserror sslcert_viewer_field_builder(enum sslcert_viewer_field field, struct treeview_field_data *data, const char *value, struct sslcert_session_data *ssl_d)
Build a sslcert viewer treeview field from given text.
static nserror sslcert_init_entry_fields(struct sslcert_session_data *ssl_d)
Initialise the treeview entry fields.
char not_before[32]
Valid from date.
ssl certificate information for certificate error message
nsurl * nsurl_ref(nsurl *url)
Increment the reference count to a NetSurf URL object.
treeview * tree
The treeview object.
static nserror sslcert_viewer_tree_node_folder_cb(struct treeview_node_msg msg, void *data)
folder operation callback
size_t der_length
DER length.
Definition: ssl_certs.h:78
treeview_node * entry
Treeview field description.
Definition: treeview.h:129
Callbacks to achieve various core window functionality.
Definition: core_window.h:51
Interface to a number of general purpose functionality.
nserror sslcert_viewer_reject(struct sslcert_session_data *ssl_d)
Reject a certificate chain.
static void sslcert_viewer_free_treeview_field_data(struct sslcert_entry *e)
Free a ssl certificate viewer entry&#39;s treeview field data.
char issuer[256]
Issuer details.
Fetching of data from a URL (interface).
treeview message
Definition: treeview.h:96
ssl certificate verification context.
char serialnum[64]
Serial number.
Whether field name shown.
Definition: treeview.h:120
Client callbacks for events concerning nodes.
Definition: treeview.h:148
nserror(* folder)(struct treeview_node_msg msg, void *data)
Definition: treeview.h:149
sslcert_viewer_field
ssl certificate viewer data fields
static nserror clip(const struct redraw_context *ctx, const struct rect *clip)
Sets a clip rectangle for subsequent plot operations.
Definition: plot.c:357
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
struct cert_chain::@62 certs[MAX_CERT_DEPTH]
void nsurl_unref(nsurl *url)
Drop a reference to a NetSurf URL object.
Unified URL information database internal interface.