diff options
Diffstat (limited to 'frontends/atari/verify_ssl.c')
-rw-r--r-- | frontends/atari/verify_ssl.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/frontends/atari/verify_ssl.c b/frontends/atari/verify_ssl.c new file mode 100644 index 000000000..cbd9d0bf6 --- /dev/null +++ b/frontends/atari/verify_ssl.c @@ -0,0 +1,269 @@ +/* + * Copyright 2010 Ole Loots <ole@monochrom.net> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <stdbool.h> +#include <windom.h> + +#include "utils/errors.h" +#include "utils/utils.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "content/urldb.h" +#include "content/fetch.h" +#include "atari/res/netsurf.rsh" +#include "atari/verify_ssl.h" + +/* + todo: this file need to use the treeview api - complete rework, + current implementation is not used in any way. +*/ + +extern void * h_gem_rsrc; +extern short atari_plot_vdi_handle; + + +#define CERT_INF_LINES 8 + +static struct ssl_info_draw_param +{ + struct ssl_cert_info * cert_infos_n; + unsigned long num_certs; + int current; + int scrollx; + int cols; + int scrolly; + int rows; /* assumed to be 8 */ + OBJECT * tree; +} dp; + + +static int cert_display_width( struct ssl_cert_info * cert_info ) +{ + int l1, l2; + int add = 16; /* strlen("Issuer: "); */ + + l1 = strlen(cert_info->issuer) + add; + l2 = strlen(cert_info->subject) + add; + return( MAX(l1, l2) ); +} + + +static void __CDECL cert_info_draw( WINDOW * win, short buf[8], void * data) +{ + struct ssl_info_draw_param * dp = (struct ssl_info_draw_param *)data; + GRECT work; + short pxy[4]; + int maxchars; + short d, cbh, cbw; + int i = 0; + short x,y,w,h; + int px_ypos; + char * line = malloc(512); + if( line == NULL ) + return; + + LOG("Cert info draw, win: %p, data: %p, scrollx: %d", win, data, dp->scrollx ); + + WindGet( win, WF_WORKXYWH, &x, &y, &w, &h ); + /*using static values here, as RsrcUserDraw has mem leaks & a very small stack */ + pxy[0] = work.g_x = x + 8; + pxy[1] = work.g_y = y + 80; + pxy[2] = x + 8 + 272; + pxy[3] = y + 80 + 176; + work.g_w = 272; + work.g_h = 176; + + maxchars = (work.g_w / 8)+1; + vs_clip( atari_plot_vdi_handle, 1,(short*) &pxy ); + vswr_mode( atari_plot_vdi_handle, MD_REPLACE ); + vsf_interior( atari_plot_vdi_handle, 1 ); + vsf_color( atari_plot_vdi_handle, LWHITE ); + v_bar( atari_plot_vdi_handle, (short*)&pxy ); + vst_height( atari_plot_vdi_handle, 16, &d, &d, &cbw, &cbh ); + vst_alignment(atari_plot_vdi_handle, 0, 5, &d, &d ); + vst_color( atari_plot_vdi_handle, BLACK ); + vst_effects( atari_plot_vdi_handle, 0 ); + px_ypos = 0; + for(i=0; i<CERT_INF_LINES; i++ ) { + switch( i ) { + case 0: + sprintf(line, "Cert Version: %d", dp->cert_infos_n[dp->current].version ); + break; + + case 1: + sprintf(line, "Invalid before: %s", &dp->cert_infos_n[dp->current].not_before ); + break; + + case 2: + sprintf(line, "Invalid after: %s", &dp->cert_infos_n[dp->current].not_after ); + break; + + case 3: + sprintf(line, "Signature type: %d", dp->cert_infos_n[dp->current].sig_type ); + break; + + case 4: + sprintf(line, "Serial: %d", dp->cert_infos_n[dp->current].serial ); + break; + + case 5: + sprintf(line, "Issuer: %s", &dp->cert_infos_n[dp->current].issuer ); + break; + + case 6: + sprintf(line, "Subject: %s", &dp->cert_infos_n[dp->current].subject ); + break; + + case 7: + sprintf(line, "Cert type: %d", dp->cert_infos_n[dp->current].cert_type ); + break; + + default: + break; + } + if( (int)strlen(line) > dp->scrollx ) { + if( dp->scrollx + maxchars < 511 && ( (signed int)strlen(line) - dp->scrollx) > maxchars ) + line[dp->scrollx + maxchars] = 0; + v_gtext(atari_plot_vdi_handle, work.g_x + 1, work.g_y + px_ypos, &line[dp->scrollx]); + } + px_ypos += cbh; + } + vst_alignment(atari_plot_vdi_handle, 0, 0, &d, &d ); + vs_clip( atari_plot_vdi_handle, 0, (short*)&pxy ); + free( line ); +} + + +static void do_popup( WINDOW *win, int index, int mode, void *data) +{ + struct ssl_info_draw_param * dp = (struct ssl_info_draw_param *)data; + char * items[dp->num_certs]; + short x, y; + unsigned int i; + LOG("do_popup: num certs: %d", dp->num_certs); + for( i = 0; i<dp->num_certs; i++) { + items[i] = malloc( 48 ); + strncpy(items[i], (char*)&dp->cert_infos_n[i].issuer, 46 ); + } + objc_offset( FORM(win), index, &x, &y ); + dp->current = MenuPopUp( items, x, y, + dp->num_certs, MIN( 3, dp->num_certs), 0, + P_LIST + P_WNDW + P_CHCK ); + ObjcChange( OC_FORM, win, index, NORMAL, TRUE ); + dp->cols = cert_display_width( &dp->cert_infos_n[dp->current] ); + dp->rows = 8; + dp->scrollx = 0; + dp->scrolly = 0; + + /* Send (!) redraw ( OC_MSG ) */ + ObjcDrawParent( OC_FORM, FORM(win), VERIFY_BOX_DETAILS, 1, 7 | OC_MSG ); + for( i = 0; i<dp->num_certs; i++) { + free( items[i] ); + } +} + + + +bool verify_ssl_form_do( const char * url, const struct ssl_cert_info * cert_infos_n , + unsigned long num_certs ) +{ + OBJECT *tree; + WINDOW * form; + + bool bres = false; + bool cont = true; + int res = 0; + dp.cert_infos_n = (struct ssl_cert_info *)cert_infos_n; + dp.num_certs = num_certs; + dp.scrollx = 0; + dp.scrolly = 0; + dp.current = 0; + dp.cols = cert_display_width( &dp.cert_infos_n[dp.current] ); + dp.rows = 8; + dp.tree = tree; + + RsrcGaddr (h_gem_rsrc , R_TREE, VERIFY, &tree); + ObjcString( tree, VERIFY_LBL_HOST, (char*)url ); + ObjcChange( OC_OBJC, tree, VERIFY_BT_ACCEPT, 0, 0 ); + ObjcChange( OC_OBJC, tree, VERIFY_BT_REJECT, 0, 0 ); + form = FormWindBegin( tree, (char*)"SSL Verify failed" ); + EvntDataAdd( form, WM_REDRAW, cert_info_draw, (void*)&dp, EV_BOT ); + /* this results in some extended objects which can not be freed: :( */ + /* RsrcUserDraw( OC_FORM, tree, VERIFY_BOX_DETAILS, cert_info_draw,(void*)&dp ) ; */ + ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp ); + /* + ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp ); + ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp ); + */ + while( cont ) { + res = FormWindDo( MU_MESAG ); + cont = false; + switch( res ){ + case VERIFY_BT_ACCEPT: + bres = true; + break; + + case VERIFY_BT_NEXT_CERT: + /* select box clicked or dragged... */ + cont = true; + break; + + case VERIFY_BT_REJECT: + bres = false; + break; + + case VERIFY_BT_SCROLL_D: + cont = true; + dp.scrolly += 1; + ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG ); + break; + + case VERIFY_BT_SCROLL_U: + cont = true; + dp.scrolly -= 1; + ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG ); + break; + + case VERIFY_BT_SCROLL_R: + LOG("scroll r!"); + cont = true; + dp.scrollx += 1; + if( dp.scrollx > (dp.cols - (272 / 8 )) ) + dp.scrollx -= 1; + ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG); + break; + + case VERIFY_BT_SCROLL_L: + cont = true; + dp.scrollx -= 1; + if( dp.scrollx < 0 ) + dp.scrollx = 0; + ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG ); + break; + + default: + break; + } + } + FormWindEnd( ); + return( bres ); +} |