]> git.g-eek.se Git - interimap.git/commitdiff
Don't modify the state when receiving an unsolicited FETCH response without UID
authorGuilhem Moulin <guilhem@fripost.org>
Thu, 3 Mar 2016 21:26:33 +0000 (22:26 +0100)
committerGuilhem Moulin <guilhem@fripost.org>
Thu, 3 Mar 2016 21:28:18 +0000 (22:28 +0100)
We require QRESYNC support (RFC 7162) for syncing, which requires UID
(MODSEQ) in unsolicited FETCH responses, cf RFC 7162 section 3.2.4.

lib/Net/IMAP/InterIMAP.pm

index e3285de374c3498ff77dce1d74d58d3c3e5abe4e..0405794ac725943b0e2b130ac1ce44e23e87dc50 100644 (file)
@@ -2212,16 +2212,18 @@ sub _resp($$;$$$) {
                 undef $first;
             }
 
-            my $uid = $mail{UID} // $self->panic(); # sanity check
             $self->panic() unless defined $mail{MODSEQ} or !$self->_enabled('QRESYNC'); # sanity check
+            my $uid = $mail{UID};
 
             if (!exists $mail{RFC822} and !exists $mail{ENVELOPE} and # ignore new mails
+                defined $uid and # /!\ ignore unsolicited FETCH responses without UID, cf RFC 7162 section 3.2.4
                 (!exists $self->{_MODIFIED}->{$uid} or $self->{_MODIFIED}->{$uid}->[0] < $mail{MODSEQ} or
                     ($self->{_MODIFIED}->{$uid}->[0] == $mail{MODSEQ} and !defined $self->{_MODIFIED}->{$uid}->[1]))) {
                 my $flags = join ' ', sort(grep {lc $_ ne '\recent'} @{$mail{FLAGS}}) if defined $mail{FLAGS};
                 $self->{_MODIFIED}->{$uid} = [ $mail{MODSEQ}, $flags ];
             }
-            $callback->(\%mail) if defined $callback and ($cmd eq 'FETCH' or $cmd eq 'STORE') and in_set($uid, $set);
+            $callback->(\%mail) if defined $callback and ($cmd eq 'FETCH' or $cmd eq 'STORE') and
+                                   defined $uid and in_set($uid, $set);
         }
         elsif (/\AENABLED((?: $RE_ATOM_CHAR+)+)\z/) { # RFC 5161 ENABLE
             $self->{_ENABLED} //= [];