stratagem 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/Manifest +16 -18
  2. data/Rakefile +3 -3
  3. data/bin/stratagem +54 -6
  4. data/generators/stratagem/stratagem_generator.rb +26 -0
  5. data/lib/generators/stratagem/install/USAGE +0 -0
  6. data/lib/generators/stratagem/install/install_base.rb +35 -0
  7. data/lib/generators/stratagem/install/install_generator.rb +24 -0
  8. data/lib/stratagem.rb +87 -57
  9. data/lib/stratagem/authentication.rb +2 -2
  10. data/lib/stratagem/auto_mock/aquifer.rb +6 -1
  11. data/lib/stratagem/auto_mock/factory.rb +2 -2
  12. data/lib/stratagem/client.rb +1 -1
  13. data/lib/stratagem/crawler.rb +2 -0
  14. data/lib/stratagem/crawler/authentication.rb +10 -9
  15. data/lib/stratagem/crawler/parameter_resolver.rb +83 -0
  16. data/lib/stratagem/crawler/route_invoker.rb +187 -0
  17. data/lib/stratagem/crawler/session.rb +23 -251
  18. data/lib/stratagem/crawler/site_model.rb +18 -16
  19. data/lib/stratagem/framework_extensions.rb +12 -1
  20. data/lib/stratagem/framework_extensions/method_invocation.rb +50 -0
  21. data/lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb +1 -1
  22. data/lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb +20 -11
  23. data/lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb +7 -3
  24. data/lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb +11 -9
  25. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb +12 -0
  26. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb +0 -0
  27. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb +21 -0
  28. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb +4 -0
  29. data/lib/stratagem/framework_extensions/models/annotations.rb +1 -24
  30. data/lib/stratagem/framework_extensions/models/tracing.rb +9 -3
  31. data/lib/stratagem/framework_extensions/rails.rb +0 -6
  32. data/lib/stratagem/framework_extensions/{controllers → rails2}/action_controller.rb +0 -0
  33. data/lib/stratagem/framework_extensions/{controllers → rails2}/action_mailer.rb +0 -0
  34. data/lib/stratagem/framework_extensions/rails3/parameters.rb +14 -0
  35. data/lib/stratagem/interface/browser.rb +3 -1
  36. data/lib/stratagem/model/application.rb +6 -6
  37. data/lib/stratagem/model/components/controller.rb +17 -63
  38. data/lib/stratagem/model/components/model.rb +33 -33
  39. data/lib/stratagem/model/components/reference.rb +8 -4
  40. data/lib/stratagem/model/components/route.rb +40 -14
  41. data/lib/stratagem/model/components/view.rb +1 -1
  42. data/lib/stratagem/model_builder.rb +71 -42
  43. data/lib/stratagem/site_crawler.rb +1 -1
  44. data/lib/stratagem/snapshot.rb +0 -1
  45. data/stratagem.gemspec +10 -7
  46. data/templates/install/environments/stratagem.rb.erb +16 -0
  47. data/templates/install/tasks/stratagem.rake +18 -0
  48. metadata +57 -40
  49. data/lib/stratagem/framework_extensions/controllers.rb +0 -5
  50. data/lib/stratagem/scan/checks/filter_parameter_logging.rb +0 -6
  51. data/lib/stratagem/scan/checks/mongo_mapper/base.rb +0 -19
  52. data/lib/stratagem/scan/checks/mongo_mapper/foreign_keys_exposed.rb +0 -32
  53. data/lib/stratagem/scan/checks/routes.rb +0 -16
  54. data/lib/tasks/_old_stratagem.rake +0 -99
  55. data/spec/model/component_spec.rb +0 -43
  56. data/spec/model/components/view_spec.rb +0 -43
  57. data/spec/model/test_spec.rb +0 -10
  58. data/spec/samples/404.html.erb +0 -30
  59. data/spec/samples/_form.html.erb +0 -8
  60. data/spec/samples/index.html.erb +0 -77
  61. data/spec/samples/sample_model.rb +0 -5
  62. data/spec/samples/signup.html.erb +0 -14
  63. data/spec/scan/checks/email_address_spec.rb +0 -24
  64. data/spec/scan/checks/error_pages_spec.rb +0 -22
data/Manifest CHANGED
@@ -1,8 +1,12 @@
1
1
  Manifest
