Bug #10112

NET::IMAP fails to parse uid_search/search response with MODSEQ search criteria

Added by Philippe-Antoine Lehoux about 1 year ago. Updated 10 months ago.

[ruby-core:64203]
Status:Closed
Priority:Normal
Assignee:Shugo Maeda
ruby -v:ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0] Backport:2.0.0: UNKNOWN, 2.1: UNKNOWN

Description

 imap.examine('INBOX')
 imap.uid_search(['MODSEQ', 12345])

NET::IMAP fails to parse uid_search/search response with MODSEQ search criteria (example above), here is the debug output I get from running it on GMAIL.

C: RUBY0002 EXAMINE INBOX
S: * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $Phishing $Forwarded Seen $has_cal $NotJunk receipt-handled NotJunk $NotPhishing $Junk Junk)
S: * OK [PERMANENTFLAGS ()] Flags permitted.
S: * OK [UIDVALIDITY 2] UIDs valid.
S: * 3 EXISTS
S: * 0 RECENT
S: * OK [UIDNEXT 87222] Predicted next UID.
S: * OK [HIGHESTMODSEQ 7667593]
S: RUBY0002 OK [READ-ONLY] INBOX selected. (Success)
C: RUBY0003 UID SEARCH MODSEQ 7666341
S: * OK [HIGHESTMODSEQ 7667593]
S: * SEARCH 87216 87221 (MODSEQ 7667567)
@str: "* SEARCH 87216 87221 (MODSEQ 7667567)\r\n"
@pos: 22
@lex_state: EXPR_BEG
@token.symbol: LPAR
@token.value: "("

Associated revisions

Revision 48411
Added by Shugo Maeda 10 months ago

  • lib/net/imap.rb (search_response): parse MODSEQ in SEARCH responses properly. [Bug #10112]

Revision 48411
Added by Shugo Maeda 10 months ago

  • lib/net/imap.rb (search_response): parse MODSEQ in SEARCH responses properly. [Bug #10112]

History

#1 Updated by Philippe-Antoine Lehoux about 1 year ago

Here is my patch to parse the response successfully.

require 'net/imap'

##
# Fixing issue: NET::IMAP fails to parse uid_search/search response with MODSEQ search criteria
# https://bugs.ruby-lang.org/issues/10112
module Net # :nodoc:
  class IMAP # :nodoc:
    class ResponseParser # :nodoc:
      def search_response
        token = match(T_ATOM)
        name = token.value.upcase
        token = lookahead
        if token.symbol == T_SPACE
          shift_token
          data = []
          while true
            token = lookahead
            case token.symbol
            when T_LPAR
              shift_token
              match(T_ATOM)
              match(T_SPACE)
              match(T_NUMBER)
              match(T_RPAR)
            when T_NUMBER
              data.push(number)
            when T_CRLF
              break
            else
              shift_token
            end
          end
        else
          data = []
        end
        return UntaggedResponse.new(name, data, @str)
      end
    end
  end
end

#2 Updated by Hiroshi SHIBATA about 1 year ago

  • Status changed from Open to Assigned

#3 Updated by Shugo Maeda 10 months ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

Applied in changeset r48411.


  • lib/net/imap.rb (search_response): parse MODSEQ in SEARCH responses properly. [Bug #10112]

Also available in: Atom PDF