| #!/usr/bin/perl |
| |
| # (C) Maxim Dounin |
| |
| # Tests for nginx mail smtp module. |
| |
| ############################################################################### |
| |
| use warnings; |
| use strict; |
| |
| use Test::More tests => 28; |
| |
| use MIME::Base64; |
| |
| use _common; |
| |
| ############################################################################### |
| |
| select STDERR; $| = 1; |
| select STDOUT; $| = 1; |
| |
| start_nginx('smtp.conf'); |
| |
| ############################################################################### |
| |
| my $s = smtp_connect(); |
| smtp_check(qr/^220 /, "greeting"); |
| |
| smtp_send('EHLO example.com'); |
| smtp_check(qr/^250 /, "ehlo"); |
| |
| smtp_send('AUTH PLAIN ' . encode_base64("test\@example.com\0\0bad", '')); |
| smtp_check(qr/^5.. /, 'auth plain with bad password'); |
| |
| smtp_send('AUTH PLAIN ' . encode_base64("test\@example.com\0\0secret", '')); |
| smtp_ok('auth plain'); |
| |
| # We are talking to backend from this point |
| |
| smtp_send('MAIL FROM:<test@example.com> SIZE=100'); |
| smtp_ok('mail from after auth'); |
| |
| smtp_send('RSET'); |
| smtp_ok('rset'); |
| |
| smtp_send('MAIL FROM:<test@xn--e1afmkfd.xn--80akhbyknj4f> SIZE=100'); |
| smtp_ok("idn mail from (example.test in russian)"); |
| |
| smtp_send('QUIT'); |
| smtp_ok("quit"); |
| |
| # Try auth plain with pipelining |
| |
| $s = smtp_connect(); |
| smtp_check(qr/^220 /, "greeting"); |
| |
| smtp_send('EHLO example.com'); |
| smtp_check(qr/^250 /, "ehlo"); |
| |
| smtp_send('INVALID COMMAND WITH ARGUMENTS' . CRLF |
| . 'RSET'); |
| smtp_read(); |
| smtp_ok('pipelined rset after invalid command'); |
| |
| smtp_send('AUTH PLAIN ' |
| . encode_base64("test\@example.com\0\0bad", '') . CRLF |
| . 'MAIL FROM:<test@example.com> SIZE=100'); |
| smtp_read(); |
| smtp_ok('mail from after failed pipelined auth'); |
| |
| smtp_send('AUTH PLAIN ' |
| . encode_base64("test\@example.com\0\0secret", '') . CRLF |
| . 'MAIL FROM:<test@example.com> SIZE=100'); |
| smtp_read(); |
| smtp_ok('mail from after pipelined auth'); |
| |
| # Try auth none |
| |
| $s = smtp_connect(); |
| smtp_check(qr/^220 /, "greeting"); |
| |
| smtp_send('EHLO example.com'); |
| smtp_check(qr/^250 /, "ehlo"); |
| |
| smtp_send('MAIL FROM:<test@example.com> SIZE=100'); |
| smtp_ok('auth none - mail from'); |
| |
| smtp_send('RCPT TO:<test@example.com>'); |
| smtp_ok('auth none - rcpt to'); |
| |
| smtp_send('RSET'); |
| smtp_ok('auth none - rset, should go to backend'); |
| |
| # Auth none with pipelining |
| |
| $s = smtp_connect(); |
| smtp_check(qr/^220 /, "greeting"); |
| |
| smtp_send('EHLO example.com'); |
| smtp_check(qr/^250 /, "ehlo"); |
| |
| smtp_send('MAIL FROM:<test@example.com> SIZE=100' . CRLF |
| . 'RCPT TO:<test@example.com>' . CRLF |
| . 'RSET'); |
| |
| smtp_ok('pipelined mail from'); |
| |
| smtp_ok('pipelined rcpt to'); |
| smtp_ok('pipelined rset'); |
| |
| # Connection must stay even if error returned to rcpt to command |
| |
| $s = smtp_connect(); |
| smtp_read(); # skip greeting |
| |
| smtp_send('EHLO example.com'); |
| smtp_read(); # skip ehlo reply |
| |
| smtp_send('MAIL FROM:<test@example.com> SIZE=100'); |
| smtp_read(); # skip mail from reply |
| |
| smtp_send('RCPT TO:<example.com>'); |
| smtp_check(qr/^5.. /, "bad rcpt to"); |
| |
| smtp_send('RCPT TO:<test@example.com>'); |
| smtp_ok('good rcpt to'); |
| |
| # Make sure command splitted into many packets processed correctly |
| |
| $s = smtp_connect(); |
| smtp_read(); |
| |
| log_out('HEL'); |
| $s->print('HEL'); |
| smtp_send('O example.com'); |
| smtp_ok('splitted command'); |
| |
| # With smtp_greeting_delay session expected to be closed after first error |
| # message if client sent something before greeting. Use 10026 port |
| # configured with smtp_greeting_delay 0.1s to check this. |
| |
| $s = smtp_connect(PeerPort => 10026); |
| smtp_send('HELO example.com'); |
| smtp_check(qr/^5.. /, "command before greeting - session must be rejected"); |
| ok($s->eof(), "session have to be closed"); |
| |
| ############################################################################### |