2
2
  Rakefile
3
3
  bin/stratagem
4
+ generators/stratagem/stratagem_generator.rb
4
5
  init.rb
5
6
  lib/bootstrap.rb
7
+ lib/generators/stratagem/install/USAGE
8
+ lib/generators/stratagem/install/install_base.rb
9
+ lib/generators/stratagem/install/install_generator.rb
6
10
  lib/stratagem.rb
7
11
  lib/stratagem/authentication.rb
8
12
  lib/stratagem/auto_mock.rb
@@ -20,6 +24,8 @@ lib/stratagem/crawler.rb
20
24
  lib/stratagem/crawler/authentication.rb
21
25
  lib/stratagem/crawler/form.rb
22
26
  lib/stratagem/crawler/html_utils.rb
27
+ lib/stratagem/crawler/parameter_resolver.rb
28
+ lib/stratagem/crawler/route_invoker.rb
23
29
  lib/stratagem/crawler/session.rb
24
30
  lib/stratagem/crawler/site_model.rb
25
31
  lib/stratagem/crawler/trace_utils.rb
@@ -32,9 +38,7 @@ lib/stratagem/extensions/red_parse.rb
32
38
  lib/stratagem/extensions/string.rb
33
39
  lib/stratagem/extensions/trace_compression.rb
34
40
  lib/stratagem/framework_extensions.rb
35
- lib/stratagem/framework_extensions/controllers.rb
36
- lib/stratagem/framework_extensions/controllers/action_controller.rb
37
- lib/stratagem/framework_extensions/controllers/action_mailer.rb
41
+ lib/stratagem/framework_extensions/method_invocation.rb
38
42
  lib/stratagem/framework_extensions/models.rb
39
43
  lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb
40
44
  lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb
@@ -48,6 +52,10 @@ lib/stratagem/framework_extensions/models/adapters/common/detect.rb
48
52
  lib/stratagem/framework_extensions/models/adapters/common/extensions.rb
49
53
  lib/stratagem/framework_extensions/models/adapters/common/metadata.rb
50
54
  lib/stratagem/framework_extensions/models/adapters/common/tracing.rb
55
+ lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb
56
+ lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb
57
+ lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb
58
+ lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb
51
59
  lib/stratagem/framework_extensions/models/adapters/restful_authentication/detect.rb
52
60
  lib/stratagem/framework_extensions/models/adapters/restful_authentication/extensions.rb
53
61
  lib/stratagem/framework_extensions/models/adapters/restful_authentication/metadata.rb
@@ -59,6 +67,9 @@ lib/stratagem/framework_extensions/models/metadata.rb
59
67
  lib/stratagem/framework_extensions/models/mocking.rb
60
68
  lib/stratagem/framework_extensions/models/tracing.rb
61
69
  lib/stratagem/framework_extensions/rails.rb
70
+ lib/stratagem/framework_extensions/rails2/action_controller.rb
71
+ lib/stratagem/framework_extensions/rails2/action_mailer.rb
72
+ lib/stratagem/framework_extensions/rails3/parameters.rb
62
73
  lib/stratagem/interface/browser.rb
63
74
  lib/stratagem/interface/public/images/backgrounds/content.png
64
75
  lib/stratagem/interface/public/images/backgrounds/shadow.png
@@ -90,22 +101,9 @@ lib/stratagem/scan.rb
90
101
  lib/stratagem/scan/checks/capistrano/secure_deploy.rb
91
102
  lib/stratagem/scan/checks/email_address.rb
92
103
  lib/stratagem/scan/checks/error_pages.rb
93
- lib/stratagem/scan/checks/filter_parameter_logging.rb
94
- lib/stratagem/scan/checks/mongo_mapper/base.rb
95
- lib/stratagem/scan/checks/mongo_mapper/foreign_keys_exposed.rb
96
- lib/stratagem/scan/checks/routes.rb
97
104
  lib/stratagem/scan/result.rb
98
105
  lib/stratagem/scanner.rb
99
106
  lib/stratagem/site_crawler.rb
100
107
  lib/stratagem/snapshot.rb
