diff options
-rw-r--r-- | check/magma/regression/regression_check.c | 34 | ||||
-rw-r--r-- | check/magma/regression/regression_check.h | 2 | ||||
-rw-r--r-- | check/magma/regression/regression_check_helpers.c | 45 | ||||
-rw-r--r-- | check/magma/servers/imap/imap_check.h | 3 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check.c | 8 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check.h | 2 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check_network.c | 54 | ||||
-rw-r--r-- | sandbox/etc/.magma.sandbox.config.swp | bin | 16384 -> 0 bytes | |||
-rwxr-xr-x | sandbox/etc/magma.sandbox.config | 2 |
9 files changed, 113 insertions, 37 deletions
diff --git a/check/magma/regression/regression_check.c b/check/magma/regression/regression_check.c index ed1994ba..83575f41 100644 --- a/check/magma/regression/regression_check.c +++ b/check/magma/regression/regression_check.c @@ -75,34 +75,20 @@ START_TEST (check_regression_smtp_dot_stuffing_s) { } END_TEST -START_TEST (check_regression_imap_search_range_s) { +START_TEST (check_regression_imap_search_range_parsing_s) { log_disable(); bool_t outcome = true; + server_t *server = NULL; stringer_t *errmsg = MANAGEDBUF(1024); - /// MEDIUM: Write a unit test to prevent the regression of the IMAP search range parsing logic. - /// - /// A01 LOGIN magma password - /// A02 SELECT Inbox - /// - /// -- This search command would have triggered the parser issue in the past because the start sequence is - /// higher than the first available message. Note the start token could have been a UID or sequence and triggered - /// the improper token handling. It just needed to be higher than the first legit message. Now this should return - /// an empty set, assuming the start range is higher then we'll ever see during a unit test. (Make it higher?) - /// A03 SEARCH UID 531870239:532870239 NOT DELETE - /// - /// -- Ensure that even if the first message set doesn't match, because it starts beyond the valid range, a second - /// valid sequence will still be considered, and thus return messages. - /// A04 SEARCH UID 531870239:532870239,1:10000 NOT DELETE - /// - /// A05 LOGOUT - /// - - st_sprint(errmsg, "This check needs love. Touch me tender, and finish me off."); - outcome = false; - - //if (status()) outcome = check_regression_imap_search_range_sthread(errmsg); + if (!(server = servers_get_by_protocol(IMAP, false))) { + st_sprint(errmsg, "No IMAP servers were configured and available for testing."); + outcome = false; + } + else if (status()) { + outcome = check_regression_imap_search_range_parsing_sthread(errmsg, server->network.port); + } log_test("REGRESSION / IMAP / SEARCH RANGE PARSING / SINGLE THREADED:", errmsg); ck_assert_msg(outcome, st_char_get(errmsg)); @@ -115,7 +101,7 @@ Suite * suite_check_regression(void) { suite_check_testcase(s, "REGRESSION", "Regression File Descriptors Leak/M", check_regression_file_descriptors_leak_m); suite_check_testcase(s, "REGRESSION", "Regression SMTP Dot Stuffing/S", check_regression_smtp_dot_stuffing_s); - suite_check_testcase(s, "REGRESSION", "Regression IMAP Search Range Ranges/S", check_regression_imap_search_range_s); + suite_check_testcase(s, "REGRESSION", "Regression IMAP Search Range Parsing/S", check_regression_imap_search_range_parsing_s); return s; } diff --git a/check/magma/regression/regression_check.h b/check/magma/regression/regression_check.h index 655424d7..d37d8ae5 100644 --- a/check/magma/regression/regression_check.h +++ b/check/magma/regression/regression_check.h @@ -11,7 +11,7 @@ void check_regression_file_descriptors_leak_test(void); bool_t check_client_dot_stuff(client_t *client, chr_t *token); bool_t check_regression_smtp_dot_stuffing_sthread(stringer_t *errmsg); -bool_t check_regression_imap_search_range_sthread(stringer_t *errmsg); +bool_t check_regression_imap_search_range_parsing_sthread(stringer_t *errmsg, uint32_t port); Suite * suite_check_regression(void); diff --git a/check/magma/regression/regression_check_helpers.c b/check/magma/regression/regression_check_helpers.c index 6f3f96a2..34d3e5d1 100644 --- a/check/magma/regression/regression_check_helpers.c +++ b/check/magma/regression/regression_check_helpers.c @@ -134,6 +134,49 @@ bool_t check_regression_smtp_dot_stuffing_sthread(stringer_t *errmsg) { return true; } -bool_t check_regression_imap_search_range_sthread(stringer_t *errmsg) { +bool_t check_regression_imap_search_range_parsing_sthread(stringer_t *errmsg, uint32_t port) { + client_t *client = NULL; + + // Enable logging to see the error. It should take the form of two repeating lines: + // + // Attempted a token count on a NULL string bugger. + // Attempted token extraction from a NULL string buffer. + log_enable(); + + // Connect the client over TCP. + if (!(client = client_connect("localhost", port)) || client_read_line(client) <= 0 || !net_set_timeout(client->sockd, 20, 20)) { + + st_sprint(errmsg, "Failed to connect with the IMAP server over TCP."); + client_close(client); + return false; + } + else if (!check_imap_client_login(client, "princess", "password", "A00", errmsg) || + !check_imap_client_select(client, "Inbox", "A01", errmsg)) { + + if (st_empty(errmsg)) st_sprint(errmsg, "The LOGIN or SELECT command failed."); + client_close(client); + return false; + } + else if (client_write(client, PLACER("A02 SEARCH UID 531870239:532870239 NOT DELETE\r\n", 47)) != 47 || + !check_imap_client_read_end(client, "A02") || + client_write(client, PLACER("A03 SEARCH UID 531870239:532870239, 1:10000 NOT DELETE\r\n", 56)) != 56 || + !check_imap_client_read_end(client, "A03")) { + + if (st_empty(errmsg)) st_sprint(errmsg, "A SEARCH UID command failed."); + client_close(client); + return false; + } + else if (!check_imap_client_close_logout(client, 4, errmsg)) { + + if (st_empty(errmsg)) st_sprint(errmsg, "A LOGOUT or CLOSE command failed."); + client_close(client); + return false; + } + + // Disable logging again. + log_disable(); + + client_close(client); + return true; } diff --git a/check/magma/servers/imap/imap_check.h b/check/magma/servers/imap/imap_check.h index 3a6c5e77..05e0bb29 100644 --- a/check/magma/servers/imap/imap_check.h +++ b/check/magma/servers/imap/imap_check.h @@ -9,6 +9,9 @@ /// imap_check_network.c bool_t check_imap_client_read_end(client_t *client, chr_t *tag); +bool_t check_imap_client_login(client_t *client, chr_t *user, chr_t *pass, chr_t *tag, stringer_t *errmsg); +bool_t check_imap_client_select(client_t *client, chr_t *folder, chr_t *tag, stringer_t *errmsg); +bool_t check_imap_client_close_logout(client_t *client, uint32_t tag_num, stringer_t *errmsg); bool_t check_imap_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); bool_t check_imap_network_search_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); bool_t check_imap_network_fetch_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); diff --git a/check/magma/servers/smtp/smtp_check.c b/check/magma/servers/smtp/smtp_check.c index aa7e6b8d..b9b36c9e 100644 --- a/check/magma/servers/smtp/smtp_check.c +++ b/check/magma/servers/smtp/smtp_check.c @@ -138,7 +138,7 @@ START_TEST (check_smtp_network_auth_login_s) { } END_TEST -START_TEST (check_smtp_network_quotas_s) { +START_TEST (check_smtp_network_outbound_quota_s) { log_disable(); bool_t outcome = true; @@ -149,11 +149,11 @@ START_TEST (check_smtp_network_quotas_s) { st_sprint(errmsg, "No SMTP servers were configured and available for testing."); outcome = false; } - else if (status() && !check_smtp_network_quotas_sthread(errmsg, server->network.port, true)) { + else if (status() && !check_smtp_network_outbound_quota_sthread(errmsg, server->network.port, false)) { outcome = false; } - log_test("SMTP / NETWORK / QUOTAS / SINGLE THREADED:", NULLER("SKIPPED")); + log_test("SMTP / NETWORK / OUTBOUND QUOTA / SINGLE THREADED:", errmsg); ck_assert_msg(outcome, st_char_get(errmsg)); } END_TEST @@ -189,7 +189,7 @@ Suite * suite_check_smtp(void) { 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); - suite_check_testcase(s, "SMTP", "SMTP Network Quotas/S", check_smtp_network_quotas_s); + suite_check_testcase(s, "SMTP", "SMTP Network Outbound Quota/S", check_smtp_network_outbound_quota_s); suite_check_testcase(s, "SMTP", "SMTP Network STARTTLS Advertisement/S", check_smtp_network_starttls_advertisement_s); return s; diff --git a/check/magma/servers/smtp/smtp_check.h b/check/magma/servers/smtp/smtp_check.h index 592c9599..440d21db 100644 --- a/check/magma/servers/smtp/smtp_check.h +++ b/check/magma/servers/smtp/smtp_check.h @@ -23,7 +23,7 @@ bool_t check_smtp_client_auth_login(client_t *client, stringer_t *user, stringer bool_t check_smtp_client_quit(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_sthread(stringer_t *errmsg, uint32_t port, bool_t login); -bool_t check_smtp_network_quotas_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); +bool_t check_smtp_network_outbound_quota_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); bool_t check_smtp_network_starttls_advertisement_sthread(stringer_t *errmsg, uint32_t tcp_port, uint32_t tls_port); 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 f1206128..b5d01eec 100644 --- a/check/magma/servers/smtp/smtp_check_network.c +++ b/check/magma/servers/smtp/smtp_check_network.c @@ -279,18 +279,62 @@ bool_t check_smtp_network_auth_sthread(stringer_t *errmsg, uint32_t port, bool_t return true; } -bool_t check_smtp_network_quotas_sthread(stringer_t *errmsg, uint32_t port, bool_t secure) { +bool_t check_smtp_network_outbound_quota_sthread(stringer_t *errmsg, uint32_t port, bool_t secure) { - // Set the quota low for the magma user. - if (sql_query(PLACER("UPDATE Users SET quota = 1 WHERE usernum = 1;", 0)) != 0) { + client_t *client = NULL; + log_enable(); + + // Wipe the Transmitting table history for the Magma user. + if (sql_query(PLACER("DELETE FROM Transmitting WHERE usernum = 1;", 45)) != 0) { + + st_sprint(errmsg, "The SQL query to clear the Magma user's transmission history failed."); + return false; + } + // Set the daily send limit to 1 for the Magma user. + else if (sql_query(PLACER("UPDATE Dispatch SET daily_send_limit = 1 WHERE usernum = 1;", 59)) != 0) { + + st_sprint(errmsg, "The SQL query to set the daily send limit low for the Magma user failed."); + return false; + } + // Connect to the SMTP server and authenticate. + else if (!(client = client_connect("localhost", port)) || !net_set_timeout(client->sockd, 20, 20) || + (secure && (client_secure(client) == -1)) || client_read_line(client) <= 0 || + !check_smtp_client_auth_login(client, PLACER("bWFnbWE=", 8), PLACER("cGFzc3dvcmQ=", 12))) { + + sql_query(PLACER("UPDATE Dispatch SET daily_send_limit = 256 WHERE usernum = 1;", 61)); + st_sprint(errmsg, "Failed to connect with the SMTP server or AUTH LOGIN failed."); + client_close(client); return false; } + // Send the first message and expect a reply of "250 MESSAGE ACCEPTED". + else if (!check_smtp_client_mail_rcpt_data(client, "magma@lavabit.com", "ladar@lavabit.com", errmsg) || + client_write(client, PLACER("This is a message body.\r\n.\r\n", 28)) != 28 || + !check_smtp_client_read_end(client) || st_cmp_cs_starts(&(client->line), PLACER("250", 3)) != 0) { - // Reset the quota for the magma user. - else if (sql_query(PLACER("UPDATE Users SET quota = 4294967296 WHERE usernum = 1;", 0)) != 0) { + sql_query(PLACER("UPDATE Dispatch SET daily_send_limit = 256 WHERE usernum = 1;", 61)); + if (st_empty(errmsg)) st_sprint(errmsg, "Failed sending the first message."); + client_close(client); + return false; + } + // Send the second message and expect a reply of "451 OUTBOUND MAIL QUOTA EXCEEDED". + else if (!check_smtp_client_mail_rcpt_data(client, "magma@lavabit.com", "ladar@lavabit.com", errmsg) || + client_write(client, PLACER("This is a message body.\r\n.\r\n", 28)) != 28 || + !check_smtp_client_read_end(client) || st_cmp_cs_starts(&(client->line), PLACER("451", 3)) != 0) { + + sql_query(PLACER("UPDATE Dispatch SET daily_send_limit = 256 WHERE usernum = 1;", 61)); + if (st_empty(errmsg)) st_sprint(errmsg, "Failed to be limited by quota."); + client_close(client); return false; } + // Reset the daily send limit for the Magma user. + else if (sql_query(PLACER("UPDATE Dispatch SET daily_send_limit = 256 WHERE usernum = 1;", 61)) != 0) { + st_sprint(errmsg, "The SQL query to reset the daily send limit for the Magma user failed."); + client_close(client); + return false; + } + + client_close(client); return true; } diff --git a/sandbox/etc/.magma.sandbox.config.swp b/sandbox/etc/.magma.sandbox.config.swp Binary files differdeleted file mode 100644 index 1610a19e..00000000 --- a/sandbox/etc/.magma.sandbox.config.swp +++ /dev/null diff --git a/sandbox/etc/magma.sandbox.config b/sandbox/etc/magma.sandbox.config index ce4cb820..6784aac4 100755 --- a/sandbox/etc/magma.sandbox.config +++ b/sandbox/etc/magma.sandbox.config @@ -73,7 +73,7 @@ magma.web.portal.safeguard = false magma.relay.timeout = 60 magma.relay[1].name = localhost -magma.relay[1].port = 25 +magma.relay[1].port = 7000 magma.servers[1].name = Lavabit Molten magma.servers[1].domain = lavabit.com |