sanitize-rails 0.8.1 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe1b33404aa8e997aba5fdf6101b25c3b5dde7a5
4
- data.tar.gz: d74c48a669484082ed497713dc198e2ead6ab310
3
+ metadata.gz: 92119626e5ebb931fe890e757c3c2fc9b287a351
4
+ data.tar.gz: 315002fac67c6275c2b6ef6eafeef4f946cf3f52
5
5
  SHA512:
6
- metadata.gz: 4a44d6ac9ae62f3c1aa68bf7569e289b9264afd2311d338c8a1bd8cd87bfa572b254727e0bdaf8b20ffe011120e687e3ef35e41fc9abb528243ffe79ca57ba23
7
- data.tar.gz: 46ab3c9d6ac847044d1d8e5101890d717a1e981408b734a19b8c957aab348f95b3809dd62a61f231eb49658fef57ee6cd61838963f4bbcbec701ffb604d8612a
6
+ metadata.gz: 452ec0f4ac318d174ed4625646ad62e9f3524faa926eaff28726d2fb1e57127ac9db389bf1aadbd1f312da30c760ea12beed184e4d69cb739d50070ccd710aae
7
+ data.tar.gz: 44077d2a5c5a330f61c2903649b0ef71e246af81d6323047713d69d21292c0893af6883cf41168b2cac25547ee5397c89c47ae4bf647a2d1015d9c11400a60ad
data/.gitignore CHANGED
@@ -1,6 +1,8 @@
1
1
  .*.sw?
2
2
  .DS_Store
3
3
  *.sublime-*
4
+ .ruby-version
5
+ .bundle
4
6
  Gemfile.lock
5
7
  html