101
- lib/tasks/_old_stratagem.rake
102
- spec/model/component_spec.rb
103
- spec/model/components/view_spec.rb
104
- spec/model/test_spec.rb
105
- spec/samples/404.html.erb
106
- spec/samples/_form.html.erb
107
- spec/samples/index.html.erb
108
- spec/samples/sample_model.rb
109
- spec/samples/signup.html.erb
110
- spec/scan/checks/email_address_spec.rb
111
- spec/scan/checks/error_pages_spec.rb
108
+ templates/install/environments/stratagem.rb.erb
109
+ templates/install/tasks/stratagem.rake
data/Rakefile CHANGED
@@ -2,15 +2,15 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('stratagem', '0.1.8') do |p|
5
+ Echoe.new('stratagem', '0.1.9') do |p|
6
6
  p.description = "Intuitive security analysis of your Rails applications"
7
7
  p.url = "http://github.com/stratagem/stratagem"
8
8
  p.author = "Charles Grimes"
9
9
  p.email = "cj@stratagemapp.com"
10
10
  p.executable_pattern = ['bin/*']
11
11
  p.ignore_pattern = ["tmp/*", "script/*", "spec/*", "webapp/*"]
12
- p.runtime_dependencies = ["launchy >=0.3.5", "redparse >=0.8.4", "haml >=3.0.0", "nokogiri >=1.4.3"]
13
- p.development_dependencies = ["launchy >=0.3.5", "redparse >=0.8.4", "sinatra =1.0", "haml >=3.0.0", "webrat >=0.4.3"]
12
+ p.runtime_dependencies = ["launchy >=0.3.5", "redparse >=0.8.4", "haml >=3.0.0", "nokogiri >=1.4.3", "sinatra >=1.0"]
13
+ p.development_dependencies = ["launchy >=0.3.5", "redparse >=0.8.4", "sinatra >=1.0", "haml >=3.0.0", "webrat >=0.4.3"]
14
14
  # p.requirements ["Install the stratagem-ui gem for the web browser interface."]
15
15
  end
16
16
 
@@ -1,10 +1,58 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- RAILS_ENV='test'
4
3
 
5
- require 'rubygems'
6
- require File.join(Dir.pwd, 'config', 'boot')
7
- require 'bootstrap'
8
- require './config/environment'
4
+ # ENV['RAILS_ENV'] = 'test'
5
+ # ENV['RACK_ENV'] = 'test'
6
+ #
7
+ # application_file = File.join(Dir.pwd, 'config', 'application')
8
+ # if (File.exists?(application_file+'.rb'))
9
+ # require File.join(Dir.pwd, 'config', 'boot')
10
+ # require application_file
11
+ # require 'active_record'
12
+ # else
13
+ # puts "loading environment"
14
+ # # require File.join(Dir.pwd, 'config', 'boot')
15
+ # # puts "loading environment"
16
+ # require 'config/environment'
17
+ # end
18
+ #
19
+ #
20
+ # Stratagem.init
21
+ # Stratagem::Command.run(ARGV[0])
9
22
 
