angular_xss 0.1.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.
Files changed (57) hide show
  1. data/.gitignore +5 -0
  2. data/LICENSE +22 -0
  3. data/README.md +43 -0
  4. data/Rakefile +62 -0
  5. data/assignable_values.gemspec +20 -0
  6. data/lib/angular_xss.rb +5 -0
  7. data/lib/angular_xss/erb.rb +25 -0
  8. data/lib/angular_xss/escaper.rb +10 -0
  9. data/lib/angular_xss/haml.rb +15 -0
  10. data/lib/angular_xss/version.rb +3 -0
  11. data/spec/rails-2.3/Gemfile +10 -0
  12. data/spec/rails-2.3/Gemfile.lock +56 -0
  13. data/spec/rails-2.3/Rakefile +11 -0
  14. data/spec/rails-2.3/app_root/config/boot.rb +129 -0
  15. data/spec/rails-2.3/app_root/config/database.yml +4 -0
  16. data/spec/rails-2.3/app_root/config/environment.rb +14 -0
  17. data/spec/rails-2.3/app_root/config/environments/test.rb +28 -0
  18. data/spec/rails-2.3/app_root/config/preinitializer.rb +20 -0
  19. data/spec/rails-2.3/app_root/config/routes.rb +4 -0
  20. data/spec/rails-2.3/app_root/lib/console_with_fixtures.rb +4 -0
  21. data/spec/rails-2.3/app_root/log/.gitignore +1 -0
  22. data/spec/rails-2.3/app_root/script/console +7 -0
  23. data/spec/rails-2.3/rcov.opts +2 -0
  24. data/spec/rails-2.3/spec.opts +4 -0
  25. data/spec/rails-2.3/spec/spec_helper.rb +20 -0
  26. data/spec/rails-3.2/.rspec +2 -0
  27. data/spec/rails-3.2/Gemfile +9 -0
  28. data/spec/rails-3.2/Gemfile.lock +128 -0
  29. data/spec/rails-3.2/Rakefile +10 -0
  30. data/spec/rails-3.2/app_root/.gitignore +4 -0
  31. data/spec/rails-3.2/app_root/config/application.rb +32 -0
  32. data/spec/rails-3.2/app_root/config/boot.rb +13 -0
  33. data/spec/rails-3.2/app_root/config/database.yml +4 -0
  34. data/spec/rails-3.2/app_root/config/environment.rb +5 -0
  35. data/spec/rails-3.2/app_root/config/environments/test.rb +35 -0
  36. data/spec/rails-3.2/app_root/config/initializers/backtrace_silencers.rb +7 -0
  37. data/spec/rails-3.2/app_root/config/initializers/inflections.rb +10 -0
  38. data/spec/rails-3.2/app_root/config/initializers/mime_types.rb +5 -0
  39. data/spec/rails-3.2/app_root/config/initializers/secret_token.rb +7 -0
  40. data/spec/rails-3.2/app_root/config/initializers/session_store.rb +8 -0
  41. data/spec/rails-3.2/app_root/config/routes.rb +58 -0
  42. data/spec/rails-3.2/app_root/lib/tasks/.gitkeep +0 -0
  43. data/spec/rails-3.2/app_root/log/.gitkeep +0 -0
  44. data/spec/rails-3.2/app_root/script/rails +6 -0
  45. data/spec/rails-3.2/rcov.opts +2 -0
  46. data/spec/rails-3.2/spec/spec_helper.rb +20 -0
  47. data/spec/shared/app_root/app/controllers/application_controller.rb +2 -0
  48. data/spec/shared/app_root/app/helpers/application_helper.rb +3 -0
  49. data/spec/shared/app_root/app/models/.gitkeep +0 -0
  50. data/spec/shared/app_root/app/views/test/_test_erb.erb +2 -0
  51. data/spec/shared/app_root/app/views/test/_test_haml.haml +3 -0
  52. data/spec/shared/app_root/config/database.yml +4 -0
  53. data/spec/shared/app_root/db/migrate/.gitkeep +0 -0
  54. data/spec/shared/support/engine_preventing_angular_xss.rb +12 -0
  55. data/spec/shared/tests/erb_spec.rb +7 -0
  56. data/spec/shared/tests/haml_spec.rb +7 -0
  57. metadata +194 -0
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ doc
2
+ pkg
3
+ *.gem
4
+ .idea
5
+ spec/*/log/*
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Henning Koch
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ angular_xss
2
+ ===========
3
+
4
+ When rendering AngularJS templates with a server-side templating engine like ERB or Haml it is easy to introduce XSS vulnerabilities. These vulnerabilities are enabled by AngularJS evaluating user-provided strings containing interpolation symbols (default symbols are `{{` and `}}`).
5
+
6
+ This gem patches ERB/rails_xss and Haml so Angular interpolation symbols are auto-escaped in unsafe strings. And by auto-escaped we mean replacing `{{` with ` { { `.
7
+
8
+ **This is an unsatisfactory hack.** A better solution is very much desired, but might not be possible without significant refactoring of AngularJS. See the [related AngularJS issue](https://github.com/angular/angular.js/issues/5601).
9
+
10
+
11
+ Installation
12
+ ------------
13
+
14
+ 0. Read the code so you know what you're getting into.
15
+
16
+ 1. Put this into your Gemfile **after other templating engines** like Haml or Erubis:
17
+
18
+ gem 'angular_xss' # put me after Haml, Erubis and other templating engines
19
+
20
+ 2. Run `bundle install`.
21
+
22
+ 3. Run your test suite to find the places that broke.
23
+
24
+ 4. Mark any string that is allowed to contain Angular expressions as `#html_safe`.
25
+
26
+
27
+ Known issues
28
+ ------------
29
+ - Requires Haml. Could be refactored to only patch ERB/rails_xss.
30
+
31
+
32
+ Development
33
+ -----------
34
+
35
+ - Fork the repository.
36
+ - Push your changes with specs. There is a Rails 3 test application in `spec/app_root` if you need to test integration with a live Rails app.
37
+ - Send a pull request.
38
+
39
+
40
+ Credits
41
+ -------
42
+
43
+ [Henning Koch](mailto:henning.koch@makandra.de) from [makandra](http://makandra.com/).
data/Rakefile ADDED
@@ -0,0 +1,62 @@
1
+ require 'rake'
2
+ require 'bundler/gem_tasks'
3
+
4
+ desc 'Default: Run all specs.'
5
+ task :default => 'all:spec'
6
+
7
+
8
+ namespace :travis do
9
+
10
+ desc 'Run tests on Travis CI'
11
+ task :run => ['slimgems', 'all:bundle:install', 'all:spec']
12
+
13
+ desc 'Install slimgems'
14
+ task :slimgems do
15
+ system('gem install slimgems')
16
+ end
17
+
18
+ end
19
+
20
+ namespace :all do
21
+
22
+ desc "Run specs on all spec apps"
23
+ task :spec do
24
+ success = true
25
+ for_each_directory_of('spec/**/Rakefile') do |directory|
26
+ env = "SPEC=../../#{ENV['SPEC']} " if ENV['SPEC']
27
+ success &= system("cd #{directory} && #{env} bundle exec rake spec")
28
+ end
29
+ fail "Tests failed" unless success
30
+ end
31
+
32
+ namespace :bundle do
33
+
34
+ desc "Bundle all spec apps"
35
+ task :install do
36
+ for_each_directory_of('spec/**/Gemfile') do |directory|
37
+ Bundler.with_clean_env do
38
+ system("cd #{directory} && bundle install")
39
+ end
40
+ end
41
+ end
42
+
43
+ desc "Update all gems, or a list of gem given by the GEM environment variable"
44
+ task :update do
45
+ for_each_directory_of('spec/**/Gemfile') do |directory|
46
+ Bundler.with_clean_env do
47
+ system("cd #{directory} && bundle update #{ENV['GEM']}")
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ def for_each_directory_of(path, &block)
57
+ Dir[path].sort.each do |rakefile|
58
+ directory = File.dirname(rakefile)
59
+ puts '', "\033[44m#{directory}\033[0m", ''
60
+ block.call(directory)
61
+ end
62
+ end
@@ -0,0 +1,20 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require "angular_xss/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'angular_xss'
6
+ s.version = AngularXss::VERSION
7
+ s.authors = ["Henning Koch"]
8
+ s.email = 'henning.koch@makandra.de'
9
+ s.homepage = 'https://github.com/makandra/angular_xss'
10
+ s.summary = 'Patches rails_xss and Haml so AngularJS interpolations are auto-escaped in unsafe strings.'
11
+ s.description = s.summary
12
+ s.license = 'MIT'
13
+
14
+ s.files = `git ls-files`.split($\)
15
+ s.test_files = s.files.grep(%r{^spec/})
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_dependency('activesupport')
19
+ s.add_dependency('haml')
20
+ end
@@ -0,0 +1,5 @@
1
+ #"string".respond_to?(:html_safe?) or raise "No rails_xss implementation present"
2
+
3
+ require 'angular_xss/escaper'
4
+ require 'angular_xss/erb'
5
+ require 'angular_xss/haml'
@@ -0,0 +1,25 @@
1
+ # Use module_eval so we crash when ERB::Util has not yet been loaded.
2
+ ERB::Util.module_eval do
3
+
4
+ def html_escape_with_escaping_angular_expressions(s)
5
+ s = s.to_s
6
+ if s.html_safe?
7
+ s
8
+ else
9
+ html_escape_without_escaping_angular_expressions(AngularXss::Escaper.escape(s))
10
+ end
11
+ end
12
+
13
+ alias_method_chain :html_escape, :escaping_angular_expressions
14
+
15
+ # Aliasing twice issues a warning "discarding old...". Remove first to avoid it.
16
+ remove_method(:h)
17
+ alias h html_escape
18
+
19
+ module_function :h
20
+
21
+ singleton_class.send(:remove_method, :html_escape)
22
+ module_function :html_escape
23
+ module_function :html_escape_without_escaping_angular_expressions
24
+
25
+ end
@@ -0,0 +1,10 @@
1
+ module AngularXss
2
+ class Escaper
3
+
4
+ def self.escape(string)
5
+ string.gsub('{{', ' { { ')
6
+ end
7
+
8
+ end
9
+ end
10
+
@@ -0,0 +1,15 @@
1
+ # Use module_eval so we crash when Haml::Helpers has not yet been loaded.
2
+ Haml::Helpers.module_eval do
3
+
4
+ def html_escape_with_escaping_angular_expressions(s)
5
+ s = s.to_s
6
+ if s.html_safe?
7
+ s
8
+ else
9
+ html_escape_without_escaping_angular_expressions(AngularXss::Escaper.escape(s))
10
+ end
11
+ end
12
+
13
+ alias_method_chain :html_escape, :escaping_angular_expressions
14
+
15
+ end
@@ -0,0 +1,3 @@
1
+ module AngularXss
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,10 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'sqlite3'
4
+ gem 'rails', '~>2.3.10'
5
+ gem 'rspec', '<2'
6
+ gem 'rspec-rails', '<2'
7
+ gem 'rspec_candy'
8
+ gem 'haml', '=3.0.25'
9
+ gem 'rails_xss'
10
+ gem 'angular_xss', :path => '../..'
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ angular_xss (0.1.0)
5
+ activesupport
6
+ haml
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ actionmailer (2.3.18)
12
+ actionpack (= 2.3.18)
13
+ actionpack (2.3.18)
14
+ activesupport (= 2.3.18)
15
+ rack (~> 1.1.0)
16
+ activerecord (2.3.18)
17
+ activesupport (= 2.3.18)
18
+ activeresource (2.3.18)
19
+ activesupport (= 2.3.18)
20
+ activesupport (2.3.18)
21
+ erubis (2.7.0)
22
+ haml (3.0.25)
23
+ rack (1.1.6)
24
+ rails (2.3.18)
25
+ actionmailer (= 2.3.18)
26
+ actionpack (= 2.3.18)
27
+ activerecord (= 2.3.18)
28
+ activeresource (= 2.3.18)
29
+ activesupport (= 2.3.18)
30
+ rake (>= 0.8.3)
31
+ rails_xss (0.5.1)
32
+ erubis (>= 2.6.5)
33
+ rake (10.1.1)
34
+ rspec (1.3.2)
35
+ rspec-rails (1.3.4)
36
+ rack (>= 1.0.0)
37
+ rspec (~> 1.3.1)
38
+ rspec_candy (0.3.1)
39
+ rspec
40
+ sneaky-save
41
+ sneaky-save (0.0.2)
42
+ activerecord (>= 2.3.2)
43
+ sqlite3 (1.3.8)
44
+
45
+ PLATFORMS
46
+ ruby
47
+
48
+ DEPENDENCIES
49
+ angular_xss!
50
+ haml (= 3.0.25)
51
+ rails (~> 2.3.10)
52
+ rails_xss
53
+ rspec (< 2)
54
+ rspec-rails (< 2)
55
+ rspec_candy
56
+ sqlite3
@@ -0,0 +1,11 @@
1
+ require 'rake'
2
+ require 'spec/rake/spectask'
3
+
4
+ desc 'Default: Run all specs for a specific rails version.'
5
+ task :default => :spec
6
+
7
+ desc "Run all specs for a specific rails version"
8
+ Spec::Rake::SpecTask.new() do |t|
9
+ t.spec_opts = ['--options', "\"spec.opts\""]
10
+ t.spec_files = defined?(SPEC) ? SPEC : FileList['**/*_spec.rb', '../shared/**/*_spec.rb']
11
+ end
@@ -0,0 +1,129 @@
1
+ # Allow customization of the rails framework path
2
+ RAILS_FRAMEWORK_ROOT = (ENV['RAILS_FRAMEWORK_ROOT'] || "#{File.dirname(__FILE__)}/../../../../../../vendor/rails") unless defined?(RAILS_FRAMEWORK_ROOT)
3
+
4
+ # Don't change this file!
5
+ # Configure your app in config/environment.rb and config/environments/*.rb
6
+
7
+ RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
8
+
9
+ module Rails
10
+ class << self
11
+ def boot!
12
+ unless booted?
13
+ preinitialize
14
+ pick_boot.run
15
+ end
16
+ end
17
+
18
+ def booted?
19
+ defined? Rails::Initializer
20
+ end
21
+
22
+ def pick_boot
23
+ (vendor_rails? ? VendorBoot : GemBoot).new
24
+ end
25
+
26
+ def vendor_rails?
27
+ File.exist?(RAILS_FRAMEWORK_ROOT)
28
+ end
29
+
30
+ def preinitialize
31
+ load(preinitializer_path) if File.exist?(preinitializer_path)
32
+ end
33
+
34
+ def preinitializer_path
35
+ "#{RAILS_ROOT}/config/preinitializer.rb"
36
+ end
37
+ end
38
+
39
+ class Boot
40
+ def run
41
+ load_initializer
42
+ Rails::Initializer.run(:set_load_path)
43
+ end
44
+ end
45
+
46
+ class VendorBoot < Boot
47
+ def load_initializer
48
+ require "#{RAILS_FRAMEWORK_ROOT}/railties/lib/initializer"
49
+ Rails::Initializer.run(:install_gem_spec_stubs)
50
+ end
51
+ end
52
+
53
+ class GemBoot < Boot
54
+ def load_initializer
55
+ self.class.load_rubygems
56
+ load_rails_gem
57
+ require 'initializer'
58
+ end
59
+
60
+ def load_rails_gem
61
+ if version = self.class.gem_version
62
+ gem 'rails', version
63
+ else
64
+ gem 'rails'
65
+ end
66
+ rescue Gem::LoadError => load_error
67
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
68
+ exit 1
69
+ end
70
+
71
+ class << self
72
+ def rubygems_version
73
+ Gem::RubyGemsVersion rescue nil
74
+ end
75
+
76
+ def gem_version
77
+ if defined? RAILS_GEM_VERSION
78
+ RAILS_GEM_VERSION
79
+ elsif ENV.include?('RAILS_GEM_VERSION')
80
+ ENV['RAILS_GEM_VERSION']
81
+ else
82
+ parse_gem_version(read_environment_rb)
83
+ end
84
+ end
85
+
86
+ def load_rubygems
87
+ require 'rubygems'
88
+ min_version = '1.1.1'
89
+ unless rubygems_version >= min_version
90
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
91
+ exit 1
92
+ end
93
+
94
+ rescue LoadError
95
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
96
+ exit 1
97
+ end
98
+
99
+ def parse_gem_version(text)
100
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
101
+ end
102
+
103
+ private
104
+ def read_environment_rb
105
+ environment_rb = "#{RAILS_ROOT}/config/environment.rb"
106
+ environment_rb = "#{HELPER_RAILS_ROOT}/config/environment.rb" unless File.exists?(environment_rb)
107
+ File.read(environment_rb)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+
114
+ class Rails::Boot
115
+ def run
116
+ load_initializer
117
+
118
+ Rails::Initializer.class_eval do
119
+ def load_gems
120
+ @bundler_loaded ||= Bundler.require :default, Rails.env
121
+ end
122
+ end
123
+
124
+ Rails::Initializer.run(:set_load_path)
125
+ end
126
+ end
127
+
128
+ # All that for this:
129
+ Rails.boot!
@@ -0,0 +1,4 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+ verbosity: quiet
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), 'boot')
2
+
3
+ Rails::Initializer.run do |config|
4
+ config.cache_classes = false
5
+ config.whiny_nils = true
6
+ config.action_controller.session = { :key => "_myapp_session", :secret => "gwirofjweroijger8924rt2zfwehfuiwehb1378rifowenfoqwphf23" }
7
+ #config.plugin_locators.unshift(
8
+ # Class.new(Rails::Plugin::Locator) do
9
+ # def plugins
10
+ # [Rails::Plugin.new(File.expand_path('.'))]
11
+ # end
12
+ # end
13
+ #) unless defined?(PluginTestHelper::PluginLocator)
14
+ end
@@ -0,0 +1,28 @@
1
+ # Settings specified here will take precedence over those in config/environment.rb
2
+
3
+ # The test environment is used exclusively to run your application's
4
+ # test suite. You never need to work with it otherwise. Remember that
5
+ # your test database is "scratch space" for the test suite and is wiped
6
+ # and recreated between test runs. Don't rely on the data there!
7
+ config.cache_classes = true
8
+
9
+ # Log error messages when you accidentally call methods on nil.
10
+ config.whiny_nils = true
11
+
12
+ # Show full error reports and disable caching
13
+ config.action_controller.consider_all_requests_local = true
14
+ config.action_controller.perform_caching = false
15
+ config.action_view.cache_template_loading = true
16
+
17
+ # Disable request forgery protection in test environment
18
+ config.action_controller.allow_forgery_protection = false
19
+
20
+ # Tell Action Mailer not to deliver emails to the real world.
21
+ # The :test delivery method accumulates sent emails in the
22
+ # ActionMailer::Base.deliveries array.
23
+ config.action_mailer.delivery_method = :test
24
+
25
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
26
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
27
+ # like if you have constraints or database-specific column types
28
+ # config.active_record.schema_format = :sql
@@ -0,0 +1,20 @@
1
+ begin
2
+ require "rubygems"
3
+ require "bundler"
4
+ rescue LoadError
5
+ raise "Could not load the bundler gem. Install it with `gem install bundler`."
6
+ end
7
+
8
+ if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.24")
9
+ raise RuntimeError, "Your bundler version is too old for Rails 2.3." +
10
+ "Run `gem install bundler` to upgrade."
11
+ end
12
+
13
+ begin
14
+ # Set up load paths for all bundled gems
15
+ ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
16
+ Bundler.setup
17
+ rescue Bundler::GemNotFound
18
+ raise RuntimeError, "Bundler couldn't find some gems." +
19
+ "Did you run `bundle install`?"
20
+ end
@@ -0,0 +1,4 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ map.connect ':controller/:action/:id'
3
+ map.connect ':controller/:action/:id.:format'
4
+ end
@@ -0,0 +1,4 @@
1
+ # Loads fixtures into the database when running the test app via the console
2
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(Rails.root, '../fixtures/*.{yml,csv}'))).each do |fixture_file|
3
+ Fixtures.create_fixtures(File.join(Rails.root, '../fixtures'), File.basename(fixture_file, '.*'))
4
+ end
@@ -0,0 +1 @@
1
+ *.log
@@ -0,0 +1,7 @@
1
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
2
+ libs = " -r irb/completion"
3
+ libs << " -r test/test_helper"
4
+ libs << " -r console_app"
5
+ libs << " -r console_with_helpers"
6
+ libs << " -r console_with_fixtures"
7
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,2 @@
1
+ --exclude "spec/*,gems/*"
2
+ --rails
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,20 @@
1
+ $: << File.join(File.dirname(__FILE__), "/../../lib" )
2
+
3
+ ENV['RAILS_ENV'] = 'test'
4
+ ENV['RAILS_ROOT'] = 'app_root'
5
+
6
+ # Load the Rails environment and testing framework
7
+ require "#{File.dirname(__FILE__)}/../app_root/config/environment"
8
+ require 'spec/rails'
9
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
10
+ require 'rspec_candy/all'
11
+
12
+ # Run the migrations
13
+ print "\033[30m" # dark gray text
14
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate")
15
+ print "\033[0m"
16
+
17
+ Spec::Runner.configure do |config|
18
+ config.use_transactional_fixtures = true
19
+ config.use_instantiated_fixtures = false
20
+ end
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format progress
@@ -0,0 +1,9 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'sqlite3'
4
+ gem 'rails', '~>3.2'
5
+ gem 'rspec'
6
+ gem 'rspec-rails'
7
+ gem 'rspec_candy'
8
+ gem 'haml-rails', '=0.4'
9
+ gem 'angular_xss', :path => '../..'
@@ -0,0 +1,128 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ angular_xss (0.1.0)
5
+ activesupport
6
+ haml
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ actionmailer (3.2.16)
12
+ actionpack (= 3.2.16)
13
+ mail (~> 2.5.4)
14
+ actionpack (3.2.16)
15
+ activemodel (= 3.2.16)
16
+ activesupport (= 3.2.16)
17
+ builder (~> 3.0.0)
18
+ erubis (~> 2.7.0)
19
+ journey (~> 1.0.4)
20
+ rack (~> 1.4.5)
21
+ rack-cache (~> 1.2)
22
+ rack-test (~> 0.6.1)
23
+ sprockets (~> 2.2.1)
24
+ activemodel (3.2.16)
25
+ activesupport (= 3.2.16)
26
+ builder (~> 3.0.0)
27
+ activerecord (3.2.16)
28
+ activemodel (= 3.2.16)
29
+ activesupport (= 3.2.16)
30
+ arel (~> 3.0.2)
31
+ tzinfo (~> 0.3.29)
32
+ activeresource (3.2.16)
33
+ activemodel (= 3.2.16)
34
+ activesupport (= 3.2.16)
35
+ activesupport (3.2.16)
36
+ i18n (~> 0.6, >= 0.6.4)
37
+ multi_json (~> 1.0)
38
+ arel (3.0.3)
39
+ builder (3.0.4)
40
+ diff-lcs (1.2.5)
41
+ erubis (2.7.0)
42
+ haml (4.0.4)
43
+ tilt
44
+ haml-rails (0.4)
45
+ actionpack (>= 3.1, < 4.1)
46
+ activesupport (>= 3.1, < 4.1)
47
+ haml (>= 3.1, < 4.1)
48
+ railties (>= 3.1, < 4.1)
49
+ hike (1.2.3)
50
+ i18n (0.6.9)
51
+ journey (1.0.4)
52
+ json (1.8.1)
53
+ mail (2.5.4)
54
+ mime-types (~> 1.16)
55
+ treetop (~> 1.4.8)
56
+ mime-types (1.25.1)
57
+ multi_json (1.8.2)
58
+ polyglot (0.3.3)
59
+ rack (1.4.5)
60
+ rack-cache (1.2)
61
+ rack (>= 0.4)
62
+ rack-ssl (1.3.3)
63
+ rack
64
+ rack-test (0.6.2)
65
+ rack (>= 1.0)
66
+ rails (3.2.16)
67
+ actionmailer (= 3.2.16)
68
+ actionpack (= 3.2.16)
69
+ activerecord (= 3.2.16)
70
+ activeresource (= 3.2.16)
71
+ activesupport (= 3.2.16)
72
+ bundler (~> 1.0)
73
+ railties (= 3.2.16)
74
+ railties (3.2.16)
75
+ actionpack (= 3.2.16)
76
+ activesupport (= 3.2.16)
77
+ rack-ssl (~> 1.3.2)
78
+ rake (>= 0.8.7)
79
+ rdoc (~> 3.4)
80
+ thor (>= 0.14.6, < 2.0)
81
+ rake (10.1.1)
82
+ rdoc (3.12.2)
83
+ json (~> 1.4)
84
+ rspec (2.14.1)
85
+ rspec-core (~> 2.14.0)
86
+ rspec-expectations (~> 2.14.0)
87
+ rspec-mocks (~> 2.14.0)
88
+ rspec-core (2.14.7)
89
+ rspec-expectations (2.14.4)
90
+ diff-lcs (>= 1.1.3, < 2.0)
91
+ rspec-mocks (2.14.4)
92
+ rspec-rails (2.14.1)
93
+ actionpack (>= 3.0)
94
+ activemodel (>= 3.0)
95
+ activesupport (>= 3.0)
96
+ railties (>= 3.0)
97
+ rspec-core (~> 2.14.0)
98
+ rspec-expectations (~> 2.14.0)
99
+ rspec-mocks (~> 2.14.0)
100
+ rspec_candy (0.3.1)
101
+ rspec
102
+ sneaky-save
103
+ sneaky-save (0.0.4)
104
+ activerecord (>= 3.2.0)
105
+ sprockets (2.2.2)
106
+ hike (~> 1.2)
107
+ multi_json (~> 1.0)
108
+ rack (~> 1.0)
109
+ tilt (~> 1.1, != 1.3.0)
110
+ sqlite3 (1.3.8)
111
+ thor (0.18.1)
112
+ tilt (1.4.1)
113
+ treetop (1.4.15)
114
+ polyglot
115
+ polyglot (>= 0.3.1)
116
+ tzinfo (0.3.38)
117
+
118
+ PLATFORMS
119
+ ruby
120
+
121
+ DEPENDENCIES
122
+ angular_xss!
123
+ haml-rails (= 0.4)
124
+ rails (~> 3.2)
125
+ rspec
126
+ rspec-rails
127
+ rspec_candy
128
+ sqlite3
@@ -0,0 +1,10 @@
1
+ require 'rake'
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Default: Run all specs for a specific rails version.'
5
+ task :default => :spec
6
+
7
+ desc "Run all specs for a specific rails version"
8
+ RSpec::Core::RakeTask.new(:spec) do |t|
9
+ t.pattern = defined?(SPEC) ? SPEC : ['**/*_spec.rb', '../shared/**/*_spec.rb']
10
+ end
@@ -0,0 +1,4 @@
1
+ .bundle
2
+ db/*.sqlite3
3
+ log/*.log
4
+ tmp/**/*
@@ -0,0 +1,32 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ # If you have a Gemfile, require the gems listed there, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(:default, Rails.env) if defined?(Bundler)
8
+
9
+
10
+ module SpecApp
11
+ class Application < Rails::Application
12
+ config.encoding = "utf-8"
13
+
14
+ config.cache_classes = true
15
+ config.whiny_nils = true
16
+
17
+ config.consider_all_requests_local = true
18
+ config.action_controller.perform_caching = false
19
+
20
+ config.action_dispatch.show_exceptions = false
21
+
22
+ config.action_controller.allow_forgery_protection = false
23
+
24
+ config.action_mailer.delivery_method = :test
25
+
26
+ config.active_support.deprecation = :stderr
27
+
28
+ config.root = File.expand_path('../..', __FILE__)
29
+
30
+ # railties.plugins << Rails::Plugin.new(File.expand_path('../../../../..', __FILE__))
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+
3
+ # Set up gems listed in the Gemfile.
4
+ gemfile = File.expand_path('../../Gemfile', __FILE__)
5
+ begin
6
+ ENV['BUNDLE_GEMFILE'] = gemfile
7
+ require 'bundler'
8
+ Bundler.setup
9
+ rescue Bundler::GemNotFound => e
10
+ STDERR.puts e.message
11
+ STDERR.puts "Try running `bundle install`."
12
+ exit!
13
+ end if File.exist?(gemfile)
@@ -0,0 +1,4 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+ verbosity: quiet
@@ -0,0 +1,5 @@
1
+ # Load the rails application
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the rails application
5
+ SpecApp::Application.initialize!
@@ -0,0 +1,35 @@
1
+ SpecApp::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb
3
+
4
+ # The test environment is used exclusively to run your application's
5
+ # test suite. You never need to work with it otherwise. Remember that
6
+ # your test database is "scratch space" for the test suite and is wiped
7
+ # and recreated between test runs. Don't rely on the data there!
8
+ config.cache_classes = true
9
+
10
+ # Log error messages when you accidentally call methods on nil.
11
+ config.whiny_nils = true
12
+
13
+ # Show full error reports and disable caching
14
+ config.consider_all_requests_local = true
15
+ config.action_controller.perform_caching = false
16
+
17
+ # Raise exceptions instead of rendering exception templates
18
+ config.action_dispatch.show_exceptions = false
19
+
20
+ # Disable request forgery protection in test environment
21
+ config.action_controller.allow_forgery_protection = false
22
+
23
+ # Tell Action Mailer not to deliver emails to the real world.
24
+ # The :test delivery method accumulates sent emails in the
25
+ # ActionMailer::Base.deliveries array.
26
+ config.action_mailer.delivery_method = :test
27
+
28
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
29
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
30
+ # like if you have constraints or database-specific column types
31
+ # config.active_record.schema_format = :sql
32
+
33
+ # Print deprecation notices to the stderr
34
+ config.active_support.deprecation = :stderr
35
+ end
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,10 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ # ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w( fish sheep )
10
+ # end
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
5
+ # Mime::Type.register_alias "text/html", :iphone
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ SpecApp::Application.config.secret_token = 'cb014a08a45243e7143f31e04774c342c1fba329fd594ae1a480d8283b1a851f425dc08044311fb4be6d000b6e6681de7c76d19148419a5ffa0a9f84556d3b33'
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ SpecApp::Application.config.session_store :cookie_store, :key => '_app_root_session'
4
+
5
+ # Use the database for sessions instead of the cookie-based default,
6
+ # which shouldn't be used to store highly confidential information
7
+ # (create the session table with "rails generate session_migration")
8
+ # SpecApp::Application.config.session_store :active_record_store
@@ -0,0 +1,58 @@
1
+ SpecApp::Application.routes.draw do
2
+ # The priority is based upon order of creation:
3
+ # first created -> highest priority.
4
+
5
+ # Sample of regular route:
6
+ # match 'products/:id' => 'catalog#view'
7
+ # Keep in mind you can assign values other than :controller and :action
8
+
9
+ # Sample of named route:
10
+ # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
11
+ # This route can be invoked with purchase_url(:id => product.id)
12
+
13
+ # Sample resource route (maps HTTP verbs to controller actions automatically):
14
+ # resources :products
15
+
16
+ # Sample resource route with options:
17
+ # resources :products do
18
+ # member do
19
+ # get 'short'
20
+ # post 'toggle'
21
+ # end
22
+ #
23
+ # collection do
24
+ # get 'sold'
25
+ # end
26
+ # end
27
+
28
+ # Sample resource route with sub-resources:
29
+ # resources :products do
30
+ # resources :comments, :sales
31
+ # resource :seller
32
+ # end
33
+
34
+ # Sample resource route with more complex sub-resources
35
+ # resources :products do
36
+ # resources :comments
37
+ # resources :sales do
38
+ # get 'recent', :on => :collection
39
+ # end
40
+ # end
41
+
42
+ # Sample resource route within a namespace:
43
+ # namespace :admin do
44
+ # # Directs /admin/products/* to Admin::ProductsController
45
+ # # (app/controllers/admin/products_controller.rb)
46
+ # resources :products
47
+ # end
48
+
49
+ # You can have the root of your site routed with "root"
50
+ # just remember to delete public/index.html.
51
+ # root :to => "welcome#index"
52
+
53
+ # See how all your routes lay out with "rake routes"
54
+
55
+ # This is a legacy wild controller route that's not recommended for RESTful applications.
56
+ # Note: This route will make all actions in every controller accessible via GET requests.
57
+ match ':controller(/:action(/:id(.:format)))'
58
+ end
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby1.8
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,2 @@
1
+ --exclude "spec/*,gems/*"
2
+ --rails
@@ -0,0 +1,20 @@
1
+ $: << File.join(File.dirname(__FILE__), "/../../lib" )
2
+
3
+ ENV['RAILS_ENV'] = 'test'
4
+ ENV['RAILS_ROOT'] = 'app_root'
5
+
6
+ # Load the Rails environment and testing framework
7
+ require "#{File.dirname(__FILE__)}/../app_root/config/environment"
8
+ require 'rspec/rails'
9
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
10
+ require 'rspec_candy/all'
11
+
12
+ # Run the migrations
13
+ print "\033[30m" # dark gray text
14
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate")
15
+ print "\033[0m"
16
+
17
+ RSpec.configure do |config|
18
+ config.use_transactional_fixtures = true
19
+ config.use_instantiated_fixtures = false
20
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ module ApplicationHelper
2
+
3
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ <%= "{{unsafe}}" %>
2
+ <%= "{{safe}}".html_safe %>
@@ -0,0 +1,3 @@
1
+ = "{{unsafe}}"
2
+ #{'{{unsafe}}'}
3
+ = "{{safe}}".html_safe
@@ -0,0 +1,4 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+ verbosity: quiet
File without changes
@@ -0,0 +1,12 @@
1
+ shared_examples_for 'engine preventing Angular XSS' do
2
+
3
+ it 'escapes Angular interpolation marks iff a string is unsafe' do
4
+ engine = respond_to?(:view) ? view : template
5
+ html = engine.render(partial)
6
+ html.should include(" { { unsafe}}")
7
+ html.should_not include("{{unsafe}}")
8
+ html.should include("{{safe}}")
9
+ html.should_not include(" { { safe}}")
10
+ end
11
+
12
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Angular XSS prevention in ERB', :type => :view do
4
+
5
+ it_should_act_like 'engine preventing Angular XSS', :partial => 'test/test_erb'
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Angular XSS prevention in Haml', :type => :view do
4
+
5
+ it_should_act_like 'engine preventing Angular XSS', :partial => 'test/test_haml'
6
+
7
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: angular_xss
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Henning Koch
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2014-01-03 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activesupport
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: haml
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: Patches rails_xss and Haml so AngularJS interpolations are auto-escaped in unsafe strings.
50
+ email: henning.koch@makandra.de
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - .gitignore
59
+ - LICENSE
60
+ - README.md
61
+ - Rakefile
62
+ - assignable_values.gemspec
63
+ - lib/angular_xss.rb
64
+ - lib/angular_xss/erb.rb
65
+ - lib/angular_xss/escaper.rb
66
+ - lib/angular_xss/haml.rb
67
+ - lib/angular_xss/version.rb
68
+ - spec/rails-2.3/Gemfile
69
+ - spec/rails-2.3/Gemfile.lock
70
+ - spec/rails-2.3/Rakefile
71
+ - spec/rails-2.3/app_root/config/boot.rb
72
+ - spec/rails-2.3/app_root/config/database.yml
73
+ - spec/rails-2.3/app_root/config/environment.rb
74
+ - spec/rails-2.3/app_root/config/environments/test.rb
75
+ - spec/rails-2.3/app_root/config/preinitializer.rb
76
+ - spec/rails-2.3/app_root/config/routes.rb
77
+ - spec/rails-2.3/app_root/lib/console_with_fixtures.rb
78
+ - spec/rails-2.3/app_root/log/.gitignore
79
+ - spec/rails-2.3/app_root/script/console
80
+ - spec/rails-2.3/rcov.opts
81
+ - spec/rails-2.3/spec.opts
82
+ - spec/rails-2.3/spec/spec_helper.rb
83
+ - spec/rails-3.2/.rspec
84
+ - spec/rails-3.2/Gemfile
85
+ - spec/rails-3.2/Gemfile.lock
86
+ - spec/rails-3.2/Rakefile
87
+ - spec/rails-3.2/app_root/.gitignore
88
+ - spec/rails-3.2/app_root/config/application.rb
89
+ - spec/rails-3.2/app_root/config/boot.rb
90
+ - spec/rails-3.2/app_root/config/database.yml
91
+ - spec/rails-3.2/app_root/config/environment.rb
92
+ - spec/rails-3.2/app_root/config/environments/test.rb
93
+ - spec/rails-3.2/app_root/config/initializers/backtrace_silencers.rb
94
+ - spec/rails-3.2/app_root/config/initializers/inflections.rb
95
+ - spec/rails-3.2/app_root/config/initializers/mime_types.rb
96
+ - spec/rails-3.2/app_root/config/initializers/secret_token.rb
97
+ - spec/rails-3.2/app_root/config/initializers/session_store.rb
98
+ - spec/rails-3.2/app_root/config/routes.rb
99
+ - spec/rails-3.2/app_root/lib/tasks/.gitkeep
100
+ - spec/rails-3.2/app_root/log/.gitkeep
101
+ - spec/rails-3.2/app_root/script/rails
102
+ - spec/rails-3.2/rcov.opts
103
+ - spec/rails-3.2/spec/spec_helper.rb
104
+ - spec/shared/app_root/app/controllers/application_controller.rb
105
+ - spec/shared/app_root/app/helpers/application_helper.rb
106
+ - spec/shared/app_root/app/models/.gitkeep
107
+ - spec/shared/app_root/app/views/test/_test_erb.erb
108
+ - spec/shared/app_root/app/views/test/_test_haml.haml
109
+ - spec/shared/app_root/config/database.yml
110
+ - spec/shared/app_root/db/migrate/.gitkeep
111
+ - spec/shared/support/engine_preventing_angular_xss.rb
112
+ - spec/shared/tests/erb_spec.rb
113
+ - spec/shared/tests/haml_spec.rb
114
+ has_rdoc: true
115
+ homepage: https://github.com/makandra/angular_xss
116
+ licenses:
117
+ - MIT
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ hash: 3
138
+ segments:
139
+ - 0
140
+ version: "0"
141
+ requirements: []
142
+
143
+ rubyforge_project:
144
+ rubygems_version: 1.3.9.5
145
+ signing_key:
146
+ specification_version: 3
147
+ summary: Patches rails_xss and Haml so AngularJS interpolations are auto-escaped in unsafe strings.
148
+ test_files:
149
+ - spec/rails-2.3/Gemfile
150
+ - spec/rails-2.3/Gemfile.lock
151
+ - spec/rails-2.3/Rakefile
152
+ - spec/rails-2.3/app_root/config/boot.rb
153
+ - spec/rails-2.3/app_root/config/database.yml
154
+ - spec/rails-2.3/app_root/config/environment.rb
155
+ - spec/rails-2.3/app_root/config/environments/test.rb
156
+ - spec/rails-2.3/app_root/config/preinitializer.rb
157
+ - spec/rails-2.3/app_root/config/routes.rb
158
+ - spec/rails-2.3/app_root/lib/console_with_fixtures.rb
159
+ - spec/rails-2.3/app_root/log/.gitignore
160
+ - spec/rails-2.3/app_root/script/console
161
+ - spec/rails-2.3/rcov.opts
162
+ - spec/rails-2.3/spec.opts
163
+ - spec/rails-2.3/spec/spec_helper.rb
164
+ - spec/rails-3.2/.rspec
165
+ - spec/rails-3.2/Gemfile
166
+ - spec/rails-3.2/Gemfile.lock
167
+ - spec/rails-3.2/Rakefile
168
+ - spec/rails-3.2/app_root/.gitignore
169
+ - spec/rails-3.2/app_root/config/application.rb
170
+ - spec/rails-3.2/app_root/config/boot.rb
171
+ - spec/rails-3.2/app_root/config/database.yml
172
+ - spec/rails-3.2/app_root/config/environment.rb
173
+ - spec/rails-3.2/app_root/config/environments/test.rb
174
+ - spec/rails-3.2/app_root/config/initializers/backtrace_silencers.rb
175
+ - spec/rails-3.2/app_root/config/initializers/inflections.rb
176
+ - spec/rails-3.2/app_root/config/initializers/mime_types.rb
177
+ - spec/rails-3.2/app_root/config/initializers/secret_token.rb
178
+ - spec/rails-3.2/app_root/config/initializers/session_store.rb
179
+ - spec/rails-3.2/app_root/config/routes.rb
180
+ - spec/rails-3.2/app_root/lib/tasks/.gitkeep
181
+ - spec/rails-3.2/app_root/log/.gitkeep
182
+ - spec/rails-3.2/app_root/script/rails
183
+ - spec/rails-3.2/rcov.opts
184
+ - spec/rails-3.2/spec/spec_helper.rb
185
+ - spec/shared/app_root/app/controllers/application_controller.rb
186
+ - spec/shared/app_root/app/helpers/application_helper.rb
187
+ - spec/shared/app_root/app/models/.gitkeep
188
+ - spec/shared/app_root/app/views/test/_test_erb.erb
189
+ - spec/shared/app_root/app/views/test/_test_haml.haml
190
+ - spec/shared/app_root/config/database.yml
191
+ - spec/shared/app_root/db/migrate/.gitkeep
192
+ - spec/shared/support/engine_preventing_angular_xss.rb
193
+ - spec/shared/tests/erb_spec.rb
194
+ - spec/shared/tests/haml_spec.rb