6
8
  pkg
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
- - 2.0.0
5
- - 1.9.3
4
+ - 2.1.2
5
+ - 2.0.0
6
+ - 1.9.3
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2011-2014 Marcello Barnaba <vjt@openssl.it>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,64 +1,94 @@
1
- Sanitize-Rails - sanitize .. on Rails. [![Build Status](https://travis-ci.org/vjt/sanitize-rails.png)](https://travis-ci.org/vjt/sanitize-rails)
2
- ======================================
1
+ # Sanitize-Rails - sanitize .. on Rails. [![Build Status](https://travis-ci.org/vjt/sanitize-rails.png)](https://travis-ci.org/vjt/sanitize-rails)
3
2
 
4
- Installation
5
- ------------
3
+ An easy bridge to integrate Ryan Grove's [HTML Whitelist Sanitizer][sanitize]
4
+ in your Rails application.
6
5
 
7
- Gemfile:
6
+ ## Installation
8
7
 
9
- gem 'sanitize-rails', :require => 'sanitize/rails'
8
+ `Gemfile`:
10
9
 
11
- Configuration
12
- -------------
10
+ gem 'sanitize-rails', require: 'sanitize/rails'
13
11
 
14
- config/initializers/sanitizer.rb:
12
+ ## Configuration
13
+
14
+ Pass the configuration to `Sanitize` calling `Sanitize::Rails.configure` in
15
+ an initializer, say `config/initializers/sanitizer.rb`:
15
16
 
16
17
  Sanitize::Rails.configure(
17
- :elements => [ ... ],
18
- :attribiutes => { ... },
18
+ elements: [ ... ],
19
+ attributes: { ... },
19
20
  ...
20
21
  )
21
22
 
22
- There's an example in the `example/` directory.
23
+ Check out the [example][] in the `example/` directory.
24
+
25
+ ## Usage
26
+
27
+ ActionView `sanitize` helper is transparently overriden to use the `Sanitize`
28
+ gem.
29
+
30
+ A `sanitize` helper is added to `ActiveRecord`, that installs on create/save
31
+ callbacks that sanitize the given attributes before persisting them to the
32
+ database. Example:
33
+
34
+ `app/models/foo.rb`:
35
+
36
+ class Foo < ActiveRecord::Base
37
+ sanitizes :description # on save by default
38
+
39
+ sanitizes :body, on: :create
40
+ sanitizes :remarks, on: :save
41
+ end
42
+
43
+ ## Testing
44
+
45
+ ### RSpec
46
+
47
+ `spec/spec_helper.rb`:
48
+
49
+ require 'sanitize/rails/matchers'
50
+
51
+ in spec code:
23
52
 
24
- Usage
25
- -----
53
+ describe Post do
54
+ # Simplest variant, single field and default values
55
+ it { should sanitize_field :title }
26
56
 
27
- app/models/foo.rb:
57
+ # Multiple fields
58
+ it { should sanitize_fields :title, :body }
28
59
 
29
- sanitizes :field
30
- sanitizes :some_other_field, :on => :create
31
- sanitizes :yet_another_field, :on => :save
60
+ # Specifing both text to sanitize and expected result
61
+ it { should sanitize_field(:title).replacing('&copy;').with('©') }
62
+ end
32
63
 
33
- ActionView `sanitize` helper is overriden to use
34
- the Sanitize gem - transparently.
64
+ You should pass field names to matcher in the same way as you do with the
65
+ `sanitize` call in the model, otherwise sanitize method won't be found in
66
+ model.
35
67
 
36
- Testing
37
- -------
68
+ ### Test::Unit
38
69
 
39
- Only Test::Unit for now - please write matchers
40
- and send a pull request :-)
70
+ `test/test_helper.rb:`
41
71
 
42
- test/test\_helper:
72
+ require 'sanitize/rails/test_helpers'
43
73
 
44
74
  Sanitize::Rails::TestHelpers.setup(self,
45
- :invalid => 'some <a>string',
46
- :valid => 'some <a>string</a>'
75
+ invalid: 'some <a>string',
76
+ valid: 'some <a>string</a>'
47
77
  )
48
78
 
49
79
  your test:
50
80
 
51
- assert_sanitizes(Model, :field, :some_other_field)
81
+ assert_sanitizes Model, :field, :some_other_field
52
82
 
53
- Compatibility
54
- -------------
83
+ ## Compatibility
55
84
 
56
- Tested with Rails 3.0 ~ 4.0 under Ruby 1.9 and 2.0.
85
+ Tested with Rails 3.0 and :up: under Ruby 1.9.3 and :up:.
57
86
 
58
- License
59
- -------
87
+ ## License
60
88
 
61
89
  MIT
62
90
 
91
+ ## :smiley: Have fun!
63
92
 
64
- Have fun!
93
+ [sanitize]: https://github.com/rgrove/sanitize
94
+ [example]: https://github.com/vjt/sanitize-rails/blob/master/example/sanitizer.rb
data/example/sanitizer.rb CHANGED
@@ -1,3 +1,11 @@
1
+ # Sanitize::Rails example configuration
2
+ #
3
+ # https://github.com/vjt/sanitize-rails
4
+ #
5
+ # Enjoy, Share and Love <3
6
+ #
7
+ # -- vjt@openssl.it
8
+ #
1
9
  HTML::WhiteListSanitizer.allowed_css_properties = %w(text-align background-color)
2
10
  HTML::WhiteListSanitizer.shorthand_css_properties = %w()
3
11
  HTML::WhiteListSanitizer.allowed_css_keywords = %w(left center right justify rgb)
@@ -0,0 +1,20 @@
1
+ module Sanitize::Rails
2
+
3
+ module ActionView # :nodoc:
4
+ def self.included(base)
5
+ base.class_eval do
6
+ # To make sure we're called *after* the method is defined
7
+ undef_method :sanitize
8
+
9
+ # Overrides ActionView's sanitize() helper to use +Engine#clean+
10
+ #
11
+ # FIXME: Options are currently ignored.
12
+ #
13
+ def sanitize(string, options = {})
14
+ Engine.clean(string)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,38 @@
1
+ module Sanitize::Rails
2
+
3
+ # Adds the +sanitizes+ method to ActiveRecord children classes
4
+ #
5
+ module ActiveRecord
6
+ # Generates before_save/before_create filters that implement
7
+ # sanitization on the given fields, in the given callback
8
+ # point.
9
+ #
10
+ # Usage:
11
+ #
12
+ # sanitizes :some_field, :some_other_field #, :on => :save
13
+ #
14
+ # Valid callback points are :save and :create, callbacks are installed "before_"
15
+ # by default. Generated callbacks are named with the "sanitize_" prefix follwed
16
+ # by the field names separated by an underscore.
17
+ #
18
+ def sanitizes(*fields)
19
+ options = fields.extract_options!
20
+ callback = Engine.callback_for(options)
21
+ sanitizer = Engine.method_for(fields)
22
+
23
+ define_method(sanitizer) do # # Unrolled version
24
+ fields.each do |field| #
25
+ value = send(field)
26
+ unless value.blank? # def sanitize_fieldA_fieldB
27
+ sanitized = Engine.clean(value) # self.fieldA = Engine.clean(self.fieldA) unless fieldA.blank?
28
+ send("#{field}=", sanitized) # self.fieldB = Engine.clean(self.fieldB) unless fieldB.blank?
29
+ end # end
30
+ end #
31
+ end # end
32
+
33
+ protected sanitizer # protected :sanitize_fieldA_fieldB
34
+ send callback, sanitizer # before_save :sanitize_fieldA_fieldB
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,58 @@
1
+ module Sanitize::Rails
2
+
3
+ module Engine
4
+ extend self
5
+
6
+ def configure(config)
7
+ @@config = config.freeze
8
+ end
9
+
10
+ # Returns a memoized instance of the Engine with the
11
+ # configuration passed to the +configure+ method or with
12
+ # the ActionView's default config
13
+ #
14
+ def cleaner
15
+ @@config ||= begin
16
+ {
17
+ :elements => ::ActionView::Base.sanitized_allowed_tags.to_a,
18
+ :attributes => { :all => ::ActionView::Base.sanitized_allowed_attributes.to_a},
19
+ :protocols => { :all => ::ActionView::Base.sanitized_allowed_protocols.to_a }
20
+ }
21
+ rescue
22
+ warn "ActionView not available, falling back to Sanitize's BASIC config"
23
+ ::Sanitize::Config::BASIC
24
+ end
25
+ @sanitizer ||= ::Sanitize.new(@@config)
26
+ end
27
+
28
+ # Returns a copy of the given `string` after sanitizing it and marking it
29
+ # as `html_safe`
30
+ #
31
+ # Ensuring this methods return instances of ActiveSupport::SafeBuffer
32
+ # means that text passed through `Sanitize::Rails::Engine.clean`
33
+ # will not be escaped by ActionView's XSS filtering utilities.
34
+ def clean(string)
35
+ ::ActiveSupport::SafeBuffer.new string.to_s.dup.tap { |s| clean!(s) }
36
+ end
37
+
38
+ # Sanitizes the given `string` in place and does NOT mark it as `html_safe`
39
+ #
40
+ def clean!(string)
41
+ cleaner.clean!(string.to_s).to_s
42
+ end
43
+
44
+ def callback_for(options) #:nodoc:
45
+ point = (options[:on] || 'save').to_s
46
+
47
+ unless %w( save create ).include?(point)
48
+ raise ArgumentError, "Invalid callback point #{point}, valid ones are :save and :create"
49
+ end
50
+
51
+ "before_#{point}".intern
52
+ end
53
+
54
+ def method_for(fields) #:nodoc:
55
+ "sanitize_#{fields.join('_')}".intern
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,112 @@
1
+ module Sanitize::Rails::Matchers
2
+
3
+ # RSpec custom matcher to check for field sanitization
4
+ #
5
+ # Verifies that the matcher subject sanitizes the given `fields`, by
6
+ # checking that the sanitize callback works as expected.
7
+ #
8
+ # Matcher can be used in the following variants:
9
+ #
10
+ # describe Post do
11
+ # # Simplest variant, single field and default values
12
+ # it { should sanitize_field :title }
13
+ # # Multiple fields
14
+ # it { should sanitize_fields :title, :body }
15
+ # # Specifing both text to sanitize and expected result
16
+ # it { should sanitize_field(:title).replacing('&copy;').with('©') }
17
+ # end
18
+ #
19
+ def sanitize_field(*fields)
20
+ if fields.empty?
21
+ raise ArgumentError, 'need at least one argument'
22
+ else
23
+ SanitizeFieldsMatcher.new(*fields)
24
+ end
25
+ end
26
+
27
+ # Sintactic sugar
28
+ alias_method :sanitize_fields, :sanitize_field
29
+
30
+ # Add matchers module to rspec configuration
31
+ RSpec.configure { |c| c.include(self) } if defined? RSpec and RSpec.respond_to?(:configure)
32
+
33
+ # Actual matcher class
34
+ class SanitizeFieldsMatcher
35
+
36
+ # Take an array of fields to check, they must respect the same order given in model `sanitize` call
37
+ def initialize(*fields)
38
+ self.options = fields.extract_options!
39
+ self.sanitizer = ::Sanitize::Rails::Engine.method_for(fields)
40
+ self.fields = fields
41
+ end
42
+
43
+ # Used to specify invalid text assigned to fields
44
+ def replacing(invalid)
45
+ @invalid_changed = true
46
+ @invalid = invalid
47
+ self
48
+ end
49
+
50
+ # Used to specify expected output for the invalid text
51
+ def with(valid)
52
+ @valid_changed = true
53
+ @valid = valid
54
+ self
55
+ end
56
+
57
+ # Actual match code
58
+ def matches?(instance)
59
+ self.instance = instance
60
+ # assign invalid value to each field
61
+ fields.each { |field| instance.send("#{field}=", invalid_value) }
62
+ # sanitize the object calling the method
63
+ instance.send(sanitizer) rescue nil
64
+ # check expectation on results
65
+ fields.all? { |field| valid_value == instance.send(field) }
66
+ end
67
+
68
+ def failure_message_for_should
69
+ "Expected #{should_helper} to return sanitized value '#{valid_value}', got '#{attribute_values}'"
70
+ end
71
+
72
+ def failure_message_for_should_not
73
+ "Expected #{field_helper} not to be sanitized"
74
+ end
75
+
76
+ def description
77
+ "sanitize #{should_helper}"
78
+ end
79
+
80
+ private
81
+
82
+ attr_accessor :options, :sanitizer, :instance, :fields
83
+
84
+ def invalid_value
85
+ @invalid ||= '<b>valid<br>'
86
+ end
87
+
88
+ def valid_value
89
+ @valid ||= '<b>valid<br></b>'
90
+ end
91
+
92
+ def custom_values?
93
+ @invalid_changed && @invalid_changed
94
+ end
95
+
96
+ def field_helper
97
+ "#{'field'.pluralize(fields.count)} #{fields.to_sentence}"
98
+ end
99
+
100
+ def should_helper
101
+ field_helper.tap do |desc|
102
+ desc << " by replacing '#{invalid_value}' with '#{valid_value}'" if custom_values?
103
+ end
104
+ end
105
+
106
+ def attribute_values
107
+ instance.attributes.slice(*fields.map(&:to_s))
108
+ end
109
+
110
+ end
111
+
112
+ end
@@ -0,0 +1,21 @@
1
+ module Sanitize::Rails
2
+
3
+ class Railtie < ::Rails::Railtie
4
+ initializer 'sanitize-rails.insert_into_action_view' do
5
+ ::ActiveSupport.on_load :action_view do
6
+ ::ActionView::Helpers::SanitizeHelper.instance_eval { include Sanitize::Rails::ActionView }
7
+ end
8
+ end
9
+
10
+ initializer 'sanitize-rails.insert_into_active_record' do
11
+ ::ActiveSupport.on_load :active_record do
12
+ ::ActiveRecord::Base.extend Sanitize::Rails::ActiveRecord
13
+ end
14
+ end
15
+
16
+ initializer 'sanitize-rails.insert_into_string' do
17
+ ::String.instance_eval { include Sanitize::Rails::String }
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,20 @@
1
+ module Sanitize::Rails
2
+
3
+ # Adds two `sanitize_as_html{,!}` helpers to String itself,
4
+ # that call +Engine#clean+ or +Engine#clean!+ in turn
5
+ #
6
+ module String
7
+ # Calls +Engine#clean+ on this String instance
8
+ #
9
+ def sanitize_as_html
10
+ Engine.clean(self)
11
+ end
12
+
13
+ # Calls +Engine#clean!+ on this String instance
14
+ #
15
+ def sanitize_as_html!
16
+ Engine.clean!(self)
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,63 @@
1
+ module Sanitize::Rails
2
+
3
+ # Test instrumentation
4
+ #
5
+ module TestHelpers
6
+ class << self
7
+ # Instruments the given base class with the +assert_sanitizes+
8
+ # helper, and memoizes the given options, accessible from the
9
+ # helper itself via the +valid+ and +invalid+ methods.
10
+ #
11
+ # Those methods contains two HTML strings, one assumed to be
12
+ # "invalid" and the other, well, "valid".
13
+ #
14
+ # In your ActiveSupport::Testcase:
15
+ #
16
+ # Sanitize::Rails::TestHelpers.setup(self,
17
+ # :invalid => 'some <a>string',
18
+ # :valid => 'some <a>string</a>'
19
+ # )
20
+ #
21
+ def setup(base, options = {})
22
+ base.instance_eval { include TestHelpers }
23
+ @@options = options
24
+ end
25
+
26
+ def valid; @@options[:valid] rescue nil end
27
+ def invalid; @@options[:invalid] rescue nil end
28
+ end
29
+
30
+ # Verifies that the given `klass` sanitizes the given `fields`, by
31
+ # checking both the presence of the sanitize callback and that it
32
+ # works as expected, by setting the +invalid+ string first, invoking
33
+ # the callback and then checking that the string has been changed
34
+ # into the +valid+ one.
35
+ #
36
+ # If you pass an Hash as the last argument, it can contain `:valid`,
37
+ # `:invalid` and `:object` keys. The first two ones override the
38
+ # configured defaults, while the third executes assertions on the
39
+ # specified object. If no :object is given, a new object is instantiated
40
+ # by the given `klass` with no arguments.
41
+ #
42
+ # If neither `:valid`/`:invalid` strings are configured nor are passed
43
+ # via the options, the two default strings in the method source are
44
+ # used.
45
+ #
46
+ def assert_sanitizes(klass, *fields)
47
+ options = fields.extract_options!
48
+ sanitizer = Engine.method_for(fields)
49
+
50
+ # Verify the callback works
51
+ invalid = options[:invalid] || TestHelpers.invalid || '<b>ntani<br>'
52
+ valid = options[:valid] || TestHelpers.valid || '<b>ntani<br /></b>'
53
+ object = options[:object] || klass.new
54
+
55
+ fields.each {|field| object.send("#{field}=", invalid) }
56
+
57
+ object.send sanitizer
58
+
59
+ fields.each {|field| assert_equal(valid, object.send(field)) }
60
+ end
61
+ end
62
+
63
+ end
@@ -1,5 +1,5 @@
1
1
  class Sanitize
2
2
  module Rails
3
- VERSION = '0.8.1'
3
+ VERSION = '0.9.1'
4
4
  end
5
5
  end
@@ -1,9 +1,21 @@
1
- # Sanitize gem bridge and helpers
1
+ #
2
+ # Sanitize Gem Bridge and Helpers for Rails
3
+ #
4
+ # https://github.com/vjt/sanitize-rails
5
+ #
6
+ # (C) 2011-2014 vjt@openssl.it
7
+ #
8
+ # MIT License
2
9
  #
3
10
  require 'sanitize'
4
- require 'sanitize/railtie' if defined? Rails
11
+ require 'sanitize/rails/railtie' if defined? Rails
5
12
 
6
13
  module Sanitize::Rails
14
+ autoload :Engine, 'sanitize/rails/engine'
15
+ autoload :ActionView, 'sanitize/rails/action_view'
16
+ autoload :ActiveRecord, 'sanitize/rails/active_record'
17
+ autoload :String, 'sanitize/rails/string'
18
+ autoload :VERSION, 'sanitize/rails/version'
7
19
 
8
20
  # Configures the sanitizer with the given `config` hash.
9
21
  #
@@ -18,190 +30,4 @@ module Sanitize::Rails
18
30
  def self.configure(config)
19
31
  Engine.configure(config)
20
32
  end
21
-
22
- module Engine
23
- extend self
24
-
25
- def configure(config)
26
- @@config = config.freeze
27
- end
28
-
29
- # Returns a memoized instance of the Engine with the
30
- # configuration passed to the +configure+ method or with
31
- # the ActionView's default config
32
- #
33
- def cleaner
34
- @@config ||= begin
35
- {
36
- :elements => ::ActionView::Base.sanitized_allowed_tags.to_a,
37
- :attributes => { :all => ::ActionView::Base.sanitized_allowed_attributes.to_a},
38
- :protocols => { :all => ::ActionView::Base.sanitized_allowed_protocols.to_a }
39
- }
40
- rescue
41
- warn "ActionView not available, falling back to Sanitize's BASIC config"
42
- ::Sanitize::Config::BASIC
43
- end
44
- @sanitizer ||= ::Sanitize.new(@@config)
45
- end
46
-
47
- # Returns a copy of the given `string` after sanitizing it and marking it
48
- # as `html_safe`
49
- #
50
- # Ensuring this methods return instances of ActiveSupport::SafeBuffer
51
- # means that text passed through `Sanitize::Rails::Engine.clean`
52
- # will not be escaped by ActionView's XSS filtering utilities.
53
- def clean(string)
54
- ::ActiveSupport::SafeBuffer.new string.to_s.dup.tap { |s| clean!(s) }
55
- end
56
-
57
- # Sanitizes the given `string` in place and does NOT mark it as `html_safe`
58
- #
59
- def clean!(string)
60
- cleaner.clean!(string.to_s).to_s
61
- end
62
-
63
- def callback_for(options) #:nodoc:
64
- point = (options[:on] || 'save').to_s
65
-
66
- unless %w( save create ).include?(point)
67
- raise ArgumentError, "Invalid callback point #{point}, valid ones are :save and :create"
68
- end
69
-
70
- "before_#{point}".intern
71
- end
72
-
73
- def method_for(fields) #:nodoc:
74
- "sanitize_#{fields.join('_')}".intern
75
- end
76
- end
77
-
78
- module ActionView
79
- def self.included(base)
80
- base.class_eval do
81
- # To make sure we're called *after* the method is defined
82
- undef_method :sanitize
83
-
84
- # Overrides ActionView's sanitize() helper to use +Engine#clean+
85
- #
86
- # FIXME: Options are currently ignored.
87
- #
88
- def sanitize(string, options = {})
89
- Engine.clean(string)
90
- end
91
- end
92
- end
93
-
94
- end
95
-
96
- # Adds the +sanitizes+ method to ActiveRecord children classes
97
- #
98
- module ActiveRecord
99
- # Generates before_save/before_create filters that implement
100
- # sanitization on the given fields, in the given callback
101
- # point.
102
- #
103
- # Usage:
104
- #
105
- # sanitizes :some_field, :some_other_field #, :on => :save
106
- #
107
- # Valid callback points are :save and :create, callbacks are installed "before_"
108
- # by default. Generated callbacks are named with the "sanitize_" prefix follwed
109
- # by the field names separated by an underscore.
110
- #
111
- def sanitizes(*fields)
112
- options = fields.extract_options!
113
- callback = Engine.callback_for(options)
114
- sanitizer = Engine.method_for(fields)
115
-
116
- define_method(sanitizer) do # # Unrolled version
117
- fields.each do |field| #
118
- value = send(field)
119
- unless value.blank? # def sanitize_fieldA_fieldB
120
- sanitized = Engine.clean(value) # self.fieldA = Engine.clean(self.fieldA) unless fieldA.blank?
121
- send("#{field}=", sanitized) # self.fieldB = Engine.clean(self.fieldB) unless fieldB.blank?
122
- end # end
123
- end #
124
- end # end
125
-
126
- protected sanitizer # protected :sanitize_fieldA_fieldB
127
- send callback, sanitizer # before_save :sanitize_fieldA_fieldB
128
- end
129
- end
130
-
131
- # Adds two `sanitize_as_html{,!}` helpers to String itself,
132
- # that call +Engine#clean+ or +Engine#clean!+ in turn
133
- #
134
- module String
135
- # Calls +Engine#clean+ on this String instance
136
- #
137
- def sanitize_as_html
138
- Engine.clean(self)
139
- end
140
-
141
- # Calls +Engine#clean!+ on this String instance
142
- #
143
- def sanitize_as_html!
144
- Engine.clean!(self)
145
- end
146
- end
147
-
148
- # Test instrumentation
149
- #
150
- module TestHelpers
151
- class << self
152
- # Instruments the given base class with the +assert_sanitizes+
153
- # helper, and memoizes the given options, accessible from the
154
- # helper itself via the +valid+ and +invalid+ methods.
155
- #
156
- # Those methods contains two HTML strings, one assumed to be
157
- # "invalid" and the other, well, "valid".
158
- #
159
- # In your ActiveSupport::Testcase:
160
- #
161
- # Sanitize::Rails::TestHelpers.setup(self,
162
- # :invalid => 'some <a>string',
163
- # :valid => 'some <a>string</a>'
164
- # )
165
- #
166
- def setup(base, options = {})
167
- base.instance_eval { include TestHelpers }
168
- @@options = options
169
- end
170
-
171
- def valid; @@options[:valid] rescue nil end
172
- def invalid; @@options[:invalid] rescue nil end
173
- end
174
-
175
- # Verifies that the given `klass` sanitizes the given `fields`, by
176
- # checking both the presence of the sanitize callback and that it
177
- # works as expected, by setting the +invalid+ string first, invoking
178
- # the callback and then checking that the string has been changed
179
- # into the +valid+ one.
180
- #
181
- # If you pass an Hash as the last argument, it can contain `:valid`,
182
- # `:invalid` and `:object` keys. The first two ones override the
183
- # configured defaults, while the third executes assertions on the
184
- # specified object. If no :object is given, a new object is instantiated
185
- # by the given `klass` with no arguments.
186
- #
187
- # If neither `:valid`/`:invalid` strings are configured nor are passed
188
- # via the options, the two default strings in the method source are
189
- # used.
190
- #
191
- def assert_sanitizes(klass, *fields)
192
- options = fields.extract_options!
193
- sanitizer = Engine.method_for(fields)
194
-
195
- # Verify the callback works
196
- invalid = options[:invalid] || TestHelpers.invalid || '<b>ntani<br>'
197
- valid = options[:valid] || TestHelpers.valid || '<b>ntani<br /></b>'
198
- object = options[:object] || klass.new
199
-
200
- fields.each {|field| object.send("#{field}=", invalid) }
201
-
202
- object.send sanitizer
203
-
204
- fields.each {|field| assert_equal(valid, object.send(field)) }
205
- end
206
- end
207
33
  end
@@ -7,9 +7,9 @@ require 'sanitize/rails/version'
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "sanitize-rails"
9
9
  s.version = Sanitize::Rails::VERSION
10
- s.date = "2014-03-14"
11
- s.authors = ["Marcello Barnaba", "Damien Wilson"]
12
- s.email = ["vjt@openssl.it", "damien@mindglob.com"]
10
+ s.date = "2014-06-05"
11
+ s.authors = ["Marcello Barnaba", "Damien Wilson", "Fabio Napoleoni"]
12
+ s.email = ["vjt@openssl.it", "damien@mindglob.com", "f.napoleoni@gmail.com"]
13
13
  s.homepage = "http://github.com/vjt/sanitize-rails"
14
14
  s.summary = "A sanitizer bridge for Rails applications"
15
15
  s.license = "MIT"
@@ -1,9 +1,5 @@
1
1
  require 'test_helper'
2
2
 
3
- require 'action_view'
4
- require 'sanitize'
5
- require 'sanitize/rails'
6
-
7
3
  # Test suite for Sanitize::Rails::Engine
8
4
  class SanitizeRailsEngineTest < Minitest::Test
9
5
  def setup
@@ -1,9 +1,5 @@
1
1
  require 'test_helper'
2
2
 
3
- require 'action_view'
4
- require 'sanitize'
5
- require 'sanitize/rails'
6
-
7
3
  # Test suite for Sanitize::Rails::Engine
8
4
  class SanitizeRailsStringExtensionTest < Minitest::Test
9
5
  SanitizableString = Class.new(String) { include Sanitize::Rails::String }
data/test/test_helper.rb CHANGED
@@ -1 +1,5 @@
1
1
  require 'minitest/autorun'
2
+
3
+ require 'action_view'
4
+
5
+ require 'sanitize/rails'
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sanitize-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcello Barnaba
8
8
  - Damien Wilson
9
+ - Fabio Napoleoni
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2014-03-14 00:00:00.000000000 Z
13
+ date: 2014-06-05 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rails
@@ -43,6 +44,7 @@ description:
43
44
  email:
44
45
  - vjt@openssl.it
45
46
  - damien@mindglob.com
47
+ - f.napoleoni@gmail.com
46
48
  executables: []
47
49
  extensions: []
48
50
  extra_rdoc_files: []
@@ -50,12 +52,19 @@ files:
50
52
  - ".gitignore"
51
53
  - ".travis.yml"
52
54
  - Gemfile
55
+ - LICENSE
53
56
  - README.md
54
57
  - Rakefile
55
58
  - example/sanitizer.rb
56
59
  - lib/sanitize/rails.rb
60
+ - lib/sanitize/rails/action_view.rb
61
+ - lib/sanitize/rails/active_record.rb
62
+ - lib/sanitize/rails/engine.rb
63
+ - lib/sanitize/rails/matchers.rb
64
+ - lib/sanitize/rails/railtie.rb
65
+ - lib/sanitize/rails/string.rb
66
+ - lib/sanitize/rails/test_helpers.rb
57
67
  - lib/sanitize/rails/version.rb
58
- - lib/sanitize/railtie.rb
59
68
  - sanitize-rails.gemspec
60
69
  - test/sanitize_rails_engine_test.rb
61
70
  - test/sanitize_rails_string_extension_test.rb
@@ -1,19 +0,0 @@
1
- require 'sanitize/rails'
2
-
3
- class Sanitize::Railtie < ::Rails::Railtie
4
- initializer 'sanitize-rails.insert_into_action_view' do
5
- ActiveSupport.on_load :action_view do
6
- ActionView::Helpers::SanitizeHelper.instance_eval { include Sanitize::Rails::ActionView }
7
- end
8
- end
9
-
10
- initializer 'sanitize-rails.insert_into_active_record' do
11
- ActiveSupport.on_load :active_record do
12
- ActiveRecord::Base.extend Sanitize::Rails::ActiveRecord
13
- end
14
- end
15
-
16
- initializer 'sanitie-rails.insert_into_string' do
17
- ::String.instance_eval { include Sanitize::Rails::String }
18
- end
19
- end