10
- Stratagem::Command.run(ARGV[0])
23
+ # begin
24
+ # # rails 2
25
+ # require 'bootstrap'
26
+ # rescue Exception
27
+ # # rails 3
28
+ # end
29
+ #
30
+ # require 'config/environment'
31
+ #
32
+ # p ActiveRecord::Base
33
+ #
34
+ # Stratagem::init_system
35
+ # Stratagem::Command.run(ARGV[0])
36
+ #
37
+
38
+ #!/usr/bin/env ruby
39
+
40
+ # RAILS_ENV='test'
41
+ #
42
+ # require 'rubygems'
43
+ # require 'stratagem'
44
+ #
45
+ # require File.join(Dir.pwd, 'config', 'boot')
46
+ # begin
47
+ # # rails 2
48
+ # require 'bootstrap'
49
+ # rescue Exception
50
+ # # rails 3
51
+ # require File.join(Dir.pwd, 'config', 'application')
52
+ # end
53
+ #
54
+ # require './config/environment'
55
+ #
56
+ # Stratagem::init
57
+ #
58
+ # Stratagem::Command.run(ARGV[0])
@@ -0,0 +1,26 @@
1
+ # Rails 2 generator
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../lib/generators/stratagem/install/install_base'))
4
+
5
+ class StratagemGenerator < Rails::Generator::Base
6
+ include Stratagem::Generators::InstallBase
7
+
8
+ def manifest
9
+ record do |m|
10
+ create_all(m)
11
+ end
12
+ end
13
+
14
+ def self.gem_root
15
+ File.expand_path('../../../', __FILE__)
16
+ end
17
+
18
+ def self.source_root
19
+ File.join(gem_root, 'templates', 'install')
20
+ end
21
+
22
+ def source_root
23
+ self.class.source_root
24
+ end
25
+
26
+ end
File without changes
@@ -0,0 +1,35 @@
1
+ module Stratagem
2
+ module Generators
3
+ module InstallBase
4
+ def create_all(m=self)
5
+ create_config(m)
6
+ create_tasks(m)
7
+ create_database(m)
8
+ end
9
+
10
+ def create_config(m = self)
11
+ m.template 'environments/stratagem.rb.erb', 'config/environments/stratagem.rb'
12
+ end
13
+
14
+ def create_tasks(m = self)
15
+ m.template 'tasks/stratagem.rake', 'lib/tasks/stratagem.rake'
16
+ end
17
+
18
+ def create_database(m = self)
19
+ append_yml(m, 'mongoid.yml', 'database.yml', 'workling.yml')
20
+ end
21
+
22
+ def append_yml(m, *filenames)
23
+ filenames.each do |filename|
24
+ if (File.exists?("config/#{filename}"))
25
+ unless File.read("config/#{filename}").include? 'stratagem:'
26
+ m.gsub_file "config/#{filename}", /^test:.*\n/, "test: &test\n"
27
+ m.gsub_file "config/#{filename}", /\z/, "\nstratagem:\n <<: *test"
28
+ puts " force config/#{filename}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ require File.join(File.dirname(__FILE__), 'install_base')
2
+
3
+ module Stratagem
4
+ class InstallGenerator < Rails::Generators::Base
5
+ include Stratagem::Generators::InstallBase
6
+
7
+ def generate
8
+ create_all
9
+ end
10
+
11
+ def self.gem_root
12
+ File.expand_path("../../../../../", __FILE__)
13
+ end
14
+
15
+ def self.source_root
16
+ puts "SOURCE ROOT: #{gem_root}"
17
+ File.join(gem_root, 'templates/install')
18
+ end
19
+ #
20
+ # def stratagem_rails_env
21
+ # 'stratagem'
22
+ # end
23
+ end
24
+ end
@@ -7,71 +7,101 @@ class StratagemError < RuntimeError
7
7
  end
8
8
  end
9
9
 
10
- require 'rubygems'
11
- require 'haml'
12
- require 'launchy'
13
- require 'redparse'
14
- require 'stratagem/blocker'
15
- require 'stratagem/logger'
16
- require 'stratagem/extensions'
17
- require 'stratagem/framework_extensions'
18
-
19
- require 'stratagem/model'
20
- require 'stratagem/auto_mock'
21
-
22
- require 'stratagem/authentication'
23
- require 'stratagem/client'
24
- require 'stratagem/command'
25
- require 'stratagem/model_builder'
26
- require 'stratagem/scanner'
27
- require 'stratagem/scan'
28
- require 'stratagem/crawler'
29
- require 'stratagem/site_crawler'
30
- require 'stratagem/snapshot'
31
-
32
- require 'stratagem/commands'
33
-
34
10
  module Stratagem
35
- @@blocker = Blocker.new
36
- @@running = false
37
- @@session_id = Time.now.to_f.to_s # the interface uses this to determine which instance of the client it's talking to
11
+ class << self
12
+ def init
13
+ require 'haml'
14
+ require 'launchy'
15
+ require 'redparse'
16
+ require 'stratagem/blocker'
17
+ require 'stratagem/logger'
18
+ require 'stratagem/extensions'
19
+ require 'stratagem/framework_extensions'
38
20
 
39
- def self.session_id
40
- @@session_id
41
- end
21
+ require 'stratagem/model'
22
+ require 'stratagem/auto_mock'
42
23
 
43
- def self.logger
44
- Stratagem::Logger.instance
45
- end
24
+ require 'stratagem/authentication'
25
+ require 'stratagem/client'
26
+ require 'stratagem/command'
27
+ require 'stratagem/model_builder'
28
+ require 'stratagem/scanner'
29
+ require 'stratagem/scan'
30
+ require 'stratagem/crawler'
31
+ require 'stratagem/site_crawler'
32
+ require 'stratagem/snapshot'
46
33
 
