diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-06-24 02:58:45 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-06-24 02:58:45 +0000 |
commit | a054854324e88f2282d7440fae758d6aa7a42597 (patch) | |
tree | ad69ca1e4db07bfba5391ccce920ebbf88da6e26 | |
parent | 9a6518abf71e5de3d5dee21152dd4cff6730b640 (diff) |
Revert "* lib/uri/mailto.rb: support RFC6068."
to fix mailto URI syntax
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | lib/uri/mailto.rb | 65 | ||||
-rw-r--r-- | test/uri/test_mailto.rb | 5 |
3 files changed, 47 insertions, 27 deletions
@@ -34,10 +34,6 @@ Tue Jun 24 05:40:41 2014 KOSAKI Motohiro <kosaki.motohiro@gmail.com> Patch by Shinichiro Hamaji. [Fixes GH-529] https://github.com/ruby/ruby/pull/529 -Tue Jun 24 03:52:35 2014 NARUSE, Yui <naruse@ruby-lang.org> - - * lib/uri/mailto.rb: support RFC6068. - Mon Jun 23 18:44:45 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com> * tool/config_files.rb: rename class ConfigFiles to Downloader. diff --git a/lib/uri/mailto.rb b/lib/uri/mailto.rb index 6422e84f37..03155fb917 100644 --- a/lib/uri/mailto.rb +++ b/lib/uri/mailto.rb @@ -12,7 +12,7 @@ require 'uri/generic' module URI # - # RFC6068, The mailto URL scheme + # RFC2368, The mailto URL scheme # class MailTo < Generic include REGEXP @@ -37,12 +37,28 @@ module URI # # Within mailto URLs, the characters "?", "=", "&" are reserved. - HEADER_REGEXP = /\A(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*\z/ + # hname = *urlc + # hvalue = *urlc + # header = hname "=" hvalue + HEADER_PATTERN = "(?:[^?=&]*=[^?=&]*)".freeze + HEADER_REGEXP = Regexp.new(HEADER_PATTERN).freeze # headers = "?" header *( "&" header ) - # to = addr-spec *("," addr-spec ) - # mailtoURI = "mailto:" [ to ] [ hfields ] - TO_REGEXP = /\A(?:[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|"(?:\\[!-~]|[!#-\[\]-~])*")@(?:[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|\[[!-Z^-~]*\])\z/ - MAILTO_DATA_REGEXP = /\A(?<to>(?<addr-spec>(?<local-part>[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|"(?:\\[!-~]|[!#-\[\]-~])*")@(?<domain>[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|\[[!-Z^-~]*\]))(?:,\g<addr-spec>)*)?(?<hfields>\?(?<header>(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*))?\z/ + # to = #mailbox + # mailtoURL = "mailto:" [ to ] [ headers ] + MAILBOX_PATTERN = "(?:#{PATTERN::ESCAPED}|[^(),%?=&])".freeze + MAILTO_REGEXP = Regexp.new(" # :nodoc: + \\A + (#{MAILBOX_PATTERN}*?) (?# 1: to) + (?: + \\? + (#{HEADER_PATTERN}(?:\\&#{HEADER_PATTERN})*) (?# 2: headers) + )? + (?: + \\# + (#{PATTERN::FRAGMENT}) (?# 3: fragment) + )? + \\z + ", Regexp::EXTENDED).freeze # :startdoc: # @@ -83,8 +99,8 @@ module URI if tmp[:headers] tmp[:opaque] << '?' - case tmp[:headers] - when Array + + if tmp[:headers].kind_of?(Array) tmp[:opaque] << tmp[:headers].collect { |x| if x.kind_of?(Array) x[0] + '=' + x[1..-1].join @@ -92,10 +108,12 @@ module URI x.to_s end }.join('&') - when Hash + + elsif tmp[:headers].kind_of?(Hash) tmp[:opaque] << tmp[:headers].collect { |h,v| h + '=' + v }.join('&') + else tmp[:opaque] << tmp[:headers].to_s end @@ -119,13 +137,13 @@ module URI @to = nil @headers = [] - if m = MAILTO_DATA_REGEXP.match(@opaque) + if MAILTO_REGEXP =~ @opaque if arg[10] # arg_check - self.to = m["to"] - self.headers = m["header"] + self.to = $1 + self.headers = $2 else - set_to(m["to"]) - set_headers(m["header"]) + set_to($1) + set_headers($2) end else @@ -140,12 +158,14 @@ module URI # E-mail headers set by the URL, as an Array of Arrays attr_reader :headers - # check the to +v+ component + # check the to +v+ component against either + # * URI::Parser Regexp for :OPAQUE + # * MAILBOX_PATTERN def check_to(v) return true unless v return true if v.size == 0 - if TO_REGEXP !~ v + if parser.regexp[:OPAQUE] !~ v || /\A#{MAILBOX_PATTERN}*\z/o !~ v raise InvalidComponentError, "bad component(expected opaque component): #{v}" end @@ -168,13 +188,14 @@ module URI end # check the headers +v+ component against either - # * URI::Parser Regexp for :QUERY - # * HEADER_REGEXP + # * URI::Parser Regexp for :OPAQUE + # * HEADER_PATTERN def check_headers(v) return true unless v return true if v.size == 0 - if parser.regexp[:QUERY] !~ v || - HEADER_REGEXP !~ v + + if parser.regexp[:OPAQUE] !~ v || + /\A(#{HEADER_PATTERN}(?:\&#{HEADER_PATTERN})*)\z/o !~ v raise InvalidComponentError, "bad component(expected opaque component): #{v}" end @@ -187,8 +208,8 @@ module URI def set_headers(v) @headers = [] if v - v.split('&').each do |x| - @headers << x.split(/=/, 2) + v.scan(HEADER_REGEXP) do |x| + @headers << x.split(/=/o, 2) end end end diff --git a/test/uri/test_mailto.rb b/test/uri/test_mailto.rb index 3aac447436..c2158845e8 100644 --- a/test/uri/test_mailto.rb +++ b/test/uri/test_mailto.rb @@ -100,6 +100,9 @@ class TestMailTo < Test::Unit::TestCase # mailto:javascript:alert() bad << ["javascript:alert()", []] + # '=' which is in hname or hvalue is wrong. + bad << ["foo@example.jp?subject=1+1=2", []] + ok.each do |x| assert_equal(x[0], @u.build(x[1]).to_s) @@ -108,7 +111,7 @@ class TestMailTo < Test::Unit::TestCase end bad.each do |x| - assert_raise(URI::InvalidComponentError, %[URI::MailTo.build(#{x.inspect})]) { + assert_raise(URI::InvalidComponentError) { @u.build(x) } end |