#!/usr/bin/perl

# (C) Sergey Kandaurov
# (C) Nginx, Inc.

# Tests for imap/pop3/smtp capabilities.

###############################################################################

use warnings;
use strict;

use Test::More;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;
use Test::Nginx::IMAP;
use Test::Nginx::POP3;
use Test::Nginx::SMTP;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/mail mail_ssl imap pop3 smtp/)
	->has_daemon('openssl')->plan(17);

$t->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

mail {
    ssl_certificate_key localhost.key;
    ssl_certificate localhost.crt;

    auth_http  http://127.0.0.1:8080; # unused

    pop3_auth  plain apop cram-md5;

    server {
        listen     127.0.0.1:8143;
        protocol   imap;
        imap_capabilities SEE-THIS;
    }

    server {
        listen     127.0.0.1:8144;
        protocol   imap;
        starttls   on;
    }

    server {
        listen     127.0.0.1:8145;
        protocol   imap;
        starttls   only;
    }

    server {
        listen     127.0.0.1:8110;
        protocol   pop3;
    }

    server {
        listen     127.0.0.1:8111;
        protocol   pop3;
        starttls   on;
    }

    server {
        listen     127.0.0.1:8112;
        protocol   pop3;
        starttls   only;
    }

    server {
        listen     127.0.0.1:8025;
        protocol   smtp;
        starttls   off;
    }

    server {
        listen     127.0.0.1:8026;
        protocol   smtp;
        starttls   on;
    }

    server {
        listen     127.0.0.1:8027;
        protocol   smtp;
        starttls   only;
    }
}

EOF

$t->write_file('openssl.conf', <<EOF);
[ req ]
default_bits = 1024
encrypt_key = no
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
EOF

my $d = $t->testdir();

foreach my $name ('localhost') {
	system('openssl req -x509 -new '
		. "-config '$d/openssl.conf' -subj '/CN=$name/' "
		. "-out '$d/$name.crt' -keyout '$d/$name.key' "
		. ">>$d/openssl.out 2>&1") == 0
		or die "Can't create certificate for $name: $!\n";
}

$t->run();

###############################################################################

# imap, custom capabilities

my $s = Test::Nginx::IMAP->new();
$s->read();

$s->send('1 CAPABILITY');
$s->check(qr/^\* CAPABILITY SEE-THIS AUTH=PLAIN/, 'imap capability');
$s->ok('imap capability completed');

# imap starttls

$s = Test::Nginx::IMAP->new(PeerAddr => '127.0.0.1:' . port(8144));
$s->read();

$s->send('1 CAPABILITY');
$s->check(qr/^\* CAPABILITY IMAP4 IMAP4rev1 UIDPLUS AUTH=PLAIN STARTTLS/,
	'imap capability starttls');

# imap starttls only

$s = Test::Nginx::IMAP->new(PeerAddr => '127.0.0.1:' . port(8145));
$s->read();

$s->send('1 CAPABILITY');
$s->check(qr/^\* CAPABILITY IMAP4 IMAP4rev1 UIDPLUS STARTTLS LOGINDISABLED/,
	'imap capability starttls only');

# pop3

$s = Test::Nginx::POP3->new(PeerAddr => '127.0.0.1:' . port(8110));
$s->read();

$s->send('CAPA');
$s->ok('pop3 capa');

my $caps = get_auth_caps($s);
like($caps, qr/USER/, 'pop3 - user');

TODO: {
local $TODO = 'not yet' if $t->has_version('1.11.6')
	and !$t->has_version('1.11.11');

like($caps, qr/SASL (PLAIN LOGIN|LOGIN PLAIN) CRAM-MD5/, 'pop3 - methods');

}

unlike($caps, qr/STLS/, 'pop3 - no stls');

# pop3 starttls

$s = Test::Nginx::POP3->new(PeerAddr => '127.0.0.1:' . port(8111));
$s->read();

$s->send('CAPA');

$caps = get_auth_caps($s);
like($caps, qr/USER/, 'pop3 starttls - user');

TODO: {
local $TODO = 'not yet' if $t->has_version('1.11.6')
	and !$t->has_version('1.11.11');

like($caps, qr/SASL (PLAIN LOGIN|LOGIN PLAIN) CRAM-MD5/,
	'pop3 starttls - methods');

}

like($caps, qr/STLS/, 'pop3 startls - stls');

# pop3 starttls only

$s = Test::Nginx::POP3->new(PeerAddr => '127.0.0.1:' . port(8112));
$s->read();

$s->send('CAPA');

$caps = get_auth_caps($s);
unlike($caps, qr/USER/, 'pop3 starttls only - no user');
unlike($caps, qr/SASL/, 'pop3 starttls only - no methods');
like($caps, qr/STLS/, 'pop3 startls only - stls');

# smtp

$s = Test::Nginx::SMTP->new(PeerAddr => '127.0.0.1:' . port(8025));
$s->read();

$s->send('EHLO example.com');
$s->check(qr/^250 AUTH PLAIN LOGIN\x0d\x0a?/, 'smtp ehlo');

# smtp starttls

$s = Test::Nginx::SMTP->new(PeerAddr => '127.0.0.1:' . port(8026));
$s->read();

$s->send('EHLO example.com');
$s->check(qr/^250 STARTTLS/, 'smtp ehlo - starttls');

# smtp starttls only

$s = Test::Nginx::SMTP->new(PeerAddr => '127.0.0.1:' . port(8027));
$s->read();

$s->send('EHLO example.com');
$s->check(qr/^250 STARTTLS/, 'smtp ehlo - starttls only');

###############################################################################

sub get_auth_caps {
	my ($s) = @_;
	my @meth;

	while ($s->read()) {
		last if /^\./;
		push @meth, $1 if /(.*?)\x0d\x0a?/ms;
	}
	join ':', @meth;
}

###############################################################################
