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
path: root/check
diff options
context:
space:
mode:
authorjpadkins <jacobpadkins@gmail.com>2017-03-22 16:46:55 +0300
committerjpadkins <jacobpadkins@gmail.com>2017-03-22 16:46:55 +0300
commit57f9723b6960aedae63fa83f596a87324548d246 (patch)
treed188f9d2a29b078b187f8faa88722171335ee3af /check
parent0caebe074d88e38ef7817eab9d15f44c73128c92 (diff)
Added smtp helpers and http stubs
Diffstat (limited to 'check')
-rw-r--r--check/magma/magma_check.c1
-rw-r--r--check/magma/magma_check.h1
-rw-r--r--check/magma/servers/http/http_check.c66
-rw-r--r--check/magma/servers/http/http_check.h15
-rw-r--r--check/magma/servers/http/http_check_network.c67
-rw-r--r--check/magma/servers/imap/imap_check.c14
-rw-r--r--check/magma/servers/pop/pop_check.c2
-rw-r--r--check/magma/servers/smtp/smtp_check.c32
-rw-r--r--check/magma/servers/smtp/smtp_check.h2
-rw-r--r--check/magma/servers/smtp/smtp_check_network.c66
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;
}