Commit dffde78fabad52702978236cadb8f389d1b2c039

Authored by Perry Werneck
1 parent d86178f1
Exists in master and in 1 other branch develop

Adding certificate information in security dialog.

src/dialogs/security.c 0 → 100644
@@ -0,0 +1,205 @@ @@ -0,0 +1,205 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <config.h>
  31 +
  32 + #define ENABLE_NLS
  33 + #define GETTEXT_PACKAGE PACKAGE_NAME
  34 +
  35 + #include <gtk/gtk.h>
  36 + #include <libintl.h>
  37 + #include <glib/gi18n.h>
  38 +
  39 + #include <v3270.h>
  40 +
  41 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  42 +
  43 + static GtkWidget * label_new(const char *text)
  44 + {
  45 + GtkWidget *widget = gtk_label_new(text);
  46 + gtk_label_set_xalign(GTK_LABEL(widget),0);
  47 + return widget;
  48 + }
  49 +
  50 + static GtkWidget * text_view_new(const char *contents)
  51 + {
  52 + GtkWidget * container = gtk_scrolled_window_new(NULL,NULL);
  53 + GtkWidget * view = gtk_text_view_new();
  54 +
  55 + gtk_container_set_border_width(GTK_CONTAINER(container),5);
  56 + gtk_container_set_border_width(GTK_CONTAINER(view),5);
  57 +
  58 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(container),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  59 +
  60 + gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
  61 +
  62 + GtkTextIter itr;
  63 + GtkTextBuffer * text = GTK_TEXT_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)));
  64 +
  65 + gtk_text_buffer_get_end_iter(text,&itr);
  66 + gtk_text_buffer_insert(text,&itr,contents,strlen(contents));
  67 +
  68 + gtk_container_add(GTK_CONTAINER(container),view);
  69 + gtk_text_view_set_monospace(GTK_TEXT_VIEW(view),TRUE);
  70 +
  71 + return container;
  72 + }
  73 +
  74 + LIB3270_EXPORT GtkWidget * v3270_security_dialog_new(GtkWidget *widget)
  75 + {
  76 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
  77 + gtk_container_set_border_width(GTK_CONTAINER(grid),10);
  78 + gtk_grid_set_row_spacing(grid,5);
  79 + gtk_grid_set_column_spacing(grid,5);
  80 +
  81 + H3270 *hSession = NULL;
  82 +
  83 + if(GTK_IS_V3270(widget))
  84 + hSession = v3270_get_session(widget);
  85 +
  86 + if(hSession)
  87 + {
  88 + gtk_grid_attach(
  89 + grid,
  90 + gtk_image_new_from_icon_name(lib3270_get_ssl_state_icon_name(hSession),GTK_ICON_SIZE_DIALOG),
  91 + 0,0,
  92 + 2,2
  93 + );
  94 +
  95 + gtk_grid_attach(
  96 + grid,
  97 + label_new((lib3270_get_ssl_state_message(hSession))),
  98 + 3,0,
  99 + 6,1
  100 + );
  101 +
  102 + gtk_grid_attach(
  103 + grid,
  104 + label_new(lib3270_get_ssl_state_description(hSession)),
  105 + 3,1,
  106 + 6,1
  107 + );
  108 +
  109 + lib3270_autoptr(char) crl = lib3270_get_ssl_crl_text(hSession);
  110 + lib3270_autoptr(char) peer = lib3270_get_ssl_peer_certificate_text(hSession);
  111 +
  112 + if(peer && crl)
  113 + {
  114 + GtkWidget * frame = gtk_notebook_new();
  115 +
  116 + gtk_widget_set_hexpand(GTK_WIDGET(frame),TRUE);
  117 + gtk_widget_set_vexpand(GTK_WIDGET(frame),TRUE);
  118 +
  119 + gtk_notebook_append_page(
  120 + GTK_NOTEBOOK(frame),
  121 + text_view_new(peer),
  122 + gtk_label_new(_("Peer certificate"))
  123 + );
  124 +
  125 + gtk_notebook_append_page(
  126 + GTK_NOTEBOOK(frame),
  127 + text_view_new(crl),
  128 + gtk_label_new(_("Revocation list"))
  129 + );
  130 +
  131 + gtk_grid_attach(
  132 + grid,
  133 + frame,
  134 + 3,2,
  135 + 6,6
  136 + );
  137 +
  138 + }
  139 + else if(peer)
  140 + {
  141 + GtkWidget * frame = gtk_frame_new(_("Peer certificate"));
  142 + gtk_container_add(GTK_CONTAINER(frame),text_view_new(peer));
  143 +
  144 + gtk_widget_set_hexpand(GTK_WIDGET(frame),TRUE);
  145 + gtk_widget_set_vexpand(GTK_WIDGET(frame),TRUE);
  146 +
  147 + gtk_grid_attach(
  148 + grid,
  149 + frame,
  150 + 3,2,
  151 + 6,6
  152 + );
  153 +
  154 +
  155 + }
  156 +
  157 + }
  158 + else
  159 + {
  160 +
  161 + gtk_grid_attach(
  162 + grid,
  163 + gtk_image_new_from_icon_name("dialog-error",GTK_ICON_SIZE_DIALOG),
  164 + 0,0,
  165 + 2,2
  166 + );
  167 +
  168 + gtk_grid_attach(
  169 + grid,
  170 + label_new(_("Invalid state")),
  171 + 3,0,
  172 + 6,1
  173 + );
  174 +
  175 + gtk_grid_attach(
  176 + grid,
  177 + label_new(_("There's no security information in the session")),
  178 + 3,1,
  179 + 6,1
  180 + );
  181 + }
  182 +
  183 + return GTK_WIDGET(grid);
  184 + }
  185 +
  186 + LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget)
  187 + {
  188 + GtkWidget * dialog = gtk_dialog_new_with_buttons(
  189 + _("About security"),
  190 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  191 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  192 + _( "_Close" ), GTK_RESPONSE_ACCEPT,
  193 + NULL
  194 + );
  195 +
  196 + gtk_window_set_default_size(GTK_WINDOW(dialog), 800, 500);
  197 +
  198 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),v3270_security_dialog_new(widget),TRUE,TRUE,2);
  199 + gtk_widget_show_all(dialog);
  200 +
  201 + gtk_dialog_run(GTK_DIALOG(dialog));
  202 + gtk_widget_destroy(GTK_WIDGET(dialog));
  203 +
  204 +
  205 + }
