File f1ad8b48aae3ee26613b3e77bc0056e120096846.patch of Package rubygem-actionpack-2_1
From f1ad8b48aae3ee26613b3e77bc0056e120096846 Mon Sep 17 00:00:00 2001
From: Michael Koziarski <michael@koziarski.com>
Date: Thu, 13 Nov 2008 11:19:53 +0100
Subject: [PATCH] Instead of overriding html_types, base the verification on browser_generated_types.
Also Deprecate the old unverifiable types.
[#1145 state:committed]
---
actionpack/lib/action_controller/mime_type.rb | 21 +++++++++++++++++----
actionpack/test/controller/mime_type_test.rb | 6 +++---
2 files changed, 20 insertions(+), 7 deletions(-)
Index: lib/action_controller/mime_type.rb
===================================================================
--- lib/action_controller/mime_type.rb.orig 1970-01-01 01:00:00.000000000 +0100
+++ lib/action_controller/mime_type.rb 2010-02-02 02:07:28.341345989 +0100
@@ -18,8 +18,19 @@ module Mime
# end
class Type
@@html_types = Set.new [:html, :all]
+ cattr_reader :html_types
+
+ # These are the content types which browsers can generate without using ajax, flash, etc
+ # i.e. following a link, getting an image or posting a form. CSRF protection
+ # only needs to protect against these types.
+ @@browser_generated_types = Set.new [:html, :url_encoded_form, :multipart_form]
+ cattr_reader :browser_generated_types
+
@@unverifiable_types = Set.new [:text, :json, :csv, :xml, :rss, :atom, :yaml]
- cattr_reader :html_types, :unverifiable_types
+ def self.unverifiable_types
+ ActiveSupport::Deprecation.warn("unverifiable_types is deprecated and has no effect", caller)
+ @@unverifiable_types
+ end
# A simple helper class used in parsing the accept header
class AcceptItem #:nodoc:
@@ -161,13 +172,17 @@ module Mime
# Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See
# ActionController::RequestForgerProtection.
def verify_request?
- !@@unverifiable_types.include?(to_sym)
+ browser_generated?
end
def html?
@@html_types.include?(to_sym) || @string =~ /html/
end
+ def browser_generated?
+ @@browser_generated_types.include?(to_sym)
+ end
+
private
def method_missing(method, *args)
if method.to_s =~ /(\w+)\?$/
Index: test/controller/mime_type_test.rb
===================================================================
--- test/controller/mime_type_test.rb.orig 1970-01-01 01:00:00.000000000 +0100
+++ test/controller/mime_type_test.rb 2010-02-02 02:16:12.225759085 +0100
@@ -77,8 +77,8 @@ class MimeTypeTest < Test::Unit::TestCas
# Remove custom Mime::Type instances set in other tests, like Mime::GIF and Mime::IPHONE
all_types.delete_if { |type| !Mime.const_defined?(type.to_s.upcase) }
- unverified, verified = all_types.partition { |type| Mime::Type.unverifiable_types.include? type }
- assert verified.all? { |type| Mime.const_get(type.to_s.upcase).verify_request? }, "Not all Mime Types are verified: #{verified.inspect}"
- assert unverified.all? { |type| !Mime.const_get(type.to_s.upcase).verify_request? }, "Some Mime Types are verified: #{unverified.inspect}"
+ verified, unverified = all_types.partition { |type| Mime::Type.browser_generated_types.include? type }
+ assert verified.each { |type| assert Mime.const_get(type.to_s.upcase).verify_request?, "Verifiable Mime Type is not verified: #{type.inspect}" }
+ assert unverified.each { |type| assert !Mime.const_get(type.to_s.upcase).verify_request?, "Nonverifiable Mime Type is verified: #{type.inspect}" }
end
end