47
- def self.domain
48
- ENV['STRATAGEM_HOST'] || 'stratagemapp.com'
49
- end
34
+ require 'stratagem/commands'
50
35
 
51
- def self.wait_for_completion
52
- @@blocker.wait
53
- end
36
+ @@blocker = Blocker.new
37
+ @@running = false
38
+ @@session_id = Time.now.to_f.to_s # the interface uses this to determine which instance of the client it's talking to
39
+ end
40
+
41
+ def rails_version
42
+ @@rails_version ||= begin
43
+ rails_version = Rails.version.split('.').map {|v| v.size > 1 ? 9 : v.to_i }
44
+ rails_version << 0 while rails_version.size < 3
45
+ rails_version.pop while rails_version.size > 3
46
+ rails_version.join.to_i
47
+ end
48
+ end
54
49
 
55
- def self.complete
56
- @@blocker.notify
57
- end
50
+ def rails_3?
51
+ rails_version.between?(300, 399)
52
+ end
53
+
54
+ def rails_2?
55
+ rails_version.between?(200, 299)
56
+ end
57
+
58
+ def session_id
59
+ @@session_id
60
+ end
58
61
 
59
- def self.analyze
60
- unless (@@running)
61
- @@running = true
62
- Thread.new {
63
- begin
64
- authentication = Stratagem::Authentication.instance
65
- snapshot = Stratagem::Snapshot.create(authentication.project)
66
- Stratagem::Client.new(authentication).send(snapshot)
67
- rescue
68
- puts $!.message
69
- puts $!.backtrace
70
- ensure
71
- complete
72
- end
73
- }
62
+ def logger
63
+ Stratagem::Logger.instance
74
64
  end
65
+
66
+ def domain
67
+ ENV['STRATAGEM_HOST'] || 'stratagemapp.com'
68
+ end
69
+
70
+ def wait_for_completion
71
+ @@blocker.wait
72
+ end
73
+
74
+ def complete
75
+ @@blocker.notify
76
+ end
77
+
78
+ def analyze
79
+ unless (@@running)
80
+ @@running = true
81
+ Thread.new {
82
+ begin
83
+ # RubyProf.start
84
+
85
+ authentication = Stratagem::Authentication.instance
86
+ snapshot = Stratagem::Snapshot.create(authentication.project)
87
+ Stratagem::Client.new(authentication).send(snapshot)
88
+
89
+ # result = RubyProf.stop
90
+ #
91
+ # # Print a flat profile to text
92
+ # printer = RubyProf::FlatPrinter.new(result)
93
+ # printer.print(STDOUT, 0)
94
+ rescue
95
+ puts $!.message
96
+ puts $!.backtrace
97
+ ensure
98
+ complete
99
+ end
100
+ }
101
+ end
102
+ end
103
+
75
104
  end
105
+
76
106
  end
77
107
 
@@ -22,7 +22,7 @@ module Stratagem
22
22
  if (credentials.nil?)
23
23
  base_url+"/project_links/new"
24
24
  else
25
- base_url+"/project_links/validate/#{credentials[:token]}/#{credentials[:project]}"
25
+ base_url+"/project_links/validate/#{credentials[:project]}?auth_token=#{credentials[:token]}"
26
26
  end
27
27
  end
28
28
 
@@ -32,7 +32,7 @@ module Stratagem
32
32
  end
33
33
 
34
34
  def project_url
35
- "#{base_url}/projects/#{credentials[:project]}?api_key=#{credentials[:token]}"
35
+ "#{base_url}/projects/#{credentials[:project]}?auth_token=#{credentials[:token]}"
36
36
  end
37
37
 
38
38
  def credentials
@@ -13,7 +13,7 @@ module Stratagem::AutoMock
13
13
  self.instance
14
14
  end
15
15
 
16
- def destroy
16
+ def clear
17
17
  objects = self.repo.values.inject([]) {|memo,obj| memo += obj.compact }
18
18
  i = 0
19
19
  while (objects.size > 0 && ((i+=1) < objects.size))
@@ -32,6 +32,11 @@ module Stratagem::AutoMock
32
32
  !instance.frozen?
33
33
  end
34
34
  end
35
+ self.repo.clear
36
+ end
37
+
38
+ def destroy
39
+ clear
35
40
  end
36
41
 
37
42
  def instances_of(model_klass)