src/include/v3270.h
@@ -252,6 +252,7 @@ @@ -252,6 +252,7 @@
252 LIB3270_EXPORT const gchar * v3270_get_ssl_status_icon(GtkWidget *widget); 252 LIB3270_EXPORT const gchar * v3270_get_ssl_status_icon(GtkWidget *widget);
253 LIB3270_EXPORT const gchar * v3270_get_ssl_status_text(GtkWidget *widget); 253 LIB3270_EXPORT const gchar * v3270_get_ssl_status_text(GtkWidget *widget);
254 LIB3270_EXPORT const gchar * v3270_get_ssl_status_message(GtkWidget *widget); 254 LIB3270_EXPORT const gchar * v3270_get_ssl_status_message(GtkWidget *widget);
  255 + LIB3270_EXPORT GtkWidget * v3270_security_dialog_new(GtkWidget *widget);
255 LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget); 256 LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget);
256 257
257 // File transfer 258 // File transfer
src/testprogram/testprogram.c
@@ -83,6 +83,24 @@ static gboolean popup_menu(GtkWidget *widget, G_GNUC_UNUSED gboolean selected, g @@ -83,6 +83,24 @@ static gboolean popup_menu(GtkWidget *widget, G_GNUC_UNUSED gboolean selected, g
83 83
84 } 84 }
85 85
  86 + static gboolean field_clicked(GtkWidget *widget, gboolean connected, V3270_OIA_FIELD field, GdkEventButton *event, GtkWidget *window)
  87 + {
  88 + trace("%s: %s field=%d event=%p window=%p",__FUNCTION__,connected ? "Connected" : "Disconnected", field, event, window);
  89 +
  90 + if(!connected)
  91 + return FALSE;
  92 +
  93 + if(field == V3270_OIA_SSL)
  94 + {
  95 + v3270_popup_security_dialog(widget);
  96 + trace("%s: Show SSL connection info dialog",__FUNCTION__);
  97 + return TRUE;
  98 + }
  99 +
  100 +
  101 + return FALSE;
  102 + }
  103 +
86 static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSession) { 104 static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSession) {
87 lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0); 105 lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0);
88 lib3270_set_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE,0); 106 lib3270_set_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE,0);
@@ -129,6 +147,8 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { @@ -129,6 +147,8 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
129 // gchar * filename = NULL; 147 // gchar * filename = NULL;
130 GValue val = G_VALUE_INIT; 148 GValue val = G_VALUE_INIT;
131 149
  150 + g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window);
  151 +
