summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/feed2imap/rubyimap.rb43
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