diff options
-rw-r--r-- | lib/feed2imap/rubyimap.rb | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/lib/feed2imap/rubyimap.rb b/lib/feed2imap/rubyimap.rb index a36393d..43af035 100644 --- a/lib/feed2imap/rubyimap.rb +++ b/lib/feed2imap/rubyimap.rb @@ -1,6 +1,6 @@ # File fetched from # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/net/imap.rb?view=log -# Current rev: 24263 +# Current rev: 27336 ############################################################################ # # = net/imap.rb @@ -274,6 +274,16 @@ module Net return @@debug = val end + # Returns the max number of flags interned to symbols. + def self.max_flag_count + return @@max_flag_count + end + + # Sets the max number of flags interned to symbols. + def self.max_flag_count=(count) + @@max_flag_count = count + end + # Adds an authenticator for Net::IMAP#authenticate. +auth_type+ # is the type of authentication this authenticator supports # (for instance, "LOGIN"). The +authenticator+ is an object @@ -905,7 +915,7 @@ module Net # Encode a string from UTF-8 format to modified UTF-7. def self.encode_utf7(s) - return s.gsub(/(&)|([^\x20-\x25\x27-\x7e]+)/u) { + return s.gsub(/(&)|([^\x20-\x7e]+)/u) { if $1 "&-" else @@ -933,6 +943,7 @@ module Net @@debug = false @@authenticators = {} + @@max_flag_count = 10000 # call-seq: # Net::IMAP.new(host, options = {}) @@ -1010,7 +1021,8 @@ module Net end def receive_responses - while true + connection_closed = false + until connection_closed synchronize do @exception = nil end @@ -1047,7 +1059,7 @@ module Net if resp.name == "BYE" && @logout_command_tag.nil? @sock.close @exception = ByeResponseError.new(resp) - break + connection_closed = true end when ContinuationRequest @continuation_request_arrival.signal @@ -1933,6 +1945,14 @@ module Net end class ResponseParser # :nodoc: + def initialize + @str = nil + @pos = nil + @lex_state = nil + @token = nil + @flag_symbols = {} + end + def parse(str) @str = str @pos = 0 @@ -2943,7 +2963,16 @@ module Net if @str.index(/\(([^)]*)\)/ni, @pos) @pos = $~.end(0) return $1.scan(FLAG_REGEXP).collect { |flag, atom| - atom || flag.capitalize.intern + if atom + atom + else + symbol = flag.capitalize.untaint.intern + @flag_symbols[symbol] = true + if @flag_symbols.length > IMAP.max_flag_count + raise FlagCountError, "number of flag symbols exceeded" + end + symbol + end } else parse_error("invalid flag list") @@ -3414,6 +3443,10 @@ module Net # out due to inactivity. class ByeResponseError < ResponseError end + + # Error raised when too many flags are interned to symbols. + class FlagCountError < Error + end end end |