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/servers/http/http_check_network.c2
-rw-r--r--check/magma/servers/imap/imap_check.c48
-rw-r--r--check/magma/servers/imap/imap_check.h4
-rw-r--r--check/magma/servers/imap/imap_check_network.c13
-rw-r--r--check/magma/servers/pop/pop_check.c4
-rw-r--r--check/magma/servers/pop/pop_check.h3
-rw-r--r--check/magma/servers/pop/pop_check_network.c70
7 files changed, 133 insertions, 11 deletions
diff --git a/check/magma/servers/http/http_check_network.c b/check/magma/servers/http/http_check_network.c
index bb996427..496e86c4 100644
--- a/check/magma/servers/http/http_check_network.c
+++ b/check/magma/servers/http/http_check_network.c
@@ -39,7 +39,7 @@ uint32_t check_http_content_length_get(client_t *client, stringer_t *errmsg) {
while (st_cmp_ci_starts(&(client->line), NULLER("Content-Length:")) != 0) client_read_line(client);
if (!st_search_chr(&(client->line), ' ', &location)) {
- st_sprint(errmsg, "The Content-Length line is improperly formed.");
+ st_sprint(errmsg, "The Content-Length line was improperly formed.");
}
else if (pl_empty(cl_placer = pl_init(pl_data_get(client->line) + location, pl_length_get(client->line) - location))) {
st_sprint(errmsg, "Failed to initialize content length placer.");
diff --git a/check/magma/servers/imap/imap_check.c b/check/magma/servers/imap/imap_check.c
index d0a5e271..23e272d0 100644
--- a/check/magma/servers/imap/imap_check.c
+++ b/check/magma/servers/imap/imap_check.c
@@ -52,12 +52,60 @@ START_TEST (check_imap_network_basic_tls_s) {
}
END_TEST
+START_TEST (check_imap_network_search_s) {
+
+ log_disable();
+ bool_t outcome = true;
+ server_t *server = NULL;
+ stringer_t *errmsg = MANAGEDBUF(1024);
+
+ if (!(server = servers_get_by_protocol(IMAP, false))) {
+ st_sprint(errmsg, "No IMAP servers were configured to support TCP connections.");
+ outcome = false;
+ }
+ else if (status() && !check_imap_network_search_sthread(errmsg, server->network.port)) {
+ outcome = false;
+ }
+ else {
+ errmsg = NULL;
+ }
+
+ log_test("IMAP / NETWORK / SEARCH / SINGLE THREADED:", errmsg);
+ ck_assert_msg(outcome, st_char_get(errmsg));
+}
+END_TEST
+
+START_TEST (check_imap_network_fetch_s) {
+
+ log_disable();
+ bool_t outcome = true;
+ server_t *server = NULL;
+ stringer_t *errmsg = MANAGEDBUF(1024);
+
+ if (!(server = servers_get_by_protocol(IMAP, false))) {
+ st_sprint(errmsg, "No IMAP servers were configured to support TCP connections.");
+ outcome = false;
+ }
+ else if (status() && !check_imap_network_fetch_sthread(errmsg, server->network.port)) {
+ outcome = false;
+ }
+ else {
+ errmsg = NULL;
+ }
+
+ log_test("IMAP / NETWORK / FETCH / SINGLE THREADED:", errmsg);
+ ck_assert_msg(outcome, st_char_get(errmsg));
+}
+END_TEST
+
Suite * suite_check_imap(void) {
Suite *s = suite_create("\tIMAP");
suite_check_testcase(s, "IMAP", "IMAP Network Basic/ TCP/S", check_imap_network_basic_tcp_s);
suite_check_testcase(s, "IMAP", "IMAP Network Basic/ TLS/S", check_imap_network_basic_tls_s);
+ suite_check_testcase(s, "IMAP", "IMAP Network Search/S", check_imap_network_search_s);
+ suite_check_testcase(s, "IMAP", "IMAP Network Fetch/S", check_imap_network_fetch_s);
return s;
}
diff --git a/check/magma/servers/imap/imap_check.h b/check/magma/servers/imap/imap_check.h
index 21140d39..6e8dcf09 100644
--- a/check/magma/servers/imap/imap_check.h
+++ b/check/magma/servers/imap/imap_check.h
@@ -8,8 +8,10 @@
#define IMAP_CHECK_H
/// imap_check_network.c
-bool_t check_imap_client_read_lines_to_end(client_t *client, chr_t *tag);
+bool_t check_imap_client_read_end(client_t *client, chr_t *tag);
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 check_imap_network_fetch_sthread(stringer_t *errmsg, uint32_t port);
Suite * suite_check_imap(void);
diff --git a/check/magma/servers/imap/imap_check_network.c b/check/magma/servers/imap/imap_check_network.c
index 3954f7a8..ca690cda 100644
--- a/check/magma/servers/imap/imap_check_network.c
+++ b/check/magma/servers/imap/imap_check_network.c
@@ -93,3 +93,16 @@ bool_t check_imap_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_
return true;
}
+
+
+bool_t check_imap_network_search_sthread(stringer_t *errmsg, uint32_t port) {
+
+ bool_t outcome = true;
+ return outcome;
+}
+
+bool_t check_imap_network_fetch_sthread(stringer_t *errmsg, uint32_t port) {
+
+ bool_t outcome = true;
+ return outcome;
+}
diff --git a/check/magma/servers/pop/pop_check.c b/check/magma/servers/pop/pop_check.c
index 274b063f..ce2b258b 100644
--- a/check/magma/servers/pop/pop_check.c
+++ b/check/magma/servers/pop/pop_check.c
@@ -9,8 +9,8 @@
START_TEST (check_pop_network_basic_tcp_s) {
log_disable();
- bool_t outcome = true;
server_t *tcp = NULL;
+ bool_t outcome = true;
stringer_t *errmsg = MANAGEDBUF(1024);
if (status() && !(tcp = servers_get_by_protocol(POP, false))) {
@@ -30,8 +30,8 @@ END_TEST
START_TEST (check_pop_network_basic_tls_s) {
log_disable();
- bool_t outcome = true;
server_t *tls = NULL;
+ bool_t outcome = true;
stringer_t *errmsg = MANAGEDBUF(1024);
if (status() && !(tls = servers_get_by_protocol(POP, true))) {
diff --git a/check/magma/servers/pop/pop_check.h b/check/magma/servers/pop/pop_check.h
index dbc09d6c..003e13aa 100644
--- a/check/magma/servers/pop/pop_check.h
+++ b/check/magma/servers/pop/pop_check.h
@@ -8,7 +8,8 @@
#define POP_CHECK_H
/// pop_check_network.c
-bool_t check_pop_client_read_lines_to_end(client_t *client);
+bool_t check_pop_client_read_end(client_t *client);
+uint64_t check_pop_client_read_list(client_t *client, stringer_t *errmsg);
bool_t check_pop_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t secure);
/// pop_check.c
diff --git a/check/magma/servers/pop/pop_check_network.c b/check/magma/servers/pop/pop_check_network.c
index f4d19690..4c07e3d7 100644
--- a/check/magma/servers/pop/pop_check_network.c
+++ b/check/magma/servers/pop/pop_check_network.c
@@ -9,12 +9,13 @@
#include "magma_check.h"
/**
- * Calls client_read_line on a client until it reaches a period only line.
+ * Calls client_read_line on a client until it reaches a period only line, returning the
+ * number of messages in the inbox.
*
- * @param client The client to read from (which should be connected to a POP server).
+ * @param client The client_t* to read from (which should be connected to a POP server).
* @return true if a line containing a single period is found, false if not.
*/
-bool_t check_pop_client_read_lines_to_end(client_t *client) {
+bool_t check_pop_client_read_end(client_t *client) {
while (client_read_line(client) > 0) {
if (!st_cmp_cs_eq(&(client->line), NULLER(".\r\n"))) return true;
@@ -22,8 +23,37 @@ bool_t check_pop_client_read_lines_to_end(client_t *client) {
return false;
}
+/**
+ * Calls client_read_line on a client until it reaches a period only line, returning the
+ * number of messages in the inbox.
+ *
+ * @param client The client_t* to read from (which should be connected to a POP server).
+ * @param errmsg The stringer_t* to which error messages will be printed in event of an error.
+ * @return a uint32_t containing the number of messages in the inbox.
+ */
+uint64_t check_pop_client_read_list(client_t *client, stringer_t *errmsg) {
+
+ placer_t fragment = pl_null();
+ uint64_t counter = 0, sequence = 0;
+
+ while (client_read_line(client) > 0) {
+
+ if (pl_starts_with_char(client->line, '.')) {
+ return counter;
+ }
+ else if (tok_get_st(&(client->line), ' ', 0, &fragment) >= 0 && !uint64_conv_pl(fragment, &sequence)) {
+ if (sequence != counter) return 0;
+ }
+
+ counter++;
+ }
+
+ return 0;
+}
+
bool_t check_pop_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t secure) {
+ uint64_t message_num;
client_t *client = NULL;
// Connect the client.
@@ -69,16 +99,16 @@ bool_t check_pop_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t
}
// Test the LIST command.
- else if (client_print(client, "LIST\r\n") != 6 || !check_pop_client_read_lines_to_end(client) ||
+ else if (client_print(client, "LIST\r\n") != 6 || !(message_num = check_pop_client_read_list(client, errmsg)) ||
client_status(client) != 1) {
- st_sprint(errmsg, "Failed to return a successful state after LIST.");
+ if (!errmsg) st_sprint(errmsg, "Failed to return a successful state after LIST.");
client_close(client);
return false;
}
// Test the RETR command.
- else if (client_print(client, "RETR 1\r\n") != 8 || !check_pop_client_read_lines_to_end(client) ||
+ else if (client_print(client, "RETR 1\r\n") != 8 || !check_pop_client_read_end(client) ||
client_status(client) != 1) {
st_sprint(errmsg, "Failed to return a successful state after RETR.");
@@ -95,6 +125,34 @@ bool_t check_pop_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t
return false;
}
+ // Test the NOOP command.
+ else if (client_print(client, "NOOP\r\n") != 6 || client_read_line(client) <= 0 || client_status(client) != 1 ||
+ st_cmp_cs_starts(&(client->line), NULLER("+OK"))) {
+
+ st_sprint(errmsg, "Failed to return a successful state after NOOP.");
+ client_close(client);
+ return false;
+ }
+
+ // Test the LAST command.
+ else if (client_print(client, "LAST 1\r\n") != 8 || client_read_line(client) <= 0 || client_status(client) != 1 ||
+ st_cmp_cs_starts(&(client->line), NULLER("+OK")) || st_cmp_cs_ends(&(client->line),
+ st_aprint_opts(MANAGED_T | CONTIGUOUS | STACK, "%lu\r\n", message_num))) {
+
+ st_sprint(errmsg, "Failed to return a successful state after LAST.");
+ client_close(client);
+ return false;
+ }
+
+ // Test the RSET command.
+ else if (client_print(client, "RSET\r\n") != 6 || client_read_line(client) <= 0 || client_status(client) != 1 ||
+ st_cmp_cs_starts(&(client->line), NULLER("+OK")) || st_cmp_cs_ends(&(client->line), NULLER("were reset.\r\n"))) {
+
+ st_sprint(errmsg, "Failed to return a successful state after RSET.");
+ client_close(client);
+ return false;
+ }
+
// Test the QUIT command.
else if (client_print(client, "QUIT 1\r\n") <= 0 || client_read_line(client) <= 0 || client_status(client) != 1 ||
st_cmp_cs_starts(&(client->line), NULLER("+OK"))) {