tarantula 0.0.5

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.
Files changed (118) hide show
  1. data/CHANGELOG +2 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +106 -0
  4. data/Rakefile +80 -0
  5. data/init.rb +1 -0
  6. data/install.rb +1 -0
  7. data/laf/images/background.jpg +0 -0
  8. data/laf/images/relevance-os-logo.gif +0 -0
  9. data/laf/images/tab.png +0 -0
  10. data/laf/images/table-sort.gif +0 -0
  11. data/laf/images/tarantula-sprites.png +0 -0
  12. data/laf/javascripts/jquery-1.2.3.js +3408 -0
  13. data/laf/javascripts/jquery-ui-tabs.js +890 -0
  14. data/laf/javascripts/jquery.tablesorter.js +861 -0
  15. data/laf/javascripts/tarantula.js +10 -0
  16. data/laf/stylesheets/tarantula.css +638 -0
  17. data/laf/stylesheets/ui.tabs.css +113 -0
  18. data/lib/relevance/core_extensions/ellipsize.rb +34 -0
  19. data/lib/relevance/core_extensions/file.rb +9 -0
  20. data/lib/relevance/core_extensions/response.rb +9 -0
  21. data/lib/relevance/core_extensions/test_case.rb +12 -0
  22. data/lib/relevance/tarantula.rb +63 -0
  23. data/lib/relevance/tarantula/attack.rb +15 -0
  24. data/lib/relevance/tarantula/attack_form_submission.rb +75 -0
  25. data/lib/relevance/tarantula/attack_handler.rb +37 -0
  26. data/lib/relevance/tarantula/crawler.rb +240 -0
  27. data/lib/relevance/tarantula/detail.html.erb +77 -0
  28. data/lib/relevance/tarantula/form.rb +21 -0
  29. data/lib/relevance/tarantula/form_submission.rb +70 -0
  30. data/lib/relevance/tarantula/html_document_handler.rb +36 -0
  31. data/lib/relevance/tarantula/html_report_helper.rb +56 -0
  32. data/lib/relevance/tarantula/html_reporter.rb +105 -0
  33. data/lib/relevance/tarantula/index.html.erb +48 -0
  34. data/lib/relevance/tarantula/invalid_html_handler.rb +18 -0
  35. data/lib/relevance/tarantula/io_reporter.rb +34 -0
  36. data/lib/relevance/tarantula/link.rb +56 -0
  37. data/lib/relevance/tarantula/log_grabber.rb +16 -0
  38. data/lib/relevance/tarantula/rails_integration_proxy.rb +70 -0
  39. data/lib/relevance/tarantula/recording.rb +12 -0
  40. data/lib/relevance/tarantula/response.rb +13 -0
  41. data/lib/relevance/tarantula/result.rb +66 -0
  42. data/lib/relevance/tarantula/test_report.html.erb +34 -0
  43. data/lib/relevance/tarantula/tidy_handler.rb +32 -0
  44. data/lib/relevance/tarantula/transform.rb +17 -0
  45. data/manifest.txt +117 -0
  46. data/rails/init.rb +1 -0
  47. data/tarantula.gemspec +48 -0
  48. data/tasks/tarantula_tasks.rake +34 -0
  49. data/template/tarantula_test.rb +12 -0
  50. data/test/relevance/core_extensions/ellipsize_test.rb +19 -0
  51. data/test/relevance/core_extensions/file_test.rb +8 -0
  52. data/test/relevance/core_extensions/response_test.rb +29 -0
  53. data/test/relevance/core_extensions/test_case_test.rb +16 -0
  54. data/test/relevance/tarantula/attack_form_submission_test.rb +79 -0
  55. data/test/relevance/tarantula/attack_handler_test.rb +29 -0
  56. data/test/relevance/tarantula/crawler_test.rb +296 -0
  57. data/test/relevance/tarantula/form_submission_test.rb +71 -0
  58. data/test/relevance/tarantula/form_test.rb +50 -0
  59. data/test/relevance/tarantula/html_document_handler_test.rb +43 -0
  60. data/test/relevance/tarantula/html_report_helper_test.rb +47 -0
  61. data/test/relevance/tarantula/html_reporter_test.rb +82 -0
  62. data/test/relevance/tarantula/invalid_html_handler_test.rb +33 -0
  63. data/test/relevance/tarantula/io_reporter_test.rb +11 -0
  64. data/test/relevance/tarantula/link_test.rb +61 -0
  65. data/test/relevance/tarantula/log_grabber_test.rb +26 -0
  66. data/test/relevance/tarantula/rails_integration_proxy_test.rb +94 -0
  67. data/test/relevance/tarantula/result_test.rb +85 -0
  68. data/test/relevance/tarantula/tidy_handler_test.rb +58 -0
  69. data/test/relevance/tarantula/transform_test.rb +21 -0
  70. data/test/relevance/tarantula_test.rb +23 -0
  71. data/test/test_helper.rb +34 -0
  72. data/tmp/test_output/images/background.jpg +0 -0
  73. data/tmp/test_output/images/relevance-os-logo.gif +0 -0
  74. data/tmp/test_output/images/tab.png +0 -0
  75. data/tmp/test_output/images/table-sort.gif +0 -0
  76. data/tmp/test_output/images/tarantula-sprites.png +0 -0
  77. data/tmp/test_output/index.html +255 -0
  78. data/tmp/test_output/javascripts/jquery-1.2.3.js +3408 -0
  79. data/tmp/test_output/javascripts/jquery-ui-tabs.js +890 -0
  80. data/tmp/test_output/javascripts/jquery.tablesorter.js +861 -0
  81. data/tmp/test_output/javascripts/tarantula.js +10 -0
  82. data/tmp/test_output/stylesheets/tarantula.css +638 -0
  83. data/tmp/test_output/stylesheets/ui.tabs.css +113 -0
  84. data/tmp/test_output/test_user_pages/1.html +71 -0
  85. data/tmp/test_output/test_user_pages/10.html +71 -0
  86. data/tmp/test_output/test_user_pages/11.html +71 -0
  87. data/tmp/test_output/test_user_pages/12.html +71 -0
  88. data/tmp/test_output/test_user_pages/13.html +71 -0
  89. data/tmp/test_output/test_user_pages/14.html +71 -0
  90. data/tmp/test_output/test_user_pages/15.html +71 -0
  91. data/tmp/test_output/test_user_pages/16.html +71 -0
  92. data/tmp/test_output/test_user_pages/17.html +71 -0
  93. data/tmp/test_output/test_user_pages/18.html +71 -0
  94. data/tmp/test_output/test_user_pages/19.html +71 -0
  95. data/tmp/test_output/test_user_pages/2.html +71 -0
  96. data/tmp/test_output/test_user_pages/20.html +71 -0
  97. data/tmp/test_output/test_user_pages/3.html +71 -0
  98. data/tmp/test_output/test_user_pages/4.html +71 -0
  99. data/tmp/test_output/test_user_pages/5.html +71 -0
  100. data/tmp/test_output/test_user_pages/6.html +71 -0
  101. data/tmp/test_output/test_user_pages/7.html +71 -0
  102. data/tmp/test_output/test_user_pages/8.html +71 -0
  103. data/tmp/test_output/test_user_pages/9.html +71 -0
  104. data/uninstall.rb +1 -0
  105. data/vendor/xss-shield/MIT-LICENSE +20 -0
  106. data/vendor/xss-shield/README +76 -0
  107. data/vendor/xss-shield/init.rb +16 -0
  108. data/vendor/xss-shield/lib/xss_shield.rb +6 -0
  109. data/vendor/xss-shield/lib/xss_shield/erb_hacks.rb +111 -0
  110. data/vendor/xss-shield/lib/xss_shield/haml_hacks.rb +42 -0
  111. data/vendor/xss-shield/lib/xss_shield/safe_string.rb +47 -0
  112. data/vendor/xss-shield/lib/xss_shield/secure_helpers.rb +40 -0
  113. data/vendor/xss-shield/test/test_actionview_integration.rb +40 -0
  114. data/vendor/xss-shield/test/test_erb.rb +44 -0
  115. data/vendor/xss-shield/test/test_haml.rb +43 -0
  116. data/vendor/xss-shield/test/test_helpers.rb +25 -0
  117. data/vendor/xss-shield/test/test_safe_string.rb +55 -0
  118. metadata +283 -0
