From b9bc55a39b65d6da9da8bf2ad5daaaa2933ab508 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 20 Jul 2022 09:24:11 +0000 Subject: pop3: TOP requests do not expire messages RFC 2449 only documents "EXPIRE 0" behavior for RETR requests which fetch the whole message. TOP requests only fetch the headers and top $N lines of the body, so it's probably harmful for deletions to be triggered in those cases. --- t/pop3d.t | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 't') diff --git a/t/pop3d.t b/t/pop3d.t index d5ccb0d8..3d70935f 100644 --- a/t/pop3d.t +++ b/t/pop3d.t @@ -240,8 +240,17 @@ EOF ok(defined($capa->{PIPELINING}), 'pipelining supported by CAPA'); is($capa->{EXPIRE}, 0, 'EXPIRE 0 set'); - # clients which see "EXPIRE 0" can elide DELE requests + # ensure TOP doesn't trigger "EXPIRE 0" like RETR does (cf. RFC2449) my $list = $oldc->list; + ok(scalar keys %$list, 'got a listing of messages'); + ok($oldc->top($_, 1), "TOP $_ 1") for keys %$list; + ok($oldc->quit, 'QUIT after TOP'); + + # clients which see "EXPIRE 0" can elide DELE requests + $oldc = Net::POP3->new(@old_args); + ok($oldc->apop("$locked_mb.0", 'anonymous'), 'APOP for RETR'); + is_deeply($oldc->capa, $capa, 'CAPA unchanged'); + is_deeply($oldc->list, $list, 'LIST unchanged by previous TOP'); ok($oldc->get($_), "RETR $_") for keys %$list; ok($oldc->quit, 'QUIT after RETR'); -- cgit v1.2.3-24-ge0c7