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 @@
  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 252 LIB3270_EXPORT const gchar * v3270_get_ssl_status_icon(GtkWidget *widget);
253 253 LIB3270_EXPORT const gchar * v3270_get_ssl_status_text(GtkWidget *widget);
254 254 LIB3270_EXPORT const gchar * v3270_get_ssl_status_message(GtkWidget *widget);
  255 + LIB3270_EXPORT GtkWidget * v3270_security_dialog_new(GtkWidget *widget);
255 256 LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget);
256 257  
257 258 // File transfer
... ...
src/testprogram/testprogram.c
... ... @@ -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 104 static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSession) {
87 105 lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0);
88 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 147 // gchar * filename = NULL;
130 148 GValue val = G_VALUE_INIT;
131 149  
  150 + g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window);
  151 +
132 152 GtkWidget *trace = v3270_new_trace_window(terminal,NULL);
133 153 if(trace) {
134 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 459 static void append_text(v3270_trace *hwnd, const gchar *text)
460 460 {
461 461 GtkTextIter itr;
462   -
463 462 gtk_text_buffer_get_end_iter(hwnd->text,&itr);
464 463  
465 464 if(g_utf8_validate(text,strlen(text),NULL))
... ...
src/v3270/font.c
... ... @@ -40,7 +40,11 @@
40 40  
41 41 /*--[ Globals ]--------------------------------------------------------------------------------------*/
42 42  
  43 +#ifdef _WIN32
  44 + const gchar * v3270_default_font = "Lucida Console";
  45 +#else
43 46 const gchar * v3270_default_font = "monospace";
  47 +#endif // _WIN32
44 48  
45 49 /*--[ Implement ]------------------------------------------------------------------------------------*/
46 50  
... ...
src/v3270/security.c
... ... @@ -18,7 +18,7 @@
18 18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19 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 23 * Contatos:
24 24 *
... ... @@ -296,7 +296,7 @@
296 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 301 g_return_val_if_fail(GTK_IS_V3270(widget),"");
302 302  
... ... @@ -354,77 +354,3 @@
354 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   - }
... ...
v3270.cbp
... ... @@ -52,6 +52,9 @@
52 52 <Option compilerVar="CC" />
53 53 </Unit>
54 54 <Unit filename="src/dialogs/private.h" />
  55 + <Unit filename="src/dialogs/security.c">
  56 + <Option compilerVar="CC" />
  57 + </Unit>
55 58 <Unit filename="src/include/config.h" />
56 59 <Unit filename="src/include/config.h.in" />
57 60 <Unit filename="src/include/hostselect.h" />
... ...