xss_shield 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ERB::Util are properly escaped.
4
+ class ErbUtilTest< Test::Unit::TestCase
5
+
6
+ # h is an alias for html_escape.
7
+ def test_html_escape
8
+ assert_render({
9
+ # Test that we automatically escape
10
+ %(<%= "Foo & Bar" %>) => %(Foo &amp; Bar),
11
+ %(<%= "Foo &amp; Bar" %>) => %(Foo &amp;amp; Bar),
12
+
13
+ # Test that we don't escape twice with h
14
+ %(<%= h "Foo & Bar" %>) => %(Foo &amp; Bar),
15
+ %(<%= h "Foo &amp; Bar" %>) => %(Foo &amp;amp; Bar),
16
+
17
+ # Test that xss_safe works
18
+ %(<%= "Foo & Bar".xss_safe %>) => %(Foo & Bar),
19
+ %(<%= "Foo &amp; Bar".xss_safe %>) => %(Foo &amp; Bar),
20
+ })
21
+ end
22
+
23
+ # j is an alias for json_escape.
24
+ def test_json_escape
25
+ assert_render(
26
+ %(<%= j "is a > 0 & a < 10?" %>) =>
27
+ %(is a \\u003E 0 \\u0026 a \\u003C 10?))
28
+ end
29
+
30
+ end
@@ -0,0 +1 @@
1
+ Hello world!
@@ -0,0 +1,79 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ActionView::Helpers::FormHelper are properly escaped.
4
+ class FormHelperTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @options = { :locals => { :@foo => stub(:bar => "f&b") } }
8
+ end
9
+
10
+ def test_check_box
11
+ assert_render({
12
+ %(<%= check_box :foo, :bar %>) => %(
13
+ <input name="foo[bar]" type="checkbox" id="foo_bar" value="1" /><input name="foo[bar]" type="hidden" value="0" />)
14
+ }, @options)
15
+ end
16
+
17
+ def test_fields_for
18
+ assert_render({
19
+ %(<% fields_for @foo.bar do |fields| %>Field: <%= fields.check_box :field %><% end %>) => %(
20
+ Field: <input name="f&amp;b[field]" type="checkbox" id="f_b_field" value="1" /><input name="f&amp;b[field]" type="hidden" value="0" />)
21
+ }, @options)
22
+ end
23
+
24
+ def test_file_field
25
+ assert_render({
26
+ %(<%= file_field :foo, :bar, :class => "f&b" %>) => %(
27
+ <input name="foo[bar]" size="30" class="f&amp;b" type="file" id="foo_bar" />)
28
+ }, @options)
29
+ end
30
+
31
+ def test_form_for
32
+ assert_render({
33
+ %(<% form_for :foo do |f| %>Bar: <%= f.text_field :bar %><% end %>) => %(
34
+ <form action="/test/foobar" method="post">Bar: <input name="foo[bar]" size="30" type="text" id="foo_bar" value="f&amp;b" /></form>)
35
+ }, @options)
36
+ end
37
+
38
+ def test_hidden_field
39
+ assert_render({
40
+ %(<%= hidden_field :foo, :bar %>) => %(
41
+ <input name="foo[bar]" type="hidden" id="foo_bar" value="f&amp;b" />)
42
+ }, @options)
43
+ end
44
+
45
+ def test_label
46
+ assert_render({
47
+ %(<%= label :foo, :bar, 'f&b' %>) => %(<label for="foo_bar">f&b</label>)
48
+ }, @options)
49
+ end
50
+
51
+ def test_password_field
52
+ assert_render({
53
+ %(<%= password_field :foo, :bar %>) => %(
54
+ <input name="foo[bar]" size="30" type="password" id="foo_bar" value="f&amp;b" />)
55
+ }, @options)
56
+ end
57
+
58
+ def test_radio_button
59
+ assert_render({
60
+ %(<%= radio_button :foo, :bar, 'f&b' %>) => %(
61
+ <input name="foo[bar]" checked="checked" type="radio" id="foo_bar_fb" value="f&amp;b" />)
62
+ }, @options)
63
+ end
64
+
65
+ def test_text_area
66
+ assert_render({
67
+ %(<%= text_area :foo, :bar %>) => %(
68
+ <textarea name="foo[bar]" id="foo_bar" rows="20" cols="40">f&amp;b</textarea>)
69
+ }, @options)
70
+ end
71
+
72
+ def test_text_field
73
+ assert_render({
74
+ %(<%= text_field :foo, :bar %>) => %(
75
+ <input name="foo[bar]" size="30" type="text" id="foo_bar" value="f&amp;b" />)
76
+ }, @options)
77
+ end
78
+
79
+ end
@@ -0,0 +1,69 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ActionView::Helpers::FormOptionsHelper are properly
4
+ # escaped.
5
+ class FormOptionsHelperTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @options = {
9
+ :locals => { :@collection => [ stub(:key => 'a&b', :val => 'c&d') ] }
10
+ }
11
+ end
12
+
13
+ def test_collection_select
14
+ assert_render({
15
+ %(<%= collection_select :foo, :bar, @collection, :key, :val %>) => %(
16
+ <select name="foo[bar]" id="foo_bar"><option value="a&amp;b">c&amp;d</option></select>)
17
+ }, @options)
18
+ end
19
+
20
+ def test_country_options_for_select
21
+ assert_render_has_no_escaped_chars %(<%= country_options_for_select %>")
22
+ end
23
+
24
+ def test_country_select
25
+ assert_render_has_no_escaped_chars %(<%= country_select :foo, :bar %>)
26
+ end
27
+
28
+ def test_option_groups_from_collection_for_select
29
+ continents = [
30
+ stub(:id => 1,
31
+ :name => 'a&b',
32
+ :countries => [ stub(:id => 1, :name => 'c&d') ])
33
+ ]
34
+ assert_render({
35
+ %(<%= option_groups_from_collection_for_select @continents, :countries, :name, :id, :name %>) => %(
36
+ <optgroup label="a&amp;b"><option value="1">c&amp;d</option></optgroup>)
37
+ },
38
+ { :locals => { :@continents => continents } })
39
+ end
40
+
41
+ def test_options_for_select
42
+ assert_render(
43
+ %(<%= options_for_select 'a&b', 'c&d' %>) => %(
44
+ <option value="a&amp;b">a&amp;b</option>))
45
+ end
46
+
47
+ def test_options_from_collection_for_select
48
+ assert_render({
49
+ %(<%= options_from_collection_for_select @collection, :key, :val %>) => %(
50
+ <option value="a&amp;b">c&amp;d</option>)
51
+ }, @options)
52
+ end
53
+
54
+ def test_select
55
+ assert_render({
56
+ %(<%= select :foo, :bar, [['a&b', 'c&d']] %>) => %(
57
+ <select name="foo[bar]" id="foo_bar"><option value="c&amp;d">a&amp;b</option></select>)
58
+ })
59
+ end
60
+
61
+ def test_time_zone_options_for_select
62
+ assert_render_has_no_escaped_chars %(<%= time_zone_options_for_select %>")
63
+ end
64
+
65
+ def test_time_zone_select
66
+ assert_render_has_no_escaped_chars %(<%= time_zone_select :foo, :bar %>)
67
+ end
68
+
69
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ActionView::Helpers::FormTagHelper are properly
4
+ # escaped.
5
+ class FormTagHelperTest < Test::Unit::TestCase
6
+
7
+ def test_check_box_tag
8
+ assert_render(
9
+ %(<%= check_box_tag 'foobar' %>) => %(
10
+ <input name="foobar" type="checkbox" id="foobar" value="1"#{XHTML_TAGS}>))
11
+ end
12
+
13
+ def test_field_set_tag
14
+ assert_render(
15
+ %(<% field_set_tag 'foo&bar' do %><%= text_field_tag 'boo' %><% end %>) => %(
16
+ <fieldset><legend>foo&bar</legend><input name="boo" type="text" id=\
17
+ "boo"#{XHTML_TAGS}></fieldset>))
18
+ end
19
+
20
+ def test_file_field_tag
21
+ assert_render(
22
+ %(<%= file_field_tag 'foo&bar' %>) => %(
23
+ <input name="foo&amp;bar" type="file" id="foo&amp;bar"#{XHTML_TAGS}>))
24
+ end
25
+
26
+ def test_form_tag
27
+ assert_render(
28
+ %(<% form_tag '/foobar' do %><%= submit_tag 'f&b' %><% end %>) => %(
29
+ <form action="/foobar" method="post"><input name="commit" type="submit"\
30
+ value="f&amp;b"#{XHTML_TAGS}></form>))
31
+ end
32
+
33
+ def test_hidden_field_tag
34
+ assert_render(
35
+ %(<%= hidden_field_tag 'foo&bar' %>) => %(
36
+ <input name="foo&amp;bar" type="hidden" id="foo&amp;bar"#{XHTML_TAGS}>))
37
+ end
38
+
39
+ def test_image_submit_tag
40
+ assert_render(
41
+ %(<%= image_submit_tag 'foo&bar.png' %>) => %(
42
+ <input type="image" src="/images/foo&amp;bar.png"#{XHTML_TAGS}>))
43
+ end
44
+
45
+ def test_label_tag
46
+ assert_render(
47
+ %(<%= label_tag 'foo&bar' %>) => %(
48
+ <label for="foo&amp;bar">Foo&bar</label>))
49
+ end
50
+
51
+ def test_password_field_tag
52
+ assert_render(
53
+ %(<%= password_field_tag 'foo&bar' %>) => %(
54
+ <input name="foo&amp;bar" type="password" id="foo&amp;bar"#{XHTML_TAGS}>))
55
+ end
56
+
57
+ def test_radio_button_tag
58
+ assert_render(
59
+ %(<%= radio_button_tag 'foo&bar', 'a&b' %>) => %(
60
+ <input name="foo&amp;bar" type="radio" id="foo&amp;bar_ab" value=\
61
+ "a&amp;b"#{XHTML_TAGS}>))
62
+ end
63
+
64
+ def test_select_tag
65
+ assert_render(
66
+ %(<%= select_tag 'foo&bar' %>) => %(
67
+ <select name="foo&amp;bar" id="foo&amp;bar"></select>))
68
+ end
69
+
70
+ def test_submit_tag
71
+ assert_render(
72
+ %(<%= submit_tag 'foo&bar' %>) => %(
73
+ <input name="commit" type="submit" value="foo&amp;bar"#{XHTML_TAGS}>))
74
+ end
75
+
76
+ def test_text_area_tag
77
+ assert_render(
78
+ %(<%= text_area_tag 'foo&bar' %>) => %(
79
+ <textarea name="foo&amp;bar" id="foo&amp;bar"></textarea>))
80
+ end
81
+
82
+ def test_text_field_tag
83
+ assert_render(
84
+ %(<%= text_field_tag 'foo&bar' %>) => %(
85
+ <input name="foo&amp;bar" type="text" id="foo&amp;bar"#{XHTML_TAGS}>))
86
+ end
87
+
88
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ActionView::Helpers::JavaScriptHelper are properly
4
+ # escaped.
5
+ class JavascriptHelperTest < Test::Unit::TestCase
6
+
7
+ def test_button_to_function
8
+ assert_render(
9
+ %(<%= button_to_function 'foo&bar', "alert('foo&bar')" %>) => %(
10
+ <input type="button" value="foo&amp;bar" onclick="alert('foo&amp;bar');\
11
+ "#{XHTML_TAGS}>))
12
+ end
13
+
14
+ def test_escape_javascript
15
+ assert_render(
16
+ %(<%= escape_javascript "alert('foo&bar');" %>) =>
17
+ %(alert(\\'foo&amp;bar\\');))
18
+ end
19
+
20
+ def test_javascript_tag
21
+ assert_render(
22
+ %(<%= javascript_tag "alert('foo&bar');" %>) => %(
23
+ <script type="text/javascript">\n//<![CDATA[\nalert('foo&bar');\n//]]>\
24
+ \n</script>))
25
+ end
26
+
27
+ def test_link_to_function
28
+ assert_render(
29
+ %(<%= link_to_function 'foo&bar', "alert('foo&bar')" %>) => %(
30
+ <a href="#" onclick="alert('foo&amp;bar'); return false;">foo&bar</a>))
31
+ end
32
+
33
+ end
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ActionView::Helpers::PrototypeHelper are escaped
4
+ # correctly.
5
+ class PrototypeHelperTest < Test::Unit::TestCase
6
+
7
+ def test_evaluate_remote_response
8
+ assert_render(
9
+ %(<%= evaluate_remote_response %>) => %(eval(request.responseText)))
10
+ end
11
+
12
+ # Alias for remote_form_for.
13
+ def test_form_remote_for
14
+ assert_render_has_no_escaped_chars(
15
+ %(<% form_remote_for :post do |f| %><% end %>))
16
+ end
17
+
18
+ def test_form_remote_tag
19
+ assert_render_has_no_escaped_chars(%(<% form_remote_tag do %><% end %>))
20
+ end
21
+
22
+ def test_link_to_remote
23
+ assert_render_has_no_escaped_chars(
24
+ %(<%= link_to_remote 'foo&bar', :update => "alert('foo&bar')" %>))
25
+ end
26
+
27
+ def test_observe_field
28
+ assert_render_has_no_escaped_chars(%(<%= observe_field 'foo&bar' %>))
29
+ end
30
+
31
+ def test_observe_form
32
+ assert_render_has_no_escaped_chars %(<%= observe_form 'foo&bar' %>)
33
+ end
34
+ def test_periodically_call_remote
35
+ assert_render(
36
+ %(<%= periodically_call_remote %>) => %(
37
+ <script type="text/javascript">\n//<![CDATA[
38
+ new PeriodicalExecuter(function() {new Ajax.Request('/test/foobar', \
39
+ {asynchronous:true, evalScripts:true})}, 10)\n//]]>\n</script>))
40
+ end
41
+
42
+ def test_remote_form_for
43
+ assert_render_has_no_escaped_chars(
44
+ %(<% remote_form_for :post do |f| %><% end %>))
45
+ end
46
+
47
+ def test_remote_function
48
+ assert_render_has_no_escaped_chars(
49
+ %(<% remote_form_for :post do |f| %><% end %>))
50
+ end
51
+
52
+ def test_submit_to_remote
53
+ assert_render(
54
+ %(<%= submit_to_remote 'foo&bar', 'f&b' %>) => %(
55
+ <input name="foo&amp;bar" value="f&amp;b" type="button" onclick="\
56
+ new Ajax.Request('/test/foobar', {asynchronous:true, evalScripts:true, \
57
+ parameters:Form.serialize(this.form)}); return false;"#{XHTML_TAGS}>))
58
+ end
59
+
60
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ class SafeStringTest < Test::Unit::TestCase
4
+
5
+ include ERB::Util
6
+
7
+ def test_safe_string
8
+ assert_equal "foo", "foo".to_xss_safe
9
+ assert_equal "foo &amp; bar", "foo & bar".to_xss_safe
10
+ assert_equal "foo &amp; bar", "foo & bar".to_xss_safe
11
+ assert_equal "foo &amp;amp; bar", "foo &amp; bar".to_xss_safe
12
+ assert_equal "foo &amp; bar", "foo & bar".to_xss_safe.to_xss_safe
13
+ assert_equal "foo &amp; bar", h("foo & bar").to_xss_safe
14
+ assert_equal "foo &amp;amp; bar", h(h("foo & bar"))
15
+
16
+ assert_not_equal "foo".xss_safe.object_id, "foo".xss_safe.object_id
17
+ x = "foo & bar".xss_safe
18
+ assert_equal x.xss_safe, x
19
+ # Not sure if this makes sense
20
+ assert_not_equal x.xss_safe.object_id, x.object_id
21
+
22
+ assert_equal x.to_s, x
23
+ assert_equal x.to_s.object_id, x.object_id
24
+ end
25
+
26
+ def test_nonstring_objects
27
+ assert_equal "15", 15.to_xss_safe
28
+ assert_equal SafeString, 15.to_xss_safe.class
29
+ end
30
+
31
+ def test_nil
32
+ assert_equal "", nil.to_xss_safe
33
+ assert_equal SafeString, nil.to_xss_safe.class
34
+ assert_equal nil, nil.xss_safe
35
+ end
36
+
37
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that ERBs still work correctly.
4
+ # See /usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/test/template/template_object_test.rb.
5
+ class TemplateObjectTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @view = ActionView::Base.new(VIEW_PATH)
9
+ @path = "hello_world.erb"
10
+ end
11
+
12
+ def test_should_create_valid_template
13
+ template = ActionView::Template.new(@view, @path, true)
14
+
15
+ assert_kind_of ActionView::TemplateHandlers::ERB, template.handler
16
+ assert_equal "hello_world.erb", template.path
17
+ assert_nil template.instance_variable_get(:"@source")
18
+ assert_equal "erb", template.extension
19
+ end
20
+
21
+ def test_should_prepare_template_properly
22
+ template = ActionView::Template.new(@view, @path, true)
23
+ view = template.instance_variable_get(:"@view")
24
+
25
+ view.expects(:evaluate_assigns)
26
+ template.handler.expects(:compile_template).with(template)
27
+ view.expects(:method_names).returns({})
28
+
29
+ template.prepare!
30
+ end
31
+
32
+ end
33
+
@@ -0,0 +1,71 @@
1
+ # Loads the test environment. First try to load the Rails environment if we're
2
+ # in a Rails project. Otherwise just load the libraries that we need.
3
+ CUR_DIR = File.dirname(__FILE__)
4
+ $LOAD_PATH << "#{CUR_DIR}/../lib"
5
+ begin
6
+ require File.expand_path "#{CUR_DIR}/../../../../test/test_helper"
7
+ rescue LoadError
8
+ require 'rubygems'
9
+ gem 'rails', '=2.1.2'
10
+ require 'active_record'
11
+ require 'action_controller'
12
+ require 'action_controller/test_process'
13
+ require 'action_view/test_case'
14
+ require 'mocha'
15
+ require 'test/unit'
16
+ end
17
+ require 'init'
18
+
19
+ # Disable deprecation warnings.
20
+ ActiveSupport::Deprecation.silenced = true
21
+
22
+ # Rails creates all HTML form elements as XHTML by default. We override this in
23
+ # Studio, so make sure the tests here handle that.
24
+ XHTML_TAGS = ' /' # set this to ' /' if you don't override this in your app
25
+
26
+ class ActionView::Base
27
+ # Disable forgery protection.
28
+ def protect_against_forgery?
29
+ false
30
+ end
31
+ end
32
+
33
+ # Define helper methods here for use in the rest of the test classes.
34
+ class Test::Unit::TestCase
35
+
36
+ VIEW_PATH = File.join(File.dirname(__FILE__), 'fixtures')
37
+ ActionView::TemplateFinder.process_view_paths(VIEW_PATH)
38
+
39
+ private
40
+
41
+ def assert_render_has_no_escaped_chars(input, options = {})
42
+ actual = render_erb(input, options[:locals])
43
+ assert !actual.include?('&lt;'), "Output contains &lt;"
44
+ assert !actual.include?('&gt;'), "Output contains &gt;"
45
+ end
46
+
47
+ def assert_render(args, options = {})
48
+ args.each do |erb, expected|
49
+ expected.strip!
50
+ actual = render_erb(erb, options[:locals])
51
+ assert_dom_equal expected, actual, "#{erb} => #{expected}"
52
+ end
53
+ end
54
+
55
+ def render_erb(erb, locals = {})
56
+ # Need this to make asset packager happy.
57
+ request = mock()
58
+ request.stubs(:relative_url_root).returns('')
59
+ request.stubs(:request_uri).returns('/test/foobar')
60
+ request.stubs(:url_for).returns('/test/foobar')
61
+ request.stubs(:protocol).returns('http://')
62
+ request.stubs(:ssl?).returns(false)
63
+ controller = mock()
64
+ controller.stubs(:request).returns(request)
65
+ controller.stubs(:url_for).returns('/test/foobar')
66
+
67
+ view = ActionView::Base.new(VIEW_PATH, {}, controller)
68
+ ActionView::InlineTemplate.new(view, erb, locals).render.strip
69
+ end
70
+
71
+ end
@@ -0,0 +1,53 @@
1
+ require File.dirname(__FILE__) + '/../test/test_helper'
2
+
3
+ # Test that helpers from ActionView::Helpers::UrlHelper are properly
4
+ # escaped.
5
+ class UrlHelperTest < Test::Unit::TestCase
6
+
7
+ def test_button_to
8
+ assert_render(
9
+ %(<%= button_to 'foo&bar', :action => :boo %>) => %(
10
+ <form class="button-to" action="/test/foobar" method="post"><div>\
11
+ <input type="submit" value="foo&amp;bar"#{XHTML_TAGS}></div></form>))
12
+ end
13
+
14
+ def test_current_page?
15
+ assert_render(
16
+ %(<%= current_page? :action => :foobar %>) => %(true))
17
+ end
18
+
19
+ def test_link_to
20
+ assert_render(
21
+ %(<%= link_to 'foo&bar', :action => :boo %>) => %(
22
+ <a href="/test/foobar">foo&amp;bar</a>))
23
+ end
24
+
25
+ def test_link_to_if
26
+ assert_render(
27
+ %(<%= link_to_if true, 'foo&bar', :action => :boo %>) => %(
28
+ <a href="/test/foobar">foo&amp;bar</a>))
29
+ end
30
+
31
+ def test_link_to_unless
32
+ assert_render(
33
+ %(<%= link_to_unless false, 'foo&bar', :action => :boo %>) => %(
34
+ <a href="/test/foobar">foo&amp;bar</a>))
35
+ end
36
+
37
+ def test_link_to_unless_current
38
+ assert_render(
39
+ %(<%= link_to_unless_current 'foo&bar', :action => :boo %>) => %(
40
+ foo&amp;bar))
41
+ end
42
+
43
+ def test_mail_to
44
+ assert_render(
45
+ %(<%= mail_to 'foo@bar.com' %>) => %(
46
+ <a href="mailto:foo@bar.com">foo@bar.com</a>))
47
+ end
48
+
49
+ def test_url_for
50
+ assert_render %(<%= url_for :action => :foobar %>) => %(/test/foobar)
51
+ end
52
+
53
+ end
@@ -0,0 +1,76 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{xss_shield}
8
+ s.version = "1.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["James Tan"]
12
+ s.date = %q{2009-10-07}
13
+ s.description = %q{This Rails plugin provides automatic cross site scripting (XSS) protection for your views. Once installed, you no longer have to manually and painstakingly sanitize all your views with HTML escaping.}
14
+ s.email = %q{jamestyj@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ "MIT-LICENSE",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "init.rb",
24
+ "lib/xss_shield.rb",
25
+ "lib/xss_shield/erb_hacks.rb",
26
+ "lib/xss_shield/safe_string.rb",
27
+ "lib/xss_shield/secure_helpers.rb",
28
+ "test/active_record_helper_test.rb",
29
+ "test/asset_package_test.rb",
30
+ "test/asset_tag_helper_test.rb",
31
+ "test/date_helper_test.rb",
32
+ "test/erb_util_test.rb",
33
+ "test/fixtures/hello_world.erb",
34
+ "test/form_helper_test.rb",
35
+ "test/form_options_helper_test.rb",
36
+ "test/form_tag_helper_test.rb",
37
+ "test/javascript_helper_test.rb",
38
+ "test/prototype_helper_test.rb",
39
+ "test/safe_string_test.rb",
40
+ "test/template_object_test.rb",
41
+ "test/test_helper.rb",
42
+ "test/url_helper_test.rb",
43
+ "xss_shield.gemspec"
44
+ ]
45
+ s.homepage = %q{http://github.com/jamestyj/xss_shield}
46
+ s.rdoc_options = ["--charset=UTF-8"]
47
+ s.require_paths = ["lib"]
48
+ s.rubygems_version = %q{1.3.5}
49
+ s.summary = %q{Protect your Rails site from XSS attacks.}
50
+ s.test_files = [
51
+ "test/asset_tag_helper_test.rb",
52
+ "test/asset_package_test.rb",
53
+ "test/prototype_helper_test.rb",
54
+ "test/erb_util_test.rb",
55
+ "test/date_helper_test.rb",
56
+ "test/template_object_test.rb",
57
+ "test/form_options_helper_test.rb",
58
+ "test/url_helper_test.rb",
59
+ "test/test_helper.rb",
60
+ "test/active_record_helper_test.rb",
61
+ "test/javascript_helper_test.rb",
62
+ "test/safe_string_test.rb",
63
+ "test/form_helper_test.rb",
64
+ "test/form_tag_helper_test.rb"
65
+ ]
66
+
67
+ if s.respond_to? :specification_version then
68
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
69
+ s.specification_version = 3
70
+
71
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
72
+ else
73
+ end
74
+ else
75
+ end
76
+ end