@@ -0,0 +1,56 @@
1
+ class Relevance::Tarantula::Link
2
+
3
+ class << self
4
+ include ActionView::Helpers::UrlHelper
5
+ # method_javascript_function needs this method
6
+ def protect_against_forgery?
7
+ false
8
+ end
9
+ end
10
+
11
+ METHOD_REGEXPS = {}
12
+ [:put, :delete, :post].each do |m|
13
+ # remove submit from the end so we'll match with or without forgery protection
14
+ s = method_javascript_function(m).gsub( /f.submit();/, "" )
15
+ # don't just match this.href in case a different url was passed originally
16
+ s = Regexp.escape(s).gsub( /this.href/, ".*" )
17
+ METHOD_REGEXPS[m] = /#{s}/
18
+ end
19
+
20
+ attr_accessor :href
21
+
22
+ def initialize(link)
23
+ if String === link || link.nil?
24
+ @href = link
25
+ @method = :get
26
+ else # should be a tag
27
+ @href = link['href'].downcase
28
+ @tag = link
29
+ end
30
+ end
31
+
32
+ def method
33
+ @method ||= begin
34
+ (@tag &&
35
+ [:put, :delete, :post].detect do |m| # post should be last since it's least specific
36
+ @tag['onclick'] =~ METHOD_REGEXPS[m]
37
+ end) ||
38
+ :get
39
+ end
40
+ end
41
+
42
+ def ==(obj)
43
+ obj.respond_to?(:href) && obj.respond_to?(:method) &&
44
+ self.href.to_s == obj.href.to_s && self.method.to_s == obj.method.to_s
45
+ end
46
+ alias :eql? :==
47
+
48
+ def hash
49
+ to_s.hash
50
+ end
51
+
52
+ def to_s
53
+ "<Relevance::Tarantula::Link href=#{href}, method=#{method}>"
54
+ end
55
+
56
+ end
@@ -0,0 +1,16 @@
1
+ class Relevance::Tarantula::LogGrabber
2
+ attr_accessor :path
3
+ def initialize(path)
4
+ @path = path
5
+ end
6
+
7
+ def clear!
8
+ File.open(@path, "w")
9
+ end
10
+
11
+ def grab!
12
+ File.read(@path)
13
+ ensure
14
+ clear!
15
+ end
16
+ end
@@ -0,0 +1,70 @@
1
+ require 'test/unit'
2
+
3
+ class Relevance::Tarantula::RailsIntegrationProxy
4
+ include Relevance::Tarantula
5
+ extend Relevance::Tarantula
6
+ extend Forwardable
7
+ attr_accessor :integration_test
8
+
9
+ def self.rails_integration_test(integration_test, options = {})
10
+ t = Crawler.new
11
+ t.max_url_length = options[:max_url_length] if options[:max_url_length]
12
+ t.proxy = RailsIntegrationProxy.new(integration_test)
13
+ t.handlers << HtmlDocumentHandler.new(t)
14
+ t.handlers << InvalidHtmlHandler.new
15
+ t.log_grabber = Relevance::Tarantula::LogGrabber.new(File.join(rails_root, "log/test.log"))
16
+ t.skip_uri_patterns << /logout$/
17
+ t.transform_url_patterns += [
18
+ [/\?\d+$/, ''], # strip trailing numbers for assets
19
+ [/^http:\/\/#{integration_test.host}/, ''] # strip full path down to relative
20
+ ]
21
+ t.test_name = t.proxy.integration_test.method_name
22
+ t.reporters << Relevance::Tarantula::HtmlReporter.new(t.report_dir)
23
+ t
24
+ end
25
+
26
+ def initialize(integration_test)
27
+ @integration_test = integration_test
28
+ @integration_test.meta.attr_accessor :response
29
+ end
30
+
31
+ [:get, :post, :put, :delete].each do |verb|
32
+ define_method(verb) do |url, *args|
33
+ integration_test.send(verb, url, *args)
34
+ response = integration_test.response
35
+ patch_response(url, response)
36
+ response
37
+ end
38
+ end
39
+
40
+ def patch_response(url, response)
41
+ if response.code == '404'
42
+ if File.exist?(static_content_path(url))
43
+ case ext = File.extension(url)
44
+ when /jpe?g|gif|psd|png|eps|pdf/
45
+ log "Skipping #{url} (for now)"
46
+ when /html|te?xt|css|js/
47
+ response.body = static_content_file(url)
48
+ response.headers["type"] = "text/#{ext}" # readable as response.content_type
49
+ response.meta.attr_accessor :code
50
+ response.code = "200"
51
+ else
52
+ log "Skipping unknown type #{url}"
53
+ end
54
+ end
55
+ end
56
+ # don't count on metaclass taking block, e.g.
57
+ # http://relevancellc.com/2008/2/12/how-should-metaclass-work
58
+ response.metaclass.class_eval do
59
+ include Relevance::CoreExtensions::Response
60
+ end
61
+ end
62
+
63
+ def static_content_file(url)
64
+ File.read(static_content_path(url))
65
+ end
66
+
67
+ def static_content_path(url)
68
+ File.expand_path(File.join(rails_root, "public", url))
69
+ end
70
+ end
@@ -0,0 +1,12 @@
1
+ module Recording
2
+ def self.stderr
3
+ $stderr = recorder = StringIO.new
4
+ begin
5
+ yield
6
+ ensure
7
+ $stderr = STDERR
8
+ end
9
+ recorder.rewind
10
+ recorder.read
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # Used to create a stub response when we didn't get back a real response
2
+ class Relevance::Tarantula::Response
3
+ HASHABLE_ATTRS = [:code, :body, :content_type]
4
+ attr_accessor *HASHABLE_ATTRS
5
+
6
+ def initialize(hash)
7
+ hash.each do |k,v|
8
+ raise ArgumentError, k unless HASHABLE_ATTRS.member?(k)
9
+ self.instance_variable_set("@#{k}", v)
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,66 @@
1
+ class Relevance::Tarantula::Result
2
+ HASHABLE_ATTRS = [:success, :method, :url, :response, :referrer, :data, :description, :log, :test_name]
3
+ DEFAULT_LOCALHOST = "http://localhost:3000"
4
+ attr_accessor *HASHABLE_ATTRS
5
+ include Relevance::Tarantula
6
+ include Relevance::Tarantula::HtmlReportHelper
7
+
8
+ def initialize(hash)
9
+ hash.each do |k,v|
10
+ raise ArgumentError, k unless HASHABLE_ATTRS.member?(k)
11
+ self.instance_variable_set("@#{k}", v)
12
+ end
13
+ end
14
+ def short_description
15
+ [method,url].join(" ")
16
+ end
17
+ def sequence_number
18
+ @sequence_number ||= (self.class.next_number += 1)
19
+ end
20
+ def file_name
21
+ "#{sequence_number}.html"
22
+ end
23
+ def code
24
+ response && response.code
25
+ end
26
+ def body
27
+ response && response.body
28
+ end
29
+ def full_url
30
+ "#{DEFAULT_LOCALHOST}#{url}"
31
+ end
32
+ ALLOW_NNN_FOR = /^allow_(\d\d\d)_for$/
33
+ class << self
34
+ attr_accessor :next_number
35
+ def handle(result)
36
+ retval = result.dup
37
+ retval.success = successful?(result.response) || can_skip_error?(result)
38
+ retval.description = "Bad HTTP Response" unless retval.success
39
+ retval
40
+ end
41
+ def success_codes
42
+ %w{200 201 302 401}
43
+ end
44
+
45
+ # allow_errors_for is a hash
46
+ # k=error code,
47
+ # v=array of matchers for urls that can skip said error
48
+ attr_accessor :allow_errors_for
49
+ def can_skip_error?(result)
50
+ coll = allow_errors_for[result.code]
51
+ return false unless coll
52
+ coll.any? {|item| item === result.url}
53
+ end
54
+ def successful?(response)
55
+ success_codes.member?(response.code)
56
+ end
57
+ def method_missing(meth, *args)
58
+ super unless ALLOW_NNN_FOR =~ meth.to_s
59
+ (allow_errors_for[$1] ||= []).push(*args)
60
+ end
61
+ end
62
+ self.allow_errors_for = {}
63
+ self.next_number = 0
64
+
65
+
66
+ end
@@ -0,0 +1,34 @@
1
+ <div id="<%= test_name %>">
2
+ <% %w{failures successes}.each do |result_type| %>
3
+ <table class="grid tablesorter" cellspacing="0">
4
+ <caption><%= result_type.capitalize %> (<%= send(result_type).size %>)</caption>
5
+ <thead>
6
+ <tr>
7
+ <th class="sort asc"><span>URL</span><span class="sort"><em>&#8613;</em></span></th>
8
+ <th><span>Action</span><span class="sort"><em>&#8613;</em></span></th>
9
+ <th><span>Response</span><span class="sort"><em>&#8613;</em></span></th>
10
+ <th><span>Description</span><span class="sort"><em>&#8613;</em></span></th>
11
+ <th><span>Referrer</span><span class="sort"><em>&#8613;</em></span></th>
12
+ </tr>
13
+ </thead>
14
+ <tfoot>
15
+ <tr>
16
+ <td colspan="5">
17
+ Footer
18
+ </td>
19
+ </tr>
20
+ </tfoot>
21
+ <tbody>
22
+ <% send(result_type).sort{|x,y| y.code.to_s <=> x.code.to_s}.each do |result| %>
23
+ <tr>
24
+ <td class="left"><a href="<%= "#{test_name}/#{result.file_name}" %>"><%= result.url.ellipsize(30) %></a></td>
25
+ <td class="center"><%= result.method %></td>
26
+ <td class="center"><span class="<%= class_for_code(result.code) %>"><%= result.code %></span></td>
27
+ <td><%= result.description %></td>
28
+ <td><%= result.referrer.ellipsize(30) %></td>
29
+ </tr>
30
+ <% end %>
31
+ </tbody>
32
+ </table>
33
+ <% end %>
34
+ </div>
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ begin
3
+ gem 'tidy'
4
+ require 'tidy'
5
+ rescue Gem::LoadError
6
+ # tidy not available
7
+ end
8
+
9
+ if defined? Tidy
10
+ Tidy.path = ENV['TIDY_PATH'] if ENV['TIDY_PATH']
11
+
12
+ class Relevance::Tarantula::TidyHandler
13
+ include Relevance::Tarantula
14
+ def initialize(options = {})
15
+ @options = {:show_warnings=>true}.merge(options)
16
+ end
17
+ def handle(result)
18
+ response = result.response
19
+ return unless response.html?
20
+ tidy = Tidy.open(@options) do |tidy|
21
+ xml = tidy.clean(response.body)
22
+ tidy
23
+ end
24
+ unless tidy.errors.blank?
25
+ error_result = result.dup
26
+ error_result.description = "Bad HTML (Tidy)"
27
+ error_result.data = tidy.errors.inspect
28
+ error_result
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ class Relevance::Tarantula::Transform
2
+ attr_accessor :from, :to
3
+ def initialize(from, to)
4
+ @from = from
5
+ @to = to
6
+ end
7
+ def [](string)
8
+ case to
9
+ when Proc
10
+ string.gsub(from, &to)
11
+ else
12
+ string.gsub(from, to)
13
+ end
14
+ end
15
+ end
16
+
17
+
data/manifest.txt ADDED
@@ -0,0 +1,117 @@
1
+ CHANGELOG
2
+ init.rb
3
+ install.rb
4
+ laf/images/background.jpg
5
+ laf/images/relevance-os-logo.gif
6
+ laf/images/tab.png
7
+ laf/images/table-sort.gif
8
+ laf/images/tarantula-sprites.png
9
+ laf/javascripts/jquery-1.2.3.js
10
+ laf/javascripts/jquery-ui-tabs.js
11
+ laf/javascripts/jquery.tablesorter.js
12
+ laf/javascripts/tarantula.js
13
+ laf/stylesheets/tarantula.css
14
+ laf/stylesheets/ui.tabs.css
15
+ lib/relevance/core_extensions/ellipsize.rb
16
+ lib/relevance/core_extensions/file.rb
17
+ lib/relevance/core_extensions/response.rb
18
+ lib/relevance/core_extensions/test_case.rb
19
+ lib/relevance/tarantula/attack.rb
20
+ lib/relevance/tarantula/attack_form_submission.rb
21
+ lib/relevance/tarantula/attack_handler.rb
22
+ lib/relevance/tarantula/crawler.rb
23
+ lib/relevance/tarantula/detail.html.erb
24
+ lib/relevance/tarantula/form.rb
25
+ lib/relevance/tarantula/form_submission.rb
26
+ lib/relevance/tarantula/html_document_handler.rb
27
+ lib/relevance/tarantula/html_report_helper.rb
28
+ lib/relevance/tarantula/html_reporter.rb
29
+ lib/relevance/tarantula/index.html.erb
30
+ lib/relevance/tarantula/invalid_html_handler.rb
31
+ lib/relevance/tarantula/io_reporter.rb
32
+ lib/relevance/tarantula/link.rb
33
+ lib/relevance/tarantula/log_grabber.rb
34
+ lib/relevance/tarantula/rails_integration_proxy.rb
35
+ lib/relevance/tarantula/recording.rb
36
+ lib/relevance/tarantula/response.rb
37
+ lib/relevance/tarantula/result.rb
38
+ lib/relevance/tarantula/test_report.html.erb
39
+ lib/relevance/tarantula/tidy_handler.rb
40
+ lib/relevance/tarantula/transform.rb
41
+ lib/relevance/tarantula.rb
42
+ manifest.txt
43
+ MIT-LICENSE
44
+ rails/init.rb
45
+ Rakefile
46
+ README.rdoc
47
+ tarantula.gemspec
48
+ tasks/tarantula_tasks.rake
49
+ template/tarantula_test.rb
50
+ test/relevance/core_extensions/ellipsize_test.rb
51
+ test/relevance/core_extensions/file_test.rb
52
+ test/relevance/core_extensions/response_test.rb
53
+ test/relevance/core_extensions/test_case_test.rb
54
+ test/relevance/tarantula/attack_form_submission_test.rb
55
+ test/relevance/tarantula/attack_handler_test.rb
56
+ test/relevance/tarantula/crawler_test.rb
57
+ test/relevance/tarantula/form_submission_test.rb
58
+ test/relevance/tarantula/form_test.rb
59
+ test/relevance/tarantula/html_document_handler_test.rb
60
+ test/relevance/tarantula/html_report_helper_test.rb
61
+ test/relevance/tarantula/html_reporter_test.rb
62
+ test/relevance/tarantula/invalid_html_handler_test.rb
63
+ test/relevance/tarantula/io_reporter_test.rb
64
+ test/relevance/tarantula/link_test.rb
65
+ test/relevance/tarantula/log_grabber_test.rb
66
+ test/relevance/tarantula/rails_integration_proxy_test.rb
67
+ test/relevance/tarantula/result_test.rb
68
+ test/relevance/tarantula/tidy_handler_test.rb
69
+ test/relevance/tarantula/transform_test.rb
70
+ test/relevance/tarantula_test.rb
71
+ test/test_helper.rb
72
+ tmp/test_output/images/background.jpg
73
+ tmp/test_output/images/relevance-os-logo.gif
74
+ tmp/test_output/images/tab.png
75
+ tmp/test_output/images/table-sort.gif
76
+ tmp/test_output/images/tarantula-sprites.png
77
+ tmp/test_output/index.html
78
+ tmp/test_output/javascripts/jquery-1.2.3.js
79
+ tmp/test_output/javascripts/jquery-ui-tabs.js
80
+ tmp/test_output/javascripts/jquery.tablesorter.js
81
+ tmp/test_output/javascripts/tarantula.js
82
+ tmp/test_output/stylesheets/tarantula.css
83
+ tmp/test_output/stylesheets/ui.tabs.css
84
+ tmp/test_output/test_user_pages/1.html
85
+ tmp/test_output/test_user_pages/10.html
86
+ tmp/test_output/test_user_pages/11.html
87
+ tmp/test_output/test_user_pages/12.html
88
+ tmp/test_output/test_user_pages/13.html
89
+ tmp/test_output/test_user_pages/14.html
90
+ tmp/test_output/test_user_pages/15.html
91
+ tmp/test_output/test_user_pages/16.html
92
+ tmp/test_output/test_user_pages/17.html
93
+ tmp/test_output/test_user_pages/18.html
94
+ tmp/test_output/test_user_pages/19.html
95
+ tmp/test_output/test_user_pages/2.html
96
+ tmp/test_output/test_user_pages/20.html
97
+ tmp/test_output/test_user_pages/3.html
98
+ tmp/test_output/test_user_pages/4.html
99
+ tmp/test_output/test_user_pages/5.html
100
+ tmp/test_output/test_user_pages/6.html
101
+ tmp/test_output/test_user_pages/7.html
102
+ tmp/test_output/test_user_pages/8.html
103
+ tmp/test_output/test_user_pages/9.html
104
+ uninstall.rb
105
+ vendor/xss-shield/init.rb
106
+ vendor/xss-shield/lib/xss_shield/erb_hacks.rb
107
+ vendor/xss-shield/lib/xss_shield/haml_hacks.rb
108
+ vendor/xss-shield/lib/xss_shield/safe_string.rb
109
+ vendor/xss-shield/lib/xss_shield/secure_helpers.rb
110
+ vendor/xss-shield/lib/xss_shield.rb
111
+ vendor/xss-shield/MIT-LICENSE
112
+ vendor/xss-shield/README
113
+ vendor/xss-shield/test/test_actionview_integration.rb
114
+ vendor/xss-shield/test/test_erb.rb
115
+ vendor/xss-shield/test/test_haml.rb
116
+ vendor/xss-shield/test/test_helpers.rb
117
+ vendor/xss-shield/test/test_safe_string.rb