mirror of
https://bitbucket.org/jsuto/piler.git
synced 2025-06-22 07:13:17 +02:00
@ -24,6 +24,13 @@ setup_mysql() {
|
||||
mysql -u piler -ppiler123 piler1 < ../util/db-mysql.sql
|
||||
}
|
||||
|
||||
run_smtp_tests() {
|
||||
mkdir -p /var/piler/store/00/piler /var/piler/tmp /var/piler/manticore
|
||||
chown -R piler:piler /var/piler/
|
||||
../src/piler-smtp -L 5 -d
|
||||
./smtp -s 127.0.0.1
|
||||
}
|
||||
|
||||
if [[ -v BUILD_NUMBER ]]; then
|
||||
setup_mysql
|
||||
fi
|
||||
@ -37,3 +44,5 @@ fi
|
||||
./check_hash
|
||||
./check_decoder
|
||||
./check_attachments
|
||||
|
||||
if [[ -v BUILD_NUMBER ]]; then run_smtp_tests; fi
|
||||
|
@ -4,11 +4,13 @@
|
||||
|
||||
#include "test.h"
|
||||
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
char *testmessage = "From: aaa@aaa.fu\nTo: bela@aaa.fu\nMessage-Id: ajajajaja\nSubject: this is a test\n\nAaaaaa.";
|
||||
char *testmessage = "From: aaa@aaa.fu\r\nTo: bela@aaa.fu\r\nMessage-Id: ajajajaja\r\nSubject: this is a test\r\n\r\nAaaaaa";
|
||||
char *testmessage2 = " and the last line\r\n";
|
||||
|
||||
char *recipient = "aaa@worker0";
|
||||
|
||||
int helo = 0; // 0=HELO, 1=EHLO
|
||||
|
||||
@ -16,12 +18,24 @@ void usage(){
|
||||
printf("\nusage: smtp\n\n");
|
||||
printf(" -s <smtp server> SMTP server\n");
|
||||
printf(" -p <smtp port> SMTP port (25)\n");
|
||||
printf(" -r <recipient> Envelope recipient\n");
|
||||
printf(" -t <timeout> Timeout in sec (10)\n");
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
int countreplies(char *s){
|
||||
int replies = 0;
|
||||
|
||||
for(; *s; s++){
|
||||
if(*s == '\n') replies++;
|
||||
}
|
||||
|
||||
return replies;
|
||||
}
|
||||
|
||||
|
||||
void connect_to_smtp_server(char *server, int port, struct data *data){
|
||||
int rc;
|
||||
char port_string[8], buf[MAXBUFSIZE];
|
||||
@ -53,14 +67,15 @@ void connect_to_smtp_server(char *server, int port, struct data *data){
|
||||
}
|
||||
|
||||
recvtimeoutssl(data->net, buf, sizeof(buf));
|
||||
printf("rcvd: %s", buf);
|
||||
|
||||
ENDE:
|
||||
freeaddrinfo(res);
|
||||
}
|
||||
|
||||
|
||||
void send_smtp_command(struct net *net, char *cmd, char *buf, int buflen){
|
||||
void send_smtp_command(struct net *net, char *cmd, char *buf, int buflen, int expectedreplies){
|
||||
int tot=0;
|
||||
|
||||
if(net == NULL || cmd == NULL) return;
|
||||
|
||||
if(net->socket == -1){
|
||||
@ -68,25 +83,32 @@ void send_smtp_command(struct net *net, char *cmd, char *buf, int buflen){
|
||||
return;
|
||||
}
|
||||
|
||||
printf("sent: %s", cmd);
|
||||
write1(net, cmd, strlen(cmd));
|
||||
recvtimeoutssl(net, buf, buflen);
|
||||
printf("rcvd: %s", buf);
|
||||
|
||||
while(1){
|
||||
tot += recvtimeoutssl(net, buf+tot, buflen);
|
||||
if(countreplies(buf) == expectedreplies) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void send_helo_command(struct net *net){
|
||||
int replies=1;
|
||||
char recvbuf[MAXBUFSIZE];
|
||||
|
||||
if(helo == 0){
|
||||
send_smtp_command(net, "HELO aaaa.fu\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "HELO");
|
||||
send_smtp_command(net, "HELO aaaa.fu\r\n", recvbuf, sizeof(recvbuf)-1, replies);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
}
|
||||
else {
|
||||
send_smtp_command(net, "EHLO aaaa.fu\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250-", 4) == 0 && "EHLO");
|
||||
if(net->use_ssl == 0) assert(strstr(recvbuf, "250-STARTTLS") && "STARTTLS");
|
||||
else assert(strstr(recvbuf, "250-STARTTLS") == NULL && "STARTTLS");
|
||||
//replies = 6;
|
||||
replies = 5;
|
||||
if(net->use_ssl == 1) replies--;
|
||||
|
||||
send_smtp_command(net, "EHLO aaaa.fu\r\n", recvbuf, sizeof(recvbuf)-1, replies);
|
||||
ASSERT(strncmp(recvbuf, "250-", 4) == 0, recvbuf);
|
||||
if(net->use_ssl == 0){ ASSERT(strstr(recvbuf, "250-STARTTLS"), recvbuf); }
|
||||
else { ASSERT(strstr(recvbuf, "250-STARTTLS") == NULL, recvbuf); }
|
||||
}
|
||||
}
|
||||
|
||||
@ -94,209 +116,392 @@ void send_helo_command(struct net *net){
|
||||
static void test_smtp_commands_one_at_a_time(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "RCPT TO: <archive@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "RCPT");
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "354 ", 4) == 0 && "DATA");
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\n", testmessage);
|
||||
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "PERIOD");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "221 ", 4) == 0 && "QUIT");
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_commands_pipelining(char *server, int port, struct data *data){
|
||||
static void test_smtp_commands_one_at_a_time_data_in_2_parts(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\nRCPT TO: <archive@aaa.fu>\r\nDATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
write1(data->net, testmessage, strlen(testmessage));
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\n", testmessage2);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
/*static void test_smtp_commands_pipelining(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "MAIL FROM: <sender@aaa.fu>\r\nRCPT TO: <%s>\r\nDATA\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 3);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\nQUIT\r\n", testmessage);
|
||||
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "QUIT");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 2);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
}
|
||||
|
||||
TEST_FOOTER();
|
||||
}*/
|
||||
|
||||
|
||||
static void test_smtp_commands_with_reset_command(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE];
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "RSET\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "RSET");
|
||||
send_smtp_command(data->net, "RSET\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "RCPT TO: <archive@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "503 ", 4) == 0 && "RCPT");
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "503 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "221 ", 4) == 0 && "QUIT");
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_commands_partial_command(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
write1(data->net, "M", 1);
|
||||
printf("sent: M\n");
|
||||
|
||||
send_smtp_command(data->net, "AIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
send_smtp_command(data->net, "AIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "RCPT TO: <archive@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "RCPT");
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "354 ", 4) == 0 && "DATA");
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\n", testmessage);
|
||||
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "PERIOD");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "221 ", 4) == 0 && "QUIT");
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_commands_partial_command_pipelining(char *server, int port, struct data *data){
|
||||
/*static void test_smtp_commands_partial_command_pipelining(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
write1(data->net, "M", 1);
|
||||
printf("sent: M\n");
|
||||
|
||||
send_smtp_command(data->net, "AIL FROM: <sender@aaa.fu>\r\nRCPT TO: <archive@aaa.fu>\r\nDATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "AIL FROM: <sender@aaa.fu>\r\nRCPT TO: <%s>\r\nDATA\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 3);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\nQUIT\r\n", testmessage);
|
||||
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "QUIT");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 2);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
}
|
||||
|
||||
TEST_FOOTER();
|
||||
}*/
|
||||
|
||||
|
||||
static void test_smtp_commands_starttls(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "STARTTLS\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "220 ", 4) == 0 && "STARTTLS");
|
||||
send_smtp_command(data->net, "STARTTLS\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "220 ", 4) == 0, recvbuf);
|
||||
|
||||
init_ssl_to_server(data);
|
||||
data->net->use_ssl = 1;
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "RCPT TO: <archive@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "RCPT");
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "354 ", 4) == 0 && "DATA");
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\n", testmessage);
|
||||
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "PERIOD");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "221 ", 4) == 0 && "QUIT");
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_commands_period_command_in_2_parts(char *server, int port, char *part1, char *part2, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\nRCPT TO: <archive@aaa.fu>\r\nDATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
// As long as pipelining support is not reintroduced
|
||||
//
|
||||
/*snprintf(sendbuf, sizeof(sendbuf)-1, "MAIL FROM: <sender@aaa.fu>\r\nRCPT TO: <%s>\r\nDATA\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 3);
|
||||
if(!strstr(recvbuf, "354 ")) recvtimeoutssl(data->net, recvbuf, sizeof(recvbuf)-1);
|
||||
ASSERT(strstr(recvbuf, "354 "), recvbuf);*/
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s%s", testmessage, part1);
|
||||
write1(data->net, sendbuf, strlen(sendbuf));
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf), "%s", part2);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "QUIT\r\n");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "QUIT");
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_commands_period_command_in_its_own_packet(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\nRCPT TO: <archive@aaa.fu>\r\nDATA\r\n", recvbuf, sizeof(recvbuf)-1);
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "MAIL");
|
||||
// As long as pipelining support is not reintroduced
|
||||
//
|
||||
/*snprintf(sendbuf, sizeof(sendbuf)-1, "MAIL FROM: <sender@aaa.fu>\r\nRCPT TO: <%s>\r\nDATA\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 3);
|
||||
if(!strstr(recvbuf, "354 ")) recvtimeoutssl(data->net, recvbuf, sizeof(recvbuf)-1);
|
||||
ASSERT(strstr(recvbuf, "354 "), recvbuf);*/
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s", testmessage);
|
||||
write1(data->net, sendbuf, strlen(sendbuf));
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf), "\r\n.\r\n");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "QUIT\r\n");
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
|
||||
assert(strncmp(recvbuf, "250 ", 4) == 0 && "QUIT");
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_commands_with_partial_data_lines(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
int yes=1;
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
setsockopt(data->net->socket, IPPROTO_TCP, TCP_NODELAY, &yes, (socklen_t)sizeof(int));
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "DATA\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "354 ", 4) == 0, recvbuf);
|
||||
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "From: aaa@aaa.fu\r\nTo: bela@aaa.fu\r\nMessage-Id: ajajajaja\r\nSubject: this is a test\r\n\r\nAaaaaa");
|
||||
write1(data->net, sendbuf, strlen(sendbuf)); sleep(2);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "jjdkdjkd dkd some garbage.");
|
||||
write1(data->net, sendbuf, strlen(sendbuf)); sleep(2);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "\r\nSome shit again au aua ua au aua uuu");
|
||||
write1(data->net, sendbuf, strlen(sendbuf)); sleep(2);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, ".\r\nAnd the last line.\r\n.\r\n");
|
||||
write1(data->net, sendbuf, strlen(sendbuf));
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "%s\r\n.\r\nQUIT\r\n", testmessage);
|
||||
recvtimeoutssl(data->net, recvbuf, sizeof(recvbuf));
|
||||
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
static void test_smtp_bdat_last_one_at_a_time(char *server, int port, struct data *data){
|
||||
char recvbuf[MAXBUFSIZE], sendbuf[MAXBUFSIZE];
|
||||
|
||||
TEST_HEADER();
|
||||
|
||||
connect_to_smtp_server(server, port, data);
|
||||
|
||||
send_helo_command(data->net);
|
||||
|
||||
send_smtp_command(data->net, "MAIL FROM: <sender@aaa.fu>\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "RCPT TO: <%s>\r\n", recipient);
|
||||
send_smtp_command(data->net, sendbuf, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
snprintf(sendbuf, sizeof(sendbuf)-1, "BDAT %ld LAST\r\n", strlen(testmessage)+strlen(testmessage2));
|
||||
write1(data->net, sendbuf, strlen(sendbuf));
|
||||
|
||||
write1(data->net, testmessage, strlen(testmessage));
|
||||
|
||||
send_smtp_command(data->net, testmessage2, recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "250 ", 4) == 0, recvbuf);
|
||||
|
||||
send_smtp_command(data->net, "QUIT\r\n", recvbuf, sizeof(recvbuf)-1, 1);
|
||||
ASSERT(strncmp(recvbuf, "221 ", 4) == 0, recvbuf);
|
||||
|
||||
close(data->net->socket);
|
||||
|
||||
TEST_FOOTER();
|
||||
}
|
||||
|
||||
|
||||
@ -317,6 +522,7 @@ int main(int argc, char **argv){
|
||||
{
|
||||
{"server", required_argument, 0, 's' },
|
||||
{"port", required_argument, 0, 'p' },
|
||||
{"rcpt", required_argument, 0, 'r' },
|
||||
{"timeout", required_argument, 0, 't' },
|
||||
{"lhlo", no_argument, 0, 'l' },
|
||||
{"help", no_argument, 0, 'h' },
|
||||
@ -325,9 +531,9 @@ int main(int argc, char **argv){
|
||||
|
||||
int option_index = 0;
|
||||
|
||||
int c = getopt_long(argc, argv, "c:s:p:t:lh?", long_options, &option_index);
|
||||
int c = getopt_long(argc, argv, "c:s:p:t:r:lh?", long_options, &option_index);
|
||||
#else
|
||||
int c = getopt(argc, argv, "c:s:p:t:lh?");
|
||||
int c = getopt(argc, argv, "c:s:p:t:r:lh?");
|
||||
#endif
|
||||
|
||||
|
||||
@ -343,6 +549,10 @@ int main(int argc, char **argv){
|
||||
port = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'r' :
|
||||
recipient = optarg;
|
||||
break;
|
||||
|
||||
case 't' :
|
||||
net.timeout = atoi(optarg);
|
||||
break;
|
||||
@ -357,7 +567,7 @@ int main(int argc, char **argv){
|
||||
break;
|
||||
|
||||
|
||||
default :
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -367,21 +577,26 @@ int main(int argc, char **argv){
|
||||
data.net = &net;
|
||||
|
||||
test_smtp_commands_one_at_a_time(server, port, &data);
|
||||
test_smtp_commands_pipelining(server, port, &data);
|
||||
test_smtp_commands_one_at_a_time_data_in_2_parts(server, port, &data);
|
||||
////test_smtp_commands_pipelining(server, port, &data);
|
||||
test_smtp_commands_with_reset_command(server, port, &data);
|
||||
test_smtp_commands_partial_command(server, port, &data);
|
||||
test_smtp_commands_partial_command_pipelining(server, port, &data);
|
||||
////test_smtp_commands_partial_command_pipelining(server, port, &data);
|
||||
|
||||
test_smtp_commands_period_command_in_2_parts(server, port, "\r", "\n.\r\n", &data);
|
||||
test_smtp_commands_period_command_in_2_parts(server, port, "\r\n", ".\r\n", &data);
|
||||
test_smtp_commands_period_command_in_2_parts(server, port, "\r\n.", "\r\n", &data);
|
||||
test_smtp_commands_period_command_in_2_parts(server, port, "\r\n.\r", "\n", &data);
|
||||
test_smtp_commands_period_command_in_its_own_packet(server, port, &data);
|
||||
|
||||
helo = 1; // we must use EHLO to get the STARTTLS in the response
|
||||
test_smtp_commands_starttls(server, port, &data);
|
||||
test_smtp_commands_with_partial_data_lines(server, port, &data);
|
||||
|
||||
helo = 1; // we must use EHLO to get the STARTTLS in the response
|
||||
|
||||
test_smtp_commands_starttls(server, port, &data);
|
||||
data.net->use_ssl = 0;
|
||||
|
||||
test_smtp_bdat_last_one_at_a_time(server, port, &data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <netdb.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <fcntl.h>
|
||||
#include <locale.h>
|
||||
#include <getopt.h>
|
||||
|
Reference in New Issue
Block a user