aboutsummaryrefslogtreecommitdiffstats
path: root/tests/preauth-plaintext/imapd
blob: 6196f73d572a6adc590a803ed7913461b260b40c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl -T

use warnings;
use strict;

use Errno qw/EINTR/;
use Socket qw/INADDR_LOOPBACK AF_INET SOCK_STREAM pack_sockaddr_in
    SOL_SOCKET SO_REUSEADDR SHUT_RDWR/;

socket(my $S, AF_INET, SOCK_STREAM, 0) or die;
setsockopt($S, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or die;
bind($S, pack_sockaddr_in(10143, INADDR_LOOPBACK)) or die "bind: $!\n";
listen($S, 1) or die "listen: $!";

while (1) {
    my $sockaddr = accept(my $conn, $S) or do {
        next if $! == EINTR;
        die "accept: $!";
    };

    # minimum CAPABILITY list, see tests/config/dovecot/interimap-required-capabilities.conf
    $conn->printflush("* PREAUTH [CAPABILITY IMAP4rev1 ENABLE UIDPLUS LIST-EXTENDED QRESYNC LIST-STATUS] IMAP4rev1 Server\r\n");
    my $x;

    $x = $conn->getline() // next;
    $x =~ /\A(\S+) ENABLE QRESYNC\r\n/ or die;
    $conn->printflush("* ENABLED QRESYNC\r\n$1 OK ENABLE completed\r\n");

    $x = $conn->getline() // next;
    $x =~ /\A(\S+) LIST .*\r\n/ or die;
    $conn->print("* LIST (\\Noselect) \"~\" \"\"\r\n");
    $conn->print("* LIST () \"~\" INBOX\r\n");
    $conn->print("* STATUS INBOX (UIDNEXT 1 UIDVALIDITY 1 HIGHESTMODSEQ 1)\r\n");
    $conn->printflush("$1 OK LIST completed\r\n");

    close($conn);
}

END {
    if (defined $S) {
        shutdown($S, SHUT_RDWR) or warn "shutdown: $!";
        close($S) or print STDERR "Can't close: $!\n";
    }
}