diff options
-rw-r--r-- | check/magma/servers/smtp/smtp_check.c | 23 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check.h | 6 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check_network.c | 60 |
3 files changed, 73 insertions, 16 deletions
diff --git a/check/magma/servers/smtp/smtp_check.c b/check/magma/servers/smtp/smtp_check.c index 8f3baecd..7afaee6b 100644 --- a/check/magma/servers/smtp/smtp_check.c +++ b/check/magma/servers/smtp/smtp_check.c @@ -102,7 +102,7 @@ START_TEST (check_smtp_network_auth_plain_s) { outcome = false; } else if (status()) { - outcome = check_smtp_network_auth_plain_sthread(errmsg, server->network.port); + outcome = check_smtp_network_auth_sthread(errmsg, server->network.port, false); } log_test("SMTP / NETWORK / AUTH PLAIN / SINGLE THREADED:", errmsg); @@ -110,6 +110,26 @@ START_TEST (check_smtp_network_auth_plain_s) { } END_TEST +START_TEST (check_smtp_network_auth_login_s) { + + log_disable(); + bool_t outcome = true; + server_t *server = NULL; + stringer_t *errmsg = MANAGEDBUF(1024); + + if (!(server = servers_get_by_protocol(SMTP, false))) { + st_sprint(errmsg, "No SMTP servers were configured and available for testing."); + outcome = false; + } + else if (status()) { + outcome = check_smtp_network_auth_sthread(errmsg, server->network.port, true); + } + + log_test("SMTP / NETWORK / AUTH LOGIN / SINGLE THREADED:", errmsg); + ck_assert_msg(outcome, st_char_get(errmsg)); +} +END_TEST + Suite * suite_check_smtp(void) { Suite *s = suite_create("\tSMTP"); @@ -120,6 +140,7 @@ Suite * suite_check_smtp(void) { suite_check_testcase(s, "SMTP", "SMTP Network Basic/ TCP/S", check_smtp_network_basic_tcp_s); suite_check_testcase(s, "SMTP", "SMTP Network Basic/ TLS/S", check_smtp_network_basic_tls_s); suite_check_testcase(s, "SMTP", "SMTP Network Auth Plain/S", check_smtp_network_auth_plain_s); + suite_check_testcase(s, "SMTP", "SMTP Network Auth Login/S", check_smtp_network_auth_login_s); return s; } diff --git a/check/magma/servers/smtp/smtp_check.h b/check/magma/servers/smtp/smtp_check.h index 691c39c7..e25bccd1 100644 --- a/check/magma/servers/smtp/smtp_check.h +++ b/check/magma/servers/smtp/smtp_check.h @@ -18,9 +18,11 @@ bool_t check_smtp_checkers_filters_sthread(stringer_t *errmsg, int_t action, int /// smtp_check_network.c bool_t check_smtp_client_read_end(client_t *client); bool_t check_smtp_client_mail_rcpt_data(client_t *client, chr_t *from, chr_t *to, stringer_t *errmsg); -bool_t check_smtp_client_quit_cleanup(client_t *client, stringer_t *errmsg); +bool_t check_smtp_client_auth_plain(client_t *client, chr_t *pass, stringer_t *errmsg); +bool_t check_smtp_client_auth_login(client_t *client, chr_t *user, chr_t *pass, stringer_t *errmsg); +bool_t check_smtp_client_cleanup(client_t *client, stringer_t *errmsg); bool_t check_smtp_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); -bool_t check_smtp_network_auth_plain_sthread(stringer_t *errmsg, uint32_t port); +bool_t check_smtp_network_auth_sthread(stringer_t *errmsg, uint32_t port, bool_t login); Suite * suite_check_smtp(void); diff --git a/check/magma/servers/smtp/smtp_check_network.c b/check/magma/servers/smtp/smtp_check_network.c index db72c617..d9ce7ceb 100644 --- a/check/magma/servers/smtp/smtp_check_network.c +++ b/check/magma/servers/smtp/smtp_check_network.c @@ -53,7 +53,46 @@ bool_t check_smtp_client_mail_rcpt_data(client_t *client, chr_t *from, chr_t *to return true; } -bool_t check_smtp_client_quit_cleanup(client_t *client, stringer_t *errmsg) { +bool_t check_smtp_client_auth_plain(client_t *client, chr_t *pass, stringer_t *errmsg) { + + chr_t *line_auth = "AUTH PLAIN %s\r\n"; + + if (client_print(client, line_auth, pass) != (strlen(line_auth) + strlen(pass)) -2 || + !check_smtp_client_read_end(client) || client_status(client) != 1 || + st_cmp_cs_starts(&(client->line), NULLER("235"))) { + + st_sprint(errmsg, "Failed to return a successful status after submitting credentials"); + return false; + } + + return true; +} + +bool_t check_smtp_client_auth_login(client_t *client, chr_t *user, chr_t *pass, stringer_t *errmsg) { + + if (client_print(client, "AUTH LOGIN\r\n") != 12 || !check_smtp_client_read_end(client) || + client_status(client) != 1 || st_cmp_cs_starts(&(client->line), NULLER("334"))) { + + st_sprint(errmsg, "Failed to return a proceed status code after AUTH LOGIN."); + return false; + } + else if (client_print(client, "%s\r\n", user) != strlen(user) + 2 || !check_smtp_client_read_end(client) || + client_status(client) != 1 || st_cmp_cs_starts(&(client->line), NULLER("334"))) { + + st_sprint(errmsg, "Failed to return a proceed status code after submitting username."); + return false; + } + else if (client_print(client, "%s\r\n", pass) != strlen(pass) + 2 || !check_smtp_client_read_end(client) || + client_status(client) != 1 || st_cmp_cs_starts(&(client->line), NULLER("235"))) { + + st_sprint(errmsg, "Failed to return a successful status after submitting credentials."); + return false; + } + + return true; +} + +bool_t check_smtp_client_cleanup(client_t *client, stringer_t *errmsg) { // Test the QUIT command. if (client_print(client, "QUIT\r\n") != 6 || client_read_line(client) <= 0 || @@ -97,7 +136,6 @@ bool_t check_smtp_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_ return false; } - // Test the EHLO command. else if (client_print(client, "EHLO localhost\r\n") != 16 || !check_smtp_client_read_end(client) || client_status(client) != 1 || st_cmp_cs_starts(&(client->line), NULLER("250"))) { @@ -158,7 +196,7 @@ bool_t check_smtp_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_ return true; } -bool_t check_smtp_network_auth_plain_sthread(stringer_t *errmsg, uint32_t port) { +bool_t check_smtp_network_auth_sthread(stringer_t *errmsg, uint32_t port, bool_t login) { size_t location = 0; client_t *client = NULL; @@ -181,25 +219,21 @@ bool_t check_smtp_network_auth_plain_sthread(stringer_t *errmsg, uint32_t port) return false; } // Issue AUTH with incorrect credentials. - else if (client_print(client, "AUTH PLAIN bWFnbWEAbWFnbWEAaW52YWxpZHBhc3N3b3Jk\r\n") != 49 || - !check_smtp_client_read_end(client) || client_status(client) != 1 || - st_cmp_cs_starts(&(client->line), NULLER("535"))) { + else if ((login ? check_smtp_client_auth_login(client, "bWFnbWE=", "aW52YWxpZHBhc3N3b3Jk", errmsg) + : check_smtp_client_auth_plain(client, "bWFnbWEAbWFnbWEAaW52YWxpZHBhc3N3b3Jk", errmsg))) { - st_sprint(errmsg, "Failed to return error status after AUTH with incorrect credentials."); client_close(client); return false; } // Issue AUTH with correct credentials. - else if (client_print(client, "AUTH PLAIN bWFnbWEAbWFnbWEAcGFzc3dvcmQ=\r\n") != 41 || - !check_smtp_client_read_end(client) || client_status(client) != 1 || - st_cmp_cs_starts(&(client->line), NULLER("235"))) { + else if (!(login ? check_smtp_client_auth_login(client, "bWFnbWE=", "cGFzc3dvcmQ=", errmsg) + : check_smtp_client_auth_plain(client, "bWFnbWEAbWFnbWEAcGFzc3dvcmQ=", errmsg))) { - st_sprint(errmsg, "Failed to return successful status after AUTH with correct credentials."); client_close(client); return false; } // Try sending mail from an unauthenticated account (ladar@lavabit.com). - else if (!check_smtp_client_mail_rcpt_data(client, "ladar@lavabit.com", "princess@example.com", errmsg) || + else if ((errmsg = NULL) || !check_smtp_client_mail_rcpt_data(client, "ladar@lavabit.com", "princess@example.com", errmsg) || client_print(client, ".\r\n") != 3 || !check_smtp_client_read_end(client) || client_status(client) != 1 || st_cmp_cs_starts(&(client->line), NULLER("550"))) { @@ -217,5 +251,5 @@ bool_t check_smtp_network_auth_plain_sthread(stringer_t *errmsg, uint32_t port) return false; } - return check_smtp_client_quit_cleanup(client, errmsg); + return check_smtp_client_cleanup(client, errmsg); } |