Commit c1df1fe6239073a5fa1e5d5151d1350c04e7c17c

Authored by Perry Werneck
1 parent 3bacf3c5

Refactoring popup engine.

src/core/popup.c
... ... @@ -116,3 +116,25 @@ LIB3270_EXPORT void lib3270_popup_va(H3270 *hSession, LIB3270_NOTIFY id , const
116 116 hSession->cbk.popup_show(hSession,&popup,0);
117 117  
118 118 }
  119 +
  120 +LIB3270_POPUP * lib3270_popup_clone_printf(const LIB3270_POPUP *origin, const char *fmt, ...)
  121 +{
  122 + va_list args;
  123 +
  124 + // Create body
  125 + lib3270_autoptr(char) body = NULL;
  126 +
  127 + va_start(args, fmt);
  128 + body = lib3270_vsprintf(fmt, args);
  129 + va_end(args);
  130 +
  131 + // Alocate new struct
  132 + LIB3270_POPUP * popup = lib3270_malloc(sizeof(LIB3270_POPUP)+strlen(body)+1);
  133 +
  134 + *popup = *origin;
  135 +
  136 + strcpy((char *)(popup+1),body);
  137 + popup->body = (char *)(popup+1);
  138 + return popup;
  139 +}
  140 +
... ...
src/include/lib3270/popup.h
... ... @@ -90,6 +90,17 @@
90 90 LIB3270_EXPORT const char * lib3270_get_ssl_state_icon_name(const H3270 *hSession);
91 91  
92 92 /**
  93 + * @brief Clone popup object replacing the body contents.
  94 + *
  95 + * @param origin Original popup definition.
  96 + * @param fmt Printf formatting string.
  97 + *
  98 + * @return New popup object with the body replaced (release it with g_free).
  99 + *
  100 + */
  101 + LIB3270_EXPORT LIB3270_POPUP * lib3270_popup_clone_printf(const LIB3270_POPUP *origin, const char *fmt, ...);
  102 +
  103 + /**
93 104 * @brief Emit popup message.
94 105 *
95 106 * @param hSession TN3270 Session handle.
... ...
src/ssl/negotiate.c
... ... @@ -458,11 +458,10 @@ int ssl_negotiate(H3270 *hSession)
458 458  
459 459 rc = lib3270_run_task(hSession, background_ssl_negotiation, &msg);
460 460  
  461 + debug("background_ssl_negotiation exits with rc=%d",rc);
461 462 if(rc && msg.popup)
462 463 {
463 464 // SSL Negotiation has failed.
464   - host_disconnect(hSession,1); // Disconnect with "failed" status.
465   -
466 465 if(popup_ssl_error(hSession,rc,&msg))
467 466 {
468 467 host_disconnect(hSession,1); // Disconnect with "failed" status.
... ...
src/ssl/notify.c
... ... @@ -57,44 +57,97 @@ static LIB3270_POPUP * translate_ssl_error_message(const SSL_ERROR_MESSAGE *msg,
57 57 {
58 58 LIB3270_POPUP * popup;
59 59  
60   - if(msg->popup->body)
  60 + printf("\n\nMSG-CODE=%d\n\n",msg->code);
  61 +
  62 + if(msg->code)
61 63 {
62   - popup = lib3270_malloc(sizeof(LIB3270_POPUP));
63   - memcpy(popup,msg->popup,sizeof(LIB3270_POPUP));
64   - popup->body = dgettext(GETTEXT_PACKAGE,msg->popup->body);
  64 + if(msg->popup->body)
  65 + {
  66 + popup = lib3270_popup_clone_printf(
  67 + msg->popup,
  68 + _( "%s\nThe SSL error message was \"%s\"(%d)" ),
  69 + dgettext(GETTEXT_PACKAGE,msg->popup->body),
  70 + ERR_reason_error_string(msg->code),
  71 + msg->code
  72 + );
  73 + }
  74 + else
  75 + {
  76 + popup = lib3270_popup_clone_printf(
  77 + msg->popup,
  78 + _( "The SSL error message was \"%s\" (%d)" ),
  79 + ERR_reason_error_string(msg->code),
  80 + msg->code
  81 + );
  82 + }
  83 +
65 84 }
66   - else
  85 +#ifdef _WIN32
  86 + else if(msg->lasterror)
67 87 {
68   - lib3270_autoptr(char) body = NULL;
69   - if(msg->code)
  88 + lib3270_autoptr(char) windows_error = lib3270_win32_translate_error_code(msg->lasterror);
  89 +
  90 + if(msg->popup->body)
70 91 {
71   - body = lib3270_strdup_printf(_( "%s (SSL error %d)" ),ERR_reason_error_string(msg->code),msg->code);
  92 + popup = lib3270_popup_clone_printf(
  93 + msg->popup,
  94 + _( "%s\nThe windows error was \"%s\" (%u)" ),
  95 + dgettext(GETTEXT_PACKAGE,msg->popup->body),
  96 + windows_error,
  97 + (unsigned int) msg->lasterror
  98 + );
72 99 }
73   -#ifdef _WIN32
74   - else if(msg->lasterror)
  100 + else
75 101 {
76   - lib3270_autoptr(char) windows_error = lib3270_win32_translate_error_code(msg->lasterror);
77   - body = lib3270_strdup_printf(_( "Windows error was \"%s\" (%u)" ), windows_error,(unsigned int) msg->lasterror);
  102 + popup = lib3270_popup_clone_printf(
  103 + msg->popup,
  104 + _( "Windows error was \"%s\" (%u)" ),
  105 + windows_error,
  106 + (unsigned int) msg->lasterror
  107 + );
78 108 }
79   -#endif
80   - else if(rc) {
81   - body = lib3270_strdup_printf(_( "%s (rc=%d)" ),strerror(rc),rc);
  109 +
  110 + }
  111 +#endif // _WIN32
  112 + else if(rc)
  113 + {
  114 + if(msg->popup->body)
  115 + {
  116 + popup = lib3270_popup_clone_printf(
  117 + msg->popup,
  118 + _( "%s\nThe operating system error was \"%s\" (%u)" ),
  119 + dgettext(GETTEXT_PACKAGE,msg->popup->body),
  120 + strerror(rc),
  121 + rc
  122 + );
  123 + }
  124 + else
  125 + {
  126 + popup = lib3270_popup_clone_printf(
  127 + msg->popup,
  128 + _( "The operating system error was \"%s\" (%u)" ),
  129 + strerror(rc),
  130 + rc
  131 + );
82 132 }
83 133  
84   - popup = lib3270_malloc(sizeof(LIB3270_POPUP)+strlen(body)+1);
85   - memcpy(popup,msg->popup,sizeof(LIB3270_POPUP));
86   - popup->body = (char *) (popup+1);
87   - strcpy((char *) (popup+1),body);
  134 + }
  135 + else
  136 + {
  137 + popup = lib3270_malloc(sizeof(LIB3270_POPUP));
  138 + *popup = *msg->popup;
  139 +
  140 + if(msg->popup->body)
  141 + popup->body = dgettext(GETTEXT_PACKAGE,msg->popup->body);
88 142  
89 143 }
90 144  
91   - if(popup->summary)
92   - popup->summary = dgettext(GETTEXT_PACKAGE,popup->summary);
  145 + popup->summary = dgettext(GETTEXT_PACKAGE,msg->popup->summary);
93 146  
94 147 if(popup->title)
95 148 popup->title = dgettext(GETTEXT_PACKAGE,popup->title);
96 149 else
97   - popup->title = _("Security alert");
  150 + popup->title = _("Your connection is not safe");
98 151  
99 152 popup->label = _("Continue");
100 153 return popup;
... ...