From dffde78fabad52702978236cadb8f389d1b2c039 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 30 Jan 2019 13:50:16 -0200 Subject: [PATCH] Adding certificate information in security dialog. --- src/dialogs/security.c | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/include/v3270.h | 1 + src/testprogram/testprogram.c | 20 ++++++++++++++++++++ src/trace/trace.c | 1 - src/v3270/font.c | 4 ++++ src/v3270/security.c | 78 ++---------------------------------------------------------------------------- v3270.cbp | 3 +++ 7 files changed, 235 insertions(+), 77 deletions(-) create mode 100644 src/dialogs/security.c diff --git a/src/dialogs/security.c b/src/dialogs/security.c new file mode 100644 index 0000000..269a519 --- /dev/null +++ b/src/dialogs/security.c @@ -0,0 +1,205 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include + + #define ENABLE_NLS + #define GETTEXT_PACKAGE PACKAGE_NAME + + #include + #include + #include + + #include + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + static GtkWidget * label_new(const char *text) + { + GtkWidget *widget = gtk_label_new(text); + gtk_label_set_xalign(GTK_LABEL(widget),0); + return widget; + } + + static GtkWidget * text_view_new(const char *contents) + { + GtkWidget * container = gtk_scrolled_window_new(NULL,NULL); + GtkWidget * view = gtk_text_view_new(); + + gtk_container_set_border_width(GTK_CONTAINER(container),5); + gtk_container_set_border_width(GTK_CONTAINER(view),5); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(container),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); + + gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE); + + GtkTextIter itr; + GtkTextBuffer * text = GTK_TEXT_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view))); + + gtk_text_buffer_get_end_iter(text,&itr); + gtk_text_buffer_insert(text,&itr,contents,strlen(contents)); + + gtk_container_add(GTK_CONTAINER(container),view); + gtk_text_view_set_monospace(GTK_TEXT_VIEW(view),TRUE); + + return container; + } + + LIB3270_EXPORT GtkWidget * v3270_security_dialog_new(GtkWidget *widget) + { + GtkGrid * grid = GTK_GRID(gtk_grid_new()); + gtk_container_set_border_width(GTK_CONTAINER(grid),10); + gtk_grid_set_row_spacing(grid,5); + gtk_grid_set_column_spacing(grid,5); + + H3270 *hSession = NULL; + + if(GTK_IS_V3270(widget)) + hSession = v3270_get_session(widget); + + if(hSession) + { + gtk_grid_attach( + grid, + gtk_image_new_from_icon_name(lib3270_get_ssl_state_icon_name(hSession),GTK_ICON_SIZE_DIALOG), + 0,0, + 2,2 + ); + + gtk_grid_attach( + grid, + label_new((lib3270_get_ssl_state_message(hSession))), + 3,0, + 6,1 + ); + + gtk_grid_attach( + grid, + label_new(lib3270_get_ssl_state_description(hSession)), + 3,1, + 6,1 + ); + + lib3270_autoptr(char) crl = lib3270_get_ssl_crl_text(hSession); + lib3270_autoptr(char) peer = lib3270_get_ssl_peer_certificate_text(hSession); + + if(peer && crl) + { + GtkWidget * frame = gtk_notebook_new(); + + gtk_widget_set_hexpand(GTK_WIDGET(frame),TRUE); + gtk_widget_set_vexpand(GTK_WIDGET(frame),TRUE); + + gtk_notebook_append_page( + GTK_NOTEBOOK(frame), + text_view_new(peer), + gtk_label_new(_("Peer certificate")) + ); + + gtk_notebook_append_page( + GTK_NOTEBOOK(frame), + text_view_new(crl), + gtk_label_new(_("Revocation list")) + ); + + gtk_grid_attach( + grid, + frame, + 3,2, + 6,6 + ); + + } + else if(peer) + { + GtkWidget * frame = gtk_frame_new(_("Peer certificate")); + gtk_container_add(GTK_CONTAINER(frame),text_view_new(peer)); + + gtk_widget_set_hexpand(GTK_WIDGET(frame),TRUE); + gtk_widget_set_vexpand(GTK_WIDGET(frame),TRUE); + + gtk_grid_attach( + grid, + frame, + 3,2, + 6,6 + ); + + + } + + } + else + { + + gtk_grid_attach( + grid, + gtk_image_new_from_icon_name("dialog-error",GTK_ICON_SIZE_DIALOG), + 0,0, + 2,2 + ); + + gtk_grid_attach( + grid, + label_new(_("Invalid state")), + 3,0, + 6,1 + ); + + gtk_grid_attach( + grid, + label_new(_("There's no security information in the session")), + 3,1, + 6,1 + ); + } + + return GTK_WIDGET(grid); + } + + LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget) + { + GtkWidget * dialog = gtk_dialog_new_with_buttons( + _("About security"), + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + _( "_Close" ), GTK_RESPONSE_ACCEPT, + NULL + ); + + gtk_window_set_default_size(GTK_WINDOW(dialog), 800, 500); + + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),v3270_security_dialog_new(widget),TRUE,TRUE,2); + gtk_widget_show_all(dialog); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(GTK_WIDGET(dialog)); + + + } diff --git a/src/include/v3270.h b/src/include/v3270.h index 9144da4..e56c5e6 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -252,6 +252,7 @@ LIB3270_EXPORT const gchar * v3270_get_ssl_status_icon(GtkWidget *widget); LIB3270_EXPORT const gchar * v3270_get_ssl_status_text(GtkWidget *widget); LIB3270_EXPORT const gchar * v3270_get_ssl_status_message(GtkWidget *widget); + LIB3270_EXPORT GtkWidget * v3270_security_dialog_new(GtkWidget *widget); LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget); // File transfer diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index 552bd14..adcfa6b 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -83,6 +83,24 @@ static gboolean popup_menu(GtkWidget *widget, G_GNUC_UNUSED gboolean selected, g } + static gboolean field_clicked(GtkWidget *widget, gboolean connected, V3270_OIA_FIELD field, GdkEventButton *event, GtkWidget *window) + { + trace("%s: %s field=%d event=%p window=%p",__FUNCTION__,connected ? "Connected" : "Disconnected", field, event, window); + + if(!connected) + return FALSE; + + if(field == V3270_OIA_SSL) + { + v3270_popup_security_dialog(widget); + trace("%s: Show SSL connection info dialog",__FUNCTION__); + return TRUE; + } + + + return FALSE; + } + static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSession) { lib3270_set_toggle(hSession,LIB3270_TOGGLE_DS_TRACE,0); lib3270_set_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE,0); @@ -129,6 +147,8 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { // gchar * filename = NULL; GValue val = G_VALUE_INIT; + g_signal_connect(terminal,"field_clicked",G_CALLBACK(field_clicked),window); + GtkWidget *trace = v3270_new_trace_window(terminal,NULL); if(trace) { g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); diff --git a/src/trace/trace.c b/src/trace/trace.c index 020a377..7118649 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -459,7 +459,6 @@ static void destroy(GtkWidget *widget) static void append_text(v3270_trace *hwnd, const gchar *text) { GtkTextIter itr; - gtk_text_buffer_get_end_iter(hwnd->text,&itr); if(g_utf8_validate(text,strlen(text),NULL)) diff --git a/src/v3270/font.c b/src/v3270/font.c index f97498f..3208229 100644 --- a/src/v3270/font.c +++ b/src/v3270/font.c @@ -40,7 +40,11 @@ /*--[ Globals ]--------------------------------------------------------------------------------------*/ +#ifdef _WIN32 + const gchar * v3270_default_font = "Lucida Console"; +#else const gchar * v3270_default_font = "monospace"; +#endif // _WIN32 /*--[ Implement ]------------------------------------------------------------------------------------*/ diff --git a/src/v3270/security.c b/src/v3270/security.c index 486d50f..34d228c 100644 --- a/src/v3270/security.c +++ b/src/v3270/security.c @@ -18,7 +18,7 @@ * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin * St, Fifth Floor, Boston, MA 02110-1301 USA * - * Este programa está nomeado como secoruty.c e possui - linhas de código. + * Este programa está nomeado como - e possui - linhas de código. * * Contatos: * @@ -296,7 +296,7 @@ return NULL; } - const gchar * v3270_get_ssl_status_icon(GtkWidget *widget) + const gchar * v3270_get_ssl_status_icon(GtkWidget *widget) { g_return_val_if_fail(GTK_IS_V3270(widget),""); @@ -354,77 +354,3 @@ return _( "Unexpected or unknown security status"); } - LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget) - { - GtkWidget * dialog; - - g_return_if_fail(GTK_IS_V3270(widget)); - - gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[GTK_V3270(widget)->pointer]); - - -#ifdef HAVE_LIBSSL - if(lib3270_get_secure(GTK_V3270(widget)->host) == LIB3270_SSL_UNSECURE) -#endif // HAVE_LIBSSL - { - // Connection is insecure, show simple dialog with host and info - - dialog = gtk_message_dialog_new( - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - "%s",v3270_get_hostname(widget) - ); - - gtk_message_dialog_format_secondary_markup( - GTK_MESSAGE_DIALOG(dialog), - "%s", _( "Identity not verified\nThe connection is insecure" )); - - } -#ifdef HAVE_LIBSSL - else - { - long id = lib3270_get_SSL_verify_result(GTK_V3270(widget)->host); - const gchar * title = N_( "Unexpected SSL error"); - const gchar * text = NULL; - const gchar * icon = GTK_STOCK_DIALOG_ERROR; - int f; - - for(f=0;ssl_status_msg[f].text;f++) - { - if(ssl_status_msg[f].id == id) - { - title = ssl_status_msg[f].text; - icon = ssl_status_msg[f].icon; - text = ssl_status_msg[f].message; - break; - } - } - - dialog = gtk_message_dialog_new( - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_OTHER, - GTK_BUTTONS_CLOSE, - "%s",gettext(title) - ); - - gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(dialog),gtk_image_new_from_stock(icon,GTK_ICON_SIZE_DIALOG)); - - if(text) - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog), "%s", gettext(text)); - else - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),_( "Unexpected SSL error %ld" ),id); - - } -#endif // HAVE_LIBSSL - - gtk_window_set_title(GTK_WINDOW(dialog),_("About security")); - - gtk_widget_show_all(GTK_WIDGET(dialog)); - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(GTK_WIDGET(dialog)); - - - } diff --git a/v3270.cbp b/v3270.cbp index 799d911..5d3aa86 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -52,6 +52,9 @@