[balsa] Fix a bug in the SMTP code, and generally clean up
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] Fix a bug in the SMTP code, and generally clean up
- Date: Thu, 20 Apr 2017 13:30:31 +0000 (UTC)
commit e07f9e1807ef3eef1bc2db34cdb2801f38756b6a
Author: Albrecht Dreß <albrecht dress arcor de>
Date: Thu Apr 20 09:29:26 2017 -0400
Fix a bug in the SMTP code, and generally clean up
* libnetclient/net-client-smtp.c (net_client_smtp_send_msg): do
not set SMTP DSN parameters for a server not supporting it;
(net_client_smtp_finalise): fix long delay when sending a
message fails in the callback;
* libnetclient/test/inetsim.conf:
* libnetclient/test/start-test-env.sh.in:
* libnetclient/test/tests.c (msg_data_cb), (test_smtp): improve
SMTP unit tests; improve the test environment script as to
place the results readable in the cwd.
Signed-off-by: Peter Bloomfield <PeterBloomfield bellsouth net>
ChangeLog | 15 +++++++++
libnetclient/net-client-smtp.c | 12 +++++--
libnetclient/test/inetsim.conf | 2 +-
libnetclient/test/start-test-env.sh.in | 6 +++-
libnetclient/test/tests.c | 53 ++++++++++++++++++++++++-------
5 files changed, 71 insertions(+), 17 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 2c17ed9..cce6f6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2017-04-20 Peter Bloomfield <pbloomfield bellsouth net>
+
+ Fix a bug in the SMTP code, and generally clean up;
+ https://mail.gnome.org/archives/balsa-list/2017-April/msg00040.html
+
+ * libnetclient/net-client-smtp.c (net_client_smtp_send_msg): do
+ not set SMTP DSN parameters for a server not supporting it;
+ (net_client_smtp_finalise): fix long delay when sending a
+ message fails in the callback;
+ * libnetclient/test/inetsim.conf:
+ * libnetclient/test/start-test-env.sh.in:
+ * libnetclient/test/tests.c (msg_data_cb), (test_smtp): improve
+ SMTP unit tests; improve the test environment script as to
+ place the results readable in the cwd.
+
2017-04-18 Peter Bloomfield <pbloomfield bellsouth net>
Remove unused code
diff --git a/libnetclient/net-client-smtp.c b/libnetclient/net-client-smtp.c
index b55710c..1d4dec1 100644
--- a/libnetclient/net-client-smtp.c
+++ b/libnetclient/net-client-smtp.c
@@ -22,6 +22,7 @@ struct _NetClientSmtpPrivate {
NetClientCryptMode crypt_mode;
guint auth_allowed[2]; /** 0: encrypted, 1: unencrypted */
gboolean can_dsn;
+ gboolean data_state;
};
@@ -182,7 +183,7 @@ net_client_smtp_send_msg(NetClientSmtp *client, const NetClientSmtpMessage *mess
(message->recipients != NULL) && (message->data_callback != NULL), FALSE);
/* set the RFC 5321 sender and recipient(s) */
- if (message->have_dsn_rcpt) {
+ if (client->priv->can_dsn && message->have_dsn_rcpt) {
if (message->dsn_envid != NULL) {
result = net_client_smtp_execute(client, "MAIL FROM:<%s> RET=%s ENVID=%s", NULL,
error, message->sender,
(message->dsn_ret_full) ? "FULL" : "HDRS", message->dsn_envid);
@@ -216,6 +217,7 @@ net_client_smtp_send_msg(NetClientSmtp *client, const NetClientSmtpMessage *mess
gssize count;
gchar last_char = '\0';
+ client->priv->data_state = TRUE;
do {
count = message->data_callback(buffer, SMTP_DATA_BUF_SIZE, message->user_data, error);
if (count < 0) {
@@ -236,6 +238,7 @@ net_client_smtp_send_msg(NetClientSmtp *client, const NetClientSmtpMessage *mess
if (result) {
result = net_client_smtp_read_reply(client, -1, NULL, error);
+ client->priv->data_state = FALSE;
}
return result;
@@ -339,8 +342,11 @@ net_client_smtp_finalise(GObject *object)
const NetClientSmtp *client = NET_CLIENT_SMTP(object);
const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_smtp_parent_class);
- /* send the 'QUIT' command - no need to evaluate the reply or check for errors */
- (void) net_client_execute(NET_CLIENT(client), NULL, "QUIT", NULL);
+ /* send the 'QUIT' command unless we are in 'DATA' state where the server will probably fail to reply
- no need to evaluate the
+ * reply or check for errors */
+ if (!client->priv->data_state) {
+ (void) net_client_execute(NET_CLIENT(client), NULL, "QUIT", NULL);
+ }
g_free(client->priv);
(*parent_class->finalize)(object);
diff --git a/libnetclient/test/inetsim.conf b/libnetclient/test/inetsim.conf
index 75e5fa0..4865337 100644
--- a/libnetclient/test/inetsim.conf
+++ b/libnetclient/test/inetsim.conf
@@ -797,7 +797,7 @@ smtps_service_extension 8BITMIME
smtps_service_extension SIZE 102400000
smtps_service_extension ENHANCEDSTATUSCODES
smtps_service_extension AUTH PLAIN LOGIN CRAM-MD5 CRAM-SHA1
-smtps_service_extension DSN
+#smtps_service_extension DSN
smtps_service_extension ETRN
#
diff --git a/libnetclient/test/start-test-env.sh.in b/libnetclient/test/start-test-env.sh.in
index 5479612..acb8e4b 100644
--- a/libnetclient/test/start-test-env.sh.in
+++ b/libnetclient/test/start-test-env.sh.in
@@ -13,7 +13,11 @@ echo "GnuTLS server w/ client checking @ port 65002 as s_server2..."
@SCREEN@ -ls
echo "inetsim (as root)..."
-@SUDO@ @INETSIM@ --config inetsim.conf
+@SUDO@ -s -- <<EOF
+rm -f debug.log main.log service.log report.*.txt
+@INETSIM@ --config inetsim.conf --report-dir . --log-dir .
+chmod 666 debug.log main.log service.log report.*.txt
+EOF
echo "shut down GnuTLS servers..."
@SCREEN@ -S s_server1 -X quit
diff --git a/libnetclient/test/tests.c b/libnetclient/test/tests.c
index 053d48c..9213174 100644
--- a/libnetclient/test/tests.c
+++ b/libnetclient/test/tests.c
@@ -237,6 +237,7 @@ test_basic_crypt(void)
typedef struct {
gchar *msg_text;
gchar *read_ptr;
+ gboolean sim_error;
} msg_data_t;
@@ -248,17 +249,21 @@ msg_data_cb(gchar *buffer, gsize count, gpointer user_data, GError **error)
gssize result;
g_message("%s(%p, %lu, %p, %p)", __func__, buffer, count, user_data, error);
- msg_len = strlen(msg_data->read_ptr);
- if (msg_len > 0) {
- if (msg_len > count) {
- result = count;
+ if (msg_data->sim_error) {
+ result = -1;
+ } else {
+ msg_len = strlen(msg_data->read_ptr);
+ if (msg_len > 0) {
+ if (msg_len > count) {
+ result = count;
+ } else {
+ result = msg_len;
+ }
+ memcpy(buffer, msg_data->read_ptr, result);
+ msg_data->read_ptr = &msg_data->read_ptr[result];
} else {
- result = msg_len;
+ result = 0;
}
- memcpy(buffer, msg_data->read_ptr, result);
- msg_data->read_ptr = &msg_data->read_ptr[result];
- } else {
- result = 0;
}
g_message("%s: return %ld", __func__, result);
return result;
@@ -303,6 +308,7 @@ test_smtp(void)
// message creation
msg_buf.msg_text = msg_buf.read_ptr = MSG_TEXT;
+ msg_buf.sim_error = FALSE;
sput_fail_unless(net_client_smtp_msg_new(NULL, NULL) == NULL, "create msg: no callback");
sput_fail_unless((msg = net_client_smtp_msg_new(msg_data_cb, &msg_buf)) != NULL, "create msg: ok");
@@ -379,6 +385,17 @@ test_smtp(void)
sput_fail_unless(net_client_smtp_allow_auth(smtp, FALSE, NET_CLIENT_SMTP_AUTH_PLAIN) == TRUE, "force
auth meth PLAIN");
g_signal_connect(G_OBJECT(smtp), "auth", G_CALLBACK(get_auth), smtp);
sput_fail_unless(net_client_smtp_connect(smtp, NULL, NULL) == TRUE, "connect: success");
+ msg_buf.sim_error = TRUE;
+ sput_fail_unless(net_client_smtp_send_msg(smtp, msg, NULL) == FALSE, "send msg: error in callback");
+ msg_buf.sim_error = FALSE;
+ g_object_unref(smtp);
+
+ // unencrypted, PLAIN auth
+ sput_fail_unless((smtp = net_client_smtp_new("localhost", 65025, NET_CLIENT_CRYPT_NONE)) != NULL,
"localhost:65025");
+ sput_fail_unless(net_client_smtp_allow_auth(NULL, FALSE, NET_CLIENT_SMTP_AUTH_PLAIN) == FALSE, "set
auth meths, no client");
+ sput_fail_unless(net_client_smtp_allow_auth(smtp, FALSE, NET_CLIENT_SMTP_AUTH_PLAIN) == TRUE, "force
auth meth PLAIN");
+ g_signal_connect(G_OBJECT(smtp), "auth", G_CALLBACK(get_auth), smtp);
+ sput_fail_unless(net_client_smtp_connect(smtp, NULL, NULL) == TRUE, "connect: success");
sput_fail_unless(net_client_smtp_send_msg(smtp, msg, NULL) == TRUE, "send msg: success");
g_object_unref(smtp);
@@ -407,10 +424,10 @@ test_smtp(void)
sput_fail_unless(net_client_smtp_send_msg(smtp, msg, NULL) == TRUE, "send msg: success");
g_object_unref(smtp);
- // SSL, CRAM-SHA1 auth
+ // STARTTLS, CRAM-SHA1 auth
sput_fail_unless(net_client_smtp_msg_add_recipient(msg, "other3 there com",
NET_CLIENT_SMTP_DSN_DELAY) == TRUE,
"add recipient ok (dsn)");
- sput_fail_unless((smtp = net_client_smtp_new("localhost", 65465, NET_CLIENT_CRYPT_ENCRYPTED)) !=
NULL, "localhost:65025, ssl");
+ sput_fail_unless((smtp = net_client_smtp_new("localhost", 65025, NET_CLIENT_CRYPT_STARTTLS)) != NULL,
"localhost:65025");
sput_fail_unless(net_client_smtp_allow_auth(smtp, TRUE, NET_CLIENT_SMTP_AUTH_CRAM_SHA1) == TRUE,
"force auth meth CRAM-SHA1");
g_signal_connect(G_OBJECT(smtp), "cert-check", G_CALLBACK(check_cert), NULL);
g_signal_connect(G_OBJECT(smtp), "auth", G_CALLBACK(get_auth), smtp);
@@ -419,10 +436,22 @@ test_smtp(void)
sput_fail_unless(net_client_smtp_send_msg(smtp, msg, NULL) == TRUE, "send msg: success");
g_object_unref(smtp);
+ // STARTTLS, auto select auth
+ sput_fail_unless(net_client_smtp_msg_add_recipient(msg, "other4 there com",
+ NET_CLIENT_SMTP_DSN_SUCCESS + NET_CLIENT_SMTP_DSN_FAILURE + NET_CLIENT_SMTP_DSN_DELAY) ==
TRUE, "add recipient ok (dsn)");
+ sput_fail_unless((smtp = net_client_smtp_new("localhost", 65025, NET_CLIENT_CRYPT_STARTTLS)) != NULL,
"localhost:65025");
+ g_signal_connect(G_OBJECT(smtp), "cert-check", G_CALLBACK(check_cert), NULL);
+ g_signal_connect(G_OBJECT(smtp), "auth", G_CALLBACK(get_auth), smtp);
+ sput_fail_unless(net_client_smtp_connect(smtp, NULL, NULL) == TRUE, "connect: success");
+ sput_fail_unless(net_client_smtp_msg_set_dsn_opts(msg, "20170113212711 19833 here com", TRUE) == TRUE,
+ "dsn: envid, message");
+ sput_fail_unless(net_client_smtp_send_msg(smtp, msg, NULL) == TRUE, "send msg: success");
+ g_object_unref(smtp);
+
// SSL, auto select auth
sput_fail_unless(net_client_smtp_msg_add_recipient(msg, "other4 there com",
NET_CLIENT_SMTP_DSN_SUCCESS + NET_CLIENT_SMTP_DSN_FAILURE + NET_CLIENT_SMTP_DSN_DELAY) ==
TRUE, "add recipient ok (dsn)");
- sput_fail_unless((smtp = net_client_smtp_new("localhost", 65465, NET_CLIENT_CRYPT_ENCRYPTED)) !=
NULL, "localhost:65025, ssl");
+ sput_fail_unless((smtp = net_client_smtp_new("localhost", 65465, NET_CLIENT_CRYPT_ENCRYPTED)) !=
NULL, "localhost:65465, ssl");
g_signal_connect(G_OBJECT(smtp), "cert-check", G_CALLBACK(check_cert), NULL);
g_signal_connect(G_OBJECT(smtp), "auth", G_CALLBACK(get_auth), smtp);
sput_fail_unless(net_client_smtp_connect(smtp, NULL, NULL) == TRUE, "connect: success");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]