diff options
author | jpadkins <jacobpadkins@gmail.com> | 2017-03-22 16:46:55 +0300 |
---|---|---|
committer | jpadkins <jacobpadkins@gmail.com> | 2017-03-22 16:46:55 +0300 |
commit | 57f9723b6960aedae63fa83f596a87324548d246 (patch) | |
tree | d188f9d2a29b078b187f8faa88722171335ee3af /check | |
parent | 0caebe074d88e38ef7817eab9d15f44c73128c92 (diff) |
Added smtp helpers and http stubs
Diffstat (limited to 'check')
-rw-r--r-- | check/magma/magma_check.c | 1 | ||||
-rw-r--r-- | check/magma/magma_check.h | 1 | ||||
-rw-r--r-- | check/magma/servers/http/http_check.c | 66 | ||||
-rw-r--r-- | check/magma/servers/http/http_check.h | 15 | ||||
-rw-r--r-- | check/magma/servers/http/http_check_network.c | 67 | ||||
-rw-r--r-- | check/magma/servers/imap/imap_check.c | 14 | ||||
-rw-r--r-- | check/magma/servers/pop/pop_check.c | 2 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check.c | 32 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check.h | 2 | ||||
-rw-r--r-- | check/magma/servers/smtp/smtp_check_network.c | 66 |
10 files changed, 238 insertions, 28 deletions
diff --git a/check/magma/magma_check.c b/check/magma/magma_check.c index a5fad777..4b1b0922 100644 --- a/check/magma/magma_check.c +++ b/check/magma/magma_check.c @@ -282,6 +282,7 @@ int main(int argc, char *argv[]) { srunner_add_suite(sr, suite_check_smtp()); srunner_add_suite(sr, suite_check_pop()); srunner_add_suite(sr, suite_check_imap()); + srunner_add_suite(sr, suite_check_http()); srunner_add_suite(sr, suite_check_regression()); } diff --git a/check/magma/magma_check.h b/check/magma/magma_check.h index fbba1b85..4778af8e 100644 --- a/check/magma/magma_check.h +++ b/check/magma/magma_check.h @@ -34,6 +34,7 @@ #include "servers/smtp/smtp_check.h" #include "servers/pop/pop_check.h" #include "servers/imap/imap_check.h" +#include "servers/http/http_check.h" #include "regression/regression_check.h" #include "config/config_check.h" diff --git a/check/magma/servers/http/http_check.c b/check/magma/servers/http/http_check.c new file mode 100644 index 00000000..63aeba6f --- /dev/null +++ b/check/magma/servers/http/http_check.c @@ -0,0 +1,66 @@ + +/** + * @file /check/magma/http_check.c + * + * @brief HTTP interface test functions. + */ + +#include "magma_check.h" + +START_TEST (check_http_network_basic_tcp_s) { + + log_disable(); + bool_t outcome = true; + server_t *server = NULL; + stringer_t *errmsg = MANAGEDBUF(1024); + + if (!(server = servers_get_by_protocol(HTTP, false))) { + st_sprint(errmsg, "No HTTP servers were configured to support TCP connections."); + outcome = false; + } + else if (status() && !check_http_network_basic_sthread(errmsg, server->network.port, false)) { + outcome = false; + } + else { + errmsg = NULL; + } + + log_test("HTTP / NETWORK / BASIC / TCP / SINGLE THREADED:", errmsg); + ck_assert_msg(outcome, st_char_get(errmsg)); +} +END_TEST + +START_TEST (check_http_network_basic_tls_s) { + + log_disable(); + bool_t outcome = true; + server_t *server = NULL; + stringer_t *errmsg = MANAGEDBUF(1024); + + if (!(server = servers_get_by_protocol(HTTP, true))) { + st_sprint(errmsg, "No HTTP servers were configured to support TLS connections."); + outcome = false; + } + else if (status() && !check_http_network_basic_sthread(errmsg, server->network.port, true)) { + outcome = false; + } + else { + errmsg = NULL; + } + + log_test("HTTP / NETWORK / BASIC / TLS / SINGLE THREADED:", errmsg); + ck_assert_msg(outcome, st_char_get(errmsg)); +} +END_TEST + +Suite * suite_check_http(void) { + + Suite *s = suite_create("\tHTTP"); + + suite_check_testcase(s, "HTTP", "HTTP Network Basic/ TCP/S", check_http_network_basic_tcp_s); + suite_check_testcase(s, "HTTP", "HTTP Network Basic/ TLS/S", check_http_network_basic_tls_s); + + return s; +} + + diff --git a/check/magma/servers/http/http_check.h b/check/magma/servers/http/http_check.h new file mode 100644 index 00000000..9062c337 --- /dev/null +++ b/check/magma/servers/http/http_check.h @@ -0,0 +1,15 @@ +/** + * @file /check/magma/servers/smtp/smtp_check.h + * + * @brief SMTP interface test functions. + */ + +#ifndef HTTP_CHECK_H +#define HTTP_CHECK_H + +/// smtp_check_network.c +bool_t check_http_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t secure); + +Suite * suite_check_http(void); + +#endif diff --git a/check/magma/servers/http/http_check_network.c b/check/magma/servers/http/http_check_network.c new file mode 100644 index 00000000..8ba2359b --- /dev/null +++ b/check/magma/servers/http/http_check_network.c @@ -0,0 +1,67 @@ + +/** + * @file /magma/check/magma/servers/http/http_check_network.c + * + * @brief Functions used to test SMTP connections over a network connection. + * + */ + +#include "magma_check.h" + +/** + * @brief Reads lines from client and returns the value of Content-Length + * + * This function reads lines from the passed client until it finds the Content-Length + * line, at which point it parses the value and returns it. + * + * @param client A client_t containing the response of an HTTP request + * @return The value of Content-Length in the HTTP message header. + */ +size_t check_http_content_length_get(client_t *client, stringer_t *errmsg) { + + size_t location = 0; + uint32_t content_length; + placer_t cl_placer = pl_null(); + + while (st_cmp_ci_starts(&(client->line), NULLER("Content-Type:")) != 0) client_read_line(client); + + if (!st_search_chr(&(client->line), ' ', &location)) { + st_sprint(errmsg, "The Content-Length line is improperly formed."); + } + else if (pl_empty(cl_placer = pl_init(pl_data_get(client->line), pl_length_get(client->line) - location))) { + st_sprint(errmsg, "Failed to initialize content length placer."); + } + else if (!pl_inc(&cl_placer, pl_length_get(client->line) - location)) { + st_sprint(errmsg, "Failed to increment placer to location of content-length value."); + } + else if (uint32_conv_st(&cl_placer, &content_length)) { + st_sprint(errmsg, "Failed to convert the content-length string to a uint32"); + } + + return content_length; +} + +bool_t check_http_network_basic_sthread(stringer_t *errmsg, uint32_t port, bool_t secure) { + + size_t content_length; + client_t *client = NULL; + + // Test the connect banner. + if (!(client = client_connect("localhost", port)) || (secure && (client_secure(client) == -1)) || + client_status(client) != 1) { + + st_sprint(errmsg, "Failed to connect with the HTTP server."); + client_close(client); + return false; + } + else if (client_print(client, "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n") != 35 || client_status(client) != 1 || + (content_length = check_http_content_length_get(client, errmsg))) { + + if (!errmsg) st_sprint(errmsg, "Failed to return a valid GET response."); + return false; + } + + client_close(client); + + return true; +} diff --git a/check/magma/servers/imap/imap_check.c b/check/magma/servers/imap/imap_check.c index 38d0bed0..d0a5e271 100644 --- a/check/magma/servers/imap/imap_check.c +++ b/check/magma/servers/imap/imap_check.c @@ -17,8 +17,11 @@ START_TEST (check_imap_network_basic_tcp_s) { st_sprint(errmsg, "No IMAP servers were configured to support TCP connections."); outcome = false; } - else if (status()) { - outcome = check_imap_network_basic_sthread(errmsg, server->network.port, false); + else if (status() && !check_imap_network_basic_sthread(errmsg, server->network.port, false)) { + outcome = false; + } + else { + errmsg = NULL; } log_test("IMAP / NETWORK / BASIC / TCP / SINGLE THREADED:", errmsg); @@ -37,8 +40,11 @@ START_TEST (check_imap_network_basic_tls_s) { st_sprint(errmsg, "No IMAP servers were configured to support TLS connections."); outcome = false; } - else if (status()) { - outcome = check_imap_network_basic_sthread(errmsg, server->network.port, true); + else if (status() && !check_imap_network_basic_sthread(errmsg, server->network.port, true)) { + outcome = false; + } + else { + errmsg = NULL; } log_test("IMAP / NETWORK / BASIC / TLS / SINGLE THREADED:", errmsg); diff --git a/check/magma/servers/pop/pop_check.c b/check/magma/servers/pop/pop_check.c index 2f495393..274b063f 100644 --- a/check/magma/servers/pop/pop_check.c +++ b/check/magma/servers/pop/pop_check.c @@ -19,6 +19,7 @@ START_TEST (check_pop_network_basic_tcp_s) { } else if (status() && !check_pop_network_basic_sthread(errmsg, tcp->network.port, false)) { outcome = false; + errmsg = NULL; } log_test("POP / NETWORK / BASIC / TCP / SINGLE THREADED:", errmsg); @@ -39,6 +40,7 @@ START_TEST (check_pop_network_basic_tls_s) { } else if (status() && !check_pop_network_basic_sthread(errmsg, tls->network.port, true)) { outcome = false; + errmsg = NULL; } log_test("POP / NETWORK / BASIC / TLS / SINGLE THREADED:", errmsg); diff --git a/check/magma/servers/smtp/smtp_check.c b/check/magma/servers/smtp/smtp_check.c index 7afaee6b..a0b7e8d3 100644 --- a/check/magma/servers/smtp/smtp_check.c +++ b/check/magma/servers/smtp/smtp_check.c @@ -18,8 +18,11 @@ START_TEST (check_smtp_network_basic_tcp_s) { st_sprint(errmsg, "No SMTP servers were configured to support TCP connections."); outcome = false; } - else if (status()) { - outcome = check_smtp_network_basic_sthread(errmsg, server->network.port, false); + else if (status() && !check_smtp_network_basic_sthread(errmsg, server->network.port, false)) { + outcome = false; + } + else { + errmsg = NULL; } log_test("SMTP / NETWORK / BASIC / TCP / SINGLE THREADED:", errmsg); @@ -38,8 +41,11 @@ START_TEST (check_smtp_network_basic_tls_s) { st_sprint(errmsg, "No SMTP servers were configured to support TLS connections."); outcome = false; } - else if (status()) { - outcome = check_smtp_network_basic_sthread(errmsg, server->network.port, true); + else if (status() && !check_smtp_network_basic_sthread(errmsg, server->network.port, true)) { + outcome = false; + } + else { + errmsg = NULL; } log_test("SMTP / NETWORK / BASIC / TLS / SINGLE THREADED:", errmsg); @@ -54,6 +60,7 @@ START_TEST (check_smtp_accept_store_message_s) { stringer_t *errmsg = MANAGEDBUF(2048); outcome = check_smtp_accept_message_sthread(errmsg); + if (outcome) errmsg = NULL; log_test("SMTP / ACCEPT / SINGLE THREADED:", errmsg); ck_assert_msg(outcome, st_char_get(errmsg)); @@ -67,6 +74,7 @@ START_TEST (check_smtp_checkers_greylist_s) { stringer_t *errmsg = MANAGEDBUF(1024); outcome = check_smtp_checkers_greylist_sthread(errmsg); + if (outcome) errmsg = NULL; log_test("SMTP / CHECKERS / GREYLIST / SINGLE THREADED:", errmsg); ck_assert_msg(outcome, st_char_get(errmsg)); @@ -85,6 +93,8 @@ START_TEST (check_smtp_checkers_filters_s) { if (status() && outcome) outcome = check_smtp_checkers_filters_sthread(errmsg, SMTP_FILTER_ACTION_LABEL, 3); if (status() && outcome) outcome = check_smtp_checkers_filters_sthread(errmsg, SMTP_FILTER_ACTION_MARK_READ, 4); + if (outcome) errmsg = NULL; + log_test("SMTP / CHECKERS / FILTERS / SINGLE THREADED:", errmsg); ck_assert_msg(outcome, st_char_get(errmsg)); } @@ -101,8 +111,11 @@ START_TEST (check_smtp_network_auth_plain_s) { 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, false); + else if (status() && !check_smtp_network_auth_sthread(errmsg, server->network.port, false)) { + outcome = false; + } + else { + errmsg = NULL; } log_test("SMTP / NETWORK / AUTH PLAIN / SINGLE THREADED:", errmsg); @@ -121,8 +134,11 @@ START_TEST (check_smtp_network_auth_login_s) { 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); + else if (status() && !check_smtp_network_auth_sthread(errmsg, server->network.port, true)) { + outcome = false; + } + else { + errmsg = NULL; } log_test("SMTP / NETWORK / AUTH LOGIN / SINGLE THREADED:", errmsg); diff --git a/check/magma/servers/smtp/smtp_check.h b/check/magma/servers/smtp/smtp_check.h index e25bccd1..0e55dfbf 100644 --- a/check/magma/servers/smtp/smtp_check.h +++ b/check/magma/servers/smtp/smtp_check.h @@ -20,7 +20,7 @@ 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_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_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); diff --git a/check/magma/servers/smtp/smtp_check_network.c b/check/magma/servers/smtp/smtp_check_network.c index d9ce7ceb..94cb2996 100644 --- a/check/magma/servers/smtp/smtp_check_network.c +++ b/check/magma/servers/smtp/smtp_check_network.c @@ -9,12 +9,10 @@ #include "magma_check.h" /** - * Calls client_read_line on a client until the last line is found, checking for errors. - * - * @param client The client to read from (which should be connected to an SMTP server). - * - * @return Returns true if client_read_line was successful until the last line was found. - * Otherwise returns false. + * @brief Calls client_read_line on a client until the last line is found + * @param client The client_t* to read from (which should be connected to an SMTP server). + * @return Returns true if client_read_line was successful until the last line was found. + * Otherwise returns false. */ bool_t check_smtp_client_read_end(client_t *client) { @@ -24,10 +22,19 @@ bool_t check_smtp_client_read_end(client_t *client) { return false; } +/** + * @brief Submits the MAIL TO, RCPT FROM, and DATA commands to the passed client using the passed params + * @param client The client to write the commands to. It should be connected to an SMTP server and have + * had HELO/EHLO issued previously. + * @baram from A chr_t* holding the value to be inserted in the MAIL FROM command + * @param to A chr_t* holding the value to be inserted in the RCPT TO command + * @param errmsg A stringer_t* that will have the error message printed to it in the event of an error + * @return True if no errors, false otherwise + */ bool_t check_smtp_client_mail_rcpt_data(client_t *client, chr_t *from, chr_t *to, stringer_t *errmsg) { chr_t *line_from = "MAIL FROM: <%s>\r\n", *line_to = "RCPT TO: <%s>\r\n"; - size_t size_from = strlen(line_from) + strlen(from) -2, size_to = strlen(line_to) + strlen(to) -2; + size_t size_from = ns_length_get(line_from) + ns_length_get(from) -2, size_to = ns_length_get(line_to) + ns_length_get(to) -2; // Issue MAIL command. if (client_print(client, line_from, from) != size_from || !check_smtp_client_read_end(client) || @@ -53,11 +60,20 @@ bool_t check_smtp_client_mail_rcpt_data(client_t *client, chr_t *from, chr_t *to return true; } -bool_t check_smtp_client_auth_plain(client_t *client, chr_t *pass, stringer_t *errmsg) { +/** + * @brief Submits the AUTH PLAIN command to the passed client using the passed parameters + * @param client A client_t* connected to an SMTP server that has had the HELO/EHLO command + * already submitted + * @param auth The user authentication string + * @param errmsg A stringer_t* that will have the error message printed to it in the event of + * and error + * @return True if no errors, false otherwise + */ +bool_t check_smtp_client_auth_plain(client_t *client, chr_t *auth, 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 || + if (client_print(client, line_auth, auth) != (ns_length_get(line_auth) + ns_length_get(auth)) -2 || !check_smtp_client_read_end(client) || client_status(client) != 1 || st_cmp_cs_starts(&(client->line), NULLER("235"))) { @@ -68,6 +84,16 @@ bool_t check_smtp_client_auth_plain(client_t *client, chr_t *pass, stringer_t *e return true; } +/** + * @brief Submits the AUTH LOGIN command to the passed client using the passed parameters + * @param client A client_t* connected to an SMTP server that has had the HELO/EHLO command + * already submitted + * @param user A chr_t* containing the username of the user + * @param pass A chr_t* containing the password of the user + * @param errmsg A stringer_t* that will have the error message printed to it in the event of + * and error + * @return True if no errors, false otherwise + */ 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) || @@ -76,13 +102,13 @@ bool_t check_smtp_client_auth_login(client_t *client, chr_t *user, chr_t *pass, 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) || + else if (client_print(client, "%s\r\n", user) != ns_length_get(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) || + else if (client_print(client, "%s\r\n", pass) != ns_length_get(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."); @@ -92,7 +118,15 @@ bool_t check_smtp_client_auth_login(client_t *client, chr_t *user, chr_t *pass, return true; } -bool_t check_smtp_client_cleanup(client_t *client, stringer_t *errmsg) { +/** + * @brief Submits the QUIT command to the passed client and checks for errors + * @param client The client_t* to submit the command to, it should be connected + * to an smtp server + * @param errmsg A stringer_t* that will have the error message printed to it in + * the event of an error + * @return True if no errors, false otherwise + */ +bool_t check_smtp_client_quit(client_t *client, stringer_t *errmsg) { // Test the QUIT command. if (client_print(client, "QUIT\r\n") != 6 || client_read_line(client) <= 0 || @@ -108,8 +142,6 @@ bool_t check_smtp_client_cleanup(client_t *client, stringer_t *errmsg) { return false; } - client_close(client); - return true; } @@ -250,6 +282,10 @@ bool_t check_smtp_network_auth_sthread(stringer_t *errmsg, uint32_t port, bool_t client_close(client); return false; } + // Submit QUIT and cleanup. + else if (!check_smtp_client_quit(client, errmsg)) { + return false; + } - return check_smtp_client_cleanup(client, errmsg); + return true; } |