132 GtkWidget *trace = v3270_new_trace_window(terminal,NULL); 152 GtkWidget *trace = v3270_new_trace_window(terminal,NULL);
133 if(trace) { 153 if(trace) {
134 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); 154 g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal));
src/trace/trace.c
@@ -459,7 +459,6 @@ static void destroy(GtkWidget *widget) @@ -459,7 +459,6 @@ static void destroy(GtkWidget *widget)
459 static void append_text(v3270_trace *hwnd, const gchar *text) 459 static void append_text(v3270_trace *hwnd, const gchar *text)
460 { 460 {
461 GtkTextIter itr; 461 GtkTextIter itr;
462 -  
463 gtk_text_buffer_get_end_iter(hwnd->text,&itr); 462 gtk_text_buffer_get_end_iter(hwnd->text,&itr);
464 463
465 if(g_utf8_validate(text,strlen(text),NULL)) 464 if(g_utf8_validate(text,strlen(text),NULL))
src/v3270/font.c
@@ -40,7 +40,11 @@ @@ -40,7 +40,11 @@
40 40
41 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 41 /*--[ Globals ]--------------------------------------------------------------------------------------*/
42 42
  43 +#ifdef _WIN32
  44 + const gchar * v3270_default_font = "Lucida Console";
  45 +#else
43 const gchar * v3270_default_font = "monospace"; 46 const gchar * v3270_default_font = "monospace";
  47 +#endif // _WIN32
44 48
45 /*--[ Implement ]------------------------------------------------------------------------------------*/ 49 /*--[ Implement ]------------------------------------------------------------------------------------*/
46 50
src/v3270/security.c
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin 18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19 * St, Fifth Floor, Boston, MA 02110-1301 USA 19 * St, Fifth Floor, Boston, MA 02110-1301 USA
20 * 20 *
21 - * Este programa está nomeado como secoruty.c e possui - linhas de código. 21 + * Este programa está nomeado como - e possui - linhas de código.
22 * 22 *
23 * Contatos: 23 * Contatos:
24 * 24 *
@@ -296,7 +296,7 @@ @@ -296,7 +296,7 @@
296 return NULL; 296 return NULL;
297 } 297 }
298 298
299 - const gchar * v3270_get_ssl_status_icon(GtkWidget *widget) 299 + const gchar * v3270_get_ssl_status_icon(GtkWidget *widget)
300 { 300 {
301 g_return_val_if_fail(GTK_IS_V3270(widget),""); 301 g_return_val_if_fail(GTK_IS_V3270(widget),"");
302 302
@@ -354,77 +354,3 @@ @@ -354,77 +354,3 @@
354 return _( "Unexpected or unknown security status"); 354 return _( "Unexpected or unknown security status");
355 } 355 }
356 356
357 - LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget)  
358 - {  
359 - GtkWidget * dialog;  
360 -  
361 - g_return_if_fail(GTK_IS_V3270(widget));  
362 -  
363 - gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[GTK_V3270(widget)->pointer]);  
364 -  
365 -  
366 -#ifdef HAVE_LIBSSL  
367 - if(lib3270_get_secure(GTK_V3270(widget)->host) == LIB3270_SSL_UNSECURE)  
368 -#endif // HAVE_LIBSSL  
369 - {  
370 - // Connection is insecure, show simple dialog with host and info  
371 -  
372 - dialog = gtk_message_dialog_new(  
373 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
374 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
375 - GTK_MESSAGE_INFO,  
376 - GTK_BUTTONS_CLOSE,  
377 - "%s",v3270_get_hostname(widget)  
378 - );  
379 -  
380 - gtk_message_dialog_format_secondary_markup(  
381 - GTK_MESSAGE_DIALOG(dialog),  
382 - "%s", _( "<b>Identity not verified</b>\nThe connection is insecure" ));  
383 -  
384 - }  
385 -#ifdef HAVE_LIBSSL  
386 - else  
387 - {  
388 - long id = lib3270_get_SSL_verify_result(GTK_V3270(widget)->host);  
389 - const gchar * title = N_( "Unexpected SSL error");  
390 - const gchar * text = NULL;  
391 - const gchar * icon = GTK_STOCK_DIALOG_ERROR;  
392 - int f;  
393 -  
394 - for(f=0;ssl_status_msg[f].text;f++)  
395 - {  
396 - if(ssl_status_msg[f].id == id)  
397 - {  
398 - title = ssl_status_msg[f].text;  
399 - icon = ssl_status_msg[f].icon;  
400 - text = ssl_status_msg[f].message;  
401 - break;  
402 - }  
403 - }  
404 -  
405 - dialog = gtk_message_dialog_new(  
406 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
407 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
408 - GTK_MESSAGE_OTHER,  
409 - GTK_BUTTONS_CLOSE,  
410 - "%s",gettext(title)  
411 - );  
412 -  
413 - gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(dialog),gtk_image_new_from_stock(icon,GTK_ICON_SIZE_DIALOG));  
414 -  
415 - if(text)  
416 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog), "%s", gettext(text));  
417 - else  
418 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),_( "Unexpected SSL error <b>%ld</b>" ),id);  
419 -  
420 - }  
421 -#endif // HAVE_LIBSSL  
422 -  
423 - gtk_window_set_title(GTK_WINDOW(dialog),_("About security"));  
424 -  
425 - gtk_widget_show_all(GTK_WIDGET(dialog));  
426 - gtk_dialog_run(GTK_DIALOG(dialog));  
427 - gtk_widget_destroy(GTK_WIDGET(dialog));  
428 -  
429 -  
430 - }  
@@ -52,6 +52,9 @@ @@ -52,6 +52,9 @@
52 <Option compilerVar="CC" /> 52 <Option compilerVar="CC" />
53 </Unit> 53 </Unit>
54 <Unit filename="src/dialogs/private.h" /> 54 <Unit filename="src/dialogs/private.h" />
  55 + <Unit filename="src/dialogs/security.c">
  56 + <Option compilerVar="CC" />
  57 + </Unit>
55 <Unit filename="src/include/config.h" /> 58 <Unit filename="src/include/config.h" />
56 <Unit filename="src/include/config.h.in" /> 59 <Unit filename="src/include/config.h.in" />
57 <Unit filename="src/include/hostselect.h" /> 60 <Unit filename="src/include/hostselect.h" />