]> Sergey Matveev's repositories - public-inbox.git/commitdiff
imap: clarify "DONE" usage with IDLE
authorEric Wong <e@yhbt.net>
Mon, 15 Jun 2020 03:30:03 +0000 (03:30 +0000)
committerEric Wong <e@yhbt.net>
Tue, 16 Jun 2020 00:07:02 +0000 (00:07 +0000)
"DONE" is a continuation and not a normal IMAP command, so
ensure it can't be called like a normal IMAP command which
has a tag.

lib/PublicInbox/IMAP.pm

index bc8905170b20b19289e97fa6ffee4960395d0e53..9ae7c60e75ee161eb276b23d750fa65c4ea9a7ce 100644 (file)
@@ -358,7 +358,7 @@ sub stop_idle ($$) {
        $ibx->unsubscribe_unlock($fd);
 }
 
-sub cmd_done ($$) {
+sub idle_done ($$) {
        my ($self, $tag) = @_; # $tag is "DONE" (case-insensitive)
        defined(my $idle_tag = delete $self->{-idle_tag}) or
                return "$tag BAD not idle\r\n";
@@ -1310,12 +1310,12 @@ sub process_line ($$) {
                $req .= "_".(shift @args);
        }
        my $res = eval {
-               if (my $cmd = $self->can('cmd_'.lc($req // ''))) {
-                       defined($self->{-idle_tag}) ?
-                               "$self->{-idle_tag} BAD expected DONE\r\n" :
-                               $cmd->($self, $tag, @args);
-               } elsif (uc($tag // '') eq 'DONE' && !defined($req)) {
-                       cmd_done($self, $tag);
+               if (defined(my $idle_tag = $self->{-idle_tag})) {
+                       (uc($tag // '') eq 'DONE' && !defined($req)) ?
+                               idle_done($self, $tag) :
+                               "$idle_tag BAD expected DONE\r\n";
+               } elsif (my $cmd = $self->can('cmd_'.lc($req // ''))) {
+                       $cmd->($self, $tag, @args);
                } else { # this is weird
                        auth_challenge_ok($self) //
                                        ($tag // '*') .