Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/lavabit/magma.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--check/magma/regression/regression_check.c34
-rw-r--r--check/magma/regression/regression_check.h2
-rw-r--r--check/magma/regression/regression_check_helpers.c45
-rw-r--r--check/magma/servers/imap/imap_check.h3
-rw-r--r--check/magma/servers/smtp/smtp_check.c8
-rw-r--r--check/magma/servers/smtp/smtp_check.h2
-rw-r--r--check/magma/servers/smtp/smtp_check_network.c54
-rw-r--r--sandbox/etc/.magma.sandbox.config.swpbin16384 -> 0 bytes
-rwxr-xr-xsandbox/etc/magma.sandbox.config2
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
deleted file mode 100644
index 1610a19e..00000000
--- a/sandbox/etc/.magma.sandbox.config.swp
+++ /dev/null
Binary files differ
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