+static int handle_invalid_peer_certificate (long vfy_result) {
+#if defined (USE_SSL) || (defined (USE_GNUTLS) && defined (HAVE_GNUTLS_OPENSSL_H))
+ mutt_error (_("Error verifying certificate: %s"),
+ NONULL (X509_verify_cert_error_string (vfy_result)));
+#else
+ mutt_error (_("Error verifying certificate. Error Code: %lu"), vfy_result);
+#endif
+ sleep(2);
+ return 1; /* Accept the problem */
+}
+
+static void event_cb (smtp_session_t session, int event_no, void *arg,...)
+{
+ va_list alist;
+ int *ok;
+
+ va_start(alist, arg);
+ switch(event_no) {
+ case SMTP_EV_CONNECT:
+ case SMTP_EV_MAILSTATUS:
+ case SMTP_EV_RCPTSTATUS:
+ case SMTP_EV_MESSAGEDATA:
+ case SMTP_EV_MESSAGESENT:
+ case SMTP_EV_DISCONNECT: break;
+ case SMTP_EV_WEAK_CIPHER: {
+ int bits;
+ bits = va_arg(alist, long); ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_WEAK_CIPHER, bits=%d - accepted."), bits);
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_STARTTLS_OK:
+ mutt_message (_("Using TLS"));
+ sleep(1);
+ break;
+ case SMTP_EV_INVALID_PEER_CERTIFICATE: {
+ long vfy_result;
+ vfy_result = va_arg(alist, long); ok = va_arg(alist, int*);
+ *ok = handle_invalid_peer_certificate(vfy_result);
+ sleep(1);
+ break;
+ }
+ case SMTP_EV_NO_PEER_CERTIFICATE: {
+ ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_NO_PEER_CERTIFICATE - accepted."));
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_WRONG_PEER_CERTIFICATE: {
+ ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_WRONG_PEER_CERTIFICATE - accepted."));
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_NO_CLIENT_CERTIFICATE: {
+ ok = va_arg(alist, int*);
+ mutt_message (_("SMTP_EV_NO_CLIENT_CERTIFICATE - accepted."));
+ sleep(1);
+ *ok = 1; break;
+ }
+ case SMTP_EV_EXTNA_DSN:
+ extna ("DSN");
+ break;
+ case SMTP_EV_EXTNA_STARTTLS:
+ extna ("StartTLS");
+ break;
+ case SMTP_EV_EXTNA_8BITMIME:
+ extna ("8BITMIME");
+ break;
+ default:
+ mutt_message(_("Got unhandled event ID = %d - ignored."), event_no);
+ sleep(1);
+ }
+ va_end(alist);
+}
+
+static void do_dsn_notify (smtp_message_t message, const char* from) {
+ int flags = Notify_NOTSET;
+ smtp_recipient_t self = NULL;
+
+ if (!DsnNotify || !*DsnNotify || !message || !from || !*from ||
+ strstr (DsnNotify, "never") != NULL)
+ return;
+
+ if (strstr (DsnNotify, "failure") != NULL)
+ flags |= Notify_FAILURE;
+ if (strstr (DsnNotify, "delay") != NULL)
+ flags |= Notify_DELAY;
+ if (strstr (DsnNotify, "success") != NULL)
+ flags |= Notify_SUCCESS;
+
+ if (flags != Notify_NOTSET) {
+ if (!(self = smtp_add_recipient (message, from)))
+ return;
+ smtp_dsn_set_notify (self, flags);
+ }
+}
+
+static void do_dsn_ret (smtp_message_t message) {
+ if (!DsnReturn || !*DsnReturn || !message)
+ return;
+ if (ascii_strncasecmp (DsnReturn, "hdrs", 4) == 0)
+ smtp_dsn_set_ret (message, Ret_HDRS);
+ else if (ascii_strncasecmp (DsnReturn, "full", 4) == 0)
+ smtp_dsn_set_ret (message, Ret_FULL);
+}
+
+#if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS))
+int mutt_libesmtp_check_usetls (const char* option, unsigned long p,
+ char* errbuf, size_t errlen) {
+ char* val = (char*) p;
+ if (!val || !*val)
+ return (1);
+ if (str_ncmp (val, "enabled", 7) != 0 &&
+ str_ncmp (val, "required", 8) != 0) {
+ if (errbuf)
+ snprintf (errbuf, errlen, _("'%s' is invalid for %s"), val, option);
+ return (0);
+ }
+ return (1);
+}
+#endif
+